From 81f4d4cd03b561e331f6fd48fc3c9d2be8974456 Mon Sep 17 00:00:00 2001 From: Yuri Astrakhan Date: Sat, 25 May 2024 01:51:04 -0400 Subject: [PATCH 001/215] Switch default encoding to gzip for now (#1260) GZip is significantly faster, so for now lets use that until brotli project gains some performance, and until we get proper after-compression caching. --- Cargo.lock | 1 + docs/src/config-file.md | 55 ++++++++++++++------------- docs/src/run-with-cli.md | 5 ++- martin/Cargo.toml | 1 + martin/src/args/srv.rs | 5 +-- martin/src/srv/tiles.rs | 80 +++++++++++++++++++--------------------- 6 files changed, 74 insertions(+), 73 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a8fb4ff55..37dfa0fac 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2379,6 +2379,7 @@ dependencies = [ "postgres-protocol", "pprof", "regex", + "rstest", "rustls 0.23.8", "rustls-native-certs", "rustls-pemfile", diff --git a/docs/src/config-file.md b/docs/src/config-file.md index cc2670ac4..ad930a947 100644 --- a/docs/src/config-file.md +++ b/docs/src/config-file.md @@ -1,12 +1,17 @@ # Configuration File -If you don't want to expose all of your tables and functions, you can list your sources in a configuration file. To start Martin with a configuration file you need to pass a path to a file with a `--config` argument. Config files may contain environment variables, which will be expanded before parsing. For example, to use `MY_DATABASE_URL` in your config file: `connection_string: ${MY_DATABASE_URL}`, or with a default `connection_string: ${MY_DATABASE_URL:-postgresql://postgres@localhost/db}` +If you don't want to expose all of your tables and functions, you can list your sources in a configuration file. To +start Martin with a configuration file you need to pass a path to a file with a `--config` argument. Config files may +contain environment variables, which will be expanded before parsing. For example, to use `MY_DATABASE_URL` in your +config file: `connection_string: ${MY_DATABASE_URL}`, or with a +default `connection_string: ${MY_DATABASE_URL:-postgresql://postgres@localhost/db}` ```shell martin --config config.yaml ``` -You may wish to auto-generate a config file with `--save-config` argument. This will generate a config yaml file with all of your configuration, which you can edit to remove any sources you don't want to expose. +You may wish to auto-generate a config file with `--save-config` argument. This will generate a config yaml file with +all of your configuration, which you can edit to remove any sources you don't want to expose. ```shell martin ... ... ... --save-config config.yaml @@ -31,7 +36,7 @@ worker_processes: 8 # Amount of memory (in MB) to use for caching tiles [default: 512, 0 to disable] cache_size_mb: 1024 -# If the client accepts multiple compression formats, and the tile source is not pre-compressed, which compression should be used. `gzip` is faster, but `brotli` is smaller, and may be faster with caching. Defaults to brotli. +# If the client accepts multiple compression formats, and the tile source is not pre-compressed, which compression should be used. `gzip` is faster, but `brotli` is smaller, and may be faster with caching. Default could be different depending on Martin version. preferred_encoding: gzip # Database configuration. This can also be a list of PG configs. @@ -92,76 +97,76 @@ postgres: functions: # Optionally set how source ID should be generated based on the function's name and schema source_id_format: '{schema}.{function}' - + # Associative arrays of table sources tables: table_source_id: # ID of the MVT layer (optional, defaults to table name) layer_id: table_source - + # Table schema (required) schema: public - + # Table name (required) table: table_source - + # Geometry SRID (required) srid: 4326 - + # Geometry column name (required) geometry_column: geom - + # Feature id column name id_column: ~ - + # An integer specifying the minimum zoom level minzoom: 0 - + # An integer specifying the maximum zoom level. MUST be >= minzoom maxzoom: 30 - + # The maximum extent of available map tiles. Bounds MUST define an area # covered by all zoom levels. The bounds are represented in WGS:84 # latitude and longitude values, in the order left, bottom, right, top. # Values may be integers or floating point numbers. - bounds: [-180.0, -90.0, 180.0, 90.0] - + bounds: [ -180.0, -90.0, 180.0, 90.0 ] + # Tile extent in tile coordinate space extent: 4096 - + # Buffer distance in tile coordinate space to optionally clip geometries buffer: 64 - + # Boolean to control if geometries should be clipped or encoded as is clip_geom: true - + # Geometry type geometry_type: GEOMETRY - + # List of columns, that should be encoded as tile properties (required) properties: gid: int4 - + # Associative arrays of function sources functions: function_source_id: # Schema name (required) schema: public - + # Function name (required) function: function_zxy_query - + # An integer specifying the minimum zoom level minzoom: 0 - + # An integer specifying the maximum zoom level. MUST be >= minzoom maxzoom: 30 - + # The maximum extent of available map tiles. Bounds MUST define an area # covered by all zoom levels. The bounds are represented in WGS:84 # latitude and longitude values, in the order left, bottom, right, top. # Values may be integers or floating point numbers. - bounds: [-180.0, -90.0, 180.0, 90.0] + bounds: [ -180.0, -90.0, 180.0, 90.0 ] # Publish PMTiles files from local disk or proxy to a web server pmtiles: @@ -177,7 +182,7 @@ pmtiles: pm-src1: /path/to/pmt.pmtiles # A named source to a web server with a PMTiles file that supports range requests pm-web2: https://example.org/path/tiles.pmtiles - + # Publish MBTiles files mbtiles: paths: diff --git a/docs/src/run-with-cli.md b/docs/src/run-with-cli.md index da3241c1c..17b16fbaf 100644 --- a/docs/src/run-with-cli.md +++ b/docs/src/run-with-cli.md @@ -1,6 +1,7 @@ ## Command-line Interface -You can configure Martin using command-line interface. See `martin --help` or `cargo run -- --help` for more information. +You can configure Martin using command-line interface. See `martin --help` or `cargo run -- --help` for more +information. ```shell Usage: martin [OPTIONS] [CONNECTION]... @@ -34,7 +35,7 @@ Options: Number of web server workers --preferred-encoding - Martin server preferred tile encoding. If the client accepts multiple compression formats, and the tile source is not pre-compressed, which compression should be used. `gzip` is faster, but `brotli` is smaller, and may be faster with caching. Defaults to brotli + Martin server preferred tile encoding. If the client accepts multiple compression formats, and the tile source is not pre-compressed, which compression should be used. `gzip` is faster, but `brotli` is smaller, and may be faster with caching. Default could be different depending on Martin version [possible values: brotli, gzip] diff --git a/martin/Cargo.toml b/martin/Cargo.toml index 874f95d43..428cf6ae0 100644 --- a/martin/Cargo.toml +++ b/martin/Cargo.toml @@ -120,3 +120,4 @@ ctor.workspace = true indoc.workspace = true insta = { workspace = true, features = ["yaml"] } pprof.workspace = true +rstest.workspace = true diff --git a/martin/src/args/srv.rs b/martin/src/args/srv.rs index 73c38c3f2..8bbd91178 100644 --- a/martin/src/args/srv.rs +++ b/martin/src/args/srv.rs @@ -17,15 +17,14 @@ pub struct SrvArgs { /// Number of web server workers #[arg(short = 'W', long)] pub workers: Option, - /// Martin server preferred tile encoding. If the client accepts multiple compression formats, and the tile source is not pre-compressed, which compression should be used. `gzip` is faster, but `brotli` is smaller, and may be faster with caching. Defaults to brotli. + /// Martin server preferred tile encoding. If the client accepts multiple compression formats, and the tile source is not pre-compressed, which compression should be used. `gzip` is faster, but `brotli` is smaller, and may be faster with caching. Defaults to gzip. #[arg(long)] pub preferred_encoding: Option, } -#[derive(PartialEq, Eq, Default, Debug, Clone, Copy, Serialize, Deserialize, ValueEnum)] +#[derive(PartialEq, Eq, Debug, Clone, Copy, Serialize, Deserialize, ValueEnum)] #[serde(rename_all = "lowercase")] pub enum PreferredEncoding { - #[default] #[serde(alias = "br")] #[clap(alias("br"))] Brotli, diff --git a/martin/src/srv/tiles.rs b/martin/src/srv/tiles.rs index c5195b87c..a90c2c53f 100755 --- a/martin/src/srv/tiles.rs +++ b/martin/src/srv/tiles.rs @@ -199,8 +199,8 @@ impl<'a> DynTileSource<'a> { if tile.info.encoding == Encoding::Uncompressed { let ordered_encodings = match self.preferred_enc { - Some(PreferredEncoding::Gzip) => PREFER_GZIP_ENC, - Some(PreferredEncoding::Brotli) | None => PREFER_BROTLI_ENC, + Some(PreferredEncoding::Gzip) | None => PREFER_GZIP_ENC, + Some(PreferredEncoding::Brotli) => PREFER_BROTLI_ENC, }; // only apply compression if the content supports it @@ -264,58 +264,52 @@ pub fn to_encoding(val: ContentEncoding) -> Option { #[cfg(test)] mod tests { + use rstest::rstest; use tilejson::tilejson; use super::*; use crate::srv::server::tests::TestSource; + #[rstest] + #[trace] + #[case(&["gzip", "deflate", "br", "zstd"], None, Encoding::Gzip)] + #[case(&["gzip", "deflate", "br", "zstd"], Some(PreferredEncoding::Brotli), Encoding::Brotli)] + #[case(&["gzip", "deflate", "br", "zstd"], Some(PreferredEncoding::Gzip), Encoding::Gzip)] + #[case(&["br;q=1", "gzip;q=1"], Some(PreferredEncoding::Gzip), Encoding::Gzip)] + #[case(&["gzip;q=1", "br;q=1"], Some(PreferredEncoding::Brotli), Encoding::Brotli)] + #[case(&["gzip;q=1", "br;q=0.5"], Some(PreferredEncoding::Brotli), Encoding::Gzip)] #[actix_rt::test] - async fn test_encoding_preference() { - let source = TestSource { + async fn test_enc_preference( + #[case] accept_enc: &[&'static str], + #[case] preferred_enc: Option, + #[case] expected_enc: Encoding, + ) { + let sources = TileSources::new(vec![vec![Box::new(TestSource { id: "test_source", tj: tilejson! { tiles: vec![] }, data: vec![1_u8, 2, 3], - }; - let sources = TileSources::new(vec![vec![Box::new(source)]]); + })]]); - for (accept_encodings, prefered_encoding, result_encoding) in [ - ( - Some(AcceptEncoding(vec![ - "gzip;q=1".parse().unwrap(), - "br;q=1".parse().unwrap(), - ])), - Some(PreferredEncoding::Brotli), - Encoding::Brotli, - ), - ( - Some(AcceptEncoding(vec![ - "gzip;q=1".parse().unwrap(), - "br;q=0.5".parse().unwrap(), - ])), - Some(PreferredEncoding::Brotli), - Encoding::Gzip, - ), - ] { - let src = DynTileSource::new( - &sources, - "test_source", - None, - "", - accept_encodings, - prefered_encoding, - None, - ) - .unwrap(); - let xyz = TileCoord { z: 0, x: 0, y: 0 }; - let data = &src.get_tile_content(xyz).await.unwrap().data; - let decoded = match result_encoding { - Encoding::Gzip => decode_gzip(data), - Encoding::Brotli => decode_brotli(data), - _ => panic!("Unexpected encoding"), - }; - assert_eq!(vec![1_u8, 2, 3], decoded.unwrap()); - } + let accept_enc = Some(AcceptEncoding( + accept_enc.iter().map(|s| s.parse().unwrap()).collect(), + )); + + let src = DynTileSource::new( + &sources, + "test_source", + None, + "", + accept_enc, + preferred_enc, + None, + ) + .unwrap(); + + let xyz = TileCoord { z: 0, x: 0, y: 0 }; + let tile = src.get_tile_content(xyz).await.unwrap(); + assert_eq!(tile.info.encoding, expected_enc); } + #[actix_rt::test] async fn test_tile_content() { let non_empty_source = TestSource { From a9cb0c972f6e9d6581c8dfad2c52b5e13cbe616e Mon Sep 17 00:00:00 2001 From: Lucas Date: Sun, 26 May 2024 19:06:28 +0800 Subject: [PATCH 002/215] Adjust readme and martin book (#1253) Fixes #1245 Large book and README refactoring, adding quick started section, list of available features to the README, and moving most of the content from README to the book. --------- Co-authored-by: Yuri Astrakhan --- README.md | 131 +++--------------- docs/src/SUMMARY.md | 6 + docs/src/config-file.md | 4 +- docs/src/development.md | 19 +-- docs/src/images/qgis_add_to_layers.png | Bin 0 -> 38200 bytes docs/src/images/qgis_add_vector_tile.png | Bin 0 -> 101384 bytes .../images/qgis_add_vector_tile_options.png | Bin 0 -> 59384 bytes docs/src/images/qgis_shows_in_the_map.png | Bin 0 -> 177144 bytes docs/src/installation.md | 87 ++++++++---- docs/src/martin-as-a-library.md | 9 ++ docs/src/martin-cp.md | 14 +- docs/src/mbtiles-copy.md | 11 +- docs/src/mbtiles-diff.md | 6 +- docs/src/mbtiles-meta.md | 21 +-- docs/src/mbtiles-validation.md | 38 +++-- docs/src/quick-start-linux.md | 24 ++++ docs/src/quick-start-macos.md | 27 ++++ docs/src/quick-start-qgis.md | 17 +++ docs/src/quick-start-windows.md | 24 ++++ docs/src/quick-start.md | 7 + docs/src/recipes.md | 19 ++- docs/src/run-with-cli.md | 2 +- docs/src/run-with-docker-compose.md | 7 +- docs/src/run-with-docker.md | 16 ++- docs/src/run.md | 9 +- docs/src/sources-composite.md | 8 +- docs/src/sources-files.md | 9 +- docs/src/sources-fonts.md | 15 +- docs/src/sources-pg-functions.md | 34 +++-- docs/src/sources-sprites.md | 30 ++-- docs/src/troubleshooting.md | 11 +- docs/src/using.md | 14 +- 32 files changed, 386 insertions(+), 233 deletions(-) create mode 100644 docs/src/images/qgis_add_to_layers.png create mode 100644 docs/src/images/qgis_add_vector_tile.png create mode 100644 docs/src/images/qgis_add_vector_tile_options.png create mode 100644 docs/src/images/qgis_shows_in_the_map.png create mode 100644 docs/src/martin-as-a-library.md create mode 100644 docs/src/quick-start-linux.md create mode 100644 docs/src/quick-start-macos.md create mode 100644 docs/src/quick-start-qgis.md create mode 100644 docs/src/quick-start-windows.md create mode 100644 docs/src/quick-start.md diff --git a/README.md b/README.md index bbcf8a5ff..47338b2f8 100755 --- a/README.md +++ b/README.md @@ -8,116 +8,27 @@ [![Security audit](https://github.com/maplibre/martin/workflows/Security%20audit/badge.svg)](https://github.com/maplibre/martin/security) [![CI build](https://github.com/maplibre/martin/actions/workflows/ci.yml/badge.svg)](https://github.com/maplibre/martin/actions) -Martin is a tile server able to generate and serve [vector tiles](https://github.com/mapbox/vector-tile-spec) on the fly from large [PostGIS](https://github.com/postgis/postgis) databases, [PMTile](https://protomaps.com/blog/pmtiles-v3-whats-new) (local or remote), and [MBTile](https://github.com/mapbox/mbtiles-spec) files, allowing multiple tile sources to be dynamically combined into one. Martin optimizes for speed and heavy traffic, and is written in [Rust](https://github.com/rust-lang/rust). - -Additionally, there are [several tools](https://maplibre.org/martin/tools.html) for generating tiles in bulk from any Martin-supported sources (similar to `tilelive-copy`), copying tiles between MBTiles files, creating deltas (patches) and applying them, and validating MBTiles files. - -See [Martin book](https://maplibre.org/martin/) for complete documentation. - -## Installation - -_See [installation instructions](https://maplibre.org/martin/installation.html) in the Martin book._ - -**Prerequisites:** If using Martin with PostgreSQL database, you must install PostGIS with at least v3.0+, v3.1+ recommended. - -You can download martin from [GitHub releases page](https://github.com/maplibre/martin/releases). - -| Platform | AMD-64 | ARM-64 | -|----------|--------------------------------------------------------------------------------------------------|-------------------------------------| -| Linux | [.tar.gz][rl-linux-x64] (gnu)
[.tar.gz][rl-linux-x64-musl] (musl)
[.deb][rl-linux-x64-deb] | [.tar.gz][rl-linux-a64-musl] (musl) | -| macOS | [.tar.gz][rl-macos-x64] | [.tar.gz][rl-macos-a64] | -| Windows | [.zip][rl-win64-zip] | | - -[rl-linux-x64]: https://github.com/maplibre/martin/releases/latest/download/martin-x86_64-unknown-linux-gnu.tar.gz -[rl-linux-x64-musl]: https://github.com/maplibre/martin/releases/latest/download/martin-x86_64-unknown-linux-musl.tar.gz -[rl-linux-x64-deb]: https://github.com/maplibre/martin/releases/latest/download/martin-Debian-x86_64.deb -[rl-linux-a64-musl]: https://github.com/maplibre/martin/releases/latest/download/martin-aarch64-unknown-linux-musl.tar.gz -[rl-macos-x64]: https://github.com/maplibre/martin/releases/latest/download/martin-x86_64-apple-darwin.tar.gz -[rl-macos-a64]: https://github.com/maplibre/martin/releases/latest/download/martin-aarch64-apple-darwin.tar.gz -[rl-win64-zip]: https://github.com/maplibre/martin/releases/latest/download/martin-x86_64-pc-windows-msvc.zip - -If you are using macOS and [Homebrew](https://brew.sh/) you can install `martin` and `mbtiles` using Homebrew tap. - -```shell -brew tap maplibre/martin -brew install martin -``` - -## Running Martin Service - -_See [running instructions](https://maplibre.org/martin/run.html) in the Martin book._ - -Martin supports any number of PostgreSQL/PostGIS database connections with [geospatial-enabled](https://postgis.net/docs/using_postgis_dbmanagement.html#geometry_columns) tables and tile-producing SQL functions, as well as [PMTile](https://protomaps.com/blog/pmtiles-v3-whats-new) and [MBTile](https://github.com/mapbox/mbtiles-spec) files as tile sources. - -Martin can auto-discover tables and functions using a [connection string](https://maplibre.org/martin/pg-connections.html). A PG connection string can also be passed via the `DATABASE_URL` environment variable. - -Each tile source will have a [TileJSON](https://github.com/mapbox/tilejson-spec) endpoint. - -#### Examples - -```shell -# publish all tables and functions from a single database -export DATABASE_URL="postgresql://user:password@host:port/database" -martin - -# same as above, but passing connection string via CLI, together with a directory of .mbtiles/.pmtiles files -martin postgresql://user:password@host:port/database path/to/dir - -# publish all discovered tables/funcs from two DBs -# and generate config file with all detected sources -martin postgres://... postgres://... --save-config config.yaml - -# use configuration file instead of auto-discovery -martin --config config.yaml -``` - -#### Docker Example - -_See [Docker instructions](https://maplibre.org/martin/run-with-docker.html) in the Martin book._ - -Martin is also available as a [Docker image](https://ghcr.io/maplibre/martin). You could either share a configuration file from the host with the container via the `-v` param, or you can let Martin auto-discover all sources e.g. by passing `DATABASE_URL` or specifying the .mbtiles/.pmtiles files. - -```shell -export PGPASSWORD=postgres # secret! -docker run -p 3000:3000 \ - -e PGPASSWORD \ - -e DATABASE_URL=postgresql://user@host:port/db \ - -v /path/to/config/dir:/config \ - ghcr.io/maplibre/martin --config /config/config.yaml -``` - -## API - -_See [API documentation](https://maplibre.org/martin/using.html) in the Martin book._ - -Martin data is available via the HTTP `GET` endpoints: - -| URL | Description | -|-----------------------------------------|-----------------------------------------------| -| `/` | Status text, that will eventually show web UI | -| `/catalog` | List of all sources | -| `/{sourceID}` | Source TileJSON | -| `/{sourceID}/{z}/{x}/{y}` | Map Tiles | -| `/{source1},…,{sourceN}` | Composite Source TileJSON | -| `/{source1},…,{sourceN}/{z}/{x}/{y}` | Composite Source Tiles | -| `/sprite/{spriteID}[@2x].{json,png}` | Sprites (low and high DPI, index/png) | -| `/font/{font}/{start}-{end}` | Font source | -| `/font/{font1},…,{fontN}/{start}-{end}` | Composite Font source | -| `/health` | Martin server health check: returns 200 `OK` | - -## Re-use Martin as a library - -Martin can be used as a standalone server, or as a library in your own Rust application. When used as a library, you can use the following features: - -* **postgres** - enable PostgreSQL/PostGIS tile sources -* **pmtiles** - enable PMTile tile sources -* **mbtiles** - enable MBTile tile sources -* **fonts** - enable font sources -* **sprites** - enable sprite sources - -## Documentation - -See [Martin book](https://maplibre.org/martin/) for complete documentation. +Martin is a tile server able to generate and serve [vector tiles](https://github.com/mapbox/vector-tile-spec) on the fly +from large [PostGIS](https://github.com/postgis/postgis) +databases, [PMTile](https://protomaps.com/blog/pmtiles-v3-whats-new) (local or remote), +and [MBTile](https://github.com/mapbox/mbtiles-spec) files, allowing multiple tile sources to be dynamically combined +into one. Martin optimizes for speed and heavy traffic, and is written in [Rust](https://github.com/rust-lang/rust). + +### Features + +* Serve vector tiles from PostGIS, PMTile, and MBTile sources +* [Combine](https://maplibre.org/martin/sources-composite.html) multiple tile sources +* Generate [sprites](https://maplibre.org/martin/sources-sprites.html) and [font glyphs](https://maplibre.org/martin/sources-fonts.html) +* Generate tiles in bulk from any Martin-supported sources into an `.mbtiles` file with [martin-cp](https://maplibre.org/martin/martin-cp.html) tool +* Examine, copy, validate, compare, and apply diffs between `.mbtiles` files with [mbtiles](https://maplibre.org/martin/tools.html#mbtiles) tool + +### Documentation + +* [Quick Start](https://maplibre.org/martin/quick-start.html) +* [Installation](https://maplibre.org/martin/installation.html) +* Running with [CLI](https://maplibre.org/martin/run-with-cli.html) + or [configuration file](https://maplibre.org/martin/config-file.html) +* [Usage and API](https://maplibre.org/martin/using.html) ## License diff --git a/docs/src/SUMMARY.md b/docs/src/SUMMARY.md index ac0d5e000..62b84d8f8 100644 --- a/docs/src/SUMMARY.md +++ b/docs/src/SUMMARY.md @@ -1,5 +1,10 @@ [Introduction](introduction.md) +- [Quick Start](quick-start.md) + - [On Linux](quick-start-linux.md) + - [On macOS](quick-start-macos.md) + - [On Windows](quick-start-windows.md) + - [View with QGIS](quick-start-qgis.md) - [Installation](installation.md) - [Running](run.md) - [Command Line Interface](run-with-cli.md) @@ -32,3 +37,4 @@ - [Diffing/Patching MBTiles](mbtiles-diff.md) - [Validating MBTiles](mbtiles-validation.md) - [Development](development.md) + - [Martin as a library](martin-as-a-library.md) diff --git a/docs/src/config-file.md b/docs/src/config-file.md index ad930a947..2468893a4 100644 --- a/docs/src/config-file.md +++ b/docs/src/config-file.md @@ -6,14 +6,14 @@ contain environment variables, which will be expanded before parsing. For exampl config file: `connection_string: ${MY_DATABASE_URL}`, or with a default `connection_string: ${MY_DATABASE_URL:-postgresql://postgres@localhost/db}` -```shell +```bash martin --config config.yaml ``` You may wish to auto-generate a config file with `--save-config` argument. This will generate a config yaml file with all of your configuration, which you can edit to remove any sources you don't want to expose. -```shell +```bash martin ... ... ... --save-config config.yaml ``` diff --git a/docs/src/development.md b/docs/src/development.md index b3bc71147..ad0369cc2 100644 --- a/docs/src/development.md +++ b/docs/src/development.md @@ -1,36 +1,39 @@ # Development -Clone Martin, setting remote name to `upstream`. This way `main` branch will be updated automatically with the latest changes from the upstream repo. +Clone Martin, setting remote name to `upstream`. This way `main` branch will be updated automatically with the latest +changes from the upstream repo. -```shell, ignore +```bash, ignore git clone https://github.com/maplibre/martin.git -o upstream cd martin ``` Fork Martin repo into your own GitHub account, and add your fork as a remote -```shell, ignore +```bash, ignore git remote add origin _URL_OF_YOUR_FORK_ ``` Install [docker](https://docs.docker.com/get-docker/) and [docker-compose](https://docs.docker.com/compose/) -```shell, ignore +```bash, ignore # Ubuntu-based distros have an older version that might also work: sudo apt install -y docker.io docker-compose ``` Install a few required libs and tools: -```shell, ignore +```bash, ignore # For Ubuntu-based distros sudo apt install -y build-essential pkg-config jq file ``` -Install [Just](https://github.com/casey/just#readme) (improved makefile processor). Note that some Linux and Homebrew distros have outdated versions of Just, so you should install it from source: +Install [Just](https://github.com/casey/just#readme) (improved makefile processor). Note that some Linux and Homebrew +distros have outdated versions of Just, so you should install it from source: -```shell, ignore +```bash, ignore cargo install just --locked ``` -When developing MBTiles SQL code, you may need to use `just prepare-sqlite` whenever SQL queries are modified. Run `just` to see all available commands. +When developing MBTiles SQL code, you may need to use `just prepare-sqlite` whenever SQL queries are modified. +Run `just` to see all available commands. diff --git a/docs/src/images/qgis_add_to_layers.png b/docs/src/images/qgis_add_to_layers.png new file mode 100644 index 0000000000000000000000000000000000000000..68d6097a9a2f7a23496a419ed38822e1feaad434 GIT binary patch literal 38200 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 JPDHLkV1n5(W4{0Z literal 0 HcmV?d00001 diff --git a/docs/src/images/qgis_add_vector_tile.png b/docs/src/images/qgis_add_vector_tile.png new file mode 100644 index 0000000000000000000000000000000000000000..de707e506a210fbd9539b26cc0f87f90bf7f5de9 GIT binary patch literal 101384 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Μ9^qD%Qr- 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[.tar.gz][rl-linux-x64-musl] (musl)
[.deb][rl-linux-x64-deb] | [.tar.gz][rl-linux-a64-musl] (musl) | +| macOS | [.tar.gz][rl-macos-x64] | [.tar.gz][rl-macos-a64] | +| Windows | [.zip][rl-win64-zip] | | -[rl-linux-tar]: https://github.com/maplibre/martin/releases/latest/download/martin-x86_64-unknown-linux-gnu.tar.gz -[rl-macos-tar]: https://github.com/maplibre/martin/releases/latest/download/martin-x86_64-apple-darwin.tar.gz -[rl-win64-zip]: https://github.com/maplibre/martin/releases/latest/download/martin-x86_64-pc-windows-msvc.zip +[rl-linux-x64]: https://github.com/maplibre/martin/releases/latest/download/martin-x86_64-unknown-linux-gnu.tar.gz -### Building with Cargo +[rl-linux-x64-musl]: https://github.com/maplibre/martin/releases/latest/download/martin-x86_64-unknown-linux-musl.tar.gz -If you [install Rust](https://www.rust-lang.org/tools/install), you can build martin from source with Cargo: +[rl-linux-x64-deb]: https://github.com/maplibre/martin/releases/latest/download/martin-Debian-x86_64.deb -```shell -cargo install martin --locked +[rl-linux-a64-musl]: https://github.com/maplibre/martin/releases/latest/download/martin-aarch64-unknown-linux-musl.tar.gz + +[rl-macos-x64]: https://github.com/maplibre/martin/releases/latest/download/martin-x86_64-apple-darwin.tar.gz + +[rl-macos-a64]: https://github.com/maplibre/martin/releases/latest/download/martin-aarch64-apple-darwin.tar.gz + +[rl-win64-zip]: https://github.com/maplibre/martin/releases/latest/download/martin-x86_64-pc-windows-msvc.zip + +Rust users can install pre-built martin binary +with [cargo-binstall](https://github.com/cargo-bins/cargo-binstall) and `cargo`. + +```bash +cargo install cargo-binstall +cargo binstall martin martin --help ``` -### Homebrew +### From package + +To install with apt source and others, We need your help +to [improve packaging for various platforms](https://github.com/maplibre/martin/issues/578). + +#### Homebrew If you are using macOS and [Homebrew](https://brew.sh/) you can install martin using Homebrew tap. -```shell +```bash brew tap maplibre/martin brew install martin +martin --help ``` -### Docker +#### Debian Packages(x86_64) manually -Martin is also available as a [Docker image](https://ghcr.io/maplibre/martin). You could either share a configuration file from the host with the container via the `-v` param, or you can let Martin auto-discover all sources e.g. by passing `DATABASE_URL` or specifying the .mbtiles/.pmtiles files or URLs to .pmtiles. +```bash +curl -O https://github.com/maplibre/martin/releases/latest/download/martin-Debian-x86_64.deb +sudo dpkg -i ./martin-Debian-x86_64.deb +martin --help +rm ./martin-Debian-x86_64.deb +``` -```shell -export PGPASSWORD=postgres # secret! -docker run -p 3000:3000 \ - -e PGPASSWORD \ - -e DATABASE_URL=postgresql://user@host:port/db \ - -v /path/to/config/dir:/config \ - ghcr.io/maplibre/martin --config /config/config.yaml +### Building From source + +If you [install Rust](https://www.rust-lang.org/tools/install), you can build martin from source with Cargo: + +```bash +cargo install martin --locked +martin --help ``` diff --git a/docs/src/martin-as-a-library.md b/docs/src/martin-as-a-library.md new file mode 100644 index 000000000..680d2435e --- /dev/null +++ b/docs/src/martin-as-a-library.md @@ -0,0 +1,9 @@ +# Martin as a library + +Martin can be used as a standalone server, or as a library in your own Rust application. When used as a library, you can use the following features: + +* **postgres** - enable PostgreSQL/PostGIS tile sources +* **pmtiles** - enable PMTile tile sources +* **mbtiles** - enable MBTile tile sources +* **fonts** - enable font sources +* **sprites** - enable sprite sources diff --git a/docs/src/martin-cp.md b/docs/src/martin-cp.md index 53e06b319..38660598b 100644 --- a/docs/src/martin-cp.md +++ b/docs/src/martin-cp.md @@ -1,14 +1,20 @@ # Generating Tiles in Bulk -`martin-cp` is a tool for generating tiles in bulk, from any source(s) supported by Martin, and save retrieved tiles into a new or an existing MBTiles file. `martin-cp` can be used to generate tiles for a large area or multiple areas (bounding boxes). If multiple areas overlap, it will ensure each tile is generated only once. `martin-cp` supports the same configuration file and CLI arguments as Martin server, so it can support all sources and even combining sources. +`martin-cp` is a tool for generating tiles in bulk, from any source(s) supported by Martin, and save retrieved tiles +into a new or an existing MBTiles file. `martin-cp` can be used to generate tiles for a large area or multiple areas ( +bounding boxes). If multiple areas overlap, it will ensure each tile is generated only once. `martin-cp` supports the +same configuration file and CLI arguments as Martin server, so it can support all sources and even combining sources. -After copying, `martin-cp` will update the `agg_tiles_hash` metadata value unless `--skip-agg-tiles-hash` is specified. This allows the MBTiles file to be [validated](./mbtiles-validation.md#aggregate-content-validation) using `mbtiles validate` command. +After copying, `martin-cp` will update the `agg_tiles_hash` metadata value unless `--skip-agg-tiles-hash` is specified. +This allows the MBTiles file to be [validated](./mbtiles-validation.md#aggregate-content-validation) +using `mbtiles validate` command. ## Usage -This copies tiles from a PostGIS table `my_table` into an MBTiles file `tileset.mbtiles` using [normalized](mbtiles-schema.md) schema, with zoom levels from 0 to 10, and bounds of the whole world. +This copies tiles from a PostGIS table `my_table` into an MBTiles file `tileset.mbtiles` +using [normalized](mbtiles-schema.md) schema, with zoom levels from 0 to 10, and bounds of the whole world. -```shell +```bash martin-cp --output-file tileset.mbtiles \ --mbtiles-type normalized \ "--bbox=-180,-90,180,90" \ diff --git a/docs/src/mbtiles-copy.md b/docs/src/mbtiles-copy.md index 29a3a46a6..7b005b1bc 100644 --- a/docs/src/mbtiles-copy.md +++ b/docs/src/mbtiles-copy.md @@ -4,14 +4,14 @@ Copy command copies an mbtiles file, optionally filtering its content by zoom levels. -```shell +```bash mbtiles copy src_file.mbtiles dst_file.mbtiles \ --min-zoom 0 --max-zoom 10 ``` This command can also be used to generate files of different [supported schema](mbtiles-schema.md). -```shell +```bash mbtiles copy normalized.mbtiles dst.mbtiles \ --dst-mbttype flat-with-hash ``` @@ -20,7 +20,7 @@ mbtiles copy normalized.mbtiles dst.mbtiles \ This option is identical to using [`mbtiles diff ...`](mbtiles-diff.md). The following commands two are equivalent: -```shell +```bash mbtiles diff file1.mbtiles file2.mbtiles diff.mbtiles mbtiles copy file1.mbtiles diff.mbtiles \ @@ -29,9 +29,10 @@ mbtiles copy file1.mbtiles diff.mbtiles \ ## `mbtiles copy --apply-patch` -Copy a source file to destination while also applying the diff file generated by `copy --diff-with-file` command above to the destination mbtiles file. This allows safer application of the diff file, as the source file is not modified. +Copy a source file to destination while also applying the diff file generated by `copy --diff-with-file` command above +to the destination mbtiles file. This allows safer application of the diff file, as the source file is not modified. -```shell +```bash mbtiles copy src_file.mbtiles dst_file.mbtiles \ --apply-patch diff.mbtiles ``` diff --git a/docs/src/mbtiles-diff.md b/docs/src/mbtiles-diff.md index b2d627b2d..d5a02e2e8 100644 --- a/docs/src/mbtiles-diff.md +++ b/docs/src/mbtiles-diff.md @@ -13,7 +13,7 @@ file to the original file, as the `agg_tiles_hash` value will be different after command will automatically rename the `agg_tiles_hash_after_apply` value back to `agg_tiles_hash` when applying the diff. -```shell +```bash # This command will compare `file1.mbtiles` and `file2.mbtiles`, and generate a new diff file `diff.mbtiles`. mbtiles diff file1.mbtiles file2.mbtiles diff.mbtiles @@ -41,7 +41,7 @@ Note that the `agg_tiles_hash_after_apply` metadata value will be renamed to `ag This is done to avoid confusion when applying the diff file to the original file, as the `agg_tiles_hash` value will be different after the diff is applied. -```shell +```bash mbtiles apply-patch src_file.mbtiles diff_file.mbtiles ``` @@ -53,7 +53,7 @@ from `diff_file.mbtiles` into `src_file.mbtiles`, where both files are of `flat` passed as a query parameter to the sqlite3 command line tool, and then used in the SQL statements. Note that this does not update the `agg_tiles_hash` metadata value, so it will be incorrect after the diff is applied. -```shell +```bash sqlite3 src_file.mbtiles \ -bail \ -cmd ".parameter set @diffDbFilename diff_file.mbtiles" \ diff --git a/docs/src/mbtiles-meta.md b/docs/src/mbtiles-meta.md index ac1d0fb76..422cf51e8 100644 --- a/docs/src/mbtiles-meta.md +++ b/docs/src/mbtiles-meta.md @@ -2,9 +2,11 @@ ## summary -Use `mbtiles summary` to get a summary of the contents of an MBTiles file. The command will print a table with the number of tiles per zoom level, the size of the smallest and largest tiles, and the average size of tiles at each zoom level. The command will also print the bounding box of the covered area per zoom level. +Use `mbtiles summary` to get a summary of the contents of an MBTiles file. The command will print a table with the +number of tiles per zoom level, the size of the smallest and largest tiles, and the average size of tiles at each zoom +level. The command will also print the bounding box of the covered area per zoom level. -```shell +```bash MBTiles file summary for tests/fixtures/mbtiles/world_cities.mbtiles Schema: flat File size: 48.00KiB @@ -24,24 +26,27 @@ Page count: 12 ## meta-all -Print all metadata values to stdout, as well as the results of tile detection. The format of the values printed is not stable, and should only be used for visual inspection. +Print all metadata values to stdout, as well as the results of tile detection. The format of the values printed is not +stable, and should only be used for visual inspection. -```shell +```bash mbtiles meta-all my_file.mbtiles ``` ## meta-get -Retrieve raw metadata value by its name. The value is printed to stdout without any modifications. For example, to get the `description` value from an mbtiles file: +Retrieve raw metadata value by its name. The value is printed to stdout without any modifications. For example, to get +the `description` value from an mbtiles file: -```shell +```bash mbtiles meta-get my_file.mbtiles description ``` ## meta-set -Set metadata value by its name, or delete the key if no value is supplied. For example, to set the `description` value to `A vector tile dataset`: +Set metadata value by its name, or delete the key if no value is supplied. For example, to set the `description` value +to `A vector tile dataset`: -```shell +```bash mbtiles meta-set my_file.mbtiles description "A vector tile dataset" ``` diff --git a/docs/src/mbtiles-validation.md b/docs/src/mbtiles-validation.md index bd5486c5e..4e95930b5 100644 --- a/docs/src/mbtiles-validation.md +++ b/docs/src/mbtiles-validation.md @@ -1,32 +1,47 @@ # MBTiles Validation -The original [MBTiles specification](https://github.com/mapbox/mbtiles-spec#readme) does not provide any guarantees for the content of the tile data in MBTiles. `mbtiles validate` assumes a few additional conventions and uses them to ensure that the content of the tile data is valid performing several validation steps. If the file is not valid, the command will print an error message and exit with a non-zero exit code. +The original [MBTiles specification](https://github.com/mapbox/mbtiles-spec#readme) does not provide any guarantees for +the content of the tile data in MBTiles. `mbtiles validate` assumes a few additional conventions and uses them to ensure +that the content of the tile data is valid performing several validation steps. If the file is not valid, the command +will print an error message and exit with a non-zero exit code. -```shell +```bash mbtiles validate src_file.mbtiles ``` ## SQLite Integrity check -The `validate` command will run `PRAGMA integrity_check` on the file, and will fail if the result is not `ok`. The `--integrity-check` flag can be used to disable this check, or to make it more thorough with `full` value. Default is `quick`. +The `validate` command will run `PRAGMA integrity_check` on the file, and will fail if the result is not `ok`. +The `--integrity-check` flag can be used to disable this check, or to make it more thorough with `full` value. Default +is `quick`. ## Schema check -The `validate` command will verify that the `tiles` table/view exists, and that it has the expected columns and indexes. It will also verify that the `metadata` table/view exists, and that it has the expected columns and indexes. +The `validate` command will verify that the `tiles` table/view exists, and that it has the expected columns and indexes. +It will also verify that the `metadata` table/view exists, and that it has the expected columns and indexes. ## Per-tile validation -If the `.mbtiles` file uses [flat_with_hash](mbtiles-schema.md#flat-with-hash) or [normalized](mbtiles-schema.md#normalized) schema, the `validate` command will verify that the MD5 hash of the `tile_data` column matches the `tile_hash` or `tile_id` columns (depending on the schema). +If the `.mbtiles` file uses [flat_with_hash](mbtiles-schema.md#flat-with-hash) +or [normalized](mbtiles-schema.md#normalized) schema, the `validate` command will verify that the MD5 hash of +the `tile_data` column matches the `tile_hash` or `tile_id` columns (depending on the schema). -A typical Normalized schema generated by tools like [tilelive-copy](https://github.com/mapbox/TileLive#bintilelive-copy) use MD5 hash in the `tile_id` column. The Martin's `mbtiles` tool can use this hash to verify the content of each tile. We also define a new [flat-with-hash](mbtiles-schema.md#flat-with-hash) schema that stores the hash and tile data in the same table, allowing per-tile validation without the multiple table layout. +A typical Normalized schema generated by tools like [tilelive-copy](https://github.com/mapbox/TileLive#bintilelive-copy) +use MD5 hash in the `tile_id` column. The Martin's `mbtiles` tool can use this hash to verify the content of each tile. +We also define a new [flat-with-hash](mbtiles-schema.md#flat-with-hash) schema that stores the hash and tile data in the +same table, allowing per-tile validation without the multiple table layout. Per-tile validation is not available for the `flat` schema, and will be skipped. ## Aggregate Content Validation -Per-tile validation will catch individual tile corruption, but it will not detect overall datastore corruption such as missing tiles, tiles that should not exist, or tiles with incorrect z/x/y values. For that, the `mbtiles` tool defines a new metadata value called `agg_tiles_hash`. +Per-tile validation will catch individual tile corruption, but it will not detect overall datastore corruption such as +missing tiles, tiles that should not exist, or tiles with incorrect z/x/y values. For that, the `mbtiles` tool defines a +new metadata value called `agg_tiles_hash`. -The value is computed by hashing the combined value for all rows in the `tiles` table/view, ordered by z,x,y. The value is computed using the following SQL expression, which uses a custom `md5_concat_hex` function from [sqlite-hashes crate](https://crates.io/crates/sqlite-hashes): +The value is computed by hashing the combined value for all rows in the `tiles` table/view, ordered by z,x,y. The value +is computed using the following SQL expression, which uses a custom `md5_concat_hex` function +from [sqlite-hashes crate](https://crates.io/crates/sqlite-hashes): ```sql, ignore md5_concat_hex( @@ -36,6 +51,9 @@ md5_concat_hex( tile_data) ``` -In case there are no rows or all are NULL, the hash value of an empty string is used. Note that SQLite allows any value type to be stored as in any column, so if `tile_data` accidentally contains non-blob/text/null value, validation will fail. +In case there are no rows or all are NULL, the hash value of an empty string is used. Note that SQLite allows any value +type to be stored as in any column, so if `tile_data` accidentally contains non-blob/text/null value, validation will +fail. -The `mbtiles` tool will compute `agg_tiles_hash` value when copying or validating mbtiles files. Use `--agg-hash update` to force the value to be updated, even if it is incorrect or does not exist. +The `mbtiles` tool will compute `agg_tiles_hash` value when copying or validating mbtiles files. Use `--agg-hash update` +to force the value to be updated, even if it is incorrect or does not exist. diff --git a/docs/src/quick-start-linux.md b/docs/src/quick-start-linux.md new file mode 100644 index 000000000..093b323b0 --- /dev/null +++ b/docs/src/quick-start-linux.md @@ -0,0 +1,24 @@ +## Quick start on Linux + +```bash +mkdir martin +cd martin + +# Download some sample data +curl -O https://github.com/maplibre/martin/blob/main/tests/fixtures/mbtiles/world_cities.mbtiles + +# Download the latest version of Martin binary, extract it, and make it executable +curl -O https://github.com/maplibre/martin/releases/latest/download/martin-x86_64-unknown-linux-gnu.tar.gz +tar -xzf martin-x86_64-unknown-linux-gnu.tar.gz +chmod +x ./martin + +# Show Martin help screen +./martin --help + +# Run Martin with the sample data as the only tile source +./martin world_cities.mbtiles +``` + +### View the map + +See [quick start with QGIS](quick-start-qgis.md) for instructions on how to view the map. diff --git a/docs/src/quick-start-macos.md b/docs/src/quick-start-macos.md new file mode 100644 index 000000000..921e8a2f4 --- /dev/null +++ b/docs/src/quick-start-macos.md @@ -0,0 +1,27 @@ +## Quick start on macOS + +1. Download some [demo tiles](https://github.com/maplibre/martin/blob/main/tests/fixtures/mbtiles/world_cities.mbtiles). + +2. Download the latest version of Martin from + the [release page](https://github.com/maplibre/martin/releases/latest/download). + Use [about this Mac](https://support.apple.com/en-us/116943) to find your processors type. + * Use [martin-x86_64-apple-darwin.tar.gz](https://github.com/maplibre/martin/releases/latest/download/martin-x86_64-apple-darwin.tar.gz) for Intel + * Use [martin-aarch64-apple-darwin.tar.gz](https://github.com/maplibre/martin/releases/latest/download/martin-aarch64-apple-darwin.tar.gz) for M1 + +3. Extract content of both files and place them in a same directory. + +4. Open the command prompt and navigate to the directory where `martin` and `world_cities.mbtiles` are located. + +5. Run the following command to start Martin with the demo data: + +```bash +# Show Martin help screen +./martin --help + +# Run Martin with the sample data as the only tile source +./martin world_cities.mbtiles +``` + +### View the map + +See [quick start with QGIS](quick-start-qgis.md) for instructions on how to view the map. diff --git a/docs/src/quick-start-qgis.md b/docs/src/quick-start-qgis.md new file mode 100644 index 000000000..8ad2db54b --- /dev/null +++ b/docs/src/quick-start-qgis.md @@ -0,0 +1,17 @@ +### View map with QGIS + +1. Download, install, and run [QGIS](https://qgis.org/en/site/forusers/download.html) for your platform + +2. Add a new `Vector Tiles` connection + > ![alt text](images/qgis_add_vector_tile.png) + +3. In the `Vector Tile Connection` dialog, give it some name and the URL of the Martin server, + e.g. `http://localhost:3000/martin/{z}/{x}/{y}.pbf` and click `OK`. + > ![alt text](images/qgis_add_vector_tile_options.png) + +4. In the QGIS browser panel (left), double-click the newly added connection, or right-click it and click + on `Add Layer to Project`. + > ![alt text](images/qgis_add_to_layers.png) + +5. The map should now be visible in the QGIS map view. + > ![alt text](images/qgis_shows_in_the_map.png) diff --git a/docs/src/quick-start-windows.md b/docs/src/quick-start-windows.md new file mode 100644 index 000000000..af7fa0f5e --- /dev/null +++ b/docs/src/quick-start-windows.md @@ -0,0 +1,24 @@ +## Quick start on Windows + +1. Download some [demo tiles](https://github.com/maplibre/martin/blob/main/tests/fixtures/mbtiles/world_cities.mbtiles). + +2. Download the latest Windows version of Martin from + the [release page](https://github.com/maplibre/martin/releases): []([martin-x86_64-pc-windows-msvc.zip](https://github.com/maplibre/martin/releases/latest/download/martin-x86_64-pc-windows-msvc.zip) + +3. Extract content of both files and place them in a same directory. + +4. Open the command prompt and navigate to the directory where `martin` and `world_cities.mbtiles` are located. + +5. Run the following command to start Martin with the demo data: + +```bash +# Show Martin help screen +martin --help + +# Run Martin with the sample data as the only tile source +martin world_cities.mbtiles +``` + +### View the map + +See [quick start with QGIS](quick-start-qgis.md) for instructions on how to view the map. diff --git a/docs/src/quick-start.md b/docs/src/quick-start.md new file mode 100644 index 000000000..5e35ee51f --- /dev/null +++ b/docs/src/quick-start.md @@ -0,0 +1,7 @@ +## Martin Quick Start Guide + +Choose your operating system to get started with Martin tile server + +* [Linux](quick-start-linux.md) +* [macOS](quick-start-macos.md) +* [Windows](quick-start-windows.md) diff --git a/docs/src/recipes.md b/docs/src/recipes.md index 2c864efeb..423c64b08 100644 --- a/docs/src/recipes.md +++ b/docs/src/recipes.md @@ -2,11 +2,15 @@ ### Using with DigitalOcean PostgreSQL -You can use Martin with [Managed PostgreSQL from DigitalOcean](https://www.digitalocean.com/products/managed-databases-postgresql/) with PostGIS extension +You can use Martin +with [Managed PostgreSQL from DigitalOcean](https://www.digitalocean.com/products/managed-databases-postgresql/) with +PostGIS extension -First, you need to download the CA certificate and get your cluster connection string from the [dashboard](https://cloud.digitalocean.com/databases). After that, you can use the connection string and the CA certificate to connect to the database +First, you need to download the CA certificate and get your cluster connection string from +the [dashboard](https://cloud.digitalocean.com/databases). After that, you can use the connection string and the CA +certificate to connect to the database -```shell +```bash martin --ca-root-file ./ca-certificate.crt \ postgresql://user:password@host:port/db?sslmode=require ``` @@ -15,13 +19,14 @@ martin --ca-root-file ./ca-certificate.crt \ You can use Martin with [Managed PostgreSQL from Heroku](https://www.heroku.com/postgres) with PostGIS extension -```shell +```bash heroku pg:psql -a APP_NAME -c 'create extension postgis' ``` -Use the same environment variables as Heroku [suggests for psql](https://devcenter.heroku.com/articles/heroku-postgres-via-mtls#step-2-configure-environment-variables). +Use the same environment variables as +Heroku [suggests for psql](https://devcenter.heroku.com/articles/heroku-postgres-via-mtls#step-2-configure-environment-variables). -```shell +```bash export DATABASE_URL=$(heroku config:get DATABASE_URL -a APP_NAME) export PGSSLCERT=DIRECTORY/PREFIXpostgresql.crt export PGSSLKEY=DIRECTORY/PREFIXpostgresql.key @@ -32,6 +37,6 @@ martin You may also be able to validate SSL certificate with an explicit sslmode, e.g. -```shell +```bash export DATABASE_URL="$(heroku config:get DATABASE_URL -a APP_NAME)?sslmode=verify-ca" ``` diff --git a/docs/src/run-with-cli.md b/docs/src/run-with-cli.md index 17b16fbaf..fe6ddaf14 100644 --- a/docs/src/run-with-cli.md +++ b/docs/src/run-with-cli.md @@ -3,7 +3,7 @@ You can configure Martin using command-line interface. See `martin --help` or `cargo run -- --help` for more information. -```shell +```text Usage: martin [OPTIONS] [CONNECTION]... Arguments: diff --git a/docs/src/run-with-docker-compose.md b/docs/src/run-with-docker-compose.md index 005f0187e..31a6cd2a6 100644 --- a/docs/src/run-with-docker-compose.md +++ b/docs/src/run-with-docker-compose.md @@ -1,6 +1,7 @@ ## Running with Docker Compose -You can use example [`docker-compose.yml`](https://raw.githubusercontent.com/maplibre/martin/main/docker-compose.yml) file as a reference +You can use example [`docker-compose.yml`](https://raw.githubusercontent.com/maplibre/martin/main/docker-compose.yml) +file as a reference ```yml services: @@ -28,13 +29,13 @@ services: First, you need to start `db` service -```shell +```bash docker compose up -d db ``` Then, after `db` service is ready to accept connections, you can start `martin` -```shell +```bash docker compose up -d martin ``` diff --git a/docs/src/run-with-docker.md b/docs/src/run-with-docker.md index 75ae7e488..ebb5b5421 100644 --- a/docs/src/run-with-docker.md +++ b/docs/src/run-with-docker.md @@ -4,7 +4,7 @@ You can use official Docker image [`ghcr.io/maplibre/martin`](https://ghcr.io/ma ### Using Non-Local PostgreSQL -```shell +```bash docker run \ -p 3000:3000 \ -e DATABASE_URL=postgresql://postgres@postgres.example.org/db \ @@ -15,7 +15,7 @@ docker run \ You can expose local files to the Docker container using the `-v` flag. -```shell +```bash docker run \ -p 3000:3000 \ -v /path/to/local/files:/files \ @@ -24,11 +24,13 @@ docker run \ ### Accessing Local PostgreSQL on Linux -If you are running PostgreSQL instance on `localhost`, you have to change network settings to allow the Docker container to access the `localhost` network. +If you are running PostgreSQL instance on `localhost`, you have to change network settings to allow the Docker container +to access the `localhost` network. -For Linux, add the `--net=host` flag to access the `localhost` PostgreSQL service. You would not need to export ports with `-p` because the container is already using the host network. +For Linux, add the `--net=host` flag to access the `localhost` PostgreSQL service. You would not need to export ports +with `-p` because the container is already using the host network. -```shell +```bash docker run \ --net=host \ -e DATABASE_URL=postgresql://postgres@localhost/db \ @@ -39,7 +41,7 @@ docker run \ For macOS, use `host.docker.internal` as hostname to access the `localhost` PostgreSQL service. -```shell +```bash docker run \ -p 3000:3000 \ -e DATABASE_URL=postgresql://postgres@host.docker.internal/db \ @@ -50,7 +52,7 @@ docker run \ For Windows, use `docker.for.win.localhost` as hostname to access the `localhost` PostgreSQL service. -```shell +```bash docker run \ -p 3000:3000 \ -e DATABASE_URL=postgresql://postgres@docker.for.win.localhost/db \ diff --git a/docs/src/run.md b/docs/src/run.md index 4007b4cd0..829fa1323 100644 --- a/docs/src/run.md +++ b/docs/src/run.md @@ -1,9 +1,12 @@ # Usage -Martin requires at least one PostgreSQL [connection string](pg-connections.md) or a [tile source file](sources-files.md) as a command-line argument. A PG connection string can also be passed via the `DATABASE_URL` environment variable. +Martin requires at least one PostgreSQL [connection string](pg-connections.md) or a [tile source file](sources-files.md) +as a command-line argument. A PG connection string can also be passed via the `DATABASE_URL` environment variable. -```shell +```bash martin postgresql://postgres@localhost/db ``` -Martin provides [TileJSON](https://github.com/mapbox/tilejson-spec) endpoint for each [geospatial-enabled](https://postgis.net/docs/using_postgis_dbmanagement.html#geometry_columns) table in your database. +Martin provides [TileJSON](https://github.com/mapbox/tilejson-spec) endpoint for +each [geospatial-enabled](https://postgis.net/docs/using_postgis_dbmanagement.html#geometry_columns) table in your +database. diff --git a/docs/src/sources-composite.md b/docs/src/sources-composite.md index 255b5caf0..68769b470 100644 --- a/docs/src/sources-composite.md +++ b/docs/src/sources-composite.md @@ -1,14 +1,16 @@ ## Composite Sources -Composite Sources allows combining multiple sources into one. Composite Source consists of multiple sources separated by comma `{source1},...,{sourceN}` +Composite Sources allows combining multiple sources into one. Composite Source consists of multiple sources separated by +comma `{source1},...,{sourceN}` Each source in a composite source can be accessed with its `{source_name}` as a `source-layer` property. -Composite source [TileJSON](https://github.com/mapbox/tilejson-spec) endpoint is available at `/{source1},...,{sourceN}`, and tiles are available at `/{source1},...,{sourceN}/{z}/{x}/{y}`. +Composite source [TileJSON](https://github.com/mapbox/tilejson-spec) endpoint is available +at `/{source1},...,{sourceN}`, and tiles are available at `/{source1},...,{sourceN}/{z}/{x}/{y}`. For example, composite source combining `points` and `lines` sources will be available at `/points,lines/{z}/{x}/{y}` -```shell +```bash # TileJSON curl localhost:3000/points,lines diff --git a/docs/src/sources-files.md b/docs/src/sources-files.md index 658453c2e..c755794f5 100644 --- a/docs/src/sources-files.md +++ b/docs/src/sources-files.md @@ -1,9 +1,12 @@ ## MBTiles and PMTiles File Sources -Martin can serve any type of tiles from [PMTile](https://protomaps.com/blog/pmtiles-v3-whats-new) and [MBTile](https://github.com/mapbox/mbtiles-spec) files. To serve a file from CLI, simply put the path to the file or the directory with `*.mbtiles` or `*.pmtiles` files. A path to PMTiles file may be a URL. For example: +Martin can serve any type of tiles from [PMTile](https://protomaps.com/blog/pmtiles-v3-whats-new) +and [MBTile](https://github.com/mapbox/mbtiles-spec) files. To serve a file from CLI, simply put the path to the file or +the directory with `*.mbtiles` or `*.pmtiles` files. A path to PMTiles file may be a URL. For example: -```shell +```bash martin /path/to/mbtiles/file.mbtiles /path/to/directory https://example.org/path/tiles.pmtiles ``` -You may also want to generate a [config file](config-file.md) using the `--save-config my-config.yaml`, and later edit it and use it with `--config my-config.yaml` option. +You may also want to generate a [config file](config-file.md) using the `--save-config my-config.yaml`, and later edit +it and use it with `--config my-config.yaml` option. diff --git a/docs/src/sources-fonts.md b/docs/src/sources-fonts.md index 21095ca8e..a223eb06e 100644 --- a/docs/src/sources-fonts.md +++ b/docs/src/sources-fonts.md @@ -1,11 +1,14 @@ ## Font Sources -Martin can serve glyph ranges from `otf`, `ttf`, and `ttc` fonts as needed by MapLibre text rendering. Martin will generate them dynamically on the fly. +Martin can serve glyph ranges from `otf`, `ttf`, and `ttc` fonts as needed by MapLibre text rendering. Martin will +generate them dynamically on the fly. The glyph range generation is not yet cached, and may require external reverse proxy or CDN for faster operation. ## API -Fonts ranges are available either for a single font, or a combination of multiple fonts. The font names are case-sensitive and should match the font name in the font file as published in the catalog. Make sure to URL-escape font names as they usually contain spaces. +Fonts ranges are available either for a single font, or a combination of multiple fonts. The font names are +case-sensitive and should match the font name in the font file as published in the catalog. Make sure to URL-escape font +names as they usually contain spaces. | | Font Request | |---------|--------------------------------------| @@ -14,7 +17,9 @@ Fonts ranges are available either for a single font, or a combination of multipl ### Composite Font Request -When combining multiple fonts, the glyph range will contain glyphs from the first listed font if available, and fallback to the next font if the glyph is not available in the first font, etc. The glyph range will be empty if none of the fonts contain the glyph. +When combining multiple fonts, the glyph range will contain glyphs from the first listed font if available, and fallback +to the next font if the glyph is not available in the first font, etc. The glyph range will be empty if none of the +fonts contain the glyph. | | Composite Font Request with fallbacks | |---------|--------------------------------------------------------------| @@ -25,7 +30,7 @@ When combining multiple fonts, the glyph range will contain glyphs from the firs Martin will show all available fonts at the `/catalog` endpoint. -```shell +```bash curl http://127.0.0.1:3000/catalog { "fonts": { @@ -58,7 +63,7 @@ curl http://127.0.0.1:3000/catalog A font file or directory can be configured from the [CLI](run-with-cli.md) with one or more `--font` parameters. -```shell +```bash martin --font /path/to/font/file.ttf --font /path/to/font_dir ``` diff --git a/docs/src/sources-pg-functions.md b/docs/src/sources-pg-functions.md index 1dfa95536..3578c6ebb 100644 --- a/docs/src/sources-pg-functions.md +++ b/docs/src/sources-pg-functions.md @@ -1,6 +1,11 @@ ## PostgreSQL Function Sources -Function Source is a database function which can be used to query [vector tiles](https://github.com/mapbox/vector-tile-spec). When started, Martin will look for the functions with a suitable signature. A function that takes `z integer` (or `zoom integer`), `x integer`, `y integer`, and an optional `query json` and returns `bytea`, can be used as a Function Source. Alternatively the function could return a record with a single `bytea` field, or a record with two fields of types `bytea` and `text`, where the `text` field is an etag key (i.e. md5 hash). +Function Source is a database function which can be used to +query [vector tiles](https://github.com/mapbox/vector-tile-spec). When started, Martin will look for the functions with +a suitable signature. A function that takes `z integer` (or `zoom integer`), `x integer`, `y integer`, and an +optional `query json` and returns `bytea`, can be used as a Function Source. Alternatively the function could return a +record with a single `bytea` field, or a record with two fields of types `bytea` and `text`, where the `text` field is +an etag key (i.e. md5 hash). | Argument | Type | Description | |----------------------------|---------|-------------------------| @@ -11,7 +16,8 @@ Function Source is a database function which can be used to query [vector tiles] ### Simple Function -For example, if you have a table `table_source` in WGS84 (`4326` SRID), then you can use this function as a Function Source: +For example, if you have a table `table_source` in WGS84 (`4326` SRID), then you can use this function as a Function +Source: ```sql, ignore CREATE OR REPLACE @@ -63,15 +69,18 @@ END $$ LANGUAGE plpgsql IMMUTABLE STRICT PARALLEL SAFE; ``` -The `query_params` argument is a JSON representation of the tile request query params. Query params could be passed as simple query values, e.g. +The `query_params` argument is a JSON representation of the tile request query params. Query params could be passed as +simple query values, e.g. -```shell +```bash curl localhost:3000/function_zxy_query/0/0/0?token=martin ``` -You can also use [urlencoded](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent) params to encode complex values: +You can also +use [urlencoded](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent) +params to encode complex values: -```shell +```bash curl \ --data-urlencode 'arrayParam=[1, 2, 3]' \ --data-urlencode 'numberParam=42' \ @@ -101,7 +110,11 @@ You can access this params using [json operators](https://www.postgresql.org/doc ### Modifying TileJSON -Martin will automatically generate a basic [TileJSON](https://github.com/mapbox/tilejson-spec) manifest for each function source that will contain the name and description of the function, plus optionally `minzoom`, `maxzoom`, and `bounds` (if they were specified via one of the configuration methods). For example, if there is a function `public.function_zxy_query_jsonb`, the default `TileJSON` might look like this (note that URL will be automatically adjusted to match the request host): +Martin will automatically generate a basic [TileJSON](https://github.com/mapbox/tilejson-spec) manifest for each +function source that will contain the name and description of the function, plus optionally `minzoom`, `maxzoom`, +and `bounds` (if they were specified via one of the configuration methods). For example, if there is a +function `public.function_zxy_query_jsonb`, the default `TileJSON` might look like this (note that URL will be +automatically adjusted to match the request host): ```json { @@ -116,9 +129,12 @@ Martin will automatically generate a basic [TileJSON](https://github.com/mapbox/ #### TileJSON in SQL Comments -To modify automatically generated `TileJSON`, you can add a valid JSON as an SQL comment on the function. Martin will merge function comment into the generated `TileJSON` using [JSON Merge patch](https://www.rfc-editor.org/rfc/rfc7386). The following example adds `attribution` and `version` fields to the `TileJSON`. +To modify automatically generated `TileJSON`, you can add a valid JSON as an SQL comment on the function. Martin will +merge function comment into the generated `TileJSON` using [JSON Merge patch](https://www.rfc-editor.org/rfc/rfc7386). +The following example adds `attribution` and `version` fields to the `TileJSON`. -**Note:** This example uses `EXECUTE` to ensure that the comment is a valid JSON (or else PostgreSQL will throw an error). You can use other methods of creating SQL comments. +**Note:** This example uses `EXECUTE` to ensure that the comment is a valid JSON (or else PostgreSQL will throw an +error). You can use other methods of creating SQL comments. ```sql DO $do$ BEGIN diff --git a/docs/src/sources-sprites.md b/docs/src/sources-sprites.md index 809e87092..298b011ea 100644 --- a/docs/src/sources-sprites.md +++ b/docs/src/sources-sprites.md @@ -1,20 +1,28 @@ ## Sprite Sources -Given a directory with SVG images, Martin will generate a sprite -- a JSON index and a PNG image, for both low and high resolution displays. The SVG filenames without extension will be used as the sprite image IDs. The images are searched recursively in the given directory, so subdirectory names will be used as prefixes for the image IDs, e.g. `icons/bicycle.svg` will be available as `icons/bicycle` sprite image. The sprite generation is not yet cached, and may require external reverse proxy or CDN for faster operation. +Given a directory with SVG images, Martin will generate a sprite -- a JSON index and a PNG image, for both low and high +resolution displays. The SVG filenames without extension will be used as the sprite image IDs. The images are searched +recursively in the given directory, so subdirectory names will be used as prefixes for the image IDs, +e.g. `icons/bicycle.svg` will be available as `icons/bicycle` sprite image. The sprite generation is not yet cached, and +may require external reverse proxy or CDN for faster operation. ### API -Martin uses [MapLibre sprites API](https://maplibre.org/maplibre-style-spec/sprite/) specification to serve sprites via several endpoints. The sprite image and index are generated on the fly, so if the sprite directory is updated, the changes will be reflected immediately. +Martin uses [MapLibre sprites API](https://maplibre.org/maplibre-style-spec/sprite/) specification to serve sprites via +several endpoints. The sprite image and index are generated on the fly, so if the sprite directory is updated, the +changes will be reflected immediately. ##### Sprite PNG ![sprite](sources-sprites.png) -`GET /sprite/.png` endpoint contains a single PNG sprite image that combines all sources images. Additionally, there is a high DPI version available at `GET /sprite/@2x.png`. +`GET /sprite/.png` endpoint contains a single PNG sprite image that combines all sources images. +Additionally, there is a high DPI version available at `GET /sprite/@2x.png`. ##### Sprite index -`/sprite/.json` metadata index describing the position and size of each image inside the sprite. Just like the PNG, there is a high DPI version available at `/sprite/@2x.json`. +`/sprite/.json` metadata index describing the position and size of each image inside the sprite. Just like +the PNG, there is a high DPI version available at `/sprite/@2x.json`. ```json { @@ -31,19 +39,25 @@ Martin uses [MapLibre sprites API](https://maplibre.org/maplibre-style-spec/spri #### Combining Multiple Sprites -Multiple sprite_id values can be combined into one sprite with the same pattern as for tile joining: `/sprite/,,...,`. No ID renaming is done, so identical sprite names will override one another. +Multiple sprite_id values can be combined into one sprite with the same pattern as for tile +joining: `/sprite/,,...,`. No ID renaming is done, so identical sprite names will +override one another. ### Configuring from CLI -A sprite directory can be configured from the CLI with the `--sprite` flag. The flag can be used multiple times to configure multiple sprite directories. The name of the sprite will be the name of the directory -- in the example below, the sprites will be available at `/sprite/sprite_a` and `/sprite/sprite_b`. Use `--save-config` to save the configuration to the config file. +A sprite directory can be configured from the CLI with the `--sprite` flag. The flag can be used multiple times to +configure multiple sprite directories. The name of the sprite will be the name of the directory -- in the example below, +the sprites will be available at `/sprite/sprite_a` and `/sprite/sprite_b`. Use `--save-config` to save the +configuration to the config file. -```shell +```bash martin --sprite /path/to/sprite_a --sprite /path/to/other/sprite_b ``` ### Configuring with Config File -A sprite directory can be configured from the config file with the `sprite` key, similar to how [MBTiles and PMTiles](config-file.md) are configured. +A sprite directory can be configured from the config file with the `sprite` key, similar to +how [MBTiles and PMTiles](config-file.md) are configured. ```yaml # Sprite configuration diff --git a/docs/src/troubleshooting.md b/docs/src/troubleshooting.md index 0c46f4478..9800c2df8 100644 --- a/docs/src/troubleshooting.md +++ b/docs/src/troubleshooting.md @@ -1,17 +1,20 @@ ## Troubleshooting -Log levels are controlled on a per-module basis, and by default all logging is disabled except for errors. Logging is controlled via the `RUST_LOG` environment variable. The value of this environment variable is a comma-separated list of logging directives. +Log levels are controlled on a per-module basis, and by default all logging is disabled except for errors. Logging is +controlled via the `RUST_LOG` environment variable. The value of this environment variable is a comma-separated list of +logging directives. This will enable debug logging for all modules: -```shell +```bash export RUST_LOG=debug martin postgresql://postgres@localhost/db ``` -While this will only enable verbose logging for the `actix_web` module and enable debug logging for the `martin` and `tokio_postgres` modules: +While this will only enable verbose logging for the `actix_web` module and enable debug logging for the `martin` +and `tokio_postgres` modules: -```shell +```bash export RUST_LOG=actix_web=info,martin=debug,tokio_postgres=debug martin postgresql://postgres@localhost/db ``` diff --git a/docs/src/using.md b/docs/src/using.md index 2d854b23f..2d8c3c537 100644 --- a/docs/src/using.md +++ b/docs/src/using.md @@ -17,11 +17,14 @@ Martin data is available via the HTTP `GET` endpoints: ### Duplicate Source ID -In case there is more than one source that has the same name, e.g. a PG function is available in two schemas/connections, or a table has more than one geometry columns, sources will be assigned unique IDs such as `/points`, `/points.1`, etc. +In case there is more than one source that has the same name, e.g. a PG function is available in two +schemas/connections, or a table has more than one geometry columns, sources will be assigned unique IDs such +as `/points`, `/points.1`, etc. ### Reserved Source IDs -Some source IDs are reserved for internal use. If you try to use them, they will be automatically renamed to a unique ID the same way as duplicate source IDs are handled, e.g. a `catalog` source will become `catalog.1`. +Some source IDs are reserved for internal use. If you try to use them, they will be automatically renamed to a unique ID +the same way as duplicate source IDs are handled, e.g. a `catalog` source will become `catalog.1`. Some of the reserved IDs: `_`, `catalog`, `config`, `font`, `health`, `help`, `index`, `manifest`, `metrics`, `refresh`, `reload`, `sprite`, `status`. @@ -30,7 +33,7 @@ Some of the reserved IDs: `_`, `catalog`, `config`, `font`, `health`, `help`, `i A list of all available sources is available via catalogue endpoint: -```shell +```bash curl localhost:3000/catalog | jq ``` @@ -73,9 +76,10 @@ curl localhost:3000/catalog | jq All tile sources have a [TileJSON](https://github.com/mapbox/tilejson-spec) endpoint available at the `/{SourceID}`. -For example, a `points` function or a table will be available as `/points`. Composite source combining `points` and `lines` sources will be available at `/points,lines` endpoint. +For example, a `points` function or a table will be available as `/points`. Composite source combining `points` +and `lines` sources will be available at `/points,lines` endpoint. -```shell +```bash curl localhost:3000/points | jq curl localhost:3000/points,lines | jq ``` From 030beb8b1c2f98cb0cbaf85c50298badf45ca42d Mon Sep 17 00:00:00 2001 From: Yuri Astrakhan Date: Sun, 26 May 2024 07:30:47 -0400 Subject: [PATCH 003/215] temporary remove link to the book to pass CI --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 47338b2f8..c01c365f6 100755 --- a/README.md +++ b/README.md @@ -24,7 +24,6 @@ into one. Martin optimizes for speed and heavy traffic, and is written in [Rust] ### Documentation -* [Quick Start](https://maplibre.org/martin/quick-start.html) * [Installation](https://maplibre.org/martin/installation.html) * Running with [CLI](https://maplibre.org/martin/run-with-cli.html) or [configuration file](https://maplibre.org/martin/config-file.html) From 15a5402e552a8c0da55577c5999aa0e8bc824940 Mon Sep 17 00:00:00 2001 From: Yuri Astrakhan Date: Sun, 26 May 2024 07:40:52 -0400 Subject: [PATCH 004/215] fix docs download link --- docs/src/quick-start-windows.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/quick-start-windows.md b/docs/src/quick-start-windows.md index af7fa0f5e..e66fafbf3 100644 --- a/docs/src/quick-start-windows.md +++ b/docs/src/quick-start-windows.md @@ -3,7 +3,7 @@ 1. Download some [demo tiles](https://github.com/maplibre/martin/blob/main/tests/fixtures/mbtiles/world_cities.mbtiles). 2. Download the latest Windows version of Martin from - the [release page](https://github.com/maplibre/martin/releases): []([martin-x86_64-pc-windows-msvc.zip](https://github.com/maplibre/martin/releases/latest/download/martin-x86_64-pc-windows-msvc.zip) + the [release page](https://github.com/maplibre/martin/releases): [martin-x86_64-pc-windows-msvc.zip](https://github.com/maplibre/martin/releases/latest/download/martin-x86_64-pc-windows-msvc.zip) 3. Extract content of both files and place them in a same directory. From fbb1a86b24331cfc5514302df779f7b9b777c6ec Mon Sep 17 00:00:00 2001 From: Yuri Astrakhan Date: Sun, 26 May 2024 07:43:36 -0400 Subject: [PATCH 005/215] fix docs download link2 --- docs/src/quick-start-macos.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/quick-start-macos.md b/docs/src/quick-start-macos.md index 921e8a2f4..5da4c70a2 100644 --- a/docs/src/quick-start-macos.md +++ b/docs/src/quick-start-macos.md @@ -3,7 +3,7 @@ 1. Download some [demo tiles](https://github.com/maplibre/martin/blob/main/tests/fixtures/mbtiles/world_cities.mbtiles). 2. Download the latest version of Martin from - the [release page](https://github.com/maplibre/martin/releases/latest/download). + the [release page](https://github.com/maplibre/martin/releases/latest). Use [about this Mac](https://support.apple.com/en-us/116943) to find your processors type. * Use [martin-x86_64-apple-darwin.tar.gz](https://github.com/maplibre/martin/releases/latest/download/martin-x86_64-apple-darwin.tar.gz) for Intel * Use [martin-aarch64-apple-darwin.tar.gz](https://github.com/maplibre/martin/releases/latest/download/martin-aarch64-apple-darwin.tar.gz) for M1 From c33c7e1faa3a620947147f43e03ad1bf302a445e Mon Sep 17 00:00:00 2001 From: Yuri Astrakhan Date: Sun, 26 May 2024 07:46:51 -0400 Subject: [PATCH 006/215] re-add quick start to readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index c01c365f6..47338b2f8 100755 --- a/README.md +++ b/README.md @@ -24,6 +24,7 @@ into one. Martin optimizes for speed and heavy traffic, and is written in [Rust] ### Documentation +* [Quick Start](https://maplibre.org/martin/quick-start.html) * [Installation](https://maplibre.org/martin/installation.html) * Running with [CLI](https://maplibre.org/martin/run-with-cli.html) or [configuration file](https://maplibre.org/martin/config-file.html) From 8c82423fc36c60df26b58b692752a8a3670f8a8f Mon Sep 17 00:00:00 2001 From: Yuri Astrakhan Date: Sun, 26 May 2024 08:06:15 -0400 Subject: [PATCH 007/215] Minor readme improvements --- README.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 47338b2f8..78d788682 100755 --- a/README.md +++ b/README.md @@ -8,21 +8,21 @@ [![Security audit](https://github.com/maplibre/martin/workflows/Security%20audit/badge.svg)](https://github.com/maplibre/martin/security) [![CI build](https://github.com/maplibre/martin/actions/workflows/ci.yml/badge.svg)](https://github.com/maplibre/martin/actions) -Martin is a tile server able to generate and serve [vector tiles](https://github.com/mapbox/vector-tile-spec) on the fly -from large [PostGIS](https://github.com/postgis/postgis) -databases, [PMTile](https://protomaps.com/blog/pmtiles-v3-whats-new) (local or remote), -and [MBTile](https://github.com/mapbox/mbtiles-spec) files, allowing multiple tile sources to be dynamically combined -into one. Martin optimizes for speed and heavy traffic, and is written in [Rust](https://github.com/rust-lang/rust). +Martin is a tile server and a set of tools able to generate vector tiles on the fly +from large PostgreSQL databases, and serve tiles from PMTiles and MBTiles files. Martin optimizes for speed and heavy traffic, and is written in [Rust](https://github.com/rust-lang/rust). -### Features +## Features -* Serve vector tiles from PostGIS, PMTile, and MBTile sources -* [Combine](https://maplibre.org/martin/sources-composite.html) multiple tile sources +* Serve [vector tiles](https://github.com/mapbox/vector-tile-spec) from + * [PostGIS](https://github.com/postgis/postgis) databases, automatically discovering compatible tables and functions + * [PMTile](https://protomaps.com/blog/pmtiles-v3-whats-new), both local files and over HTTP + * [MBTile](https://github.com/mapbox/mbtiles-spec) files +* [Combine](https://maplibre.org/martin/sources-composite.html) multiple tile sources into one * Generate [sprites](https://maplibre.org/martin/sources-sprites.html) and [font glyphs](https://maplibre.org/martin/sources-fonts.html) -* Generate tiles in bulk from any Martin-supported sources into an `.mbtiles` file with [martin-cp](https://maplibre.org/martin/martin-cp.html) tool -* Examine, copy, validate, compare, and apply diffs between `.mbtiles` files with [mbtiles](https://maplibre.org/martin/tools.html#mbtiles) tool +* Generate tiles in bulk from any Martin-supported sources into an MBTiles file with [martin-cp](https://maplibre.org/martin/martin-cp.html) tool +* Examine, copy, validate, compare, and apply diffs between MBTiles files with [mbtiles](https://maplibre.org/martin/tools.html#mbtiles) tool -### Documentation +## Documentation * [Quick Start](https://maplibre.org/martin/quick-start.html) * [Installation](https://maplibre.org/martin/installation.html) From c49648ca18e98ff1ffd860502659777aadbd33b8 Mon Sep 17 00:00:00 2001 From: Yuri Astrakhan Date: Sun, 26 May 2024 12:27:47 -0400 Subject: [PATCH 008/215] add application_name to PG connection (#1325) --- martin/src/pg/tls.rs | 6 +++++- martin/src/srv/server.rs | 2 +- martin/src/srv/tiles.rs | 4 ++-- martin/src/srv/tiles_info.rs | 2 +- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/martin/src/pg/tls.rs b/martin/src/pg/tls.rs index f397393ba..894373c06 100644 --- a/martin/src/pg/tls.rs +++ b/martin/src/pg/tls.rs @@ -50,10 +50,14 @@ pub fn parse_conn_str(conn_str: &str) -> PgResult<(Config, SslModeOverride)> { } else { Config::from_str(conn_str) }; - let pg_cfg = pg_cfg.map_err(|e| BadConnectionString(e, conn_str.to_string()))?; + let mut pg_cfg = pg_cfg.map_err(|e| BadConnectionString(e, conn_str.to_string()))?; if let SslModeOverride::Unmodified(_) = mode { mode = SslModeOverride::Unmodified(pg_cfg.get_ssl_mode()); } + let crate_ver = env!("CARGO_PKG_VERSION"); + if pg_cfg.get_application_name().is_none() { + pg_cfg.application_name(&format!("Martin v{crate_ver} - pid={}", std::process::id())); + } Ok((pg_cfg, mode)) } diff --git a/martin/src/srv/server.rs b/martin/src/srv/server.rs index c187662e7..80f11bf24 100755 --- a/martin/src/srv/server.rs +++ b/martin/src/srv/server.rs @@ -113,7 +113,7 @@ pub fn new_server(config: SrvConfig, state: ServerState) -> MartinResult<(Server let listen_addresses = config .listen_addresses .clone() - .unwrap_or_else(|| LISTEN_ADDRESSES_DEFAULT.to_owned()); + .unwrap_or_else(|| LISTEN_ADDRESSES_DEFAULT.to_string()); let factory = move || { let cors_middleware = Cors::default() diff --git a/martin/src/srv/tiles.rs b/martin/src/srv/tiles.rs index a90c2c53f..d79cdc467 100755 --- a/martin/src/srv/tiles.rs +++ b/martin/src/srv/tiles.rs @@ -133,9 +133,9 @@ impl<'a> DynTileSource<'a> { CacheValue::Tile, s.get_tile(xyz, self.query_obj.as_ref()), { - let id = s.get_id().to_owned(); + let id = s.get_id().to_string(); if let Some(query_str) = self.query_str { - CacheKey::TileWithQuery(id, xyz, query_str.to_owned()) + CacheKey::TileWithQuery(id, xyz, query_str.to_string()) } else { CacheKey::Tile(id, xyz) } diff --git a/martin/src/srv/tiles_info.rs b/martin/src/srv/tiles_info.rs index 049a27c44..a93313808 100755 --- a/martin/src/srv/tiles_info.rs +++ b/martin/src/srv/tiles_info.rs @@ -38,7 +38,7 @@ async fn get_source_info( .get("x-rewrite-url") .and_then(|v| v.to_str().ok()) .and_then(|v| v.parse::().ok()) - .map_or_else(|| req.path().to_owned(), |v| v.path().to_owned()) + .map_or_else(|| req.path().to_string(), |v| v.path().to_string()) }; let query_string = req.query_string(); From bb8db5dfcc0d1b8c51875469d2f28004e8121d92 Mon Sep 17 00:00:00 2001 From: Yuri Astrakhan Date: Sun, 26 May 2024 12:33:22 -0400 Subject: [PATCH 009/215] format README --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 78d788682..f984a79c1 100755 --- a/README.md +++ b/README.md @@ -14,9 +14,9 @@ from large PostgreSQL databases, and serve tiles from PMTiles and MBTiles files. ## Features * Serve [vector tiles](https://github.com/mapbox/vector-tile-spec) from - * [PostGIS](https://github.com/postgis/postgis) databases, automatically discovering compatible tables and functions - * [PMTile](https://protomaps.com/blog/pmtiles-v3-whats-new), both local files and over HTTP - * [MBTile](https://github.com/mapbox/mbtiles-spec) files + * [PostGIS](https://github.com/postgis/postgis) databases, automatically discovering compatible tables and functions + * [PMTile](https://protomaps.com/blog/pmtiles-v3-whats-new), both local files and over HTTP + * [MBTile](https://github.com/mapbox/mbtiles-spec) files * [Combine](https://maplibre.org/martin/sources-composite.html) multiple tile sources into one * Generate [sprites](https://maplibre.org/martin/sources-sprites.html) and [font glyphs](https://maplibre.org/martin/sources-fonts.html) * Generate tiles in bulk from any Martin-supported sources into an MBTiles file with [martin-cp](https://maplibre.org/martin/martin-cp.html) tool From 73909f2e201824d730aa088e7e96820f6e951f0b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 May 2024 02:16:08 +0000 Subject: [PATCH 010/215] chore(deps): Bump serde from 1.0.202 to 1.0.203 (#1354) Bumps [serde](https://github.com/serde-rs/serde) from 1.0.202 to 1.0.203.
Release notes

Sourced from serde's releases.

v1.0.203

  • Documentation improvements (#2747)
Commits
  • d5bc546 Release 1.0.203
  • 45ae217 Merge pull request #2747 from dtolnay/variadic
  • b7b97dd Unindent implementation inside tuple_impl_body macro
  • 5d3c563 Document tuple impls as fake variadic
  • 3761854 Merge pull request #2745 from dtolnay/docsrs
  • a8f1484 Rely on docs.rs to define --cfg=docsrs by default
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=serde&package-manager=cargo&previous-version=1.0.202&new-version=1.0.203)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 37dfa0fac..adee409be 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3719,18 +3719,18 @@ checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" -version = "1.0.202" +version = "1.0.203" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "226b61a0d411b2ba5ff6d7f73a476ac4f8bb900373459cd00fab8512828ba395" +checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.202" +version = "1.0.203" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6048858004bcff69094cd972ed40a32500f153bd3be9f716b2eed2e8217c4838" +checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" dependencies = [ "proc-macro2", "quote", From e4228fb77c644d4d24f36a3af1748440840c8571 Mon Sep 17 00:00:00 2001 From: Yuri Astrakhan Date: Tue, 28 May 2024 22:13:51 -0400 Subject: [PATCH 011/215] Fix preferred encoding computation (#1355) * Decides which encoding to use depending on both `Accept-Encode` and the preferred encoding (chooses the preferred one in case brotli and gzip have the same q value) * Uses `gzip` by default This will fix #1315 --- martin/src/srv/tiles.rs | 69 ++++++++++++++++++++++++++-------- martin/tests/mb_server_test.rs | 10 ++--- 2 files changed, 58 insertions(+), 21 deletions(-) diff --git a/martin/src/srv/tiles.rs b/martin/src/srv/tiles.rs index d79cdc467..fe592180a 100755 --- a/martin/src/srv/tiles.rs +++ b/martin/src/srv/tiles.rs @@ -1,5 +1,6 @@ +use actix_http::header::Quality; use actix_http::ContentEncoding; -use actix_web::error::{ErrorBadRequest, ErrorNotFound}; +use actix_web::error::{ErrorBadRequest, ErrorNotAcceptable, ErrorNotFound}; use actix_web::http::header::{ AcceptEncoding, Encoding as HeaderEnc, Preference, CONTENT_ENCODING, }; @@ -21,13 +22,7 @@ use crate::utils::{ }; use crate::{Tile, TileCoord, TileData}; -static PREFER_BROTLI_ENC: &[HeaderEnc] = &[ - HeaderEnc::brotli(), - HeaderEnc::gzip(), - HeaderEnc::identity(), -]; - -static PREFER_GZIP_ENC: &[HeaderEnc] = &[ +static SUPPORTED_ENC: &[HeaderEnc] = &[ HeaderEnc::gzip(), HeaderEnc::brotli(), HeaderEnc::identity(), @@ -180,6 +175,49 @@ impl<'a> DynTileSource<'a> { self.recompress(data) } + /// Decide which encoding to use for the uncompressed tile data, based on the client's Accept-Encoding header + fn decide_encoding(&self, accept_enc: &AcceptEncoding) -> ActixResult> { + let mut q_gzip = None; + let mut q_brotli = None; + for enc in accept_enc.iter() { + if let Preference::Specific(HeaderEnc::Known(e)) = enc.item { + match e { + ContentEncoding::Gzip => q_gzip = Some(enc.quality), + ContentEncoding::Brotli => q_brotli = Some(enc.quality), + _ => {} + } + } else if let Preference::Any = enc.item { + q_gzip.get_or_insert(enc.quality); + q_brotli.get_or_insert(enc.quality); + } + } + Ok(match (q_gzip, q_brotli) { + (Some(q_gzip), Some(q_brotli)) if q_gzip == q_brotli => { + if q_gzip > Quality::ZERO { + Some(self.get_preferred_enc()) + } else { + None + } + } + (Some(q_gzip), Some(q_brotli)) if q_brotli > q_gzip => Some(ContentEncoding::Brotli), + (Some(_), Some(_)) => Some(ContentEncoding::Gzip), + _ => { + if let Some(HeaderEnc::Known(enc)) = accept_enc.negotiate(SUPPORTED_ENC.iter()) { + Some(enc) + } else { + return Err(ErrorNotAcceptable("No supported encoding found")); + } + } + }) + } + + fn get_preferred_enc(&self) -> ContentEncoding { + match self.preferred_enc { + None | Some(PreferredEncoding::Gzip) => ContentEncoding::Gzip, + Some(PreferredEncoding::Brotli) => ContentEncoding::Brotli, + } + } + fn recompress(&self, tile: TileData) -> ActixResult { let mut tile = Tile::new(tile, self.info); if let Some(accept_enc) = &self.accept_enc { @@ -198,18 +236,12 @@ impl<'a> DynTileSource<'a> { } if tile.info.encoding == Encoding::Uncompressed { - let ordered_encodings = match self.preferred_enc { - Some(PreferredEncoding::Gzip) | None => PREFER_GZIP_ENC, - Some(PreferredEncoding::Brotli) => PREFER_BROTLI_ENC, - }; - - // only apply compression if the content supports it - if let Some(HeaderEnc::Known(enc)) = accept_enc.negotiate(ordered_encodings.iter()) - { + if let Some(enc) = self.decide_encoding(accept_enc)? { // (re-)compress the tile into the preferred encoding tile = encode(tile, enc)?; } } + Ok(tile) } else { // no accepted-encoding header, decode the tile if compressed @@ -270,6 +302,11 @@ mod tests { use super::*; use crate::srv::server::tests::TestSource; + #[actix_rt::test] + async fn test_deleteme() { + test_enc_preference(&["gzip", "deflate", "br", "zstd"], None, Encoding::Gzip).await; + } + #[rstest] #[trace] #[case(&["gzip", "deflate", "br", "zstd"], None, Encoding::Gzip)] diff --git a/martin/tests/mb_server_test.rs b/martin/tests/mb_server_test.rs index 9af72bc9a..95bb70746 100644 --- a/martin/tests/mb_server_test.rs +++ b/martin/tests/mb_server_test.rs @@ -3,8 +3,8 @@ use actix_web::test::{call_service, read_body, read_body_json, TestRequest}; use ctor::ctor; use indoc::indoc; use insta::assert_yaml_snapshot; -use martin::decode_gzip; use martin::srv::SrvConfig; +use martin::{decode_brotli, decode_gzip}; use tilejson::TileJSON; pub mod utils; @@ -211,7 +211,7 @@ async fn mbt_get_mvt_brotli() { assert_eq!(response.headers().get(CONTENT_ENCODING).unwrap(), "br"); let body = read_body(response).await; assert_eq!(body.len(), 871); // this number could change if compression gets more optimized - let body = martin::decode_brotli(&body).unwrap(); + let body = decode_brotli(&body).unwrap(); assert_eq!(body.len(), 1828); } @@ -267,10 +267,10 @@ async fn mbt_get_raw_mvt_gzip_br() { response.headers().get(CONTENT_TYPE).unwrap(), "application/x-protobuf" ); - assert_eq!(response.headers().get(CONTENT_ENCODING).unwrap(), "br"); + assert_eq!(response.headers().get(CONTENT_ENCODING).unwrap(), "gzip"); let body = read_body(response).await; - assert_eq!(body.len(), 871); // this number could change if compression gets more optimized - let body = martin::decode_brotli(&body).unwrap(); + assert_eq!(body.len(), 1107); // this number could change if compression gets more optimized + let body = decode_gzip(&body).unwrap(); assert_eq!(body.len(), 1828); } From f3bc6b7aeb5ef52dc87512116b429d732c27befb Mon Sep 17 00:00:00 2001 From: Yuri Astrakhan Date: Wed, 29 May 2024 12:19:32 -0400 Subject: [PATCH 012/215] Use actions/upload-artifact@v4 --- .github/workflows/ci.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 444a6f8dc..a01da0d09 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -152,7 +152,7 @@ jobs: done - name: Save build artifacts to build-${{ matrix.target }} - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: cross-build path: target_releases/* @@ -287,7 +287,7 @@ jobs: mv target/${{ matrix.target }}/release/martin-cp${{ matrix.ext }} target_releases/ mv target/${{ matrix.target }}/release/mbtiles${{ matrix.ext }} target_releases/ - name: Save build artifacts to build-${{ matrix.target }} - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: build-${{ matrix.target }} path: target_releases/* @@ -383,7 +383,7 @@ jobs: DATABASE_URL: ${{ steps.pg.outputs.connection-uri }} - name: Save test output (on error) if: failure() - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: failed-test-output-${{ runner.os }} path: | @@ -517,7 +517,7 @@ jobs: DATABASE_URL: postgres://${{ env.PGUSER }}:${{ env.PGUSER }}@${{ env.PGHOST }}:${{ job.services.postgres.ports[5432] }}/${{ env.PGDATABASE }}?sslmode=${{ matrix.sslmode }} - name: Save test output (on error) if: failure() - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: test-output path: | @@ -631,7 +631,7 @@ jobs: EOF - name: Save Homebrew Config - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: homebrew-config path: target/homebrew_config.yaml From d8defffddaefe0d0878ff16dc4b983d09893fa99 Mon Sep 17 00:00:00 2001 From: Yuri Astrakhan Date: Wed, 29 May 2024 12:40:35 -0400 Subject: [PATCH 013/215] Use actions/download-artifact@v4 --- .github/workflows/ci.yml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a01da0d09..2989b7e90 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -300,7 +300,7 @@ jobs: - name: Checkout sources uses: actions/checkout@v4 - name: Download build artifact cross-build - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: cross-build - run: tests/test-aws-lambda.sh @@ -345,7 +345,7 @@ jobs: env: PGSERVICE: ${{ steps.pg.outputs.service-name }} - name: Download build artifact build-${{ matrix.target }} - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: build-${{ matrix.target }} path: target/ @@ -366,7 +366,7 @@ jobs: run: diff --brief --recursive --new-file tests/output tests/expected - name: Download Debian package (Linux) if: matrix.target == 'x86_64-unknown-linux-gnu' - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: build-debian-x86_64 path: target/ @@ -466,7 +466,7 @@ jobs: docker cp ${{ job.services.postgres.id }}:/etc/ssl/certs/ssl-cert-snakeoil.pem target/certs/server.crt docker cp ${{ job.services.postgres.id }}:/etc/ssl/private/ssl-cert-snakeoil.key target/certs/server.key - name: Download build artifact build-x86_64-unknown-linux-gnu - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: build-x86_64-unknown-linux-gnu path: target_releases/ @@ -485,7 +485,7 @@ jobs: env: DATABASE_URL: postgres://${{ env.PGUSER }}:${{ env.PGUSER }}@${{ env.PGHOST }}:${{ job.services.postgres.ports[5432] }}/${{ env.PGDATABASE }}?sslmode=${{ matrix.sslmode }} - name: Download Debian package - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: build-debian-x86_64 path: target_releases/ @@ -533,34 +533,34 @@ jobs: - name: Checkout sources uses: actions/checkout@v4 - name: Download build artifact build-aarch64-apple-darwin - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: build-aarch64-apple-darwin path: target/aarch64-apple-darwin - name: Download build artifact build-x86_64-apple-darwin - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: build-x86_64-apple-darwin path: target/x86_64-apple-darwin - name: Download build artifact build-x86_64-unknown-linux-gnu - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: build-x86_64-unknown-linux-gnu path: target/x86_64-unknown-linux-gnu - name: Download cross-build artifacts - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: cross-build path: target/cross - name: Download build artifact build-x86_64-pc-windows-msvc - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: build-x86_64-pc-windows-msvc path: target/x86_64-pc-windows-msvc - name: Download build artifact build-debian-x86_64 - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: build-debian-x86_64 path: target/debian-x86_64 From 6320e0fff3ad7e1b262cd7115353c4671b47f0b1 Mon Sep 17 00:00:00 2001 From: Yuri Astrakhan Date: Thu, 30 May 2024 14:28:34 -0400 Subject: [PATCH 014/215] Add `agg_tiles_hash_before_apply`, warnings, and validate on patch (#1266) Implement #1244 --- mbtiles/src/bin/mbtiles.rs | 17 +- mbtiles/src/copier.rs | 248 ++++++++++++------ mbtiles/src/errors.rs | 20 +- mbtiles/src/lib.rs | 2 +- mbtiles/src/mbtiles.rs | 12 +- mbtiles/src/patcher.rs | 54 +++- mbtiles/src/validation.rs | 93 ++++++- mbtiles/tests/copy.rs | 27 +- .../snapshots/copy__databases@flat__dif.snap | 1 + .../copy__databases@flat__dif_empty.snap | 1 + .../snapshots/copy__databases@hash__dif.snap | 1 + .../copy__databases@hash__dif_empty.snap | 1 + .../snapshots/copy__databases@norm__dif.snap | 1 + .../copy__databases@norm__dif_empty.snap | 1 + tests/expected/mbtiles/meta-all.txt | 1 + tests/fixtures/mbtiles/world_cities.mbtiles | Bin 49152 -> 49152 bytes .../mbtiles/world_cities_modified.mbtiles | Bin 49152 -> 49152 bytes 17 files changed, 361 insertions(+), 119 deletions(-) diff --git a/mbtiles/src/bin/mbtiles.rs b/mbtiles/src/bin/mbtiles.rs index 7bf406851..26992c236 100644 --- a/mbtiles/src/bin/mbtiles.rs +++ b/mbtiles/src/bin/mbtiles.rs @@ -66,6 +66,9 @@ enum Commands { base_file: PathBuf, /// Diff file patch_file: PathBuf, + /// Force patching operation, ignoring some warnings that otherwise would prevent the operation. Use with caution. + #[arg(short, long)] + force: bool, }, /// Update metadata to match the content of the file #[command(name = "meta-update", alias = "update-meta")] @@ -156,6 +159,12 @@ pub struct SharedCopyOpts { /// Skip generating a global hash for mbtiles validation. By default, `mbtiles` will compute `agg_tiles_hash` metadata value. #[arg(long)] skip_agg_tiles_hash: bool, + /// Force copy operation, ignoring some warnings that otherwise would prevent the operation. Use with caution. + #[arg(short, long)] + force: bool, + /// Perform agg_hash validation on the original and destination files. + #[arg(long)] + validate: bool, } impl SharedCopyOpts { @@ -181,6 +190,8 @@ impl SharedCopyOpts { zoom_levels: self.zoom_levels, bbox: self.bbox, skip_agg_tiles_hash: self.skip_agg_tiles_hash, + force: self.force, + validate: self.validate, // Constants dst_type: None, // Taken from dst_type_cli } @@ -233,8 +244,9 @@ async fn main_int() -> anyhow::Result<()> { Commands::ApplyPatch { base_file, patch_file, + force, } => { - apply_patch(base_file, patch_file).await?; + apply_patch(base_file, patch_file, force).await?; } Commands::UpdateMetadata { file, update_zoom } => { let mbt = Mbtiles::new(file.as_path())?; @@ -258,7 +270,7 @@ async fn main_int() -> anyhow::Result<()> { } }); let mbt = Mbtiles::new(file.as_path())?; - mbt.validate(integrity_check, agg_hash).await?; + mbt.open_and_validate(integrity_check, agg_hash).await?; } Commands::Summary { file } => { let mbt = Mbtiles::new(file.as_path())?; @@ -597,6 +609,7 @@ mod tests { command: ApplyPatch { base_file: PathBuf::from("src_file"), patch_file: PathBuf::from("diff_file"), + force: false, } } ); diff --git a/mbtiles/src/copier.rs b/mbtiles/src/copier.rs index c152205b4..a550b8460 100644 --- a/mbtiles/src/copier.rs +++ b/mbtiles/src/copier.rs @@ -3,21 +3,24 @@ use std::path::PathBuf; use enum_display::EnumDisplay; use itertools::Itertools as _; -use log::{debug, info, trace}; +use log::{debug, info, trace, warn}; use martin_tile_utils::{bbox_to_xyz, MAX_ZOOM}; use serde::{Deserialize, Serialize}; use sqlite_hashes::rusqlite::Connection; -use sqlx::{query, Executor as _, Row, SqliteConnection}; +use sqlx::{query, Connection as _, Executor as _, Row, SqliteConnection}; use tilejson::Bounds; use crate::errors::MbtResult; +use crate::mbtiles::PatchFileInfo; use crate::queries::{ create_tiles_with_hash_view, detach_db, init_mbtiles_schema, is_empty_database, }; +use crate::AggHashType::Verify; +use crate::IntegrityCheckType::Quick; use crate::MbtType::{Flat, FlatWithHash, Normalized}; use crate::{ invert_y_value, reset_db_settings, CopyType, MbtError, MbtType, MbtTypeCli, Mbtiles, - AGG_TILES_HASH, AGG_TILES_HASH_AFTER_APPLY, + AGG_TILES_HASH, AGG_TILES_HASH_AFTER_APPLY, AGG_TILES_HASH_BEFORE_APPLY, }; #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, EnumDisplay)] @@ -68,12 +71,16 @@ pub struct MbtilesCopier { pub apply_patch: Option, /// Skip generating a global hash for mbtiles validation. By default, `mbtiles` will compute `agg_tiles_hash` metadata value. pub skip_agg_tiles_hash: bool, + /// Ignore some warnings and continue with the copying operation + pub force: bool, + /// Perform `agg_hash` validation on the original and destination files. + pub validate: bool, } #[derive(Clone, Debug)] struct MbtileCopierInt { - src_mbtiles: Mbtiles, - dst_mbtiles: Mbtiles, + src_mbt: Mbtiles, + dst_mbt: Mbtiles, options: MbtilesCopier, } @@ -114,23 +121,30 @@ impl MbtileCopierInt { } Ok(MbtileCopierInt { - src_mbtiles: Mbtiles::new(&options.src_file)?, - dst_mbtiles: Mbtiles::new(&options.dst_file)?, + src_mbt: Mbtiles::new(&options.src_file)?, + dst_mbt: Mbtiles::new(&options.dst_file)?, options, }) } pub async fn run(self) -> MbtResult { - if self.options.diff_with_file.is_none() && self.options.apply_patch.is_none() { - self.run_simple().await + if let Some(diff_file) = &self.options.diff_with_file { + let mbt = Mbtiles::new(diff_file)?; + self.run_with_diff(mbt).await + } else if let Some(patch_file) = &self.options.apply_patch { + let mbt = Mbtiles::new(patch_file)?; + self.run_with_patch(mbt).await } else { - self.run_with_diff_or_patch().await + self.run_simple().await } } - pub async fn run_simple(self) -> MbtResult { - let src_type = self.src_mbtiles.open_and_detect_type().await?; - let mut conn = self.dst_mbtiles.open_or_new().await?; + async fn run_simple(self) -> MbtResult { + let mut conn = self.src_mbt.open_readonly().await?; + let src_type = self.src_mbt.detect_type(&mut conn).await?; + conn.close().await?; + + conn = self.dst_mbt.open_or_new().await?; let is_empty_db = is_empty_database(&mut conn).await?; let on_duplicate = if let Some(on_duplicate) = self.options.on_duplicate { @@ -141,24 +155,24 @@ impl MbtileCopierInt { return Err(MbtError::DestinationFileExists(self.options.dst_file)); }; - self.src_mbtiles.attach_to(&mut conn, "sourceDb").await?; + self.src_mbt.attach_to(&mut conn, "sourceDb").await?; let dst_type = if is_empty_db { self.options.dst_type().unwrap_or(src_type) } else { - self.validate_dst_type(self.dst_mbtiles.detect_type(&mut conn).await?)? + self.validate_dst_type(self.dst_mbt.detect_type(&mut conn).await?)? }; info!( "Copying {src_mbt} ({src_type}) {what}to a {is_new} file {dst_mbt} ({dst_type})", - src_mbt = self.src_mbtiles, + src_mbt = self.src_mbt, what = self.copy_text(), is_new = if is_empty_db { "new" } else { "existing" }, - dst_mbt = self.dst_mbtiles, + dst_mbt = self.dst_mbt, ); if is_empty_db { - self.init_new_schema(&mut conn, src_type, dst_type).await?; + self.init_schema(&mut conn, src_type, dst_type).await?; } self.copy_with_rusqlite( @@ -166,12 +180,11 @@ impl MbtileCopierInt { on_duplicate, dst_type, get_select_from(src_type, dst_type), - false, ) .await?; if self.options.copy.copy_tiles() && !self.options.skip_agg_tiles_hash { - self.dst_mbtiles.update_agg_tiles_hash(&mut conn).await?; + self.dst_mbt.update_agg_tiles_hash(&mut conn).await?; } detach_db(&mut conn, "sourceDb").await?; @@ -179,62 +192,149 @@ impl MbtileCopierInt { Ok(conn) } - pub async fn run_with_diff_or_patch(self) -> MbtResult { - let ((Some(dif_file), None) | (None, Some(dif_file))) = - (&self.options.diff_with_file, &self.options.apply_patch) - else { - unreachable!() - }; - let dif_mbt = Mbtiles::new(dif_file)?; - let dif_type = dif_mbt.open_and_detect_type().await?; - let is_creating_diff = self.options.diff_with_file.is_some(); + /// Compare two files, and write their difference to the diff file + async fn run_with_diff(self, dif_mbt: Mbtiles) -> MbtResult { + let mut dif_conn = dif_mbt.open_readonly().await?; + let dif_info = dif_mbt.examine_diff(&mut dif_conn).await?; + dif_mbt.assert_hashes(&dif_info, self.options.force)?; + dif_conn.close().await?; - let src_type = self.src_mbtiles.open_and_detect_type().await?; + let src_info = self.validate_src_file().await?; - let mut conn = self.dst_mbtiles.open_or_new().await?; + let mut conn = self.dst_mbt.open_or_new().await?; if !is_empty_database(&mut conn).await? { return Err(MbtError::NonEmptyTargetFile(self.options.dst_file)); } - self.src_mbtiles.attach_to(&mut conn, "sourceDb").await?; + self.src_mbt.attach_to(&mut conn, "sourceDb").await?; dif_mbt.attach_to(&mut conn, "diffDb").await?; - let what = self.copy_text(); - let src_path = &self.src_mbtiles.filepath(); - let dst_path = &self.dst_mbtiles.filepath(); - let dif_path = dif_mbt.filepath(); - let dst_type = self.options.dst_type().unwrap_or(src_type); - if is_creating_diff { - info!("Comparing {src_path} ({src_type}) and {dif_path} ({dif_type}) {what}into a new file {dst_path} ({dst_type})"); - } else { - info!("Applying patch from {dif_path} ({dif_type}) to {src_path} ({src_type}) {what}into a new file {dst_path} ({dst_type})"); + let dst_type = self.options.dst_type().unwrap_or(src_info.mbt_type); + info!( + "Comparing {src_mbt} ({src_type}) and {dif_path} ({dif_type}) {what}into a new file {dst_path} ({dst_type})", + src_mbt = self.src_mbt, + src_type = src_info.mbt_type, + dif_path = dif_mbt.filepath(), + dif_type = dif_info.mbt_type, + what = self.copy_text(), + dst_path = self.dst_mbt.filepath() + ); + + self.init_schema(&mut conn, src_info.mbt_type, dst_type) + .await?; + self.copy_with_rusqlite( + &mut conn, + CopyDuplicateMode::Override, + dst_type, + &get_select_from_with_diff(dif_info.mbt_type, dst_type), + ) + .await?; + + if let Some(hash) = src_info.agg_tiles_hash { + self.dst_mbt + .set_metadata_value(&mut conn, AGG_TILES_HASH_BEFORE_APPLY, &hash) + .await?; + } + if let Some(hash) = dif_info.agg_tiles_hash { + self.dst_mbt + .set_metadata_value(&mut conn, AGG_TILES_HASH_AFTER_APPLY, &hash) + .await?; + }; + + // TODO: perhaps disable all except --copy all when using with diffs, or else is not making much sense + if self.options.copy.copy_tiles() && !self.options.skip_agg_tiles_hash { + self.dst_mbt.update_agg_tiles_hash(&mut conn).await?; } - self.init_new_schema(&mut conn, src_type, dst_type).await?; + detach_db(&mut conn, "diffDb").await?; + detach_db(&mut conn, "sourceDb").await?; + self.validate(&self.dst_mbt, &mut conn).await?; + + Ok(conn) + } + + /// Apply a patch file to the source file and write the result to the destination file + async fn run_with_patch(self, dif_mbt: Mbtiles) -> MbtResult { + let mut dif_conn = dif_mbt.open_readonly().await?; + let dif_info = dif_mbt.examine_diff(&mut dif_conn).await?; + self.validate(&dif_mbt, &mut dif_conn).await?; + dif_mbt.validate_diff_info(&dif_info, self.options.force)?; + dif_conn.close().await?; + + let src_type = self.validate_src_file().await?.mbt_type; + let mut conn = self.dst_mbt.open_or_new().await?; + if !is_empty_database(&mut conn).await? { + return Err(MbtError::NonEmptyTargetFile(self.options.dst_file)); + } + + self.src_mbt.attach_to(&mut conn, "sourceDb").await?; + dif_mbt.attach_to(&mut conn, "diffDb").await?; + + let dst_type = self.options.dst_type().unwrap_or(src_type); + info!("Applying patch from {dif_path} ({dif_type}) to {src_mbt} ({src_type}) {what}into a new file {dst_path} ({dst_type})", + dif_path = dif_mbt.filepath(), + dif_type = dif_info.mbt_type, + src_mbt = self.src_mbt, + what = self.copy_text(), + dst_path = self.dst_mbt.filepath()); + + self.init_schema(&mut conn, src_type, dst_type).await?; self.copy_with_rusqlite( &mut conn, CopyDuplicateMode::Override, dst_type, - &(if is_creating_diff { - get_select_from_with_diff(dif_type, dst_type) - } else { - get_select_from_apply_patch(src_type, dif_type, dst_type) - }), - true, + &get_select_from_apply_patch(src_type, dif_info.mbt_type, dst_type), ) .await?; + // TODO: perhaps disable all except --copy all when using with diffs, or else is not making much sense if self.options.copy.copy_tiles() && !self.options.skip_agg_tiles_hash { - self.dst_mbtiles.update_agg_tiles_hash(&mut conn).await?; + self.dst_mbt.update_agg_tiles_hash(&mut conn).await?; + + let new_hash = self.dst_mbt.get_agg_tiles_hash(&mut conn).await?; + match (dif_info.agg_tiles_hash_after_apply, new_hash) { + (Some(expected), Some(actual)) if expected != actual => { + let err = MbtError::AggHashMismatchAfterApply( + dif_mbt.filepath().to_string(), + expected, + self.dst_mbt.filepath().to_string(), + actual, + ); + if !self.options.force { + return Err(err); + } + warn!("{err}"); + } + _ => {} + } } detach_db(&mut conn, "diffDb").await?; detach_db(&mut conn, "sourceDb").await?; + self.validate(&self.dst_mbt, &mut conn).await?; + Ok(conn) } + async fn validate(&self, mbt: &Mbtiles, conn: &mut SqliteConnection) -> MbtResult<()> { + if self.options.validate { + mbt.validate(conn, Quick, Verify).await?; + } + Ok(()) + } + + async fn validate_src_file(&self) -> MbtResult { + let mut src_conn = self.src_mbt.open_readonly().await?; + let src_info = self.src_mbt.examine_diff(&mut src_conn).await?; + self.validate(&self.src_mbt, &mut src_conn).await?; + self.src_mbt.assert_hashes(&src_info, self.options.force)?; + src_conn.close().await?; + + Ok(src_info) + } + fn copy_text(&self) -> &str { match self.options.copy { CopyType::All => "", @@ -249,7 +349,6 @@ impl MbtileCopierInt { on_duplicate: CopyDuplicateMode, dst_type: MbtType, select_from: &str, - is_diff: bool, ) -> Result<(), MbtError> { // SAFETY: This must be scoped to make sure the handle is dropped before we continue using conn // Make sure not to execute any other queries while the handle is locked @@ -266,7 +365,7 @@ impl MbtileCopierInt { } if self.options.copy.copy_metadata() { - self.copy_metadata(&rusqlite_conn, is_diff, on_duplicate) + self.copy_metadata(&rusqlite_conn, on_duplicate) } else { debug!("Skipping copying metadata"); Ok(()) @@ -276,38 +375,35 @@ impl MbtileCopierInt { fn copy_metadata( &self, rusqlite_conn: &Connection, - is_diff: bool, on_duplicate: CopyDuplicateMode, ) -> Result<(), MbtError> { let on_dupl = on_duplicate.to_sql(); let sql; - if is_diff { - // Insert all rows from diffDb.metadata if they do not exist or are different in sourceDb.metadata. - // Also insert all names from sourceDb.metadata that do not exist in diffDb.metadata, with their value set to NULL. - // Rename agg_tiles_hash to agg_tiles_hash_after_apply because agg_tiles_hash will be auto-added later - if self.options.diff_with_file.is_some() { - // Include agg_tiles_hash value even if it is the same because we will still need it when applying the diff - sql = format!( - " + + // Insert all rows from diffDb.metadata if they do not exist or are different in sourceDb.metadata. + // Also insert all names from sourceDb.metadata that do not exist in diffDb.metadata, with their value set to NULL. + // Skip agg_tiles_hash because that requires special handling + if self.options.diff_with_file.is_some() { + // Include agg_tiles_hash value even if it is the same because we will still need it when applying the diff + sql = format!( + " INSERT {on_dupl} INTO metadata (name, value) - SELECT IIF(name = '{AGG_TILES_HASH}','{AGG_TILES_HASH_AFTER_APPLY}', name) as name - , value + SELECT name, value FROM ( SELECT COALESCE(difMD.name, srcMD.name) as name , difMD.value as value FROM sourceDb.metadata AS srcMD FULL JOIN diffDb.metadata AS difMD ON srcMD.name = difMD.name - WHERE srcMD.value != difMD.value OR srcMD.value ISNULL OR difMD.value ISNULL OR srcMD.name = '{AGG_TILES_HASH}' + WHERE srcMD.value != difMD.value OR srcMD.value ISNULL OR difMD.value ISNULL ) joinedMD - WHERE name != '{AGG_TILES_HASH_AFTER_APPLY}'" - ); - debug!("Copying metadata, taking into account diff file with {sql}"); - } else { - sql = format!( - " + WHERE name NOT IN ('{AGG_TILES_HASH}', '{AGG_TILES_HASH_BEFORE_APPLY}', '{AGG_TILES_HASH_AFTER_APPLY}')" + ); + debug!("Copying metadata, taking into account diff file with {sql}"); + } else if self.options.apply_patch.is_some() { + sql = format!( + " INSERT {on_dupl} INTO metadata (name, value) - SELECT IIF(name = '{AGG_TILES_HASH_AFTER_APPLY}','{AGG_TILES_HASH}', name) as name - , value + SELECT name, value FROM ( SELECT COALESCE(srcMD.name, difMD.name) as name , COALESCE(difMD.value, srcMD.value) as value @@ -315,10 +411,9 @@ impl MbtileCopierInt { ON srcMD.name = difMD.name WHERE difMD.name ISNULL OR difMD.value NOTNULL ) joinedMD - WHERE name != '{AGG_TILES_HASH}'" - ); - debug!("Copying metadata, and applying the diff file with {sql}"); - } + WHERE name NOT IN ('{AGG_TILES_HASH}', '{AGG_TILES_HASH_BEFORE_APPLY}', '{AGG_TILES_HASH_AFTER_APPLY}')" + ); + debug!("Copying metadata, and applying the diff file with {sql}"); } else { sql = format!( " @@ -404,7 +499,7 @@ impl MbtileCopierInt { Ok(dst_type) } - async fn init_new_schema( + async fn init_schema( &self, conn: &mut SqliteConnection, src: MbtType, @@ -826,6 +921,7 @@ mod tests { src_file: src.clone(), dst_file: dst.clone(), diff_with_file: Some(diff_file.clone()), + force: true, ..Default::default() }; let mut dst_conn = opt.run().await?; diff --git a/mbtiles/src/errors.rs b/mbtiles/src/errors.rs index b68137fbd..2f4e60924 100644 --- a/mbtiles/src/errors.rs +++ b/mbtiles/src/errors.rs @@ -3,7 +3,7 @@ use std::path::PathBuf; use martin_tile_utils::{TileInfo, MAX_ZOOM}; use sqlite_hashes::rusqlite; -use crate::MbtType; +use crate::{MbtType, AGG_TILES_HASH, AGG_TILES_HASH_AFTER_APPLY, AGG_TILES_HASH_BEFORE_APPLY}; #[derive(thiserror::Error, Debug)] pub enum MbtError { @@ -77,6 +77,24 @@ pub enum MbtError { #[error("Invalid zoom value {0}={1}, expecting an integer between 0..{MAX_ZOOM}")] InvalidZoomValue(&'static str, String), + + #[error("A file {0} does not have an {AGG_TILES_HASH} metadata entry, probably because it was not created by this tool. Use `--force` to ignore this warning, or run this to update hash value: `mbtiles validate --agg-hash update {0}`")] + CannotDiffFileWithoutHash(String), + + #[error("File {0} has {AGG_TILES_HASH_BEFORE_APPLY} or {AGG_TILES_HASH_AFTER_APPLY} metadata entry, indicating it is a patch file which should not be diffed with another file. Use `--force` to ignore this warning.")] + DiffingDiffFile(String), + + #[error("A file {0} does not seem to be a patch diff file because it has no {AGG_TILES_HASH_BEFORE_APPLY} and {AGG_TILES_HASH_AFTER_APPLY} metadata entries. These entries are automatically created when using `mbtiles diff` and `mbitiles copy --diff-with-file`. Use `--force` to ignore this warning.")] + PatchFileHasNoHashes(String), + + #[error("A file {0} does not have {AGG_TILES_HASH_BEFORE_APPLY} metadata, probably because it was created by an older version of the `mbtiles` tool. Use `--force` to ignore this warning, but ensure you are applying the patch to the right file.")] + PatchFileHasNoBeforeHash(String), + + #[error("The {AGG_TILES_HASH_BEFORE_APPLY}='{1}' in patch file {0} does not match {AGG_TILES_HASH}='{3}' in the file {2}")] + AggHashMismatchWithDiff(String, String, String, String), + + #[error("The {AGG_TILES_HASH_AFTER_APPLY}='{1}' in patch file {0} does not match {AGG_TILES_HASH}='{3}' in the file {2} after the patch was applied")] + AggHashMismatchAfterApply(String, String, String, String), } pub type MbtResult = Result; diff --git a/mbtiles/src/lib.rs b/mbtiles/src/lib.rs index 272915f8b..1f54ebb66 100644 --- a/mbtiles/src/lib.rs +++ b/mbtiles/src/lib.rs @@ -32,7 +32,7 @@ pub use update::UpdateZoomType; mod validation; pub use validation::{ calc_agg_tiles_hash, AggHashType, IntegrityCheckType, MbtType, AGG_TILES_HASH, - AGG_TILES_HASH_AFTER_APPLY, + AGG_TILES_HASH_AFTER_APPLY, AGG_TILES_HASH_BEFORE_APPLY, }; /// `MBTiles` uses a TMS (Tile Map Service) scheme for its tile coordinates (inverted along the Y axis). diff --git a/mbtiles/src/mbtiles.rs b/mbtiles/src/mbtiles.rs index 9808fb194..ebd2e5c2d 100644 --- a/mbtiles/src/mbtiles.rs +++ b/mbtiles/src/mbtiles.rs @@ -42,6 +42,13 @@ impl CopyType { } } +pub struct PatchFileInfo { + pub mbt_type: MbtType, + pub agg_tiles_hash: Option, + pub agg_tiles_hash_before_apply: Option, + pub agg_tiles_hash_after_apply: Option, +} + #[derive(Clone, Debug)] pub struct Mbtiles { filepath: String, @@ -212,11 +219,6 @@ impl Mbtiles { ), } } - - pub async fn open_and_detect_type(&self) -> MbtResult { - let mut conn = self.open_readonly().await?; - self.detect_type(&mut conn).await - } } pub async fn attach_hash_fn(conn: &mut SqliteConnection) -> MbtResult<()> { diff --git a/mbtiles/src/patcher.rs b/mbtiles/src/patcher.rs index 6e983ffec..6650021cf 100644 --- a/mbtiles/src/patcher.rs +++ b/mbtiles/src/patcher.rs @@ -1,25 +1,53 @@ use std::path::PathBuf; -use log::{debug, info}; -use sqlx::query; +use log::{debug, info, warn}; +use sqlx::{query, Connection as _}; use crate::queries::detach_db; use crate::MbtType::{Flat, FlatWithHash, Normalized}; -use crate::{MbtResult, MbtType, Mbtiles, AGG_TILES_HASH, AGG_TILES_HASH_AFTER_APPLY}; +use crate::{ + MbtError, MbtResult, MbtType, Mbtiles, AGG_TILES_HASH, AGG_TILES_HASH_AFTER_APPLY, + AGG_TILES_HASH_BEFORE_APPLY, +}; -pub async fn apply_patch(base_file: PathBuf, patch_file: PathBuf) -> MbtResult<()> { +pub async fn apply_patch(base_file: PathBuf, patch_file: PathBuf, force: bool) -> MbtResult<()> { let base_mbt = Mbtiles::new(base_file)?; let patch_mbt = Mbtiles::new(patch_file)?; - let patch_type = patch_mbt.open_and_detect_type().await?; + + let mut conn = patch_mbt.open_readonly().await?; + let patch_info = patch_mbt.examine_diff(&mut conn).await?; + patch_mbt.validate_diff_info(&patch_info, force)?; + let patch_type = patch_info.mbt_type; + conn.close().await?; let mut conn = base_mbt.open().await?; - let base_type = base_mbt.detect_type(&mut conn).await?; + let base_info = base_mbt.examine_diff(&mut conn).await?; + let base_hash = base_mbt.get_agg_tiles_hash(&mut conn).await?; + base_mbt.assert_hashes(&base_info, force)?; + + match (force, base_hash, patch_info.agg_tiles_hash_before_apply) { + (false, Some(base_hash), Some(expected_hash)) if base_hash != expected_hash => { + return Err(MbtError::AggHashMismatchWithDiff( + patch_mbt.filepath().to_string(), + expected_hash, + base_mbt.filepath().to_string(), + base_hash, + )); + } + (true, Some(base_hash), Some(expected_hash)) if base_hash != expected_hash => { + warn!("Aggregate tiles hash mismatch: Patch file expected {expected_hash} but found {base_hash} in {base_mbt} (force mode)"); + } + _ => {} + } - info!("Applying patch file {patch_mbt} ({patch_type}) to {base_mbt} ({base_type})"); + info!( + "Applying patch file {patch_mbt} ({patch_type}) to {base_mbt} ({base_type})", + base_type = base_info.mbt_type + ); patch_mbt.attach_to(&mut conn, "patchDb").await?; - let select_from = get_select_from(base_type, patch_type); - let (main_table, insert1, insert2) = get_insert_sql(base_type, select_from); + let select_from = get_select_from(base_info.mbt_type, patch_type); + let (main_table, insert1, insert2) = get_insert_sql(base_info.mbt_type, select_from); let sql = format!("{insert1} WHERE tile_data NOTNULL"); query(&sql).execute(&mut conn).await?; @@ -38,7 +66,7 @@ pub async fn apply_patch(base_file: PathBuf, patch_file: PathBuf) -> MbtResult<( ); query(&sql).execute(&mut conn).await?; - if base_type.is_normalized() { + if base_info.mbt_type.is_normalized() { debug!("Removing unused tiles from the images table (normalized schema)"); let sql = "DELETE FROM images WHERE tile_id NOT IN (SELECT tile_id FROM map)"; query(sql).execute(&mut conn).await?; @@ -53,7 +81,7 @@ pub async fn apply_patch(base_file: PathBuf, patch_file: PathBuf) -> MbtResult<( SELECT IIF(name = '{AGG_TILES_HASH_AFTER_APPLY}', '{AGG_TILES_HASH}', name) as name, value FROM patchDb.metadata - WHERE name NOTNULL AND name != '{AGG_TILES_HASH}';" + WHERE name NOTNULL AND name NOT IN ('{AGG_TILES_HASH}', '{AGG_TILES_HASH_BEFORE_APPLY}');" ); query(&sql).execute(&mut conn).await?; @@ -151,7 +179,7 @@ mod tests { // Apply patch to the src data in in-memory DB let patch_file = PathBuf::from("../tests/fixtures/mbtiles/world_cities_diff.mbtiles"); - apply_patch(src, patch_file).await?; + apply_patch(src, patch_file, true).await?; // Verify the data is the same as the file the patch was generated from Mbtiles::new("../tests/fixtures/mbtiles/world_cities_modified.mbtiles")? @@ -183,7 +211,7 @@ mod tests { // Apply patch to the src data in in-memory DB let patch_file = PathBuf::from("../tests/fixtures/mbtiles/geography-class-jpg-diff.mbtiles"); - apply_patch(src, patch_file).await?; + apply_patch(src, patch_file, true).await?; // Verify the data is the same as the file the patch was generated from Mbtiles::new("../tests/fixtures/mbtiles/geography-class-jpg-modified.mbtiles")? diff --git a/mbtiles/src/validation.rs b/mbtiles/src/validation.rs index 1ac919f2c..8db5cac10 100644 --- a/mbtiles/src/validation.rs +++ b/mbtiles/src/validation.rs @@ -7,10 +7,11 @@ use martin_tile_utils::{Format, TileInfo, MAX_ZOOM}; use serde::Serialize; use serde_json::Value; use sqlx::sqlite::SqliteRow; -use sqlx::{query, Row, SqliteExecutor}; +use sqlx::{query, Row, SqliteConnection, SqliteExecutor}; use tilejson::TileJSON; use crate::errors::{MbtError, MbtResult}; +use crate::mbtiles::PatchFileInfo; use crate::queries::{ has_tiles_with_hash, is_flat_tables_type, is_flat_with_hash_tables_type, is_normalized_tables_type, @@ -27,6 +28,9 @@ pub const AGG_TILES_HASH: &str = "agg_tiles_hash"; /// Metadata key for a diff file, describing the eventual [`AGG_TILES_HASH`] value of the resulting tileset once the diff is applied pub const AGG_TILES_HASH_AFTER_APPLY: &str = "agg_tiles_hash_after_apply"; +/// Metadata key for a diff file, describing the expected [`AGG_TILES_HASH`] value of the tileset to which the diff will be applied. +pub const AGG_TILES_HASH_BEFORE_APPLY: &str = "agg_tiles_hash_before_apply"; + #[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, EnumDisplay, Serialize)] #[enum_display(case = "Kebab")] pub enum MbtType { @@ -71,7 +75,7 @@ pub enum AggHashType { } impl Mbtiles { - pub async fn validate( + pub async fn open_and_validate( &self, check_type: IntegrityCheckType, agg_hash: AggHashType, @@ -81,12 +85,24 @@ impl Mbtiles { } else { self.open_readonly().await? }; - self.check_integrity(&mut conn, check_type).await?; - self.check_tiles_type_validity(&mut conn).await?; - self.check_each_tile_hash(&mut conn).await?; + self.validate(&mut conn, check_type, agg_hash).await + } + + pub async fn validate( + &self, + conn: &mut T, + check_type: IntegrityCheckType, + agg_hash: AggHashType, + ) -> MbtResult + where + for<'e> &'e mut T: SqliteExecutor<'e>, + { + self.check_integrity(&mut *conn, check_type).await?; + self.check_tiles_type_validity(&mut *conn).await?; + self.check_each_tile_hash(&mut *conn).await?; match agg_hash { - AggHashType::Verify => self.check_agg_tiles_hashes(&mut conn).await, - AggHashType::Update => self.update_agg_tiles_hash(&mut conn).await, + AggHashType::Verify => self.check_agg_tiles_hashes(conn).await, + AggHashType::Update => self.update_agg_tiles_hash(conn).await, AggHashType::Off => Ok(String::new()), } } @@ -453,6 +469,69 @@ LIMIT 1;" info!("All tile hashes are valid for {self}"); Ok(()) } + + pub async fn examine_diff(&self, conn: &mut SqliteConnection) -> MbtResult { + let info = PatchFileInfo { + mbt_type: self.detect_type(&mut *conn).await?, + agg_tiles_hash: self.get_agg_tiles_hash(&mut *conn).await?, + agg_tiles_hash_before_apply: self + .get_metadata_value(&mut *conn, AGG_TILES_HASH_BEFORE_APPLY) + .await?, + agg_tiles_hash_after_apply: self + .get_metadata_value(&mut *conn, AGG_TILES_HASH_AFTER_APPLY) + .await?, + }; + + Ok(info) + } + + pub fn assert_hashes(&self, info: &PatchFileInfo, force: bool) -> MbtResult<()> { + if info.agg_tiles_hash.is_none() { + if !force { + return Err(MbtError::CannotDiffFileWithoutHash( + self.filepath().to_string(), + )); + } + warn!("File {self} has no {AGG_TILES_HASH} metadata field, probably because it was created by an older version of the `mbtiles` tool. Use this command to update the value:\nmbtiles validate --agg-hash update {self}"); + } else if info.agg_tiles_hash_before_apply.is_some() + || info.agg_tiles_hash_after_apply.is_some() + { + if !force { + return Err(MbtError::DiffingDiffFile(self.filepath().to_string())); + } + warn!("File {self} has {AGG_TILES_HASH_BEFORE_APPLY} or {AGG_TILES_HASH_AFTER_APPLY} metadata field, indicating it is a patch file which should not be diffed with another file."); + } + Ok(()) + } + + pub fn validate_diff_info(&self, info: &PatchFileInfo, force: bool) -> MbtResult<()> { + match ( + &info.agg_tiles_hash_before_apply, + &info.agg_tiles_hash_after_apply, + ) { + (Some(before), Some(after)) => { + info!( + "The patch file {self} expects to be applied to a tileset with {AGG_TILES_HASH}={before}, and should result in hash {after} after applying", + ); + } + (None, Some(_)) => { + if !force { + return Err(MbtError::PatchFileHasNoBeforeHash( + self.filepath().to_string(), + )); + } + warn!( + "The patch file {self} has no {AGG_TILES_HASH_BEFORE_APPLY} metadata field, probably because it was created by an older version of the `mbtiles` tool."); + } + _ => { + if !force { + return Err(MbtError::PatchFileHasNoHashes(self.filepath().to_string())); + } + warn!("The patch file {self} has no {AGG_TILES_HASH_AFTER_APPLY} metadata field, probably because it was not properly created by the `mbtiles` tool."); + } + } + Ok(()) + } } /// Compute the hash of the combined tiles in the mbtiles file tiles table/view. diff --git a/mbtiles/tests/copy.rs b/mbtiles/tests/copy.rs index e0525cd31..5d1347b94 100644 --- a/mbtiles/tests/copy.rs +++ b/mbtiles/tests/copy.rs @@ -242,7 +242,7 @@ fn databases() -> Databases { copy!(result.path("empty_no_hash", mbt_typ), path(&empty_mbt)); let dmp = dump(&mut empty_cn).await.unwrap(); assert_dump!(&dmp, "{typ}__empty"); - let hash = empty_mbt.validate(Off, Verify).await.unwrap(); + let hash = empty_mbt.open_and_validate(Off, Verify).await.unwrap(); allow_duplicates! { assert_snapshot!(hash, @"D41D8CD98F00B204E9800998ECF8427E"); } @@ -265,7 +265,7 @@ fn databases() -> Databases { copy!(result.path("v1_no_hash", mbt_typ), path(&v1_mbt)); let dmp = dump(&mut v1_cn).await.unwrap(); assert_dump!(&dmp, "{typ}__v1"); - let hash = v1_mbt.validate(Off, Verify).await.unwrap(); + let hash = v1_mbt.open_and_validate(Off, Verify).await.unwrap(); allow_duplicates! { assert_snapshot!(hash, @"9ED9178D7025276336C783C2B54D6258"); } @@ -276,7 +276,7 @@ fn databases() -> Databases { new_file!(databases, mbt_typ, METADATA_V2, TILES_V2, "{typ}__v2"); let dmp = dump(&mut v2_cn).await.unwrap(); assert_dump!(&dmp, "{typ}__v2"); - let hash = v2_mbt.validate(Off, Verify).await.unwrap(); + let hash = v2_mbt.open_and_validate(Off, Verify).await.unwrap(); allow_duplicates! { assert_snapshot!(hash, @"3BCDEE3F52407FF1315629298CB99133"); } @@ -291,7 +291,7 @@ fn databases() -> Databases { }; let dmp = dump(&mut dif_cn).await.unwrap(); assert_dump!(&dmp, "{typ}__dif"); - let hash = dif_mbt.validate(Off, Verify).await.unwrap(); + let hash = dif_mbt.open_and_validate(Off, Verify).await.unwrap(); allow_duplicates! { assert_snapshot!(hash, @"B86122579EDCDD4C51F3910894FCC1A1"); } @@ -300,7 +300,7 @@ fn databases() -> Databases { // ----------------- v1_clone ----------------- let (v1_clone_mbt, v1_clone_cn) = open!(databases, "{typ}__v1-clone"); let dmp = copy_dump!(result.path("v1", mbt_typ), path(&v1_clone_mbt)); - let hash = v1_clone_mbt.validate(Off, Verify).await.unwrap(); + let hash = v1_clone_mbt.open_and_validate(Off, Verify).await.unwrap(); allow_duplicates! { assert_snapshot!(hash, @"9ED9178D7025276336C783C2B54D6258"); } @@ -322,7 +322,7 @@ fn databases() -> Databases { }; let dmp = dump(&mut dif_empty_cn).await.unwrap(); assert_dump!(&dmp, "{typ}__dif_empty"); - let hash = dif_empty_mbt.validate(Off, Verify).await.unwrap(); + let hash = dif_empty_mbt.open_and_validate(Off, Verify).await.unwrap(); allow_duplicates! { assert_snapshot!(hash, @"D41D8CD98F00B204E9800998ECF8427E"); } @@ -483,8 +483,8 @@ async fn diff_and_patch( eprintln!("TEST: Applying the difference ({b_db} - {a_db} = {dif_db}) to {a_db}, should get {b_db}"); let (clone_mbt, mut clone_cn) = open!(diff_and_patch, "{prefix}__1"); copy!(databases.path(a_db, *dst_type), path(&clone_mbt)); - apply_patch(path(&clone_mbt), path(&dif_mbt)).await?; - let hash = clone_mbt.validate(Off, Verify).await?; + apply_patch(path(&clone_mbt), path(&dif_mbt), false).await?; + let hash = clone_mbt.open_and_validate(Off, Verify).await?; assert_eq!(hash, databases.hash(b_db, *dst_type)); let dmp = dump(&mut clone_cn).await?; pretty_assert_eq!(&dmp, expected_b); @@ -492,8 +492,8 @@ async fn diff_and_patch( eprintln!("TEST: Applying the difference ({b_db} - {a_db} = {dif_db}) to {b_db}, should not modify it"); let (clone_mbt, mut clone_cn) = open!(diff_and_patch, "{prefix}__2"); copy!(databases.path(b_db, *dst_type), path(&clone_mbt)); - apply_patch(path(&clone_mbt), path(&dif_mbt)).await?; - let hash = clone_mbt.validate(Off, Verify).await?; + apply_patch(path(&clone_mbt), path(&dif_mbt), true).await?; + let hash = clone_mbt.open_and_validate(Off, Verify).await?; assert_eq!(hash, databases.hash(b_db, *dst_type)); let dmp = dump(&mut clone_cn).await?; pretty_assert_eq!(&dmp, expected_b); @@ -522,10 +522,9 @@ async fn patch_on_copy( apply_patch => Some(databases.path("dif", dif_type)), dst_type_cli => v2_type, }; - pretty_assert_eq!( - &dump(&mut v2_cn).await?, - databases.dump("v2", v2_type.unwrap_or(v1_type)) - ); + let actual = dump(&mut v2_cn).await?; + let expected = databases.dump("v2", v2_type.unwrap_or(v1_type)); + pretty_assert_eq!(&actual, expected); Ok(()) } diff --git a/mbtiles/tests/snapshots/copy__databases@flat__dif.snap b/mbtiles/tests/snapshots/copy__databases@flat__dif.snap index 36193a4f5..317787984 100644 --- a/mbtiles/tests/snapshots/copy__databases@flat__dif.snap +++ b/mbtiles/tests/snapshots/copy__databases@flat__dif.snap @@ -12,6 +12,7 @@ CREATE TABLE metadata ( values = [ '( "agg_tiles_hash", "B86122579EDCDD4C51F3910894FCC1A1" )', '( "agg_tiles_hash_after_apply", "3BCDEE3F52407FF1315629298CB99133" )', + '( "agg_tiles_hash_before_apply", "9ED9178D7025276336C783C2B54D6258" )', '( "md-edit", "value - v2" )', '( "md-new", "value - new" )', '( "md-remove", NULL )', diff --git a/mbtiles/tests/snapshots/copy__databases@flat__dif_empty.snap b/mbtiles/tests/snapshots/copy__databases@flat__dif_empty.snap index b88309497..e2b5de434 100644 --- a/mbtiles/tests/snapshots/copy__databases@flat__dif_empty.snap +++ b/mbtiles/tests/snapshots/copy__databases@flat__dif_empty.snap @@ -12,6 +12,7 @@ CREATE TABLE metadata ( values = [ '( "agg_tiles_hash", "D41D8CD98F00B204E9800998ECF8427E" )', '( "agg_tiles_hash_after_apply", "9ED9178D7025276336C783C2B54D6258" )', + '( "agg_tiles_hash_before_apply", "9ED9178D7025276336C783C2B54D6258" )', ] [[]] diff --git a/mbtiles/tests/snapshots/copy__databases@hash__dif.snap b/mbtiles/tests/snapshots/copy__databases@hash__dif.snap index ae6e8941c..d9feedca6 100644 --- a/mbtiles/tests/snapshots/copy__databases@hash__dif.snap +++ b/mbtiles/tests/snapshots/copy__databases@hash__dif.snap @@ -12,6 +12,7 @@ CREATE TABLE metadata ( values = [ '( "agg_tiles_hash", "B86122579EDCDD4C51F3910894FCC1A1" )', '( "agg_tiles_hash_after_apply", "3BCDEE3F52407FF1315629298CB99133" )', + '( "agg_tiles_hash_before_apply", "9ED9178D7025276336C783C2B54D6258" )', '( "md-edit", "value - v2" )', '( "md-new", "value - new" )', '( "md-remove", NULL )', diff --git a/mbtiles/tests/snapshots/copy__databases@hash__dif_empty.snap b/mbtiles/tests/snapshots/copy__databases@hash__dif_empty.snap index 7dc8868c9..aedfc8819 100644 --- a/mbtiles/tests/snapshots/copy__databases@hash__dif_empty.snap +++ b/mbtiles/tests/snapshots/copy__databases@hash__dif_empty.snap @@ -12,6 +12,7 @@ CREATE TABLE metadata ( values = [ '( "agg_tiles_hash", "D41D8CD98F00B204E9800998ECF8427E" )', '( "agg_tiles_hash_after_apply", "9ED9178D7025276336C783C2B54D6258" )', + '( "agg_tiles_hash_before_apply", "9ED9178D7025276336C783C2B54D6258" )', ] [[]] diff --git a/mbtiles/tests/snapshots/copy__databases@norm__dif.snap b/mbtiles/tests/snapshots/copy__databases@norm__dif.snap index 3dda51925..0231bb4f6 100644 --- a/mbtiles/tests/snapshots/copy__databases@norm__dif.snap +++ b/mbtiles/tests/snapshots/copy__databases@norm__dif.snap @@ -50,6 +50,7 @@ CREATE TABLE metadata ( values = [ '( "agg_tiles_hash", "B86122579EDCDD4C51F3910894FCC1A1" )', '( "agg_tiles_hash_after_apply", "3BCDEE3F52407FF1315629298CB99133" )', + '( "agg_tiles_hash_before_apply", "9ED9178D7025276336C783C2B54D6258" )', '( "md-edit", "value - v2" )', '( "md-new", "value - new" )', '( "md-remove", NULL )', diff --git a/mbtiles/tests/snapshots/copy__databases@norm__dif_empty.snap b/mbtiles/tests/snapshots/copy__databases@norm__dif_empty.snap index d84884200..e45a492f8 100644 --- a/mbtiles/tests/snapshots/copy__databases@norm__dif_empty.snap +++ b/mbtiles/tests/snapshots/copy__databases@norm__dif_empty.snap @@ -33,6 +33,7 @@ CREATE TABLE metadata ( values = [ '( "agg_tiles_hash", "D41D8CD98F00B204E9800998ECF8427E" )', '( "agg_tiles_hash_after_apply", "9ED9178D7025276336C783C2B54D6258" )', + '( "agg_tiles_hash_before_apply", "9ED9178D7025276336C783C2B54D6258" )', ] [[]] diff --git a/tests/expected/mbtiles/meta-all.txt b/tests/expected/mbtiles/meta-all.txt index 2949d92f4..42cf8feef 100644 --- a/tests/expected/mbtiles/meta-all.txt +++ b/tests/expected/mbtiles/meta-all.txt @@ -109,4 +109,5 @@ json: count: 68 geometry: Point layer: cities +agg_tiles_hash: 84792BF4EE9AEDDC5B1A60E707011FEE diff --git a/tests/fixtures/mbtiles/world_cities.mbtiles b/tests/fixtures/mbtiles/world_cities.mbtiles index d5fc059555366aaa27317ea8a171ec50701fdabc..92c23a9e95fcbb693466f4f3071e5a18b845526c 100644 GIT binary patch delta 168 zcmZo@U~Xt&o*>Q0Gf~Ewm4`vEXu-ym1^iOnT#Fd^FZ0jmpTytFU%?;FugEXR&&+j| zYthEW7A|8$9%fD7#Psy|lFXdc;`ofj;tUHDb4w#9HxpM^OGj517iUu^Lq{_MS91e% z14BbMSJ%x~rSwImxcLhh_zU>g@$ck+!9R+_Mp|We>B1KYf5T CpB~`= diff --git a/tests/fixtures/mbtiles/world_cities_modified.mbtiles b/tests/fixtures/mbtiles/world_cities_modified.mbtiles index e6d104bf730a9af5db838195f345bae9e6b817e2..85f88c640de135d281edd05e33649fbac8fd91d0 100644 GIT binary patch delta 193 zcmZo@U~Xt&o*>OAGEv5vRfIvWXu-ym1^iOnTwRR(m$|z5C-JxPSMZ1PEAk8SGjm<# zpTDs&hih|}R3r-%1HfFDZ*G&^A0)HWA2ARb3J-$- j53Ucn59kk?4}%ZH56}58Sg6uw@UkgFk(Mq0}l2 From 5c31d2112036a1d3e48ce38831a9bd8eed85a258 Mon Sep 17 00:00:00 2001 From: Yuri Astrakhan Date: Thu, 30 May 2024 14:34:53 -0400 Subject: [PATCH 015/215] Bump deps --- Cargo.lock | 108 ++++++++++++++++++++++++++++++++++------------------- Cargo.toml | 2 +- 2 files changed, 70 insertions(+), 40 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index adee409be..a759d364b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -202,9 +202,9 @@ dependencies = [ [[package]] name = "addr2line" -version = "0.21.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" dependencies = [ "gimli", ] @@ -357,9 +357,9 @@ checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" [[package]] name = "async-compression" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c90a406b4495d129f00461241616194cb8a032c8d1c53c657f0961d5f8e0498" +checksum = "cd066d0b4ef8ecb03a55319dc13aa6910616d0f44008a045bb1835af830abff5" dependencies = [ "flate2", "futures-core", @@ -456,9 +456,9 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.71" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" +checksum = "17c6a35df3749d2e8bb1b7b21a976d82b15548788d2735b9d82f329268f71a11" dependencies = [ "addr2line", "cc", @@ -596,7 +596,7 @@ checksum = "74f7971dbd9326d58187408ab83117d8ac1bb9c17b085fdacd1cf2f598719b6b" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", - "brotli-decompressor 4.0.0", + "brotli-decompressor 4.0.1", ] [[package]] @@ -611,9 +611,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "4.0.0" +version = "4.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6221fe77a248b9117d431ad93761222e1cf8ff282d9d1d5d9f53d6299a1cf76" +checksum = "9a45bd2e4095a8b518033b128020dd4a55aab1c0a381ba4404a472630f4bc362" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -732,9 +732,9 @@ dependencies = [ [[package]] name = "clang-sys" -version = "1.7.0" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67523a3b4be3ce1989d607a828d036249522dd9c1c8de7f4dd2dae43a37369d1" +checksum = "f803f94ecf597339c7a34eed2036ef83f86aaba937f001f7c5b5e251f043f1f9" dependencies = [ "glob", "libc", @@ -1308,9 +1308,9 @@ dependencies = [ [[package]] name = "event-listener" -version = "5.3.0" +version = "5.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d9944b8ca13534cdfb2800775f8dd4902ff3fc75a50101466decadfdf322a24" +checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" dependencies = [ "concurrent-queue", "parking", @@ -1384,12 +1384,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "finl_unicode" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fcfdc7a0362c9f4444381a9e697c79d435fe65b52a37466fc2c1184cee9edc6" - [[package]] name = "flate2" version = "1.0.30" @@ -1675,9 +1669,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.1" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" [[package]] name = "glob" @@ -1934,9 +1928,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d8d52be92d09acc2e01dddb7fde3ad983fc6489c7db4837e605bc3fca4cb63e" +checksum = "7b875924a60b96e5d7b9ae7b066540b1dd1cbd90d1828f54c92e02a283351c56" dependencies = [ "bytes", "futures-channel", @@ -2528,7 +2522,7 @@ dependencies = [ "crossbeam-channel", "crossbeam-epoch", "crossbeam-utils", - "event-listener 5.3.0", + "event-listener 5.3.1", "futures-util", "once_cell", "parking_lot", @@ -2680,9 +2674,9 @@ dependencies = [ [[package]] name = "object" -version = "0.32.2" +version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +checksum = "b8ec7ab813848ba4522158d5517a6093db1ded27575b070f4177b8d12b41db5e" dependencies = [ "memchr", ] @@ -3083,11 +3077,20 @@ dependencies = [ "syn 2.0.66", ] +[[package]] +name = "proc-macro-crate" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" +dependencies = [ + "toml_edit", +] + [[package]] name = "proc-macro2" -version = "1.0.83" +version = "1.0.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b33eb56c327dec362a9e55b3ad14f9d2f0904fb5a5b03b513ab5465399e9f43" +checksum = "ec96c6a92621310b51366f1e28d05ef11489516e93be030060e5fc12024a49d6" dependencies = [ "unicode-ident", ] @@ -3487,9 +3490,9 @@ dependencies = [ [[package]] name = "rstest" -version = "0.19.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d5316d2a1479eeef1ea21e7f9ddc67c191d497abc8fc3ba2467857abbb68330" +checksum = "27059f51958c5f8496a6f79511e7c0ac396dd815dc8894e9b6e2efb5779cf6f0" dependencies = [ "futures", "futures-timer", @@ -3499,12 +3502,13 @@ dependencies = [ [[package]] name = "rstest_macros" -version = "0.19.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04a9df72cc1f67020b0d63ad9bfe4a323e459ea7eb68e03bd9824db49f9a4c25" +checksum = "e6132d64df104c0b3ea7a6ad7766a43f587bd773a4a9cf4cd59296d426afaf3a" dependencies = [ "cfg-if", "glob", + "proc-macro-crate", "proc-macro2", "quote", "regex", @@ -4223,13 +4227,13 @@ dependencies = [ [[package]] name = "stringprep" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb41d74e231a107a1b4ee36bd1214b11285b77768d2e3824aedafa988fd36ee6" +checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" dependencies = [ - "finl_unicode", "unicode-bidi", "unicode-normalization", + "unicode-properties", ] [[package]] @@ -4603,6 +4607,23 @@ dependencies = [ "serde", ] +[[package]] +name = "toml_datetime" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" + +[[package]] +name = "toml_edit" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" +dependencies = [ + "indexmap 2.2.6", + "toml_datetime", + "winnow", +] + [[package]] name = "tower" version = "0.4.13" @@ -4665,9 +4686,9 @@ dependencies = [ [[package]] name = "triomphe" -version = "0.1.11" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "859eb650cfee7434994602c3a68b25d77ad9e68c8a6cd491616ef86661382eb3" +checksum = "1b2cb4fbb9995eeb36ac86fadf24031ccd58f99d6b4b2d7b911db70bddb80d90" [[package]] name = "try-lock" @@ -5194,6 +5215,15 @@ version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + [[package]] name = "winreg" version = "0.52.0" @@ -5272,9 +5302,9 @@ dependencies = [ [[package]] name = "zeroize" -version = "1.7.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" dependencies = [ "zeroize_derive", ] diff --git a/Cargo.toml b/Cargo.toml index 4499a9f0b..0f2ccd9e2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -62,7 +62,7 @@ postgres-protocol = "0.6" pprof = { version = "0.13", features = ["flamegraph", "criterion"] } pretty_assertions = "1" regex = "1" -rstest = "0.19" +rstest = "0.20" rustls = "0.23.8" # ring feature does not require NASM windows executable, but works slower #rustls = { version = "0.23", default-features = false, features = ["logging", "std", "tls12", "ring"] } From a7f0937d9a60e1ad6ee87ff81bdf1bc356d35fbf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 4 Jun 2024 02:41:09 +0000 Subject: [PATCH 016/215] chore(deps): Bump sqlite-hashes from 0.7.1 to 0.7.2 (#1361) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [sqlite-hashes](https://github.com/nyurik/sqlite-hashes) from 0.7.1 to 0.7.2.
Release notes

Sourced from sqlite-hashes's releases.

v0.7.2

What's Changed

Full Changelog: https://github.com/nyurik/sqlite-hashes/compare/v0.7.1...v0.7.2

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=sqlite-hashes&package-manager=cargo&previous-version=0.7.1&new-version=0.7.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a759d364b..24c75be42 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4001,9 +4001,9 @@ dependencies = [ [[package]] name = "sqlite-hashes" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4faff0b1f487d94938f61fe78989b8e1e9524cf16a0b63174129c6a427057e2" +checksum = "16e525595f5f7d0b78daecb5d4fbf347d876a1d17d4486e3aba587891bb26333" dependencies = [ "digest", "hex", diff --git a/Cargo.toml b/Cargo.toml index 0f2ccd9e2..f079d2690 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -75,7 +75,7 @@ serde_with = "3" serde_yaml = "0.9" size_format = "1.0.2" spreet = { version = "0.11", default-features = false } -sqlite-hashes = { version = "0.7.1", default-features = false, features = ["md5", "aggregate", "hex"] } +sqlite-hashes = { version = "0.7.2", default-features = false, features = ["md5", "aggregate", "hex"] } sqlx = { version = "0.7", features = ["sqlite", "runtime-tokio"] } subst = { version = "0.3", features = ["yaml"] } thiserror = "1" From 9c24e3b4fd1b549073f2746f0fc34f39791b9fb8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 4 Jun 2024 02:52:36 +0000 Subject: [PATCH 017/215] chore(deps): Bump rustls from 0.23.8 to 0.23.9 (#1360) Bumps [rustls](https://github.com/rustls/rustls) from 0.23.8 to 0.23.9.
Commits
  • e754234 Prepare 0.23.9
  • 590716e Fix unstable fmt job
  • de851b4 unbuffered examples: avoid clippy lint
  • 5faa88c hs.rs: refactor to eliminate conditional allow()
  • 503d42b Tidy away unneeded #[allow()]s
  • 0c85c01 Add issue number for server-side ECH in the roadmap.
  • bacc19c General roadmap updates.
  • 4bd989c handshake_test: reorder items in file
  • 1aba137 handshake_test: clarify cloning tests
  • d202e0d handshake_test: remove get_ function prefices
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=rustls&package-manager=cargo&previous-version=0.23.8&new-version=0.23.9)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 10 +++++----- Cargo.toml | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 24c75be42..a98ce2326 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2374,7 +2374,7 @@ dependencies = [ "pprof", "regex", "rstest", - "rustls 0.23.8", + "rustls 0.23.9", "rustls-native-certs", "rustls-pemfile", "semver", @@ -3582,9 +3582,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.8" +version = "0.23.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79adb16721f56eb2d843e67676896a61ce7a0fa622dc18d3e372477a029d2740" +checksum = "a218f0f6d05669de4eabfb24f31ce802035c952429d037507b4a4a39f0e60c5b" dependencies = [ "aws-lc-rs", "log", @@ -4545,7 +4545,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04fb792ccd6bbcd4bba408eb8a292f70fc4a3589e5d793626f45190e6454b6ab" dependencies = [ "ring", - "rustls 0.23.8", + "rustls 0.23.9", "tokio", "tokio-postgres", "tokio-rustls 0.26.0", @@ -4569,7 +4569,7 @@ version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" dependencies = [ - "rustls 0.23.8", + "rustls 0.23.9", "rustls-pki-types", "tokio", ] diff --git a/Cargo.toml b/Cargo.toml index f079d2690..30b4b1f7c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -63,7 +63,7 @@ pprof = { version = "0.13", features = ["flamegraph", "criterion"] } pretty_assertions = "1" regex = "1" rstest = "0.20" -rustls = "0.23.8" +rustls = "0.23.9" # ring feature does not require NASM windows executable, but works slower #rustls = { version = "0.23", default-features = false, features = ["logging", "std", "tls12", "ring"] } rustls-native-certs = "0.7" From 526aa595bef3867c774f528e16dac8bb64671553 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 7 Jun 2024 03:24:42 +0000 Subject: [PATCH 018/215] chore(deps): Bump clap from 4.5.4 to 4.5.6 (#1363) Bumps [clap](https://github.com/clap-rs/clap) from 4.5.4 to 4.5.6.
Release notes

Sourced from clap's releases.

v4.5.6

[4.5.6] - 2024-06-06

Changelog

Sourced from clap's changelog.

[4.5.6] - 2024-06-06

[4.5.5] - 2024-06-06

Fixes

  • Allow exclusive to override required_unless_present, required_unless_present_any, required_unless_present_all
Commits
  • 51de731 chore(ci): Lint clippy::items_after_statements seems too strict
  • 181a2cf chore(ci): Allow prelude wildcard imports
  • 82cf9a6 chore(ci): Reduce noisy lints
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=clap&package-manager=cargo&previous-version=4.5.4&new-version=4.5.6)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a98ce2326..74f678d45 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -743,9 +743,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.4" +version = "4.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bc066a67923782aa8515dbaea16946c5bcc5addbd668bb80af688e53e548a0" +checksum = "a9689a29b593160de5bc4aacab7b5d54fb52231de70122626c178e6a368994c7" dependencies = [ "clap_builder", "clap_derive", @@ -753,9 +753,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.2" +version = "4.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4" +checksum = "2e5387378c84f6faa26890ebf9f0a92989f8873d4d380467bcd0d8d8620424df" dependencies = [ "anstream", "anstyle", @@ -765,9 +765,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.4" +version = "4.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "528131438037fd55894f62d6e9f068b8f45ac57ffa77517819645d10aed04f64" +checksum = "c780290ccf4fb26629baa7a1081e68ced113f1d3ec302fa5948f1c381ebf06c6" dependencies = [ "heck 0.5.0", "proc-macro2", @@ -2265,7 +2265,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19" dependencies = [ "cfg-if", - "windows-targets 0.52.5", + "windows-targets 0.48.5", ] [[package]] From 1bef526b77356d2d4a3392bbb3737793cdfb9ce7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Jun 2024 03:25:07 +0000 Subject: [PATCH 019/215] chore(deps): Bump regex from 1.10.4 to 1.10.5 (#1366) Bumps [regex](https://github.com/rust-lang/regex) from 1.10.4 to 1.10.5.
Changelog

Sourced from regex's changelog.

1.10.5 (2024-06-09)

This is a new patch release with some minor fixes.

Bug fixes:

Commits
  • 0718fc5 1.10.5
  • 377463b changelog: 1.10.4 and 1.10.5
  • 68c4f0b regex-automata-0.4.7
  • 4757b5f regex-syntax-0.8.4
  • 1430b65 changelog: 1.10.4
  • 1f9f9cc bytes: escape invalid UTF-8 bytes in debug output for Match
  • ab4c8d1 doc: fix duplicate phrasing typo
  • ddeb85e cli/deps: update memmap2 to 0.9
  • 023f1c9 lite: fix attribute warning about rustfmt
  • 9c139f4 syntax: simplify Hir::dot constructors
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=regex&package-manager=cargo&previous-version=1.10.4&new-version=1.10.5)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 74f678d45..9b9582025 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3320,9 +3320,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.4" +version = "1.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" +checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" dependencies = [ "aho-corasick", "memchr", From 131e68fd1ea1962c99541999034994ac4aba5b4d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Jun 2024 03:28:14 +0000 Subject: [PATCH 020/215] chore(deps): Bump subst from 0.3.0 to 0.3.1 (#1367) Bumps [subst](https://github.com/fizyr/subst) from 0.3.0 to 0.3.1.
Changelog

Sourced from subst's changelog.

Version 0.3.1 - 2024-06-09

  • [fix][minor] Fix recursive substitution in braced default values.
Commits
  • aee45ad Bump version to 0.3.1.
  • 091d597 Update CHANGELOG.
  • 58ef80f Add more tests for recursive substitution in default values.
  • 476997b fix: Allow recursive substitution of braced variables
  • ce74b13 Merge pull request #10 from nyurik/linting
  • 2a100f4 Expand match on YAML value again.
  • 4b75931 Address PR review feedback
  • 9abed1f Some linting and minor upgrades
  • fa37c2e Merge pull request #13 from cre4ture/fix/cargo_fmt
  • 783e5ae cargo fmt with exceptions for relevant tests and yaml.rs parts
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=subst&package-manager=cargo&previous-version=0.3.0&new-version=0.3.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9b9582025..dbcb3148d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4267,9 +4267,9 @@ dependencies = [ [[package]] name = "subst" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca1318e5d6716d6541696727c88d9b8dfc8cfe6afd6908e186546fd4af7f5b98" +checksum = "914a3487c294386d731fd33a8116b3ae4a8f95c0976b1550cc6b59b3db6c1e26" dependencies = [ "memchr", "serde", From 8f5767d8d340786df8b28e4fb5285bb2dda4fbb7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Jun 2024 03:17:36 +0000 Subject: [PATCH 021/215] chore(deps): Bump url from 2.5.0 to 2.5.1 (#1370) Bumps [url](https://github.com/servo/rust-url) from 2.5.0 to 2.5.1.
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=url&package-manager=cargo&previous-version=2.5.0&new-version=2.5.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 261 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 255 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index dbcb3148d..70d2fd2bd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1171,6 +1171,17 @@ dependencies = [ "subtle", ] +[[package]] +name = "displaydoc" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + [[package]] name = "dotenvy" version = "0.15.7" @@ -1969,6 +1980,124 @@ dependencies = [ "cc", ] +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f8ac670d7422d7f76b32e17a5db556510825b29ec9154f235977c9caba61036" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + [[package]] name = "ident_case" version = "1.0.1" @@ -1977,12 +2106,14 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "0.5.0" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +checksum = "4716a3a0933a1d01c2f72450e89596eb51dd34ef3c211ccd875acdf1f8fe47ed" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "icu_normalizer", + "icu_properties", + "smallvec", + "utf8_iter", ] [[package]] @@ -2297,6 +2428,12 @@ version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +[[package]] +name = "litemap" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704" + [[package]] name = "local-channel" version = "0.1.5" @@ -4344,6 +4481,17 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + [[package]] name = "tagptr" version = "0.2.0" @@ -4457,6 +4605,16 @@ dependencies = [ "strict-num", ] +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + [[package]] name = "tinytemplate" version = "1.2.1" @@ -4791,9 +4949,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.0" +version = "2.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +checksum = "f7c25da092f0a868cdf09e8674cd3b7ef3a7d92a24253e663a2fb85e2496de56" dependencies = [ "form_urlencoded", "idna", @@ -4867,6 +5025,18 @@ dependencies = [ "tiny-skia-path", ] +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "utf8parse" version = "0.2.1" @@ -5234,6 +5404,18 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + [[package]] name = "wyz" version = "0.5.1" @@ -5280,6 +5462,30 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" +[[package]] +name = "yoke" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", + "synstructure", +] + [[package]] name = "zerocopy" version = "0.7.34" @@ -5300,6 +5506,27 @@ dependencies = [ "syn 2.0.66", ] +[[package]] +name = "zerofrom" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", + "synstructure", +] + [[package]] name = "zeroize" version = "1.8.1" @@ -5320,6 +5547,28 @@ dependencies = [ "syn 2.0.66", ] +[[package]] +name = "zerovec" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb2cc8827d6c0994478a15c53f374f46fbd41bea663d809b14744bc42e6b109c" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97cf56601ee5052b4417d90c8755c6683473c926039908196cf35d99f893ebe7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + [[package]] name = "zopfli" version = "0.8.1" From bb953beb772564552abd7c9ca0580024d0b3c42f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Jun 2024 03:18:45 +0000 Subject: [PATCH 022/215] chore(deps): Bump clap from 4.5.6 to 4.5.7 (#1371) Bumps [clap](https://github.com/clap-rs/clap) from 4.5.6 to 4.5.7.
Release notes

Sourced from clap's releases.

v4.5.7

[4.5.7] - 2024-06-10

Fixes

  • Clean up error message when too few arguments for num_args
Changelog

Sourced from clap's changelog.

[4.5.7] - 2024-06-10

Fixes

  • Clean up error message when too few arguments for num_args
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=clap&package-manager=cargo&previous-version=4.5.6&new-version=4.5.7)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 70d2fd2bd..80e7b8557 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -743,9 +743,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.6" +version = "4.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9689a29b593160de5bc4aacab7b5d54fb52231de70122626c178e6a368994c7" +checksum = "5db83dced34638ad474f39f250d7fea9598bdd239eaced1bdf45d597da0f433f" dependencies = [ "clap_builder", "clap_derive", @@ -753,9 +753,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.6" +version = "4.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e5387378c84f6faa26890ebf9f0a92989f8873d4d380467bcd0d8d8620424df" +checksum = "f7e204572485eb3fbf28f871612191521df159bc3e15a9f5064c66dba3a8c05f" dependencies = [ "anstream", "anstyle", From a0dc75eb1c5db17764be907ee99dc744b448f595 Mon Sep 17 00:00:00 2001 From: Joko Priyono Date: Thu, 13 Jun 2024 10:50:31 +0700 Subject: [PATCH 023/215] =?UTF-8?q?fix:=20handle=20if=20selected=20date=20?= =?UTF-8?q?was=20undefined=20while=20double=20click=20on=20a=20sa=E2=80=A6?= =?UTF-8?q?=20(#1373)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Handle a negative case if the selected date was undefined while double-clicking on the same date in the calendar on the demo website. ![Screenshot 2024-06-12 at 15 45 49](https://github.com/maplibre/martin/assets/18734643/9d5afd46-f7a4-434e-ba44-925613055627) --- demo/frontend/src/Components/Map/Map.tsx | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/demo/frontend/src/Components/Map/Map.tsx b/demo/frontend/src/Components/Map/Map.tsx index 8e2435767..494eca248 100644 --- a/demo/frontend/src/Components/Map/Map.tsx +++ b/demo/frontend/src/Components/Map/Map.tsx @@ -62,17 +62,22 @@ class Map extends PureComponent<{}, {visibleLayer: any, range: any, hour: any}> }; changeFilter = (filter: string, value: any) => { - this.setState(state => ({ - ...state, - [filter]: value - })); + if (filter !== undefined && value !== undefined) { + this.setState(state => ({ + ...state, + [filter]: value + })); + } }; getQueryParams = () => { const { range: { from, to }, hour } = this.state; const dateFrom = `${dateConverter(from)}.2017`; - const dateTo = `${dateConverter(to)}.2017`; + let dateTo = `${dateConverter(to)}.2017`; + if (to === undefined) { + dateTo = dateFrom; + } return encodeURI(`date_from=${dateFrom}&date_to=${dateTo}&hour=${hour}`); }; From 683ce627cff55fcf9da9f5e914f4d4a7ec922031 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 13 Jun 2024 00:28:38 -0400 Subject: [PATCH 024/215] chore(deps): Bump braces from 3.0.2 to 3.0.3 in /demo/frontend (#1372) Bumps [braces](https://github.com/micromatch/braces) from 3.0.2 to 3.0.3.
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=braces&package-manager=npm_and_yarn&previous-version=3.0.2&new-version=3.0.3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/maplibre/martin/network/alerts).
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- demo/frontend/yarn.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/demo/frontend/yarn.lock b/demo/frontend/yarn.lock index 1cae63c00..cd949ef39 100644 --- a/demo/frontend/yarn.lock +++ b/demo/frontend/yarn.lock @@ -2045,11 +2045,11 @@ brace-expansion@^1.1.7: concat-map "0.0.1" braces@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: - fill-range "^7.0.1" + fill-range "^7.1.1" browserslist@^4.21.9, browserslist@^4.22.1: version "4.22.1" @@ -2766,10 +2766,10 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== +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" From da681ddd94920b8539091a0022cb5152f1f22e81 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 13 Jun 2024 00:29:07 -0400 Subject: [PATCH 025/215] chore(deps): Bump actix-web from 4.6.0 to 4.7.0 (#1369) Bumps [actix-web](https://github.com/actix/actix-web) from 4.6.0 to 4.7.0.
Release notes

Sourced from actix-web's releases.

actix-web: v4.7.0

Added

  • Add #[scope] macro.
  • Add middleware::Identity type.
  • Add CustomizeResponder::add_cookie() method.
  • Add guard::GuardContext::app_data() method.
  • Add compat-routing-macros-force-pub crate feature which (on-by-default) which, when disabled, causes handlers to inherit their attached function's visibility.
  • Add compat crate feature group (on-by-default) which, when disabled, helps with transitioning to some planned v5.0 breaking changes, starting only with compat-routing-macros-force-pub.
  • Implement From<Box<dyn ResponseError>> for Error.
Commits
  • a5c7848 chore(actix-web): prepare release 4.7.0
  • 12a0521 chore(actix-multipart): prepare release 0.6.2
  • b4faf88 chore(actix-web-codegen): prepare release 4.3.0
  • d6f8851 chore(actix-test): prepare release 0.1.4
  • ebc43dc feat: forwards-compatibility for handler visibility inheritance fix (#3391)
  • 7c4c26d feat: expose Identity middleware (#3390)
  • 3db7891 Scope macro (#3136)
  • c366649 docs: example of CPU core pinning
  • 534cfe1 feat: add .customize().add_cookie() (#3215)
  • cff958e chore: address clippy lint
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actix-web&package-manager=cargo&previous-version=4.6.0&new-version=4.7.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 80e7b8557..0771e24b1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -149,9 +149,9 @@ dependencies = [ [[package]] name = "actix-web" -version = "4.6.0" +version = "4.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1cf67dadb19d7c95e5a299e2dda24193b89d5d4f33a3b9800888ede9e19aa32" +checksum = "5d6316df3fa569627c98b12557a8b6ff0674e5be4bb9b5e4ae2550ddb4964ed6" dependencies = [ "actix-codec", "actix-http", @@ -190,9 +190,9 @@ dependencies = [ [[package]] name = "actix-web-codegen" -version = "4.2.2" +version = "4.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb1f50ebbb30eca122b188319a4398b3f7bb4a8cdf50ecfb73bfc6a3c3ce54f5" +checksum = "f591380e2e68490b5dfaf1dd1aa0ebe78d84ba7067078512b4ea6e4492d622b8" dependencies = [ "actix-router", "proc-macro2", @@ -2396,7 +2396,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19" dependencies = [ "cfg-if", - "windows-targets 0.48.5", + "windows-targets 0.52.5", ] [[package]] From bfb27167c9a1a4b2da9c9e4c73da258dd6901f83 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 13 Jun 2024 00:29:22 -0400 Subject: [PATCH 026/215] chore(deps): Bump actix-rt from 2.9.0 to 2.10.0 (#1368) Bumps [actix-rt](https://github.com/actix/actix-net) from 2.9.0 to 2.10.0.
Release notes

Sourced from actix-rt's releases.

actix-rt: v2.10.0

  • Relax F's bound (Fn => FnOnce) on {Arbiter, System}::with_tokio_rt() functions.
  • Update tokio-uring dependency to 0.5.
  • Minimum supported Rust version (MSRV) is now 1.70.
Commits
  • 0d3d192 fix: relax bounds on with_tokio_rt (#569)
  • 0c26ecf chore(actix-server): prepare release 2.4.0
  • 1bdb15e chore(actix-rt): prepare release 2.10.0
  • a524f15 build(deps): update tokio-uring requirement from 0.4 to 0.5 (#568)
  • 451a44c build(deps): bump taiki-e/install-action from 2.33.34 to 2.34.1 (#567)
  • 18071d1 ci: disable io-uring tests
  • 786014c build(deps): bump taiki-e/install-action from 2.33.26 to 2.33.34 (#566)
  • a7ef438 ci: use mold linker on linux jobs
  • 375c352 --- (#565)
  • 2d1b546 --- (#563)
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actix-rt&package-manager=cargo&previous-version=2.9.0&new-version=2.10.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0771e24b1..74b5c7e29 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -100,9 +100,9 @@ dependencies = [ [[package]] name = "actix-rt" -version = "2.9.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28f32d40287d3f402ae0028a9d54bef51af15c8769492826a69d28f81893151d" +checksum = "24eda4e2a6e042aa4e55ac438a2ae052d3b5da0ecf83d7411e1a368946925208" dependencies = [ "actix-macros", "futures-core", From 4e482a14f01ec9965cb1b1b0d72e4d660735ce63 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 13 Jun 2024 00:29:59 -0400 Subject: [PATCH 027/215] chore(deps): Bump tokio from 1.37.0 to 1.38.0 (#1357) Bumps [tokio](https://github.com/tokio-rs/tokio) from 1.37.0 to 1.38.0.
Release notes

Sourced from tokio's releases.

Tokio v1.38.0

This release marks the beginning of stabilization for runtime metrics. It stabilizes RuntimeMetrics::worker_count. Future releases will continue to stabilize more metrics.

Added

  • fs: add File::create_new (#6573)
  • io: add copy_bidirectional_with_sizes (#6500)
  • io: implement AsyncBufRead for Join (#6449)
  • net: add Apple visionOS support (#6465)
  • net: implement Clone for NamedPipeInfo (#6586)
  • net: support QNX OS (#6421)
  • sync: add Notify::notify_last (#6520)
  • sync: add mpsc::Receiver::{capacity,max_capacity} (#6511)
  • sync: add split method to the semaphore permit (#6472, #6478)
  • task: add tokio::task::join_set::Builder::spawn_blocking (#6578)
  • wasm: support rt-multi-thread with wasm32-wasi-preview1-threads (#6510)

Changed

  • macros: make #[tokio::test] append #[test] at the end of the attribute list (#6497)
  • metrics: fix blocking_threads count (#6551)
  • metrics: stabilize RuntimeMetrics::worker_count (#6556)
  • runtime: move task out of the lifo_slot in block_in_place (#6596)
  • runtime: panic if global_queue_interval is zero (#6445)
  • sync: always drop message in destructor for oneshot receiver (#6558)
  • sync: instrument Semaphore for task dumps (#6499)
  • sync: use FIFO ordering when waking batches of wakers (#6521)
  • task: make LocalKey::get work with Clone types (#6433)
  • tests: update nix and mio-aio dev-dependencies (#6552)
  • time: clean up implementation (#6517)
  • time: lazily init timers on first poll (#6512)
  • time: remove the true_when field in TimerShared (#6563)
  • time: use sharding for timer implementation (#6534)

Fixed

  • taskdump: allow building taskdump docs on non-unix machines (#6564)
  • time: check for overflow in Interval::poll_tick (#6487)
  • sync: fix incorrect is_empty on mpsc block boundaries (#6603)

Documented

  • fs: rewrite file system docs (#6467)
  • io: fix stdin documentation (#6581)
  • io: fix obsolete reference in ReadHalf::unsplit() documentation (#6498)
  • macros: render more comprehensible documentation for select! (#6468)
  • net: add missing types to module docs (#6482)
  • net: fix misleading NamedPipeServer example (#6590)

... (truncated)

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=tokio&package-manager=cargo&previous-version=1.37.0&new-version=1.38.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 74b5c7e29..f6411345a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4642,9 +4642,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.37.0" +version = "1.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" +checksum = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a" dependencies = [ "backtrace", "bytes", @@ -4661,9 +4661,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" +checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" dependencies = [ "proc-macro2", "quote", From dadb0ff90603418dc5b6760271081de92ab168bb Mon Sep 17 00:00:00 2001 From: Yuri Astrakhan Date: Thu, 13 Jun 2024 18:24:25 -0400 Subject: [PATCH 028/215] Fix tiny readme markup lints --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index f984a79c1..e9eb9fdb6 100755 --- a/README.md +++ b/README.md @@ -9,18 +9,18 @@ [![CI build](https://github.com/maplibre/martin/actions/workflows/ci.yml/badge.svg)](https://github.com/maplibre/martin/actions) Martin is a tile server and a set of tools able to generate vector tiles on the fly -from large PostgreSQL databases, and serve tiles from PMTiles and MBTiles files. Martin optimizes for speed and heavy traffic, and is written in [Rust](https://github.com/rust-lang/rust). +from large `PostgreSQL` databases, and serve tiles from `PMTiles` and `MBTiles` files. Martin optimizes for speed and heavy traffic, and is written in [Rust](https://github.com/rust-lang/rust). ## Features * Serve [vector tiles](https://github.com/mapbox/vector-tile-spec) from - * [PostGIS](https://github.com/postgis/postgis) databases, automatically discovering compatible tables and functions - * [PMTile](https://protomaps.com/blog/pmtiles-v3-whats-new), both local files and over HTTP - * [MBTile](https://github.com/mapbox/mbtiles-spec) files + * [PostGIS](https://github.com/postgis/postgis) databases, automatically discovering compatible tables and functions + * [PMTile](https://protomaps.com/blog/pmtiles-v3-whats-new), both local files and over HTTP + * [MBTile](https://github.com/mapbox/mbtiles-spec) files * [Combine](https://maplibre.org/martin/sources-composite.html) multiple tile sources into one * Generate [sprites](https://maplibre.org/martin/sources-sprites.html) and [font glyphs](https://maplibre.org/martin/sources-fonts.html) -* Generate tiles in bulk from any Martin-supported sources into an MBTiles file with [martin-cp](https://maplibre.org/martin/martin-cp.html) tool -* Examine, copy, validate, compare, and apply diffs between MBTiles files with [mbtiles](https://maplibre.org/martin/tools.html#mbtiles) tool +* Generate tiles in bulk from any Martin-supported sources into an `MBTiles` file with [martin-cp](https://maplibre.org/martin/martin-cp.html) tool +* Examine, copy, validate, compare, and apply diffs between `MBTiles` files with [mbtiles](https://maplibre.org/martin/tools.html#mbtiles) tool ## Documentation From 68aca37ba216e3b2f98b1a6a57743568ae36378a Mon Sep 17 00:00:00 2001 From: Yuri Astrakhan Date: Thu, 13 Jun 2024 18:33:29 -0400 Subject: [PATCH 029/215] fix ci, dep bump --- Cargo.lock | 144 ++++++++++++++++++++++++----------------------------- Cargo.toml | 4 +- README.md | 6 +-- 3 files changed, 71 insertions(+), 83 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f6411345a..030752f40 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -111,9 +111,9 @@ dependencies = [ [[package]] name = "actix-server" -version = "2.3.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3eb13e7eef0423ea6eab0e59f6c72e7cb46d33691ad56a726b3cd07ddec2c2d4" +checksum = "b02303ce8d4e8be5b855af6cf3c3a08f3eff26880faad82bab679c22d3650cb5" dependencies = [ "actix-rt", "actix-service", @@ -311,9 +311,9 @@ dependencies = [ [[package]] name = "anstyle-query" -version = "1.0.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a64c907d4e79225ac72e2a354c9ce84d50ebb4586dee56c82b3ee73004f537f5" +checksum = "ad186efb764318d35165f1758e7dcef3b10628e26d41a44bc5550652e6804391" dependencies = [ "windows-sys 0.52.0", ] @@ -370,11 +370,11 @@ dependencies = [ [[package]] name = "async-lock" -version = "3.3.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d034b430882f8381900d3fe6f0aaa3ad94f2cb4ac519b429692a1bc2dda4ae7b" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" dependencies = [ - "event-listener 4.0.3", + "event-listener 5.3.1", "event-listener-strategy", "pin-project-lite", ] @@ -429,9 +429,9 @@ checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[package]] name = "aws-lc-rs" -version = "1.7.2" +version = "1.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "474d7cec9d0a1126fad1b224b767fcbf351c23b0309bb21ec210bcfd379926a5" +checksum = "bf7d844e282b4b56750b2d4e893b2205581ded8709fddd2b6aa5418c150ca877" dependencies = [ "aws-lc-sys", "mirai-annotations", @@ -441,9 +441,9 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.17.0" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7505fc3cb7acbf42699a43a79dd9caa4ed9e99861dfbb837c5c0fb5a0a8d2980" +checksum = "c3a2c29203f6bf296d01141cc8bb9dbd5ecd4c27843f2ee0767bcd5985a927da" dependencies = [ "bindgen", "cc", @@ -456,9 +456,9 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.72" +version = "0.3.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17c6a35df3749d2e8bb1b7b21a976d82b15548788d2735b9d82f329268f71a11" +checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" dependencies = [ "addr2line", "cc", @@ -666,9 +666,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.0.98" +version = "1.0.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41c270e7540d725e65ac7f1b212ac8ce349719624d7bcff99f8e2e488e8cf03f" +checksum = "96c51067fd44124faa7f870b4b1c969379ad32b2ba805aa959430ceaa384f695" dependencies = [ "jobserver", "libc", @@ -732,9 +732,9 @@ dependencies = [ [[package]] name = "clang-sys" -version = "1.8.2" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f803f94ecf597339c7a34eed2036ef83f86aaba937f001f7c5b5e251f043f1f9" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" dependencies = [ "glob", "libc", @@ -777,15 +777,15 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" +checksum = "4b82cf0babdbd58558212896d1a4272303a57bdb245c2bf1147185fb45640e70" [[package]] name = "clap_mangen" -version = "0.2.20" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1dd95b5ebb5c1c54581dd6346f3ed6a79a3eef95dd372fc2ac13d535535300e" +checksum = "74b70fc13e60c0e1d490dc50eb73a749be6d81f4ef03783df1d9b7b0c62bc937" dependencies = [ "clap", "roff", @@ -1306,17 +1306,6 @@ version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" -[[package]] -name = "event-listener" -version = "4.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b215c49b2b248c855fb73579eb1f4f26c38ffdc12973e20e07b91d78d5646e" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - [[package]] name = "event-listener" version = "5.3.1" @@ -1330,11 +1319,11 @@ dependencies = [ [[package]] name = "event-listener-strategy" -version = "0.4.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3" +checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" dependencies = [ - "event-listener 4.0.3", + "event-listener 5.3.1", "pin-project-lite", ] @@ -1849,12 +1838,12 @@ dependencies = [ [[package]] name = "http-body-util" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" dependencies = [ "bytes", - "futures-core", + "futures-util", "http 1.1.0", "http-body 1.0.0", "pin-project-lite", @@ -1862,9 +1851,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.8.0" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" +checksum = "d0e7a4dd27b9476dc40cb050d3632d3bba3a70ddbff012285f7f8559a1e7e545" [[package]] name = "httpdate" @@ -1880,9 +1869,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.28" +version = "0.14.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" +checksum = "f361cde2f109281a220d4307746cdfd5ee3f410da58a70377762396775634b33" dependencies = [ "bytes", "futures-channel", @@ -2322,7 +2311,7 @@ dependencies = [ "bytes", "futures", "http 0.2.12", - "hyper 0.14.28", + "hyper 0.14.29", "lambda_runtime_api_client", "serde", "serde_json", @@ -2339,7 +2328,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7210012be904051520f0dc502140ba599bae3042b65b3737b87727f1aa88a7d6" dependencies = [ "http 0.2.12", - "hyper 0.14.28", + "hyper 0.14.29", "tokio", "tower-service", ] @@ -2511,7 +2500,7 @@ dependencies = [ "pprof", "regex", "rstest", - "rustls 0.23.9", + "rustls 0.23.10", "rustls-native-certs", "rustls-pemfile", "semver", @@ -2577,9 +2566,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.2" +version = "2.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" +checksum = "6d0d8b92cd8358e8d229c11df9358decae64d137c5be540952c5ca7b25aea768" [[package]] name = "memmap2" @@ -2811,9 +2800,9 @@ dependencies = [ [[package]] name = "object" -version = "0.35.0" +version = "0.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8ec7ab813848ba4522158d5517a6093db1ded27575b070f4177b8d12b41db5e" +checksum = "576dfe1fc8f9df304abb159d767a29d0476f7750fbf8aa7ad07816004a207434" dependencies = [ "memchr", ] @@ -3225,9 +3214,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.84" +version = "1.0.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec96c6a92621310b51366f1e28d05ef11489516e93be030060e5fc12024a49d6" +checksum = "22244ce15aa966053a896d1accb3a6e68469b97c7f33f284b99f0d576879fc23" dependencies = [ "unicode-ident", ] @@ -3464,25 +3453,25 @@ dependencies = [ "aho-corasick", "memchr", "regex-automata", - "regex-syntax 0.8.3", + "regex-syntax 0.8.4", ] [[package]] name = "regex-automata" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" +checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.3", + "regex-syntax 0.8.4", ] [[package]] name = "regex-lite" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30b661b2f27137bdbc16f00eda72866a92bb28af1753ffbd56744fb6e2e9cd8e" +checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a" [[package]] name = "regex-syntax" @@ -3492,9 +3481,9 @@ checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" [[package]] name = "regex-syntax" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" [[package]] name = "relative-path" @@ -3627,9 +3616,9 @@ dependencies = [ [[package]] name = "rstest" -version = "0.20.0" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27059f51958c5f8496a6f79511e7c0ac396dd815dc8894e9b6e2efb5779cf6f0" +checksum = "9afd55a67069d6e434a95161415f5beeada95a01c7b815508a82dcb0e1593682" dependencies = [ "futures", "futures-timer", @@ -3639,9 +3628,9 @@ dependencies = [ [[package]] name = "rstest_macros" -version = "0.20.0" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6132d64df104c0b3ea7a6ad7766a43f587bd773a4a9cf4cd59296d426afaf3a" +checksum = "4165dfae59a39dd41d8dec720d3cbfbc71f69744efb480a3920f5d4e0cc6798d" dependencies = [ "cfg-if", "glob", @@ -3719,9 +3708,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.9" +version = "0.23.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a218f0f6d05669de4eabfb24f31ce802035c952429d037507b4a4a39f0e60c5b" +checksum = "05cff451f60db80f490f3c182b77c35260baace73209e9cdbbe526bfe3a4d402" dependencies = [ "aws-lc-rs", "log", @@ -4127,11 +4116,10 @@ dependencies = [ [[package]] name = "sqlformat" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce81b7bd7c4493975347ef60d8c7e8b742d4694f4c49f93e0a12ea263938176c" +checksum = "f895e3734318cc55f1fe66258926c9b910c124d47520339efecbb6c59cec7c1f" dependencies = [ - "itertools 0.12.1", "nom", "unicode_categories", ] @@ -4432,9 +4420,9 @@ dependencies = [ [[package]] name = "symbolic-common" -version = "12.8.0" +version = "12.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cccfffbc6bb3bb2d3a26cd2077f4d055f6808d266f9d4d158797a4c60510dfe" +checksum = "71297dc3e250f7dbdf8adb99e235da783d690f5819fdeb4cce39d9cfb0aca9f1" dependencies = [ "debugid", "memmap2 0.9.4", @@ -4444,9 +4432,9 @@ dependencies = [ [[package]] name = "symbolic-demangle" -version = "12.8.0" +version = "12.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76a99812da4020a67e76c4eb41f08c87364c14170495ff780f30dd519c221a68" +checksum = "424fa2c9bf2c862891b9cfd354a752751a6730fd838a4691e7f6c2c7957b9daf" dependencies = [ "cpp_demangle", "rustc-demangle", @@ -4703,7 +4691,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04fb792ccd6bbcd4bba408eb8a292f70fc4a3589e5d793626f45190e6454b6ab" dependencies = [ "ring", - "rustls 0.23.9", + "rustls 0.23.10", "tokio", "tokio-postgres", "tokio-rustls 0.26.0", @@ -4727,7 +4715,7 @@ version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" dependencies = [ - "rustls 0.23.9", + "rustls 0.23.10", "rustls-pki-types", "tokio", ] @@ -4925,9 +4913,9 @@ checksum = "b1d386ff53b415b7fe27b50bb44679e2cc4660272694b7b6f3326d8480823a94" [[package]] name = "unicode-width" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f5e5f3158ecfd4b8ff6fe086db7c8467a2dfdac97fe420f2b7c4aa97af66d6" +checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" [[package]] name = "unicode_categories" @@ -5039,9 +5027,9 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "utf8parse" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" diff --git a/Cargo.toml b/Cargo.toml index 30b4b1f7c..d052f521d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -62,8 +62,8 @@ postgres-protocol = "0.6" pprof = { version = "0.13", features = ["flamegraph", "criterion"] } pretty_assertions = "1" regex = "1" -rstest = "0.20" -rustls = "0.23.9" +rstest = "0.21" +rustls = "0.23.10" # ring feature does not require NASM windows executable, but works slower #rustls = { version = "0.23", default-features = false, features = ["logging", "std", "tls12", "ring"] } rustls-native-certs = "0.7" diff --git a/README.md b/README.md index e9eb9fdb6..7e2b132f5 100755 --- a/README.md +++ b/README.md @@ -14,9 +14,9 @@ from large `PostgreSQL` databases, and serve tiles from `PMTiles` and `MBTiles` ## Features * Serve [vector tiles](https://github.com/mapbox/vector-tile-spec) from - * [PostGIS](https://github.com/postgis/postgis) databases, automatically discovering compatible tables and functions - * [PMTile](https://protomaps.com/blog/pmtiles-v3-whats-new), both local files and over HTTP - * [MBTile](https://github.com/mapbox/mbtiles-spec) files + * [PostGIS](https://github.com/postgis/postgis) databases, automatically discovering compatible tables and functions + * [PMTile](https://protomaps.com/blog/pmtiles-v3-whats-new), both local files and over HTTP + * [MBTile](https://github.com/mapbox/mbtiles-spec) files * [Combine](https://maplibre.org/martin/sources-composite.html) multiple tile sources into one * Generate [sprites](https://maplibre.org/martin/sources-sprites.html) and [font glyphs](https://maplibre.org/martin/sources-fonts.html) * Generate tiles in bulk from any Martin-supported sources into an `MBTiles` file with [martin-cp](https://maplibre.org/martin/martin-cp.html) tool From bf1553f74911c389760b073250e9a0aad31d2afa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 19 Jun 2024 02:42:27 +0000 Subject: [PATCH 030/215] chore(deps): Bump url from 2.5.1 to 2.5.2 (#1376) Bumps [url](https://github.com/servo/rust-url) from 2.5.1 to 2.5.2.
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=url&package-manager=cargo&previous-version=2.5.1&new-version=2.5.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 261 ++--------------------------------------------------- 1 file changed, 6 insertions(+), 255 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 030752f40..fcfa95ad3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1171,17 +1171,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "displaydoc" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.66", -] - [[package]] name = "dotenvy" version = "0.15.7" @@ -1969,124 +1958,6 @@ dependencies = [ "cc", ] -[[package]] -name = "icu_collections" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locid" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_locid_transform" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_locid_transform_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_locid_transform_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" - -[[package]] -name = "icu_normalizer" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "utf16_iter", - "utf8_iter", - "write16", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" - -[[package]] -name = "icu_properties" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f8ac670d7422d7f76b32e17a5db556510825b29ec9154f235977c9caba61036" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_locid_transform", - "icu_properties_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" - -[[package]] -name = "icu_provider" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_provider_macros", - "stable_deref_trait", - "tinystr", - "writeable", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_provider_macros" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.66", -] - [[package]] name = "ident_case" version = "1.0.1" @@ -2095,14 +1966,12 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "1.0.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4716a3a0933a1d01c2f72450e89596eb51dd34ef3c211ccd875acdf1f8fe47ed" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" dependencies = [ - "icu_normalizer", - "icu_properties", - "smallvec", - "utf8_iter", + "unicode-bidi", + "unicode-normalization", ] [[package]] @@ -2417,12 +2286,6 @@ version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" -[[package]] -name = "litemap" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704" - [[package]] name = "local-channel" version = "0.1.5" @@ -4469,17 +4332,6 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" -[[package]] -name = "synstructure" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.66", -] - [[package]] name = "tagptr" version = "0.2.0" @@ -4593,16 +4445,6 @@ dependencies = [ "strict-num", ] -[[package]] -name = "tinystr" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" -dependencies = [ - "displaydoc", - "zerovec", -] - [[package]] name = "tinytemplate" version = "1.2.1" @@ -4937,9 +4779,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.1" +version = "2.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7c25da092f0a868cdf09e8674cd3b7ef3a7d92a24253e663a2fb85e2496de56" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" dependencies = [ "form_urlencoded", "idna", @@ -5013,18 +4855,6 @@ dependencies = [ "tiny-skia-path", ] -[[package]] -name = "utf16_iter" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" - -[[package]] -name = "utf8_iter" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" - [[package]] name = "utf8parse" version = "0.2.2" @@ -5392,18 +5222,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "write16" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" - -[[package]] -name = "writeable" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" - [[package]] name = "wyz" version = "0.5.1" @@ -5450,30 +5268,6 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" -[[package]] -name = "yoke" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5" -dependencies = [ - "serde", - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.66", - "synstructure", -] - [[package]] name = "zerocopy" version = "0.7.34" @@ -5494,27 +5288,6 @@ dependencies = [ "syn 2.0.66", ] -[[package]] -name = "zerofrom" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.66", - "synstructure", -] - [[package]] name = "zeroize" version = "1.8.1" @@ -5535,28 +5308,6 @@ dependencies = [ "syn 2.0.66", ] -[[package]] -name = "zerovec" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb2cc8827d6c0994478a15c53f374f46fbd41bea663d809b14744bc42e6b109c" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97cf56601ee5052b4417d90c8755c6683473c926039908196cf35d99f893ebe7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.66", -] - [[package]] name = "zopfli" version = "0.8.1" From 454df5e31a46113ea79299eca2b044b1cb05e9de Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 20 Jun 2024 02:54:00 +0000 Subject: [PATCH 031/215] chore(deps): Bump sqlite-hashes from 0.7.2 to 0.7.3 (#1379) Bumps [sqlite-hashes](https://github.com/nyurik/sqlite-hashes) from 0.7.2 to 0.7.3.
Release notes

Sourced from sqlite-hashes's releases.

v0.7.3

Minor dependency updates and readme fixes

Full Changelog: https://github.com/nyurik/sqlite-hashes/compare/v0.7.2...v0.7.3

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=sqlite-hashes&package-manager=cargo&previous-version=0.7.2&new-version=0.7.3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index fcfa95ad3..02a55382c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3989,9 +3989,9 @@ dependencies = [ [[package]] name = "sqlite-hashes" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16e525595f5f7d0b78daecb5d4fbf347d876a1d17d4486e3aba587891bb26333" +checksum = "39e59834cb3c95e0993b5768ca9f408e8aecda5c9489d3f1f4a05fe848c4f77d" dependencies = [ "digest", "hex", diff --git a/Cargo.toml b/Cargo.toml index d052f521d..18d2d9c5b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -75,7 +75,7 @@ serde_with = "3" serde_yaml = "0.9" size_format = "1.0.2" spreet = { version = "0.11", default-features = false } -sqlite-hashes = { version = "0.7.2", default-features = false, features = ["md5", "aggregate", "hex"] } +sqlite-hashes = { version = "0.7.3", default-features = false, features = ["md5", "aggregate", "hex"] } sqlx = { version = "0.7", features = ["sqlite", "runtime-tokio"] } subst = { version = "0.3", features = ["yaml"] } thiserror = "1" From da44d0b762a19f6485b9d5e2995bc47ca0998754 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Jun 2024 02:43:09 -0400 Subject: [PATCH 032/215] chore(deps): Bump docker/build-push-action from 5 to 6 (#1375) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 5 to 6.
Release notes

Sourced from docker/build-push-action's releases.

v6.0.0

[!NOTE] This major release adds support for generating Build summary and exporting build record for your build. You can disable this feature by setting DOCKER_BUILD_NO_SUMMARY: true environment variable in your workflow.

Full Changelog: https://github.com/docker/build-push-action/compare/v5.4.0...v6.0.0

v5.4.0

Full Changelog: https://github.com/docker/build-push-action/compare/v5.3.0...v5.4.0

v5.3.0

Full Changelog: https://github.com/docker/build-push-action/compare/v5.2.0...v5.3.0

v5.2.0

Full Changelog: https://github.com/docker/build-push-action/compare/v5.1.0...v5.2.0

v5.1.0

Full Changelog: https://github.com/docker/build-push-action/compare/v5.0.0...v5.1.0

Commits
  • c382f71 Merge pull request #1120 from crazy-max/build-summary
  • 5a5b70d chore: update generated content
  • dc24cf9 don't generate summary for cloud driver
  • 667cb22 DOCKER_BUILD_NO_SUMMARY env to disable summary
  • d880b19 generate build summary
  • e51051a export build record and upload artifact
  • 86c2bd0 Merge pull request #1137 from docker/dependabot/npm_and_yarn/braces-3.0.3
  • 268d2b1 Merge pull request #1138 from docker/dependabot/npm_and_yarn/docker/actions-t...
  • 2b8dc7f chore: update generated content
  • 840c12b chore(deps): Bump @​docker/actions-toolkit from 0.25.1 to 0.26.0
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=docker/build-push-action&package-manager=github_actions&previous-version=5&new-version=6)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2989b7e90..6ed1bb17a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -169,7 +169,7 @@ jobs: - name: Copy static files run: cp -r tests/fixtures/pmtiles2/* ${{ steps.nginx.outputs.html-dir }} - name: Build linux/arm64 Docker image - uses: docker/build-push-action@v5 + uses: docker/build-push-action@v6 # https://github.com/docker/build-push-action with: context: . @@ -191,7 +191,7 @@ jobs: DATABASE_URL: postgres://${{ env.PGUSER }}:${{ env.PGUSER }}@${{ env.PGHOST }}:${{ job.services.postgres.ports[5432] }}/${{ env.PGDATABASE }}?sslmode=require - name: Build linux/amd64 Docker image - uses: docker/build-push-action@v5 + uses: docker/build-push-action@v6 # https://github.com/docker/build-push-action with: context: . @@ -228,7 +228,7 @@ jobs: images: ghcr.io/${{ github.repository }} - name: Push the Docker image if: github.event_name != 'pull_request' - uses: docker/build-push-action@v5 + uses: docker/build-push-action@v6 with: context: . file: .github/files/multi-platform.Dockerfile From 374525f8ef065cef26055b3faac7b1bb235a641c Mon Sep 17 00:00:00 2001 From: Oquile Date: Tue, 25 Jun 2024 07:43:54 +0100 Subject: [PATCH 033/215] Update quick-start-linux.md (#1380) Curl fails to follow redirects by default. Adding `-L` instructs it to follow them and allows Marlin to be downloaded. --- docs/src/quick-start-linux.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/src/quick-start-linux.md b/docs/src/quick-start-linux.md index 093b323b0..b169c9891 100644 --- a/docs/src/quick-start-linux.md +++ b/docs/src/quick-start-linux.md @@ -5,10 +5,10 @@ mkdir martin cd martin # Download some sample data -curl -O https://github.com/maplibre/martin/blob/main/tests/fixtures/mbtiles/world_cities.mbtiles +curl -L -O https://github.com/maplibre/martin/blob/main/tests/fixtures/mbtiles/world_cities.mbtiles # Download the latest version of Martin binary, extract it, and make it executable -curl -O https://github.com/maplibre/martin/releases/latest/download/martin-x86_64-unknown-linux-gnu.tar.gz +curl -L -O https://github.com/maplibre/martin/releases/latest/download/martin-x86_64-unknown-linux-gnu.tar.gz tar -xzf martin-x86_64-unknown-linux-gnu.tar.gz chmod +x ./martin From 656c197eb3a0e821abc793bcef1e6985ac9bbc07 Mon Sep 17 00:00:00 2001 From: Yuri Astrakhan Date: Tue, 25 Jun 2024 11:00:19 -0400 Subject: [PATCH 034/215] Upgrade deps and fix global RusTLS init (#1381) See https://github.com/rustls/rustls/issues/1877 --- Cargo.lock | 277 ++++++++++++++++++---------------- martin/src/config.rs | 3 +- martin/src/utils/utilities.rs | 17 ++- 3 files changed, 166 insertions(+), 131 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 02a55382c..ef0cf8978 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8,7 +8,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f7b0a21988c1bf877cf4759ef5ddaac04c1c9fe808c9142ecb78ba97d97a28a" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "bytes", "futures-core", "futures-sink", @@ -36,9 +36,9 @@ dependencies = [ [[package]] name = "actix-http" -version = "3.7.0" +version = "3.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4eb9843d84c775696c37d9a418bbb01b932629d01870722c0f13eb3f95e2536d" +checksum = "3ae682f693a9cd7b058f2b0b5d9a6d7728a8555779bedbbc35dd88528611d020" dependencies = [ "actix-codec", "actix-rt", @@ -46,7 +46,7 @@ dependencies = [ "actix-utils", "ahash", "base64 0.22.1", - "bitflags 2.5.0", + "bitflags 2.6.0", "brotli 6.0.0", "bytes", "bytestring", @@ -80,7 +80,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] @@ -149,9 +149,9 @@ dependencies = [ [[package]] name = "actix-web" -version = "4.7.0" +version = "4.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d6316df3fa569627c98b12557a8b6ff0674e5be4bb9b5e4ae2550ddb4964ed6" +checksum = "1988c02af8d2b718c05bc4aeb6a66395b7cdf32858c2c71131e5637a8c05a9ff" dependencies = [ "actix-codec", "actix-http", @@ -197,7 +197,7 @@ dependencies = [ "actix-router", "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] @@ -398,7 +398,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] @@ -409,7 +409,7 @@ checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] @@ -509,7 +509,7 @@ version = "0.69.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "cexpr", "clang-sys", "itertools 0.12.1", @@ -522,7 +522,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.66", + "syn 2.0.68", "which", ] @@ -549,9 +549,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" dependencies = [ "serde", ] @@ -627,9 +627,9 @@ checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytemuck" -version = "1.16.0" +version = "1.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78834c15cb5d5efe3452d58b1e8ba890dd62d21907f867f383358198e56ebca5" +checksum = "b236fc92302c97ed75b38da1f4917b5cdda4984745740f153a5d3059e48d725e" [[package]] name = "byteorder" @@ -666,9 +666,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.0.99" +version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96c51067fd44124faa7f870b4b1c969379ad32b2ba805aa959430ceaa384f695" +checksum = "c891175c3fb232128f48de6590095e59198bbeb8620c310be349bfc3afd12c7b" dependencies = [ "jobserver", "libc", @@ -772,7 +772,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] @@ -1033,7 +1033,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edb49164822f3ee45b17acd4a208cfc1251410cf0cad9a833234c9890774dd9f" dependencies = [ "quote", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] @@ -1057,7 +1057,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] @@ -1068,7 +1068,7 @@ checksum = "733cabb43482b1a1b53eee8583c2b9e8684d592215ea83efd305dd31bc2f0178" dependencies = [ "darling_core", "quote", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] @@ -1142,15 +1142,15 @@ dependencies = [ [[package]] name = "derive_more" -version = "0.99.17" +version = "0.99.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" dependencies = [ "convert_case 0.4.0", "proc-macro2", "quote", "rustc_version", - "syn 1.0.109", + "syn 2.0.68", ] [[package]] @@ -1236,7 +1236,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] @@ -1406,7 +1406,7 @@ checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" dependencies = [ "futures-core", "futures-sink", - "spin 0.9.8", + "spin", ] [[package]] @@ -1470,7 +1470,7 @@ version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1fad2be0bf06af23adddcf6cd143c94ff0ba3b329691f92d1a38dae5c5aeebf" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "freetype-sys", "libc", ] @@ -1577,7 +1577,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] @@ -1840,9 +1840,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.9.3" +version = "1.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0e7a4dd27b9476dc40cb050d3632d3bba3a70ddbff012285f7f8559a1e7e545" +checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" [[package]] name = "httpdate" @@ -1900,18 +1900,19 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.26.0" +version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0bea761b46ae2b24eb4aef630d8d1c398157b6fc29e6350ecf090a0b70c952c" +checksum = "5ee4be2c948921a1a5320b629c4193916ed787a7f7f293fd3f7f5a6c9de74155" dependencies = [ "futures-util", "http 1.1.0", "hyper 1.3.1", "hyper-util", - "rustls 0.22.4", + "rustls", + "rustls-native-certs", "rustls-pki-types", "tokio", - "tokio-rustls 0.25.0", + "tokio-rustls", "tower-service", ] @@ -2210,11 +2211,11 @@ checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388" [[package]] name = "lazy_static" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" dependencies = [ - "spin 0.5.2", + "spin", ] [[package]] @@ -2249,9 +2250,9 @@ dependencies = [ [[package]] name = "libloading" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19" +checksum = "e310b3a6b5907f99202fcdb4960ff45b93735d7c7d96b760fcff8db2dc0e103d" dependencies = [ "cfg-if", "windows-targets 0.52.5", @@ -2363,7 +2364,7 @@ dependencies = [ "pprof", "regex", "rstest", - "rustls 0.23.10", + "rustls", "rustls-native-certs", "rustls-pemfile", "semver", @@ -2429,9 +2430,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.3" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d0d8b92cd8358e8d229c11df9358decae64d137c5be540952c5ca7b25aea768" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "memmap2" @@ -2474,9 +2475,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87dfd01fe195c66b572b37921ad8803d010623c0aca821bea2302239d155cdae" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" dependencies = [ "adler", "simd-adler32", @@ -2733,7 +2734,7 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.1", + "redox_syscall 0.5.2", "smallvec", "windows-targets 0.52.5", ] @@ -2761,7 +2762,7 @@ dependencies = [ "regex", "regex-syntax 0.7.5", "structmeta", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] @@ -2852,7 +2853,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] @@ -3063,7 +3064,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" dependencies = [ "proc-macro2", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] @@ -3077,9 +3078,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.85" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22244ce15aa966053a896d1accb3a6e68469b97c7f33f284b99f0d576879fc23" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] @@ -3209,6 +3210,53 @@ dependencies = [ "memchr", ] +[[package]] +name = "quinn" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4ceeeeabace7857413798eb1ffa1e9c905a9946a57d81fb69b4b71c4d8eb3ad" +dependencies = [ + "bytes", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls", + "thiserror", + "tokio", + "tracing", +] + +[[package]] +name = "quinn-proto" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddf517c03a109db8100448a4be38d498df8a210a99fe0e1b9eaf39e78c640efe" +dependencies = [ + "bytes", + "rand", + "ring", + "rustc-hash", + "rustls", + "slab", + "thiserror", + "tinyvec", + "tracing", +] + +[[package]] +name = "quinn-udp" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9096629c45860fc7fb143e125eb826b5e721e10be3263160c7d60ca832cf8c46" +dependencies = [ + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.52.0", +] + [[package]] name = "quote" version = "1.0.36" @@ -3260,7 +3308,7 @@ version = "11.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e29830cbb1290e404f24c73af91c5d8d631ce7e128691e9477556b540cd01ecd" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", ] [[package]] @@ -3300,11 +3348,11 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e" +checksum = "c82cf8cff14456045f55ec4241383baeff27af886adb72ffb2162f99911de0fd" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", ] [[package]] @@ -3356,9 +3404,9 @@ checksum = "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2" [[package]] name = "reqwest" -version = "0.12.4" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "566cafdd92868e0939d3fb961bd0dc25fcfaaed179291093b3d43e6b3150ea10" +checksum = "c7d6d2a27d57148378eb5e111173f4276ad26340ecc5c49a4a2152167a2d6a37" dependencies = [ "base64 0.22.1", "bytes", @@ -3377,7 +3425,8 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "rustls 0.22.4", + "quinn", + "rustls", "rustls-native-certs", "rustls-pemfile", "rustls-pki-types", @@ -3386,7 +3435,7 @@ dependencies = [ "serde_urlencoded", "sync_wrapper", "tokio", - "tokio-rustls 0.25.0", + "tokio-rustls", "tower-service", "url", "wasm-bindgen", @@ -3431,7 +3480,7 @@ dependencies = [ "cfg-if", "getrandom", "libc", - "spin 0.9.8", + "spin", "untrusted", "windows-sys 0.52.0", ] @@ -3503,7 +3552,7 @@ dependencies = [ "regex", "relative-path", "rustc_version", - "syn 2.0.66", + "syn 2.0.68", "unicode-ident", ] @@ -3513,7 +3562,7 @@ version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a78046161564f5e7cd9008aff3b2990b3850dc8e0349119b98e8f251e099f24d" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "fallible-iterator 0.3.0", "fallible-streaming-iterator", "hashlink", @@ -3548,27 +3597,13 @@ version = "0.38.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "errno", "libc", "linux-raw-sys", "windows-sys 0.52.0", ] -[[package]] -name = "rustls" -version = "0.22.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf4ef73721ac7bcd79b2b315da7779d8fc09718c6b3d2d1b2d94850eb8c18432" -dependencies = [ - "log", - "ring", - "rustls-pki-types", - "rustls-webpki", - "subtle", - "zeroize", -] - [[package]] name = "rustls" version = "0.23.10" @@ -3578,6 +3613,7 @@ dependencies = [ "aws-lc-rs", "log", "once_cell", + "ring", "rustls-pki-types", "rustls-webpki", "subtle", @@ -3687,7 +3723,7 @@ version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" dependencies = [ - "bitflags 2.5.0", + "bitflags 2.6.0", "core-foundation", "core-foundation-sys", "libc", @@ -3727,14 +3763,14 @@ checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] name = "serde_json" -version = "1.0.117" +version = "1.0.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3" +checksum = "d947f6b3163d8857ea16c4fa0dd4840d52f3041039a85decd46867eb1abef2e4" dependencies = [ "itoa", "ryu", @@ -3801,7 +3837,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] @@ -3935,12 +3971,6 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" - [[package]] name = "spin" version = "0.9.8" @@ -4097,7 +4127,7 @@ checksum = "1ed31390216d20e538e447a7a9b959e06ed9fc51c37b514b46eb758016ecd418" dependencies = [ "atoi", "base64 0.21.7", - "bitflags 2.5.0", + "bitflags 2.6.0", "byteorder", "bytes", "crc", @@ -4139,7 +4169,7 @@ checksum = "7c824eb80b894f926f89a0b9da0c7f435d27cdd35b8c655b114e58223918577e" dependencies = [ "atoi", "base64 0.21.7", - "bitflags 2.5.0", + "bitflags 2.6.0", "byteorder", "crc", "dotenvy", @@ -4239,7 +4269,7 @@ dependencies = [ "proc-macro2", "quote", "structmeta-derive", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] @@ -4250,14 +4280,14 @@ checksum = "a60bcaff7397072dca0017d1db428e30d5002e00b6847703e2e42005c95fbe00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] name = "subst" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "914a3487c294386d731fd33a8116b3ae4a8f95c0976b1550cc6b59b3db6c1e26" +checksum = "b95bc3d9b5ec35dabec6f7ac966e073ef28d4881c6a2009567632ab721df6203" dependencies = [ "memchr", "serde", @@ -4267,9 +4297,9 @@ dependencies = [ [[package]] name = "subtle" -version = "2.5.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "svgtypes" @@ -4317,9 +4347,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.66" +version = "2.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c42f3f41a2de00b01c0aaad383c5a45241efc8b2d1eda5661812fda5f3cdcff5" +checksum = "901fa70d88b9d6c98022e23b4136f9f3e54e4662c3bc1bd1d84a42a9a0f0c1e9" dependencies = [ "proc-macro2", "quote", @@ -4328,9 +4358,9 @@ dependencies = [ [[package]] name = "sync_wrapper" -version = "0.1.2" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" [[package]] name = "tagptr" @@ -4373,7 +4403,7 @@ checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] @@ -4457,9 +4487,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.6.0" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "c55115c6fbe2d2bef26eb09ad74bde02d8255476fc0c7b515ef09fbb35742d82" dependencies = [ "tinyvec_macros", ] @@ -4497,7 +4527,7 @@ checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] @@ -4533,31 +4563,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04fb792ccd6bbcd4bba408eb8a292f70fc4a3589e5d793626f45190e6454b6ab" dependencies = [ "ring", - "rustls 0.23.10", + "rustls", "tokio", "tokio-postgres", - "tokio-rustls 0.26.0", + "tokio-rustls", "x509-certificate", ] -[[package]] -name = "tokio-rustls" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" -dependencies = [ - "rustls 0.22.4", - "rustls-pki-types", - "tokio", -] - [[package]] name = "tokio-rustls" version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" dependencies = [ - "rustls 0.23.10", + "rustls", "rustls-pki-types", "tokio", ] @@ -4660,7 +4679,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] @@ -4674,9 +4693,9 @@ dependencies = [ [[package]] name = "triomphe" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b2cb4fbb9995eeb36ac86fadf24031ccd58f99d6b4b2d7b911db70bddb80d90" +checksum = "e6631e42e10b40c0690bf92f404ebcfe6e1fdb480391d15f17cc8e96eeed5369" [[package]] name = "try-lock" @@ -4863,9 +4882,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.8.0" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" +checksum = "5de17fd2f7da591098415cff336e12965a28061ddace43b59cb3c430179c9439" dependencies = [ "getrandom", ] @@ -4940,7 +4959,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", "wasm-bindgen-shared", ] @@ -4974,7 +4993,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -5285,7 +5304,7 @@ checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] @@ -5305,7 +5324,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.66", + "syn 2.0.68", ] [[package]] @@ -5342,9 +5361,9 @@ dependencies = [ [[package]] name = "zstd-sys" -version = "2.0.10+zstd.1.5.6" +version = "2.0.11+zstd.1.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c253a4914af5bafc8fa8c86ee400827e83cf6ec01195ec1f1ed8441bf00d65aa" +checksum = "75652c55c0b6f3e6f12eb786fe1bc960396bf05a1eb3bf1f3691c3610ac2e6d4" dependencies = [ "cc", "pkg-config", diff --git a/martin/src/config.rs b/martin/src/config.rs index 8be723a91..eff279dc8 100644 --- a/martin/src/config.rs +++ b/martin/src/config.rs @@ -19,7 +19,7 @@ use crate::source::{TileInfoSources, TileSources}; #[cfg(feature = "sprites")] use crate::sprites::{SpriteConfig, SpriteSources}; use crate::srv::{SrvConfig, RESERVED_KEYWORDS}; -use crate::utils::{parse_base_path, CacheValue, MainCache, OptMainCache}; +use crate::utils::{init_aws_lc_tls, parse_base_path, CacheValue, MainCache, OptMainCache}; use crate::MartinError::{ConfigLoadError, ConfigParseError, ConfigWriteError, NoSources}; use crate::{IdResolver, MartinResult, OptOneMany}; @@ -117,6 +117,7 @@ impl Config { } pub async fn resolve(&mut self) -> MartinResult { + init_aws_lc_tls()?; let resolver = IdResolver::new(RESERVED_KEYWORDS); let cache_size = self.cache_size_mb.unwrap_or(512) * 1024 * 1024; let cache = if cache_size > 0 { diff --git a/martin/src/utils/utilities.rs b/martin/src/utils/utilities.rs index 7cc1156b1..8ed5af5ec 100644 --- a/martin/src/utils/utilities.rs +++ b/martin/src/utils/utilities.rs @@ -1,11 +1,26 @@ use std::io::{Read as _, Write as _}; +use std::sync::OnceLock; use actix_web::http::Uri; use flate2::read::GzDecoder; use flate2::write::GzEncoder; use crate::MartinError::BasePathError; -use crate::MartinResult; +use crate::{MartinError, MartinResult}; + +pub fn init_aws_lc_tls() -> MartinResult<()> { + // https://github.com/rustls/rustls/issues/1877 + static INIT_TLS: OnceLock> = OnceLock::new(); + // TODO: replace with LazyCell after 1.80 + INIT_TLS + .get_or_init(|| { + rustls::crypto::aws_lc_rs::default_provider() + .install_default() + .map_err(|e| format!("Unable to init rustls: {e:?}")) + }) + .clone() + .map_err(|e| MartinError::InternalError(e.into())) +} pub fn decode_gzip(data: &[u8]) -> Result, std::io::Error> { let mut decoder = GzDecoder::new(data); From 9b55f9263477724822f6cf058d40f56610caf01b Mon Sep 17 00:00:00 2001 From: Lucas Date: Wed, 26 Jun 2024 00:43:44 +0800 Subject: [PATCH 035/215] Update quick-start-qgis.md (#1382) --- docs/src/quick-start-qgis.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/quick-start-qgis.md b/docs/src/quick-start-qgis.md index 8ad2db54b..0c7cec1ec 100644 --- a/docs/src/quick-start-qgis.md +++ b/docs/src/quick-start-qgis.md @@ -6,7 +6,7 @@ > ![alt text](images/qgis_add_vector_tile.png) 3. In the `Vector Tile Connection` dialog, give it some name and the URL of the Martin server, - e.g. `http://localhost:3000/martin/{z}/{x}/{y}.pbf` and click `OK`. + e.g. `http://localhost:3000/world_cities/{z}/{x}/{y}` and click `OK`. > ![alt text](images/qgis_add_vector_tile_options.png) 4. In the QGIS browser panel (left), double-click the newly added connection, or right-click it and click From ccd550a2cffbd126b71864d0bdbf8475ac046985 Mon Sep 17 00:00:00 2001 From: Yuri Astrakhan Date: Tue, 25 Jun 2024 15:34:14 -0400 Subject: [PATCH 036/215] Add binary diff for mbtiles (#1358) * `mbtiles diff` now has an additional `--patch-type` param with `whole`, `bin-diff-raw` and `bin-diff-gz` values: * `whole` stores different tiles as before - as whole tiles in the `tiles` table * `bin-diff-raw` computes binary difference between tiles, and stores them as brotli-encoded value in a `bsdiffraw` table, together with a `xxh3_64` hash of the tile as it will be stored after patching * `bin-diff-gz` same as `bin-diff-raw`, but assumes the tiles are gzip-compressed, so it uncompresses them before comparing. The `xxh3_64` stores the hash of the uncompressed tile. The data will be stored in the `bsdiffrawgz` table (identical structure with above) * `mbtiles copy --apply-patch` will automatically detect if `bsdiffrawgz` or `bsdiffraw` tables exist, and will use binary patching. * `mbtiles apply-patch` does not support binary patching yet * `mbtiles copy --diff-with-file ... --patch-type ...` is an alias to `mbtiles diff --patch-type ...` --- .gitignore | 1 + Cargo.lock | 55 ++- Cargo.toml | 10 +- justfile | 3 +- martin-tile-utils/Cargo.toml | 4 +- martin-tile-utils/src/decoders.rs | 30 ++ martin-tile-utils/src/lib.rs | 26 +- martin/Cargo.toml | 3 +- martin/benches/bench.rs | 6 +- martin/src/bin/martin-cp.rs | 6 +- martin/src/lib.rs | 4 +- martin/src/mbtiles/mod.rs | 4 +- martin/src/pg/errors.rs | 2 +- martin/src/pg/pg_source.rs | 4 +- martin/src/pmtiles/mod.rs | 4 +- martin/src/source.rs | 4 +- martin/src/srv/server.rs | 4 +- martin/src/srv/tiles.rs | 11 +- martin/src/utils/cache.rs | 3 +- martin/src/utils/mod.rs | 3 - martin/src/utils/utilities.rs | 29 -- martin/src/utils/xyz.rs | 18 - martin/tests/mb_server_test.rs | 2 +- martin/tests/pg_function_source_test.rs | 2 +- martin/tests/pg_table_source_test.rs | 3 +- martin/tests/pmt_server_test.rs | 2 +- mbtiles/Cargo.toml | 11 +- mbtiles/src/bin/mbtiles.rs | 24 +- mbtiles/src/bindiff.rs | 390 ++++++++++++++++++ mbtiles/src/copier.rs | 224 +++++++--- mbtiles/src/errors.rs | 15 + mbtiles/src/lib.rs | 5 +- mbtiles/src/mbtiles.rs | 10 +- mbtiles/src/patcher.rs | 4 + mbtiles/src/queries.rs | 91 +++- mbtiles/src/validation.rs | 3 +- mbtiles/tests/copy.rs | 377 ++++++++++------- .../snapshots/copy__databases@flat__bdr.snap | 67 +++ .../snapshots/copy__databases@hash__bdr.snap | 75 ++++ tests/expected/auto/catalog_auto.json | 1 + tests/expected/mbtiles/copy_bindiff.txt | 3 + tests/expected/mbtiles/copy_bindiff2.txt | 5 + tests/expected/mbtiles/copy_bindiff3.txt | 2 + tests/expected/mbtiles/copy_bindiff4.txt | 9 + tests/expected/mbtiles/copy_diff.txt | 2 +- .../mbtiles/world_cities_diff.mbtiles | Bin 3584 -> 4096 bytes .../mbtiles/world_cities_modified.mbtiles | Bin 49152 -> 49152 bytes tests/test.sh | 21 + 48 files changed, 1263 insertions(+), 319 deletions(-) create mode 100644 martin-tile-utils/src/decoders.rs delete mode 100644 martin/src/utils/xyz.rs create mode 100644 mbtiles/src/bindiff.rs create mode 100644 mbtiles/tests/snapshots/copy__databases@flat__bdr.snap create mode 100644 mbtiles/tests/snapshots/copy__databases@hash__bdr.snap create mode 100644 tests/expected/mbtiles/copy_bindiff.txt create mode 100644 tests/expected/mbtiles/copy_bindiff2.txt create mode 100644 tests/expected/mbtiles/copy_bindiff3.txt create mode 100644 tests/expected/mbtiles/copy_bindiff4.txt diff --git a/.gitignore b/.gitignore index 6dec1c8b4..d13179339 100644 --- a/.gitignore +++ b/.gitignore @@ -10,5 +10,6 @@ test_log* pg_data/ config.yml tests/output/ +tests/mbtiles_temp_files/ tmp/ .aws-sam/ diff --git a/Cargo.lock b/Cargo.lock index ef0cf8978..50ee96887 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -619,6 +619,12 @@ dependencies = [ "alloc-stdlib", ] +[[package]] +name = "bsdiff" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7f2e6c4f2a017f63b5a1fd7cc437f061b53a3e890bcca840ef756d72f6b72f2" + [[package]] name = "bumpalo" version = "3.16.0" @@ -1406,6 +1412,7 @@ checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" dependencies = [ "futures-core", "futures-sink", + "nanorand", "spin", ] @@ -1642,8 +1649,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", + "js-sys", "libc", "wasi", + "wasm-bindgen", ] [[package]] @@ -2328,7 +2337,7 @@ checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" [[package]] name = "martin" -version = "0.13.0" +version = "0.14.0" dependencies = [ "actix-cors", "actix-http", @@ -2344,7 +2353,6 @@ dependencies = [ "deadpool-postgres", "enum-display", "env_logger", - "flate2", "futures", "indoc", "insta", @@ -2383,15 +2391,17 @@ dependencies = [ [[package]] name = "martin-tile-utils" -version = "0.4.1" +version = "0.5.0" dependencies = [ "approx", + "brotli 6.0.0", + "flate2", "insta", ] [[package]] name = "mbtiles" -version = "0.9.1" +version = "0.10.0" dependencies = [ "actix-rt", "anyhow", @@ -2399,11 +2409,14 @@ dependencies = [ "ctor", "enum-display", "env_logger", + "flume", "futures", "insta", "itertools 0.13.0", "log", "martin-tile-utils", + "md5", + "num_cpus", "pretty_assertions", "rstest", "serde", @@ -2411,11 +2424,13 @@ dependencies = [ "serde_with", "serde_yaml", "size_format", + "sqlite-compressions", "sqlite-hashes", "sqlx", "thiserror", "tilejson", "tokio", + "xxhash-rust", ] [[package]] @@ -2428,6 +2443,12 @@ dependencies = [ "digest", ] +[[package]] +name = "md5" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "490cc448043f947bae3cbee9c203358d62dbee0db12107a74be5c30ccfd09771" + [[package]] name = "memchr" version = "2.7.4" @@ -2534,6 +2555,15 @@ dependencies = [ "serde", ] +[[package]] +name = "nanorand" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" +dependencies = [ + "getrandom", +] + [[package]] name = "nix" version = "0.26.4" @@ -4017,6 +4047,17 @@ dependencies = [ "unicode_categories", ] +[[package]] +name = "sqlite-compressions" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d005d84196a3cc75a3113058d333de388cef7eb665dbcee09e31bb8166a1382" +dependencies = [ + "bsdiff", + "flate2", + "rusqlite", +] + [[package]] name = "sqlite-hashes" version = "0.7.3" @@ -5281,6 +5322,12 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec7a2a501ed189703dba8b08142f057e887dfc4b2cc4db2d343ac6376ba3e0b9" +[[package]] +name = "xxhash-rust" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "927da81e25be1e1a2901d59b81b37dd2efd1fc9c9345a55007f09bf5a2d3ee03" + [[package]] name = "yansi" version = "0.5.1" diff --git a/Cargo.toml b/Cargo.toml index 18d2d9c5b..5500b6e8b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,7 +6,7 @@ members = ["martin", "martin-tile-utils", "mbtiles"] edition = "2021" license = "MIT OR Apache-2.0" repository = "https://github.com/maplibre/martin" -rust-version = "1.74" +rust-version = "1.76" readme = "README.md" homepage = "https://martin.maplibre.org/" @@ -42,6 +42,7 @@ deadpool-postgres = "0.12" enum-display = "0.1" env_logger = "0.11" flate2 = "1" +flume = "0.11" futures = "0.3" indoc = "2" insta = "1" @@ -50,8 +51,9 @@ json-patch = "2.0" lambda-web = { version = "0.2.1", features = ["actix4"] } libsqlite3-sys = { version = ">=0.27", features = ["bundled"] } log = "0.4" -martin-tile-utils = { path = "./martin-tile-utils", version = "0.4.0" } -mbtiles = { path = "./mbtiles", version = "0.9.0" } +martin-tile-utils = { path = "./martin-tile-utils", version = "0.5.0" } +mbtiles = { path = "./mbtiles", version = "0.10.0" } +md5 = "0.7.0" moka = { version = "0.12", features = ["future"] } num_cpus = "1" pbf_font_tools = { version = "2.5.1", features = ["freetype"] } @@ -75,6 +77,7 @@ serde_with = "3" serde_yaml = "0.9" size_format = "1.0.2" spreet = { version = "0.11", default-features = false } +sqlite-compressions = { version = "0.2.12", default-features = false, features = ["bsdiffraw", "gzip"] } sqlite-hashes = { version = "0.7.3", default-features = false, features = ["md5", "aggregate", "hex"] } sqlx = { version = "0.7", features = ["sqlite", "runtime-tokio"] } subst = { version = "0.3", features = ["yaml"] } @@ -84,6 +87,7 @@ tilejson = "0.4" tokio = { version = "1", features = ["macros"] } tokio-postgres-rustls = "0.12" url = "2.5" +xxhash-rust = { version = "0.8", features = ["xxh3"] } [profile.dev.package] # See https://github.com/launchbadge/sqlx#compile-time-verification diff --git a/justfile b/justfile index c7c43f175..4fb3341e8 100644 --- a/justfile +++ b/justfile @@ -188,8 +188,7 @@ bless: restart clean-test bless-insta-martin bless-insta-mbtiles bless-tests ble bless-int: rm -rf tests/temp tests/test.sh - rm -rf tests/expected - mv tests/output tests/expected + rm -rf tests/expected && mv tests/output tests/expected # Run test with bless-tests feature bless-tests: diff --git a/martin-tile-utils/Cargo.toml b/martin-tile-utils/Cargo.toml index ee910c2b5..9ee6e5c24 100644 --- a/martin-tile-utils/Cargo.toml +++ b/martin-tile-utils/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "martin-tile-utils" -version = "0.4.1" +version = "0.5.0" authors = ["Yuri Astrakhan ", "MapLibre contributors"] description = "Utilities to help with map tile processing, such as type and compression detection. Used by the MapLibre's Martin tile server." keywords = ["maps", "tiles", "mvt", "tileserver"] @@ -17,6 +17,8 @@ repository.workspace = true rust-version.workspace = true [dependencies] +brotli.workspace = true +flate2.workspace = true [dev-dependencies] approx.workspace = true diff --git a/martin-tile-utils/src/decoders.rs b/martin-tile-utils/src/decoders.rs new file mode 100644 index 000000000..1bdb177ba --- /dev/null +++ b/martin-tile-utils/src/decoders.rs @@ -0,0 +1,30 @@ +use std::io::{Read as _, Write as _}; + +use flate2::read::GzDecoder; +use flate2::write::GzEncoder; + +pub fn decode_gzip(data: &[u8]) -> Result, std::io::Error> { + let mut decoder = GzDecoder::new(data); + let mut decompressed = Vec::new(); + decoder.read_to_end(&mut decompressed)?; + Ok(decompressed) +} + +pub fn encode_gzip(data: &[u8]) -> Result, std::io::Error> { + let mut encoder = GzEncoder::new(Vec::new(), flate2::Compression::default()); + encoder.write_all(data)?; + encoder.finish() +} + +pub fn decode_brotli(data: &[u8]) -> Result, std::io::Error> { + let mut decoder = brotli::Decompressor::new(data, 4096); + let mut decompressed = Vec::new(); + decoder.read_to_end(&mut decompressed)?; + Ok(decompressed) +} + +pub fn encode_brotli(data: &[u8]) -> Result, std::io::Error> { + let mut encoder = brotli::CompressorWriter::new(Vec::new(), 4096, 11, 22); + encoder.write_all(data)?; + Ok(encoder.into_inner()) +} diff --git a/martin-tile-utils/src/lib.rs b/martin-tile-utils/src/lib.rs index 43b7705a1..8c89bc2ad 100644 --- a/martin-tile-utils/src/lib.rs +++ b/martin-tile-utils/src/lib.rs @@ -4,13 +4,33 @@ // project originally written by Kaveh Karimi and licensed under MIT/Apache-2.0 use std::f64::consts::PI; -use std::fmt::Display; +use std::fmt::{Display, Formatter, Result}; pub const EARTH_CIRCUMFERENCE: f64 = 40_075_016.685_578_5; pub const EARTH_RADIUS: f64 = EARTH_CIRCUMFERENCE / 2.0 / PI; pub const MAX_ZOOM: u8 = 30; +mod decoders; +pub use decoders::*; + +#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] +pub struct TileCoord { + pub z: u8, + pub x: u32, + pub y: u32, +} + +impl Display for TileCoord { + fn fmt(&self, f: &mut Formatter<'_>) -> Result { + if f.alternate() { + write!(f, "{}/{}/{}", self.z, self.x, self.y) + } else { + write!(f, "{},{},{}", self.z, self.x, self.y) + } + } +} + #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub enum Format { Gif, @@ -74,7 +94,7 @@ impl Format { } impl Display for Format { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + fn fmt(&self, f: &mut Formatter<'_>) -> Result { f.write_str(match *self { Self::Gif => "gif", Self::Jpeg => "jpeg", @@ -189,7 +209,7 @@ impl From for TileInfo { } impl Display for TileInfo { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + fn fmt(&self, f: &mut Formatter<'_>) -> Result { write!(f, "{}", self.format.content_type())?; if let Some(encoding) = self.encoding.content_encoding() { write!(f, "; encoding={encoding}")?; diff --git a/martin/Cargo.toml b/martin/Cargo.toml index 428cf6ae0..0c3a871a8 100644 --- a/martin/Cargo.toml +++ b/martin/Cargo.toml @@ -3,7 +3,7 @@ lints.workspace = true [package] name = "martin" # Once the release is published with the hash, update https://github.com/maplibre/homebrew-martin -version = "0.13.0" +version = "0.14.0" authors = ["Stepan Kuzmin ", "Yuri Astrakhan ", "MapLibre contributors"] description = "Blazing fast and lightweight tile server with PostGIS, MBTiles, and PMTiles support" keywords = ["maps", "tiles", "mbtiles", "pmtiles", "postgis"] @@ -81,7 +81,6 @@ clap.workspace = true deadpool-postgres = { workspace = true, optional = true } enum-display.workspace = true env_logger.workspace = true -flate2.workspace = true futures.workspace = true itertools.workspace = true json-patch = { workspace = true, optional = true } diff --git a/martin/benches/bench.rs b/martin/benches/bench.rs index ceb4a6946..114e73656 100644 --- a/martin/benches/bench.rs +++ b/martin/benches/bench.rs @@ -2,10 +2,8 @@ use async_trait::async_trait; use criterion::async_executor::FuturesExecutor; use criterion::{criterion_group, criterion_main, Criterion}; use martin::srv::DynTileSource; -use martin::{ - CatalogSourceEntry, MartinResult, Source, TileCoord, TileData, TileSources, UrlQuery, -}; -use martin_tile_utils::{Encoding, Format, TileInfo}; +use martin::{CatalogSourceEntry, MartinResult, Source, TileData, TileSources, UrlQuery}; +use martin_tile_utils::{Encoding, Format, TileCoord, TileInfo}; use pprof::criterion::{Output, PProfProfiler}; use tilejson::{tilejson, TileJSON}; diff --git a/martin/src/bin/martin-cp.rs b/martin/src/bin/martin-cp.rs index ecb3a291f..7fe50d156 100644 --- a/martin/src/bin/martin-cp.rs +++ b/martin/src/bin/martin-cp.rs @@ -14,10 +14,10 @@ use log::{debug, error, info, log_enabled}; use martin::args::{Args, ExtraArgs, MetaArgs, OsEnv, SrvArgs}; use martin::srv::{merge_tilejson, DynTileSource}; use martin::{ - append_rect, read_config, Config, MartinError, MartinResult, ServerState, Source, TileCoord, - TileData, TileRect, + append_rect, read_config, Config, MartinError, MartinResult, ServerState, Source, TileData, + TileRect, }; -use martin_tile_utils::{bbox_to_xyz, TileInfo}; +use martin_tile_utils::{bbox_to_xyz, TileCoord, TileInfo}; use mbtiles::sqlx::SqliteConnection; use mbtiles::UpdateZoomType::GrowOnly; use mbtiles::{ diff --git a/martin/src/lib.rs b/martin/src/lib.rs index ef4aad9f7..59548426a 100644 --- a/martin/src/lib.rs +++ b/martin/src/lib.rs @@ -9,8 +9,8 @@ pub use source::{CatalogSourceEntry, Source, Tile, TileData, TileSources, UrlQue mod utils; pub use utils::{ - append_rect, decode_brotli, decode_gzip, IdResolver, MartinError, MartinResult, OptBoolObj, - OptOneMany, TileCoord, TileRect, NO_MAIN_CACHE, + append_rect, IdResolver, MartinError, MartinResult, OptBoolObj, OptOneMany, TileRect, + NO_MAIN_CACHE, }; pub mod args; diff --git a/martin/src/mbtiles/mod.rs b/martin/src/mbtiles/mod.rs index b9e446f24..2488098a0 100644 --- a/martin/src/mbtiles/mod.rs +++ b/martin/src/mbtiles/mod.rs @@ -5,7 +5,7 @@ use std::sync::Arc; use async_trait::async_trait; use log::trace; -use martin_tile_utils::TileInfo; +use martin_tile_utils::{TileCoord, TileInfo}; use mbtiles::MbtilesPool; use serde::{Deserialize, Serialize}; use tilejson::TileJSON; @@ -15,7 +15,7 @@ use crate::config::UnrecognizedValues; use crate::file_config::FileError::{AcquireConnError, InvalidMetadata, IoError}; use crate::file_config::{ConfigExtras, FileResult, SourceConfigExtras}; use crate::source::{TileData, UrlQuery}; -use crate::{MartinResult, Source, TileCoord}; +use crate::{MartinResult, Source}; #[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)] pub struct MbtConfig { diff --git a/martin/src/pg/errors.rs b/martin/src/pg/errors.rs index 2b49bc7ef..37cd6e7c0 100644 --- a/martin/src/pg/errors.rs +++ b/martin/src/pg/errors.rs @@ -3,11 +3,11 @@ use std::path::PathBuf; use deadpool_postgres::tokio_postgres::Error as TokioPgError; use deadpool_postgres::{BuildError, PoolError}; +use martin_tile_utils::TileCoord; use semver::Version; use crate::pg::utils::query_to_json; use crate::source::UrlQuery; -use crate::TileCoord; pub type PgResult = Result; diff --git a/martin/src/pg/pg_source.rs b/martin/src/pg/pg_source.rs index f639e3d5b..8f1b34712 100644 --- a/martin/src/pg/pg_source.rs +++ b/martin/src/pg/pg_source.rs @@ -3,14 +3,14 @@ use deadpool_postgres::tokio_postgres::types::{ToSql, Type}; use log::debug; use martin_tile_utils::Encoding::Uncompressed; use martin_tile_utils::Format::Mvt; -use martin_tile_utils::TileInfo; +use martin_tile_utils::{TileCoord, TileInfo}; use tilejson::TileJSON; use crate::pg::pool::PgPool; use crate::pg::utils::query_to_json; use crate::pg::PgError::{GetTileError, GetTileWithQueryError, PrepareQueryError}; use crate::source::{Source, TileData, UrlQuery}; -use crate::{MartinResult, TileCoord}; +use crate::MartinResult; #[derive(Clone, Debug)] pub struct PgSource { diff --git a/martin/src/pmtiles/mod.rs b/martin/src/pmtiles/mod.rs index 3b0c134f9..c24b823b7 100644 --- a/martin/src/pmtiles/mod.rs +++ b/martin/src/pmtiles/mod.rs @@ -8,7 +8,7 @@ use std::sync::Arc; use async_trait::async_trait; use log::{trace, warn}; -use martin_tile_utils::{Encoding, Format, TileInfo}; +use martin_tile_utils::{Encoding, Format, TileCoord, TileInfo}; use pmtiles::async_reader::AsyncPmTilesReader; use pmtiles::cache::{DirCacheResult, DirectoryCache}; use pmtiles::reqwest::Client; @@ -23,7 +23,7 @@ use crate::file_config::{ConfigExtras, FileError, FileResult, SourceConfigExtras use crate::source::UrlQuery; use crate::utils::cache::get_cached_value; use crate::utils::{CacheKey, CacheValue, OptMainCache}; -use crate::{MartinResult, Source, TileCoord, TileData}; +use crate::{MartinResult, Source, TileData}; #[derive(Clone, Debug)] pub struct PmtCache { diff --git a/martin/src/source.rs b/martin/src/source.rs index ba04293b9..879fa4592 100644 --- a/martin/src/source.rs +++ b/martin/src/source.rs @@ -4,11 +4,11 @@ use std::fmt::Debug; use actix_web::error::ErrorNotFound; use async_trait::async_trait; use log::debug; -use martin_tile_utils::TileInfo; +use martin_tile_utils::{TileCoord, TileInfo}; use serde::{Deserialize, Serialize}; use tilejson::TileJSON; -use crate::{MartinResult, TileCoord}; +use crate::MartinResult; pub type TileData = Vec; pub type UrlQuery = HashMap; diff --git a/martin/src/srv/server.rs b/martin/src/srv/server.rs index 80f11bf24..fba334e86 100755 --- a/martin/src/srv/server.rs +++ b/martin/src/srv/server.rs @@ -159,12 +159,12 @@ pub fn new_server(config: SrvConfig, state: ServerState) -> MartinResult<(Server #[cfg(test)] pub mod tests { use async_trait::async_trait; - use martin_tile_utils::{Encoding, Format, TileInfo}; + use martin_tile_utils::{Encoding, Format, TileCoord, TileInfo}; use tilejson::TileJSON; use super::*; use crate::source::{Source, TileData}; - use crate::{TileCoord, UrlQuery}; + use crate::UrlQuery; #[derive(Debug, Clone)] pub struct TestSource { diff --git a/martin/src/srv/tiles.rs b/martin/src/srv/tiles.rs index fe592180a..7d9689a01 100755 --- a/martin/src/srv/tiles.rs +++ b/martin/src/srv/tiles.rs @@ -8,7 +8,9 @@ use actix_web::web::{Data, Path, Query}; use actix_web::{route, HttpMessage, HttpRequest, HttpResponse, Result as ActixResult}; use futures::future::try_join_all; use log::trace; -use martin_tile_utils::{Encoding, Format, TileInfo}; +use martin_tile_utils::{ + decode_brotli, decode_gzip, encode_brotli, encode_gzip, Encoding, Format, TileCoord, TileInfo, +}; use serde::Deserialize; use crate::args::PreferredEncoding; @@ -16,11 +18,8 @@ use crate::source::{Source, TileSources, UrlQuery}; use crate::srv::server::map_internal_error; use crate::srv::SrvConfig; use crate::utils::cache::get_or_insert_cached_value; -use crate::utils::{ - decode_brotli, decode_gzip, encode_brotli, encode_gzip, CacheKey, CacheValue, MainCache, - OptMainCache, -}; -use crate::{Tile, TileCoord, TileData}; +use crate::utils::{CacheKey, CacheValue, MainCache, OptMainCache}; +use crate::{Tile, TileData}; static SUPPORTED_ENC: &[HeaderEnc] = &[ HeaderEnc::gzip(), diff --git a/martin/src/utils/cache.rs b/martin/src/utils/cache.rs index f1b948744..9923a2355 100755 --- a/martin/src/utils/cache.rs +++ b/martin/src/utils/cache.rs @@ -1,6 +1,7 @@ +use martin_tile_utils::TileCoord; use moka::future::Cache; -use crate::{TileCoord, TileData}; +use crate::TileData; pub type MainCache = Cache; pub type OptMainCache = Option; diff --git a/martin/src/utils/mod.rs b/martin/src/utils/mod.rs index 306da7e55..a6f519f0e 100644 --- a/martin/src/utils/mod.rs +++ b/martin/src/utils/mod.rs @@ -15,6 +15,3 @@ pub use rectangle::{append_rect, TileRect}; mod utilities; pub use utilities::*; - -mod xyz; -pub use xyz::TileCoord; diff --git a/martin/src/utils/utilities.rs b/martin/src/utils/utilities.rs index 8ed5af5ec..55b85341f 100644 --- a/martin/src/utils/utilities.rs +++ b/martin/src/utils/utilities.rs @@ -1,9 +1,6 @@ -use std::io::{Read as _, Write as _}; use std::sync::OnceLock; use actix_web::http::Uri; -use flate2::read::GzDecoder; -use flate2::write::GzEncoder; use crate::MartinError::BasePathError; use crate::{MartinError, MartinResult}; @@ -22,32 +19,6 @@ pub fn init_aws_lc_tls() -> MartinResult<()> { .map_err(|e| MartinError::InternalError(e.into())) } -pub fn decode_gzip(data: &[u8]) -> Result, std::io::Error> { - let mut decoder = GzDecoder::new(data); - let mut decompressed = Vec::new(); - decoder.read_to_end(&mut decompressed)?; - Ok(decompressed) -} - -pub fn encode_gzip(data: &[u8]) -> Result, std::io::Error> { - let mut encoder = GzEncoder::new(Vec::new(), flate2::Compression::default()); - encoder.write_all(data)?; - encoder.finish() -} - -pub fn decode_brotli(data: &[u8]) -> Result, std::io::Error> { - let mut decoder = brotli::Decompressor::new(data, 4096); - let mut decompressed = Vec::new(); - decoder.read_to_end(&mut decompressed)?; - Ok(decompressed) -} - -pub fn encode_brotli(data: &[u8]) -> Result, std::io::Error> { - let mut encoder = brotli::CompressorWriter::new(Vec::new(), 4096, 11, 22); - encoder.write_all(data)?; - Ok(encoder.into_inner()) -} - pub fn parse_base_path(path: &str) -> MartinResult { if !path.starts_with('/') { return Err(BasePathError(path.to_string())); diff --git a/martin/src/utils/xyz.rs b/martin/src/utils/xyz.rs deleted file mode 100644 index 1a968207e..000000000 --- a/martin/src/utils/xyz.rs +++ /dev/null @@ -1,18 +0,0 @@ -use std::fmt::{Display, Formatter}; - -#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] -pub struct TileCoord { - pub z: u8, - pub x: u32, - pub y: u32, -} - -impl Display for TileCoord { - fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - if f.alternate() { - write!(f, "{}/{}/{}", self.z, self.x, self.y) - } else { - write!(f, "{},{},{}", self.z, self.x, self.y) - } - } -} diff --git a/martin/tests/mb_server_test.rs b/martin/tests/mb_server_test.rs index 95bb70746..f8bfe6b1a 100644 --- a/martin/tests/mb_server_test.rs +++ b/martin/tests/mb_server_test.rs @@ -4,7 +4,7 @@ use ctor::ctor; use indoc::indoc; use insta::assert_yaml_snapshot; use martin::srv::SrvConfig; -use martin::{decode_brotli, decode_gzip}; +use martin_tile_utils::{decode_brotli, decode_gzip}; use tilejson::TileJSON; pub mod utils; diff --git a/martin/tests/pg_function_source_test.rs b/martin/tests/pg_function_source_test.rs index 8d891b51b..f10af4829 100644 --- a/martin/tests/pg_function_source_test.rs +++ b/martin/tests/pg_function_source_test.rs @@ -3,7 +3,7 @@ use ctor::ctor; use indoc::indoc; use insta::assert_yaml_snapshot; -use martin::TileCoord; +use martin_tile_utils::TileCoord; pub mod utils; pub use utils::*; diff --git a/martin/tests/pg_table_source_test.rs b/martin/tests/pg_table_source_test.rs index d4179167f..ed9983ec3 100644 --- a/martin/tests/pg_table_source_test.rs +++ b/martin/tests/pg_table_source_test.rs @@ -3,8 +3,7 @@ use ctor::ctor; use indoc::indoc; use insta::assert_yaml_snapshot; -use martin::TileCoord; - +use martin_tile_utils::TileCoord; pub mod utils; pub use utils::*; diff --git a/martin/tests/pmt_server_test.rs b/martin/tests/pmt_server_test.rs index 422d82cde..73db79dd7 100644 --- a/martin/tests/pmt_server_test.rs +++ b/martin/tests/pmt_server_test.rs @@ -3,8 +3,8 @@ use actix_web::test::{call_service, read_body, read_body_json, TestRequest}; use ctor::ctor; use indoc::indoc; use insta::assert_yaml_snapshot; -use martin::decode_gzip; use martin::srv::SrvConfig; +use martin_tile_utils::decode_gzip; use tilejson::TileJSON; pub mod utils; diff --git a/mbtiles/Cargo.toml b/mbtiles/Cargo.toml index 1f22df562..d56fbdee8 100644 --- a/mbtiles/Cargo.toml +++ b/mbtiles/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "mbtiles" -version = "0.9.1" +version = "0.10.0" authors = ["Yuri Astrakhan ", "MapLibre contributors"] description = "A simple low-level MbTiles access and processing library, with some tile format detection and other relevant heuristics." keywords = ["mbtiles", "maps", "tiles", "mvt", "tilejson"] @@ -14,29 +14,34 @@ rust-version.workspace = true [features] default = ["cli"] -cli = ["dep:anyhow", "dep:clap", "dep:env_logger", "dep:serde_yaml", "dep:tokio"] +cli = ["dep:anyhow", "dep:clap", "dep:env_logger", "dep:serde_yaml"] [dependencies] enum-display.workspace = true +flume.workspace = true futures.workspace = true itertools.workspace = true log.workspace = true martin-tile-utils.workspace = true +md5.workspace = true +num_cpus.workspace = true serde.workspace = true serde_json.workspace = true serde_with.workspace = true size_format.workspace = true +sqlite-compressions.workspace = true sqlite-hashes.workspace = true sqlx.workspace = true thiserror.workspace = true tilejson.workspace = true +tokio = { workspace = true, features = ["rt-multi-thread"] } +xxhash-rust.workspace = true # Bin dependencies anyhow = { workspace = true, optional = true } clap = { workspace = true, optional = true } env_logger = { workspace = true, optional = true } serde_yaml = { workspace = true, optional = true } -tokio = { workspace = true, features = ["rt-multi-thread"], optional = true } [dev-dependencies] # For testing, might as well use the same async framework as the Martin itself diff --git a/mbtiles/src/bin/mbtiles.rs b/mbtiles/src/bin/mbtiles.rs index 26992c236..7093c2bbd 100644 --- a/mbtiles/src/bin/mbtiles.rs +++ b/mbtiles/src/bin/mbtiles.rs @@ -4,7 +4,7 @@ use clap::{Parser, Subcommand}; use log::error; use mbtiles::{ apply_patch, AggHashType, CopyDuplicateMode, CopyType, IntegrityCheckType, MbtResult, - MbtTypeCli, Mbtiles, MbtilesCopier, UpdateZoomType, + MbtTypeCli, Mbtiles, MbtilesCopier, PatchType, UpdateZoomType, }; use tilejson::Bounds; @@ -115,6 +115,9 @@ pub struct CopyArgs { /// Use `mbtiles apply-patch` to apply the patch file in-place, without making a copy of the original. #[arg(long, conflicts_with("diff_with_file"))] apply_patch: Option, + /// Specify the type of patch file to generate. + #[arg(long, requires("diff_with_file"), default_value_t=PatchType::default())] + patch_type: PatchType, } #[allow(clippy::doc_markdown)] @@ -126,6 +129,9 @@ pub struct DiffArgs { file2: PathBuf, /// Output file to write the resulting difference to diff: PathBuf, + /// Specify the type of patch file to generate. + #[arg(long, default_value_t=PatchType::default())] + patch_type: PatchType, #[command(flatten)] pub options: SharedCopyOpts, @@ -175,11 +181,12 @@ impl SharedCopyOpts { dst_file: PathBuf, diff_with_file: Option, apply_patch: Option, + patch_type: PatchType, ) -> MbtilesCopier { MbtilesCopier { src_file, dst_file, - diff_with_file, + diff_with_file: diff_with_file.map(|p| (p, patch_type)), apply_patch, // Shared copy: self.copy, @@ -232,13 +239,18 @@ async fn main_int() -> anyhow::Result<()> { args.dst_file, args.diff_with_file, args.apply_patch, + args.patch_type, ); copier.run().await?; } Commands::Diff(args) => { - let copier = args - .options - .into_copier(args.file1, args.diff, Some(args.file2), None); + let copier = args.options.into_copier( + args.file1, + args.diff, + Some(args.file2), + None, + args.patch_type, + ); copier.run().await?; } Commands::ApplyPatch { @@ -317,6 +329,7 @@ mod tests { use clap::error::ErrorKind; use clap::Parser; use mbtiles::CopyDuplicateMode; + use mbtiles::PatchType::Whole; use super::*; use crate::Commands::{ApplyPatch, Copy, Diff, MetaGetValue, MetaSetValue, Validate}; @@ -527,6 +540,7 @@ mod tests { file1: PathBuf::from("file1.mbtiles"), file2: PathBuf::from("file2.mbtiles"), diff: PathBuf::from("../delta.mbtiles"), + patch_type: Whole, options: SharedCopyOpts { on_duplicate: Some(CopyDuplicateMode::Override), ..Default::default() diff --git a/mbtiles/src/bindiff.rs b/mbtiles/src/bindiff.rs new file mode 100644 index 000000000..e6ad0dbe3 --- /dev/null +++ b/mbtiles/src/bindiff.rs @@ -0,0 +1,390 @@ +use std::future::Future; +use std::sync::atomic::AtomicBool; +use std::sync::atomic::Ordering::Relaxed; +use std::sync::Arc; +use std::time::Instant; + +use flume::{bounded, Receiver, Sender}; +use futures::TryStreamExt; +use log::{debug, error, info}; +use martin_tile_utils::{decode_brotli, decode_gzip, encode_brotli, encode_gzip, TileCoord}; +use sqlite_compressions::{BsdiffRawDiffer, Differ as _}; +use sqlx::{query, Executor, Row, SqliteConnection}; +use xxhash_rust::xxh3::xxh3_64; + +use crate::MbtType::{Flat, FlatWithHash, Normalized}; +use crate::PatchType::Whole; +use crate::{ + create_bsdiffraw_tables, get_bsdiff_tbl_name, MbtError, MbtResult, MbtType, Mbtiles, PatchType, +}; + +pub trait BinDiffer: Sized + Send + Sync + 'static { + fn query( + &self, + sql_where: String, + tx_wrk: Sender, + ) -> impl Future> + Send; + + fn process(&self, value: S) -> MbtResult; + + fn before_insert( + &self, + conn: &mut SqliteConnection, + ) -> impl Future> + Send; + + fn insert( + &self, + value: T, + conn: &mut SqliteConnection, + ) -> impl Future> + Send; + + async fn run(self, conn: &mut SqliteConnection, sql_where: String) -> MbtResult<()> { + let patcher = Arc::new(self); + let has_errors = Arc::new(AtomicBool::new(false)); + let (tx_wrk, rx_wrk) = bounded(num_cpus::get() * 3); + let (tx_ins, rx_ins) = bounded::(num_cpus::get() * 3); + + { + let has_errors = has_errors.clone(); + let patcher = patcher.clone(); + tokio::spawn(async move { + if let Err(e) = patcher.query(sql_where, tx_wrk).await { + error!("Failed to query bindiff data: {e}"); + has_errors.store(true, Relaxed); + } + }); + } + + start_processor_threads(patcher.clone(), rx_wrk, tx_ins, has_errors.clone()); + recv_and_insert(patcher, conn, rx_ins).await?; + + if has_errors.load(Relaxed) { + Err(MbtError::BindiffError) + } else { + Ok(()) + } + } +} + +async fn recv_and_insert>( + patcher: Arc

, + conn: &mut SqliteConnection, + rx_ins: Receiver, +) -> MbtResult<()> { + patcher.before_insert(conn).await?; + conn.execute("BEGIN").await?; + let mut inserted = 0; + let mut last_report_ts = Instant::now(); + while let Ok(res) = rx_ins.recv_async().await { + patcher.insert(res, conn).await?; + inserted += 1; + if inserted % 100 == 0 { + conn.execute("COMMIT").await?; + if last_report_ts.elapsed().as_secs() >= 10 { + info!("Processed {inserted} bindiff tiles"); + last_report_ts = Instant::now(); + } + conn.execute("BEGIN").await?; + } + } + conn.execute("COMMIT").await?; + info!("Finished processing {inserted} bindiff tiles"); + + Ok(()) +} + +// Both tx and rcv must be consumed, or it will run forever +#[allow(clippy::needless_pass_by_value)] +fn start_processor_threads>( + patcher: Arc

, + rx_wrk: Receiver, + tx_ins: Sender, + has_errors: Arc, +) { + (0..num_cpus::get()).for_each(|_| { + let rx_wrk = rx_wrk.clone(); + let tx_ins = tx_ins.clone(); + let has_errors = has_errors.clone(); + let patcher = patcher.clone(); + tokio::spawn(async move { + while let Ok(wrk) = rx_wrk.recv_async().await { + if match patcher.process(wrk) { + Ok(res) => tx_ins.send_async(res).await.is_err(), + Err(e) => { + error!("Failed to process bindiff data: {e}"); + true + } + } { + has_errors.store(true, Relaxed); + } + // also stop processing if another processor stopped + if has_errors.load(Relaxed) { + break; + } + } + }); + }); +} + +pub struct DifferBefore { + coord: TileCoord, + old_tile_data: Vec, + new_tile_data: Vec, +} + +pub struct DifferAfter { + coord: TileCoord, + data: Vec, + new_tile_hash: u64, +} + +pub struct BinDiffDiffer { + src_mbt: Mbtiles, + dif_mbt: Mbtiles, + dif_type: MbtType, + patch_type: PatchType, + insert_sql: String, +} + +impl BinDiffDiffer { + pub fn new( + src_mbt: Mbtiles, + dif_mbt: Mbtiles, + dif_type: MbtType, + patch_type: PatchType, + ) -> Self { + assert_ne!(patch_type, Whole, "Invalid for BinDiffDiffer"); + let insert_sql = format!( + "INSERT INTO {}(zoom_level, tile_column, tile_row, patch_data, tile_xxh3_64_hash) VALUES (?, ?, ?, ?, ?)", + get_bsdiff_tbl_name(patch_type)); + Self { + src_mbt, + dif_mbt, + dif_type, + patch_type, + insert_sql, + } + } +} + +impl BinDiffer for BinDiffDiffer { + async fn query(&self, sql_where: String, tx_wrk: Sender) -> MbtResult<()> { + let diff_tiles = match self.dif_type { + Flat => "diffDb.tiles", + FlatWithHash => "diffDb.tiles_with_hash", + Normalized { .. } => { + " + (SELECT zoom_level, tile_column, tile_row, tile_data, map.tile_id AS tile_hash + FROM diffDb.map JOIN diffDb.images ON diffDb.map.tile_id = diffDb.images.tile_id)" + } + }; + + let sql = format!( + " + SELECT srcTiles.zoom_level + , srcTiles.tile_column + , srcTiles.tile_row + , srcTiles.tile_data old_tile_data + , difTiles.tile_data new_tile_data + FROM tiles AS srcTiles JOIN {diff_tiles} AS difTiles + ON srcTiles.zoom_level = difTiles.zoom_level + AND srcTiles.tile_column = difTiles.tile_column + AND srcTiles.tile_row = difTiles.tile_row + WHERE srcTiles.tile_data != difTiles.tile_data {sql_where}" + ); + + let mut conn = self.src_mbt.open_readonly().await?; + self.dif_mbt.attach_to(&mut conn, "diffDb").await?; + debug!("Querying source data with {sql}"); + let mut rows = query(&sql).fetch(&mut conn); + + while let Some(row) = rows.try_next().await? { + let work = DifferBefore { + coord: TileCoord { + z: row.get(0), + x: row.get(1), + y: row.get(2), + }, + old_tile_data: row.get(3), + new_tile_data: row.get(4), + }; + if tx_wrk.send_async(work).await.is_err() { + break; // the receiver has been dropped + } + } + + Ok(()) + } + + fn process(&self, value: DifferBefore) -> MbtResult { + let mut old_tile = value.old_tile_data; + let mut new_tile = value.new_tile_data; + if self.patch_type == PatchType::BinDiffGz { + old_tile = decode_gzip(&old_tile).inspect_err(|e| { + error!("Unable to gzip-decode source tile {:?}: {e}", value.coord); + })?; + new_tile = decode_gzip(&new_tile).inspect_err(|e| { + error!("Unable to gzip-decode diff tile {:?}: {e}", value.coord); + })?; + } + let new_tile_hash = xxh3_64(&new_tile); + let data = BsdiffRawDiffer::diff(&old_tile, &new_tile).expect("BinDiff failure"); + let data = encode_brotli(&data)?; + + Ok(DifferAfter { + coord: value.coord, + data, + new_tile_hash, + }) + } + + async fn before_insert(&self, conn: &mut SqliteConnection) -> MbtResult<()> { + create_bsdiffraw_tables(conn, self.patch_type).await + } + + async fn insert(&self, value: DifferAfter, conn: &mut SqliteConnection) -> MbtResult<()> { + #[allow(clippy::cast_possible_wrap)] + query(self.insert_sql.as_str()) + .bind(value.coord.z) + .bind(value.coord.x) + .bind(value.coord.y) + .bind(value.data) + .bind(value.new_tile_hash as i64) + .execute(&mut *conn) + .await?; + Ok(()) + } +} + +pub struct ApplierBefore { + coord: TileCoord, + tile_data: Vec, + patch_data: Vec, + uncompressed_tile_hash: u64, +} + +pub struct ApplierAfter { + coord: TileCoord, + data: Vec, + new_tile_hash: String, +} + +pub struct BinDiffPatcher { + src_mbt: Mbtiles, + dif_mbt: Mbtiles, + dst_type: MbtType, + patch_type: PatchType, +} + +impl BinDiffPatcher { + pub fn new( + src_mbt: Mbtiles, + dif_mbt: Mbtiles, + dst_type: MbtType, + patch_type: PatchType, + ) -> Self { + Self { + src_mbt, + dif_mbt, + dst_type, + patch_type, + } + } +} + +impl BinDiffer for BinDiffPatcher { + async fn query(&self, sql_where: String, tx_wrk: Sender) -> MbtResult<()> { + let tbl = get_bsdiff_tbl_name(self.patch_type); + let sql = format!( + " + SELECT srcTiles.zoom_level + , srcTiles.tile_column + , srcTiles.tile_row + , srcTiles.tile_data + , patch_data + , tile_xxh3_64_hash + FROM tiles AS srcTiles JOIN diffDb.{tbl} AS difTiles + ON srcTiles.zoom_level = difTiles.zoom_level + AND srcTiles.tile_column = difTiles.tile_column + AND srcTiles.tile_row = difTiles.tile_row + WHERE TRUE {sql_where}" + ); + + let mut conn = self.src_mbt.open_readonly().await?; + self.dif_mbt.attach_to(&mut conn, "diffDb").await?; + debug!("Querying {tbl} table with {sql}"); + let mut rows = query(&sql).fetch(&mut conn); + + while let Some(row) = rows.try_next().await? { + let work = ApplierBefore { + coord: TileCoord { + z: row.get(0), + x: row.get(1), + y: row.get(2), + }, + tile_data: row.get(3), + patch_data: row.get(4), + #[allow(clippy::cast_sign_loss)] + uncompressed_tile_hash: row.get::(5) as u64, + }; + if tx_wrk.send_async(work).await.is_err() { + break; // the receiver has been dropped + } + } + + Ok(()) + } + + fn process(&self, value: ApplierBefore) -> MbtResult { + let tile_data = decode_gzip(&value.tile_data) + .inspect_err(|e| error!("Unable to gzip-decode source tile {:?}: {e}", value.coord))?; + let patch_data = decode_brotli(&value.patch_data) + .inspect_err(|e| error!("Unable to brotli-decode patch data {:?}: {e}", value.coord))?; + let new_tile = BsdiffRawDiffer::patch(&tile_data, &patch_data) + .inspect_err(|e| error!("Unable to patch tile {:?}: {e}", value.coord))?; + let new_tile_hash = xxh3_64(&new_tile); + if new_tile_hash != value.uncompressed_tile_hash { + return Err(MbtError::BinDiffIncorrectTileHash( + value.coord.to_string(), + value.uncompressed_tile_hash.to_string(), + new_tile_hash.to_string(), + )); + } + + let data = encode_gzip(&new_tile)?; + + Ok(ApplierAfter { + coord: value.coord, + new_tile_hash: if self.dst_type == FlatWithHash { + format!("{:X}", md5::compute(&data)) + } else { + String::default() // This is a fast noop, no memory alloc is performed + }, + data, + }) + } + + async fn before_insert(&self, _conn: &mut SqliteConnection) -> MbtResult<()> { + Ok(()) + } + + async fn insert(&self, value: ApplierAfter, conn: &mut SqliteConnection) -> MbtResult<()> { + let mut q = query( + match self.dst_type { + Flat =>"INSERT INTO tiles (zoom_level, tile_column, tile_row, tile_data) VALUES (?, ?, ?, ?)", + FlatWithHash => "INSERT INTO tiles_with_hash (zoom_level, tile_column, tile_row, tile_data, tile_hash) VALUES (?, ?, ?, ?, ?)", + v @ Normalized { .. } => return Err(MbtError::BinDiffRequiresFlatWithHash(v)), + }) + .bind(value.coord.z) + .bind(value.coord.x) + .bind(value.coord.y) + .bind(value.data); + + if self.dst_type == FlatWithHash { + q = q.bind(value.new_tile_hash); + } + + q.execute(&mut *conn).await?; + Ok(()) + } +} diff --git a/mbtiles/src/copier.rs b/mbtiles/src/copier.rs index a550b8460..e87c76ecc 100644 --- a/mbtiles/src/copier.rs +++ b/mbtiles/src/copier.rs @@ -10,6 +10,7 @@ use sqlite_hashes::rusqlite::Connection; use sqlx::{query, Connection as _, Executor as _, Row, SqliteConnection}; use tilejson::Bounds; +use crate::bindiff::{BinDiffDiffer, BinDiffPatcher, BinDiffer as _}; use crate::errors::MbtResult; use crate::mbtiles::PatchFileInfo; use crate::queries::{ @@ -18,9 +19,11 @@ use crate::queries::{ use crate::AggHashType::Verify; use crate::IntegrityCheckType::Quick; use crate::MbtType::{Flat, FlatWithHash, Normalized}; +use crate::PatchType::{BinDiffGz, BinDiffRaw, Whole}; use crate::{ - invert_y_value, reset_db_settings, CopyType, MbtError, MbtType, MbtTypeCli, Mbtiles, - AGG_TILES_HASH, AGG_TILES_HASH_AFTER_APPLY, AGG_TILES_HASH_BEFORE_APPLY, + action_with_rusqlite, get_bsdiff_tbl_name, invert_y_value, reset_db_settings, AggHashType, + CopyType, MbtError, MbtType, MbtTypeCli, Mbtiles, AGG_TILES_HASH, AGG_TILES_HASH_AFTER_APPLY, + AGG_TILES_HASH_BEFORE_APPLY, }; #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, EnumDisplay)] @@ -32,6 +35,19 @@ pub enum CopyDuplicateMode { Abort, } +#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, EnumDisplay)] +#[enum_display(case = "Kebab")] +#[cfg_attr(feature = "cli", derive(clap::ValueEnum))] +pub enum PatchType { + /// Patch file will contain the entire tile if it is different from the source + #[default] + Whole, + /// Use bin-diff to store only the bytes changed between two versions of each tile. Treats content as gzipped blobs, decoding them before diffing. + BinDiffGz, + /// Use bin-diff to store only the bytes changed between two versions of each tile. Treats content as blobs without any special encoding. + BinDiffRaw, +} + impl CopyDuplicateMode { #[must_use] pub fn to_sql(&self) -> &'static str { @@ -65,8 +81,8 @@ pub struct MbtilesCopier { pub zoom_levels: Vec, /// Bounding box to copy, in the format `min_lon,min_lat,max_lon,max_lat`. Can be used multiple times. pub bbox: Vec, - /// Compare source file with this file, and only copy non-identical tiles to destination. - pub diff_with_file: Option, + /// Compare source file with this file, and only copy non-identical tiles to destination. Also specifies the type of patch to generate. + pub diff_with_file: Option<(PathBuf, PatchType)>, /// Apply a patch file while copying src to dst. pub apply_patch: Option, /// Skip generating a global hash for mbtiles validation. By default, `mbtiles` will compute `agg_tiles_hash` metadata value. @@ -109,7 +125,7 @@ impl MbtileCopierInt { if options.src_file == options.dst_file { return Err(MbtError::SameSourceAndDestination(options.src_file)); } - if let Some(diff_file) = &options.diff_with_file { + if let Some((diff_file, _)) = &options.diff_with_file { if options.src_file == *diff_file || options.dst_file == *diff_file { return Err(MbtError::SameDiffAndSourceOrDestination(options.src_file)); } @@ -128,9 +144,10 @@ impl MbtileCopierInt { } pub async fn run(self) -> MbtResult { - if let Some(diff_file) = &self.options.diff_with_file { + if let Some((diff_file, patch_type)) = &self.options.diff_with_file { let mbt = Mbtiles::new(diff_file)?; - self.run_with_diff(mbt).await + let patch_type = *patch_type; + self.run_with_diff(mbt, patch_type).await } else if let Some(patch_file) = &self.options.apply_patch { let mbt = Mbtiles::new(patch_file)?; self.run_with_patch(mbt).await @@ -193,7 +210,11 @@ impl MbtileCopierInt { } /// Compare two files, and write their difference to the diff file - async fn run_with_diff(self, dif_mbt: Mbtiles) -> MbtResult { + async fn run_with_diff( + self, + dif_mbt: Mbtiles, + patch_type: PatchType, + ) -> MbtResult { let mut dif_conn = dif_mbt.open_readonly().await?; let dif_info = dif_mbt.examine_diff(&mut dif_conn).await?; dif_mbt.assert_hashes(&dif_info, self.options.force)?; @@ -210,14 +231,23 @@ impl MbtileCopierInt { dif_mbt.attach_to(&mut conn, "diffDb").await?; let dst_type = self.options.dst_type().unwrap_or(src_info.mbt_type); + if patch_type != Whole && matches!(dst_type, Normalized { .. }) { + return Err(MbtError::BinDiffRequiresFlatWithHash(dst_type)); + } + info!( - "Comparing {src_mbt} ({src_type}) and {dif_path} ({dif_type}) {what}into a new file {dst_path} ({dst_type})", + "Comparing {src_mbt} ({src_type}) and {dif_path} ({dif_type}) {what}into a new file {dst_path} ({dst_type}){patch}", src_mbt = self.src_mbt, src_type = src_info.mbt_type, dif_path = dif_mbt.filepath(), dif_type = dif_info.mbt_type, what = self.copy_text(), - dst_path = self.dst_mbt.filepath() + dst_path = self.dst_mbt.filepath(), + patch = match patch_type { + Whole => {""} + BinDiffGz => {" with bin-diff"} + BinDiffRaw => {" with bin-diff-raw"} + } ); self.init_schema(&mut conn, src_info.mbt_type, dst_type) @@ -226,10 +256,21 @@ impl MbtileCopierInt { &mut conn, CopyDuplicateMode::Override, dst_type, - &get_select_from_with_diff(dif_info.mbt_type, dst_type), + &get_select_from_with_diff(dif_info.mbt_type, dst_type, patch_type), ) .await?; + // Bindiff copying uses separate threads to read and write data, so we need + // to open a separate connection to source+diff files to avoid locking issues + detach_db(&mut conn, "diffDb").await?; + detach_db(&mut conn, "sourceDb").await?; + + if patch_type != Whole { + BinDiffDiffer::new(self.src_mbt.clone(), dif_mbt, dif_info.mbt_type, patch_type) + .run(&mut conn, self.get_where_clause("srcTiles.")) + .await?; + } + if let Some(hash) = src_info.agg_tiles_hash { self.dst_mbt .set_metadata_value(&mut conn, AGG_TILES_HASH_BEFORE_APPLY, &hash) @@ -246,8 +287,6 @@ impl MbtileCopierInt { self.dst_mbt.update_agg_tiles_hash(&mut conn).await?; } - detach_db(&mut conn, "diffDb").await?; - detach_db(&mut conn, "sourceDb").await?; self.validate(&self.dst_mbt, &mut conn).await?; Ok(conn) @@ -262,6 +301,10 @@ impl MbtileCopierInt { dif_conn.close().await?; let src_type = self.validate_src_file().await?.mbt_type; + let dst_type = self.options.dst_type().unwrap_or(src_type); + if dif_info.patch_type != Whole && matches!(dst_type, Normalized { .. }) { + return Err(MbtError::BinDiffRequiresFlatWithHash(dst_type)); + } let mut conn = self.dst_mbt.open_or_new().await?; if !is_empty_database(&mut conn).await? { @@ -271,49 +314,76 @@ impl MbtileCopierInt { self.src_mbt.attach_to(&mut conn, "sourceDb").await?; dif_mbt.attach_to(&mut conn, "diffDb").await?; - let dst_type = self.options.dst_type().unwrap_or(src_type); - info!("Applying patch from {dif_path} ({dif_type}) to {src_mbt} ({src_type}) {what}into a new file {dst_path} ({dst_type})", + info!("Applying patch from {dif_path} ({dif_type}) to {src_mbt} ({src_type}) {what}into a new file {dst_path} ({dst_type}){patch}", dif_path = dif_mbt.filepath(), dif_type = dif_info.mbt_type, src_mbt = self.src_mbt, what = self.copy_text(), - dst_path = self.dst_mbt.filepath()); + dst_path = self.dst_mbt.filepath(), + patch = match dif_info.patch_type { + Whole => {""} + BinDiffGz => {" with bin-diff"} + BinDiffRaw => {" with bin-diff-raw"} + } + ); self.init_schema(&mut conn, src_type, dst_type).await?; self.copy_with_rusqlite( &mut conn, CopyDuplicateMode::Override, dst_type, - &get_select_from_apply_patch(src_type, dif_info.mbt_type, dst_type), + &get_select_from_apply_patch(src_type, &dif_info, dst_type), ) .await?; + detach_db(&mut conn, "diffDb").await?; + detach_db(&mut conn, "sourceDb").await?; + + if dif_info.patch_type != Whole { + BinDiffPatcher::new( + self.src_mbt.clone(), + dif_mbt.clone(), + dst_type, + dif_info.patch_type, + ) + .run(&mut conn, self.get_where_clause("srcTiles.")) + .await?; + } + // TODO: perhaps disable all except --copy all when using with diffs, or else is not making much sense if self.options.copy.copy_tiles() && !self.options.skip_agg_tiles_hash { self.dst_mbt.update_agg_tiles_hash(&mut conn).await?; - - let new_hash = self.dst_mbt.get_agg_tiles_hash(&mut conn).await?; - match (dif_info.agg_tiles_hash_after_apply, new_hash) { - (Some(expected), Some(actual)) if expected != actual => { - let err = MbtError::AggHashMismatchAfterApply( - dif_mbt.filepath().to_string(), - expected, - self.dst_mbt.filepath().to_string(), - actual, - ); - if !self.options.force { - return Err(err); + if dif_info.patch_type == BinDiffGz { + info!("Skipping {AGG_TILES_HASH_AFTER_APPLY} validation because re-gzip-ing could produce different tile data. Each bindiff-ed tile was still verified with a hash value"); + } else { + let new_hash = self.dst_mbt.get_agg_tiles_hash(&mut conn).await?; + match (dif_info.agg_tiles_hash_after_apply, new_hash) { + (Some(expected), Some(actual)) if expected != actual => { + let err = MbtError::AggHashMismatchAfterApply( + dif_mbt.filepath().to_string(), + expected, + self.dst_mbt.filepath().to_string(), + actual, + ); + if !self.options.force { + return Err(err); + } + warn!("{err}"); } - warn!("{err}"); + _ => {} } - _ => {} } } - detach_db(&mut conn, "diffDb").await?; - detach_db(&mut conn, "sourceDb").await?; + let hash_type = if dif_info.patch_type == BinDiffGz || self.options.skip_agg_tiles_hash { + AggHashType::Off + } else { + Verify + }; - self.validate(&self.dst_mbt, &mut conn).await?; + if self.options.validate { + self.dst_mbt.validate(&mut conn, Quick, hash_type).await?; + } Ok(conn) } @@ -350,22 +420,17 @@ impl MbtileCopierInt { dst_type: MbtType, select_from: &str, ) -> Result<(), MbtError> { - // SAFETY: This must be scoped to make sure the handle is dropped before we continue using conn - // Make sure not to execute any other queries while the handle is locked - let mut handle_lock = conn.lock_handle().await?; - let handle = handle_lock.as_raw_handle().as_ptr(); - - // SAFETY: this is safe as long as handle_lock is valid. We will drop the lock. - let rusqlite_conn = unsafe { Connection::from_handle(handle) }?; - if self.options.copy.copy_tiles() { - self.copy_tiles(&rusqlite_conn, dst_type, on_duplicate, select_from)?; + action_with_rusqlite(conn, |c| { + self.copy_tiles(c, dst_type, on_duplicate, select_from) + }) + .await?; } else { debug!("Skipping copying tiles"); } if self.options.copy.copy_metadata() { - self.copy_metadata(&rusqlite_conn, on_duplicate) + action_with_rusqlite(conn, |c| self.copy_metadata(c, on_duplicate)).await } else { debug!("Skipping copying metadata"); Ok(()) @@ -433,7 +498,7 @@ impl MbtileCopierInt { select_from: &str, ) -> Result<(), MbtError> { let on_dupl = on_duplicate.to_sql(); - let where_clause = self.get_where_clause(); + let where_clause = self.get_where_clause(""); let sql_cond = Self::get_on_duplicate_sql_cond(on_duplicate, dst_type); let sql = match dst_type { @@ -511,7 +576,7 @@ impl MbtileCopierInt { // DB objects must be created in a specific order: tables, views, triggers, indexes. let sql_objects = conn .fetch_all( - "SELECT sql + "SELECT sql, tbl_name, type FROM sourceDb.sqlite_schema WHERE tbl_name IN ('metadata', 'tiles', 'map', 'images', 'tiles_with_hash') AND type IN ('table', 'view', 'trigger', 'index') @@ -525,6 +590,11 @@ impl MbtileCopierInt { .await?; for row in sql_objects { + debug!( + "Creating {typ} {tbl_name}...", + typ = row.get::<&str, _>(2), + tbl_name = row.get::<&str, _>(1), + ); query(row.get(0)).execute(&mut *conn).await?; } if dst.is_normalized() { @@ -566,18 +636,18 @@ impl MbtileCopierInt { /// Format SQL WHERE clause and return it along with the query arguments. /// Note that there is no risk of SQL injection here, as the arguments are integers. - fn get_where_clause(&self) -> String { + fn get_where_clause(&self, prefix: &str) -> String { let mut sql = if !&self.options.zoom_levels.is_empty() { let zooms = self.options.zoom_levels.iter().join(","); - format!(" AND zoom_level IN ({zooms})") + format!(" AND {prefix}zoom_level IN ({zooms})") } else if let Some(min_zoom) = self.options.min_zoom { if let Some(max_zoom) = self.options.max_zoom { - format!(" AND zoom_level BETWEEN {min_zoom} AND {max_zoom}") + format!(" AND {prefix}zoom_level BETWEEN {min_zoom} AND {max_zoom}") } else { - format!(" AND zoom_level >= {min_zoom}") + format!(" AND {prefix}zoom_level >= {min_zoom}") } } else if let Some(max_zoom) = self.options.max_zoom { - format!(" AND zoom_level <= {max_zoom}") + format!(" AND {prefix}zoom_level <= {max_zoom}") } else { String::new() }; @@ -600,7 +670,8 @@ impl MbtileCopierInt { } writeln!( sql, - "((tile_column * (1 << ({MAX_ZOOM} - zoom_level))) BETWEEN {min_x} AND {max_x} AND (tile_row * (1 << ({MAX_ZOOM} - zoom_level))) BETWEEN {min_y} AND {max_y})", + "(({prefix}tile_column * (1 << ({MAX_ZOOM} - {prefix}zoom_level))) BETWEEN {min_x} AND {max_x} \ + AND ({prefix}tile_row * (1 << ({MAX_ZOOM} - {prefix}zoom_level))) BETWEEN {min_y} AND {max_y})", ).unwrap(); } sql.push(')'); @@ -610,7 +681,11 @@ impl MbtileCopierInt { } } -fn get_select_from_apply_patch(src_type: MbtType, dif_type: MbtType, dst_type: MbtType) -> String { +fn get_select_from_apply_patch( + src_type: MbtType, + dif_info: &PatchFileInfo, + dst_type: MbtType, +) -> String { fn query_for_dst(frm_db: &'static str, frm_type: MbtType, to_type: MbtType) -> String { match to_type { Flat => format!("{frm_db}.tiles"), @@ -648,13 +723,30 @@ fn get_select_from_apply_patch(src_type: MbtType, dif_type: MbtType, dst_type: M format!( ", COALESCE({}, {}) as tile_hash", - get_tile_hash_expr("difTiles", dif_type), + get_tile_hash_expr("difTiles", dif_info.mbt_type), get_tile_hash_expr("srcTiles", src_type) ) }; let src_tiles = query_for_dst("sourceDb", src_type, dst_type); - let diff_tiles = query_for_dst("diffDb", dif_type, dst_type); + let diff_tiles = query_for_dst("diffDb", dif_info.mbt_type, dst_type); + + let (bindiff_from, bindiff_cond) = if dif_info.patch_type == Whole { + (String::new(), "") + } else { + // do not copy any tiles that are in the patch table + let tbl = get_bsdiff_tbl_name(dif_info.patch_type); + ( + format!( + " + LEFT JOIN diffDb.{tbl} AS bdTbl + ON bdTbl.zoom_level = srcTiles.zoom_level + AND bdTbl.tile_column = srcTiles.tile_column + AND bdTbl.tile_row = srcTiles.tile_row" + ), + "AND bdTbl.patch_data ISNULL", + ) + }; // Take dif tile_data if it is set, otherwise take the one from src // Skip tiles if src and dif both have a matching index, but the dif tile_data is NULL @@ -669,11 +761,16 @@ fn get_select_from_apply_patch(src_type: MbtType, dif_type: MbtType, dst_type: M ON srcTiles.zoom_level = difTiles.zoom_level AND srcTiles.tile_column = difTiles.tile_column AND srcTiles.tile_row = difTiles.tile_row - WHERE (difTiles.zoom_level ISNULL OR difTiles.tile_data NOTNULL)" + {bindiff_from} + WHERE (difTiles.zoom_level ISNULL OR difTiles.tile_data NOTNULL) {bindiff_cond}" ) } -fn get_select_from_with_diff(dif_type: MbtType, dst_type: MbtType) -> String { +fn get_select_from_with_diff( + dif_type: MbtType, + dst_type: MbtType, + patch_type: PatchType, +) -> String { let tile_hash_expr; let diff_tiles; if dst_type == Flat { @@ -695,6 +792,11 @@ fn get_select_from_with_diff(dif_type: MbtType, dst_type: MbtType) -> String { }; } + let sql_cond = if patch_type == Whole { + "OR srcTiles.tile_data != difTiles.tile_data" + } else { + "" + }; format!( " SELECT COALESCE(srcTiles.zoom_level, difTiles.zoom_level) as zoom_level @@ -706,9 +808,9 @@ fn get_select_from_with_diff(dif_type: MbtType, dst_type: MbtType) -> String { ON srcTiles.zoom_level = difTiles.zoom_level AND srcTiles.tile_column = difTiles.tile_column AND srcTiles.tile_row = difTiles.tile_row - WHERE (srcTiles.tile_data != difTiles.tile_data - OR srcTiles.tile_data ISNULL - OR difTiles.tile_data ISNULL)" + WHERE (srcTiles.tile_data ISNULL + OR difTiles.tile_data ISNULL + {sql_cond})" ) } @@ -920,7 +1022,7 @@ mod tests { let opt = MbtilesCopier { src_file: src.clone(), dst_file: dst.clone(), - diff_with_file: Some(diff_file.clone()), + diff_with_file: Some((diff_file.clone(), Whole)), force: true, ..Default::default() }; diff --git a/mbtiles/src/errors.rs b/mbtiles/src/errors.rs index 2f4e60924..9009d1987 100644 --- a/mbtiles/src/errors.rs +++ b/mbtiles/src/errors.rs @@ -95,6 +95,21 @@ pub enum MbtError { #[error("The {AGG_TILES_HASH_AFTER_APPLY}='{1}' in patch file {0} does not match {AGG_TILES_HASH}='{3}' in the file {2} after the patch was applied")] AggHashMismatchAfterApply(String, String, String, String), + + #[error("MBTile of type {0} is not supported when using bin-diff. The bin-diff format only works with flat and flat-with-hash MBTiles files.")] + BinDiffRequiresFlatWithHash(MbtType), + + #[error("Applying bindiff to tile {0} resulted in mismatching hash: expecting `{1}` != computed uncompressed value `{2}`")] + BinDiffIncorrectTileHash(String, String, String), + + #[error("Internal error creating bin-diff table")] + BindiffError, + + #[error("BinDiff patch files can be only applied with `mbtiles copy --apply-patch` command")] + UnsupportedPatchType, + + #[error(transparent)] + IoError(#[from] std::io::Error), } pub type MbtResult = Result; diff --git a/mbtiles/src/lib.rs b/mbtiles/src/lib.rs index 1f54ebb66..6359a2601 100644 --- a/mbtiles/src/lib.rs +++ b/mbtiles/src/lib.rs @@ -4,7 +4,7 @@ pub use sqlx; mod copier; -pub use copier::{CopyDuplicateMode, MbtilesCopier}; +pub use copier::{CopyDuplicateMode, MbtilesCopier, PatchType}; mod errors; pub use errors::{MbtError, MbtResult}; @@ -29,7 +29,10 @@ mod summary; mod update; pub use update::UpdateZoomType; +mod bindiff; + mod validation; + pub use validation::{ calc_agg_tiles_hash, AggHashType, IntegrityCheckType, MbtType, AGG_TILES_HASH, AGG_TILES_HASH_AFTER_APPLY, AGG_TILES_HASH_BEFORE_APPLY, diff --git a/mbtiles/src/mbtiles.rs b/mbtiles/src/mbtiles.rs index ebd2e5c2d..04323cafb 100644 --- a/mbtiles/src/mbtiles.rs +++ b/mbtiles/src/mbtiles.rs @@ -5,12 +5,13 @@ use std::path::Path; use enum_display::EnumDisplay; use log::debug; use serde::{Deserialize, Serialize}; +use sqlite_compressions::{register_bsdiffraw_functions, register_gzip_functions}; use sqlite_hashes::register_md5_functions; use sqlx::sqlite::SqliteConnectOptions; use sqlx::{query, Connection as _, Executor, SqliteConnection, SqliteExecutor, Statement}; use crate::errors::{MbtError, MbtResult}; -use crate::{invert_y_value, CopyDuplicateMode, MbtType}; +use crate::{invert_y_value, CopyDuplicateMode, MbtType, PatchType}; #[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, Serialize, Deserialize, EnumDisplay)] #[enum_display(case = "Kebab")] @@ -47,6 +48,7 @@ pub struct PatchFileInfo { pub agg_tiles_hash: Option, pub agg_tiles_hash_before_apply: Option, pub agg_tiles_hash_after_apply: Option, + pub patch_type: PatchType, } #[derive(Clone, Debug)] @@ -101,7 +103,7 @@ impl Mbtiles { async fn open_int(opt: &SqliteConnectOptions) -> Result { let mut conn = SqliteConnection::connect_with(opt).await?; - attach_hash_fn(&mut conn).await?; + attach_sqlite_fn(&mut conn).await?; Ok(conn) } @@ -221,13 +223,15 @@ impl Mbtiles { } } -pub async fn attach_hash_fn(conn: &mut SqliteConnection) -> MbtResult<()> { +pub async fn attach_sqlite_fn(conn: &mut SqliteConnection) -> MbtResult<()> { let mut handle_lock = conn.lock_handle().await?; let handle = handle_lock.as_raw_handle().as_ptr(); // Safety: we know that the handle is a SQLite connection is locked and is not used anywhere else. // The registered functions will be dropped when SQLX drops DB connection. let rc = unsafe { sqlite_hashes::rusqlite::Connection::from_handle(handle) }?; register_md5_functions(&rc)?; + register_bsdiffraw_functions(&rc)?; + register_gzip_functions(&rc)?; Ok(()) } diff --git a/mbtiles/src/patcher.rs b/mbtiles/src/patcher.rs index 6650021cf..163b5f7fb 100644 --- a/mbtiles/src/patcher.rs +++ b/mbtiles/src/patcher.rs @@ -5,6 +5,7 @@ use sqlx::{query, Connection as _}; use crate::queries::detach_db; use crate::MbtType::{Flat, FlatWithHash, Normalized}; +use crate::PatchType::Whole; use crate::{ MbtError, MbtResult, MbtType, Mbtiles, AGG_TILES_HASH, AGG_TILES_HASH_AFTER_APPLY, AGG_TILES_HASH_BEFORE_APPLY, @@ -16,6 +17,9 @@ pub async fn apply_patch(base_file: PathBuf, patch_file: PathBuf, force: bool) - let mut conn = patch_mbt.open_readonly().await?; let patch_info = patch_mbt.examine_diff(&mut conn).await?; + if patch_info.patch_type != Whole { + return Err(MbtError::UnsupportedPatchType); + } patch_mbt.validate_diff_info(&patch_info, force)?; let patch_type = patch_info.mbt_type; conn.close().await?; diff --git a/mbtiles/src/queries.rs b/mbtiles/src/queries.rs index ade3bf19e..7443a406e 100644 --- a/mbtiles/src/queries.rs +++ b/mbtiles/src/queries.rs @@ -1,10 +1,11 @@ use log::debug; use martin_tile_utils::MAX_ZOOM; -use sqlx::{query, Executor as _, SqliteExecutor}; +use sqlite_compressions::rusqlite::Connection; +use sqlx::{query, Executor as _, Row, SqliteConnection, SqliteExecutor}; use crate::errors::MbtResult; use crate::MbtError::InvalidZoomValue; -use crate::MbtType; +use crate::{MbtType, PatchType}; /// Returns true if the database is empty (no tables/indexes/...) pub async fn is_empty_database(conn: &mut T) -> MbtResult @@ -209,6 +210,75 @@ where Ok(()) } +#[must_use] +pub fn get_bsdiff_tbl_name(patch_type: PatchType) -> &'static str { + match patch_type { + PatchType::BinDiffRaw => "bsdiffraw", + PatchType::BinDiffGz => "bsdiffrawgz", + PatchType::Whole => panic!("Unexpected PatchType::Whole"), + } +} + +pub async fn create_bsdiffraw_tables(conn: &mut T, patch_type: PatchType) -> MbtResult<()> +where + for<'e> &'e mut T: SqliteExecutor<'e>, +{ + let tbl = get_bsdiff_tbl_name(patch_type); + debug!("Creating if needed bin-diff table: {tbl}(z,x,y,data,hash)"); + let sql = format!( + "CREATE TABLE IF NOT EXISTS {tbl} ( + zoom_level integer NOT NULL, + tile_column integer NOT NULL, + tile_row integer NOT NULL, + patch_data blob NOT NULL, + tile_xxh3_64_hash integer NOT NULL, + PRIMARY KEY(zoom_level, tile_column, tile_row));" + ); + + conn.execute(sql.as_str()).await?; + Ok(()) +} + +/// Check if `MBTiles` has a table or a view named `bsdiffraw` or `bsdiffrawgz` with needed fields, +/// and return the corresponding patch type. If missing, return `PatchType::Whole` +pub async fn get_patch_type(conn: &mut T) -> MbtResult +where + for<'e> &'e mut T: SqliteExecutor<'e>, +{ + for (tbl, pt) in [ + ("bsdiffraw", PatchType::BinDiffRaw), + ("bsdiffrawgz", PatchType::BinDiffGz), + ] { + // 'bsdiffraw' or 'bsdiffrawgz' table or view columns and their types are as expected: + // 5 columns (zoom_level, tile_column, tile_row, tile_data, tile_hash). + // The order is not important + let sql = format!( + "SELECT ( + SELECT COUNT(*) = 5 + FROM pragma_table_info('{tbl}') + WHERE ((name = 'zoom_level' AND type = 'INTEGER') + OR (name = 'tile_column' AND type = 'INTEGER') + OR (name = 'tile_row' AND type = 'INTEGER') + OR (name = 'patch_data' AND type = 'BLOB') + OR (name = 'tile_xxh3_64_hash' AND type = 'INTEGER')) + -- + ) as is_valid;" + ); + + if query(&sql) + .fetch_one(&mut *conn) + .await? + .get::, _>(0) + .unwrap_or_default() + == 1 + { + return Ok(pt); + } + } + + Ok(PatchType::Whole) +} + pub async fn create_normalized_tables(conn: &mut T) -> MbtResult<()> where for<'e> &'e mut T: SqliteExecutor<'e>, @@ -300,6 +370,7 @@ where } } +/// Execute `DETACH DATABASE` command pub async fn detach_db(conn: &mut T, name: &str) -> MbtResult<()> where for<'e> &'e mut T: SqliteExecutor<'e>, @@ -324,6 +395,7 @@ fn validate_zoom(zoom: Option, zoom_name: &'static str) -> MbtResult

Changelog

Sourced from log's changelog.

[0.4.22] - 2024-06-27

What's Changed

New Contributors

Full Changelog: https://github.com/rust-lang/log/compare/0.4.21...0.4.22

Commits
  • d5ba2cf Merge pull request #634 from rust-lang/cargo/0.4.22
  • d1a8306 prepare for 0.4.22 release
  • 46894ef Merge pull request #633 from rust-lang/feat/panic-info
  • e0d389c Merge pull request #632 from rust-lang/feat/loosen-atomics
  • c9e5e13 use Location::caller() for file and line info
  • 507b672 loosen orderings for logger initialization
  • c879b01 Merge pull request #628 from Thomasdezeeuw/fix-warnings
  • 405fdb4 Merge pull request #627 from Thomasdezeeuw/check-features
  • 1307ade Remove unneeded import
  • 710560e Don't use --all-features in CI
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=log&package-manager=cargo&previous-version=0.4.21&new-version=0.4.22)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 04870c214..d19b7265f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2332,9 +2332,9 @@ checksum = "9374ef4228402d4b7e403e5838cb880d9ee663314b0a900d5a6aabf0c213552e" [[package]] name = "log" -version = "0.4.21" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "martin" From e939b388b8ea547ae4cbd794f2182f46eb51d676 Mon Sep 17 00:00:00 2001 From: Josh Lee Date: Fri, 28 Jun 2024 11:51:58 -0400 Subject: [PATCH 044/215] Typo fix (#1388) I'm torn between "Run this bash script to create this file" and "The file should look like this" and open to ideas for clarity, but I think adding the backslash is more likely to be noticed by someone who creates the file without using the heredoc than the other way around. Fixes #1335 --- docs/src/run-with-lambda.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/run-with-lambda.md b/docs/src/run-with-lambda.md index e7c462705..de2cd3f1a 100644 --- a/docs/src/run-with-lambda.md +++ b/docs/src/run-with-lambda.md @@ -60,7 +60,7 @@ Every zip-based Lambda function runs a file called `bootstrap`. cat <src/bootstrap #!/bin/sh set -eu -exec martin --config ${_HANDLER}.yaml +exec martin --config \${_HANDLER}.yaml EOF ``` From b814ac0f966e9edab9a31c7a097e1a0d379bedbd Mon Sep 17 00:00:00 2001 From: Teebo <1559534+tbo47@users.noreply.github.com> Date: Sat, 29 Jun 2024 17:49:49 +0000 Subject: [PATCH 045/215] fix curl url for linux mbtiles demo (#1387) Co-authored-by: tbo47 Co-authored-by: Yuri Astrakhan --- docs/src/quick-start-linux.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/quick-start-linux.md b/docs/src/quick-start-linux.md index b169c9891..aa7ebb09c 100644 --- a/docs/src/quick-start-linux.md +++ b/docs/src/quick-start-linux.md @@ -5,7 +5,7 @@ mkdir martin cd martin # Download some sample data -curl -L -O https://github.com/maplibre/martin/blob/main/tests/fixtures/mbtiles/world_cities.mbtiles +curl -L -O https://github.com/maplibre/martin/raw/main/tests/fixtures/mbtiles/world_cities.mbtiles # Download the latest version of Martin binary, extract it, and make it executable curl -L -O https://github.com/maplibre/martin/releases/latest/download/martin-x86_64-unknown-linux-gnu.tar.gz From 3e7c7e52d80563cd5a1f412ea46b9c4abbe0bf1b Mon Sep 17 00:00:00 2001 From: Yuri Astrakhan Date: Sat, 29 Jun 2024 13:52:36 -0400 Subject: [PATCH 046/215] Fix sample data download links --- docs/src/quick-start-macos.md | 2 +- docs/src/quick-start-windows.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/src/quick-start-macos.md b/docs/src/quick-start-macos.md index 5da4c70a2..5d9054d4a 100644 --- a/docs/src/quick-start-macos.md +++ b/docs/src/quick-start-macos.md @@ -1,6 +1,6 @@ ## Quick start on macOS -1. Download some [demo tiles](https://github.com/maplibre/martin/blob/main/tests/fixtures/mbtiles/world_cities.mbtiles). +1. Download some [demo tiles](https://github.com/maplibre/martin/raw/main/tests/fixtures/mbtiles/world_cities.mbtiles). 2. Download the latest version of Martin from the [release page](https://github.com/maplibre/martin/releases/latest). diff --git a/docs/src/quick-start-windows.md b/docs/src/quick-start-windows.md index e66fafbf3..ae9fa046f 100644 --- a/docs/src/quick-start-windows.md +++ b/docs/src/quick-start-windows.md @@ -1,6 +1,6 @@ ## Quick start on Windows -1. Download some [demo tiles](https://github.com/maplibre/martin/blob/main/tests/fixtures/mbtiles/world_cities.mbtiles). +1. Download some [demo tiles](https://github.com/maplibre/martin/raw/main/tests/fixtures/mbtiles/world_cities.mbtiles). 2. Download the latest Windows version of Martin from the [release page](https://github.com/maplibre/martin/releases): [martin-x86_64-pc-windows-msvc.zip](https://github.com/maplibre/martin/releases/latest/download/martin-x86_64-pc-windows-msvc.zip) From 0c5302d7d051aca0b79be14a77e93a0a8b42008e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Jul 2024 02:48:44 +0000 Subject: [PATCH 047/215] chore(deps): Bump serde_with from 3.8.1 to 3.8.2 (#1389) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [serde_with](https://github.com/jonasbb/serde_with) from 3.8.1 to 3.8.2.
Release notes

Sourced from serde_with's releases.

serde_with v3.8.2

Changed

  • Bump MSRV to 1.67, since that is required for the time dependency. The time version needed to be updated for nightly compatibility.

Fixed

Commits
  • 2274dd1 Bump version to 3.8.2 (#761)
  • e9e7a7e Bump version to 3.8.2
  • c9d9672 Implement JsonSchemaAs for OneOrMany instead of JsonSchema (#760)
  • dee706a Implement JsonSchemaAs for OneOrMany instead of JsonSchema
  • f74b460 Fix two clippy issues (#755)
  • 3ae4424 Fix two clippy issues
  • 729e8d2 Replace future deprecated functions from chrono (#752)
  • 685338f Replace future deprecated functions from chrono
  • 9593f93 Enable the unexpected_cfgs lint now that it can be configured via `Cargo.to...
  • 242286c Enable the unexpected_cfgs lint now that it can be configured via Cargo.toml
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=serde_with&package-manager=cargo&previous-version=3.8.1&new-version=3.8.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d19b7265f..df64c948d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2265,7 +2265,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e310b3a6b5907f99202fcdb4960ff45b93735d7c7d96b760fcff8db2dc0e103d" dependencies = [ "cfg-if", - "windows-targets 0.52.5", + "windows-targets 0.48.5", ] [[package]] @@ -3843,9 +3843,9 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.8.1" +version = "3.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ad483d2ab0149d5a5ebcd9972a3852711e0153d863bf5a5d0391d28883c4a20" +checksum = "079f3a42cd87588d924ed95b533f8d30a483388c4e400ab736a7058e34f16169" dependencies = [ "base64 0.22.1", "chrono", @@ -3861,9 +3861,9 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.8.1" +version = "3.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65569b702f41443e8bc8bbb1c5779bd0450bbe723b56198980e80ec45780bce2" +checksum = "bc03aad67c1d26b7de277d51c86892e7d9a0110a2fe44bf6b26cc569fba302d6" dependencies = [ "darling", "proc-macro2", From 49ae0569136f35ba95d76bd3a325ff48c293cf9a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Jul 2024 02:51:25 +0000 Subject: [PATCH 048/215] chore(deps): Bump serde_json from 1.0.118 to 1.0.119 (#1391) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [serde_json](https://github.com/serde-rs/json) from 1.0.118 to 1.0.119.
Release notes

Sourced from serde_json's releases.

v1.0.119

Commits
  • b48b9a3 Release 1.0.119
  • 8878cd7 Make shift_insert available for inlining like other Map methods
  • 352b7ab Document the cfg required for Map::shift_insert to exist
  • c17e63f Merge pull request #1149 from joshka/master
  • 309ef6b Add Map::shift_insert()
  • a9e089a Merge pull request #1146 from haouvw/master
  • a83fe96 chore: remove repeat words
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=serde_json&package-manager=cargo&previous-version=1.0.118&new-version=1.0.119)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index df64c948d..26870ad71 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3799,9 +3799,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.118" +version = "1.0.119" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d947f6b3163d8857ea16c4fa0dd4840d52f3041039a85decd46867eb1abef2e4" +checksum = "e8eddb61f0697cc3989c5d64b452f5488e2b8a60fd7d5076a3045076ffef8cb0" dependencies = [ "itoa", "ryu", From 3421c1257b4f1a7963e08b751e32f79923673ba4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Jul 2024 02:51:45 +0000 Subject: [PATCH 049/215] chore(deps): Bump clap from 4.5.7 to 4.5.8 (#1390) Bumps [clap](https://github.com/clap-rs/clap) from 4.5.7 to 4.5.8.
Release notes

Sourced from clap's releases.

v4.5.8

[4.5.8] - 2024-06-28

Fixes

  • Reduce extra flushes
Changelog

Sourced from clap's changelog.

[4.5.8] - 2024-06-28

Fixes

  • Reduce extra flushes
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=clap&package-manager=cargo&previous-version=4.5.7&new-version=4.5.8)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 26870ad71..0c0f4407a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -749,9 +749,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.7" +version = "4.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5db83dced34638ad474f39f250d7fea9598bdd239eaced1bdf45d597da0f433f" +checksum = "84b3edb18336f4df585bc9aa31dd99c036dfa5dc5e9a2939a722a188f3a8970d" dependencies = [ "clap_builder", "clap_derive", @@ -759,9 +759,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.7" +version = "4.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7e204572485eb3fbf28f871612191521df159bc3e15a9f5064c66dba3a8c05f" +checksum = "c1c09dd5ada6c6c78075d6fd0da3f90d8080651e2d6cc8eb2f1aaa4034ced708" dependencies = [ "anstream", "anstyle", @@ -771,9 +771,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.5" +version = "4.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c780290ccf4fb26629baa7a1081e68ced113f1d3ec302fa5948f1c381ebf06c6" +checksum = "2bac35c6dafb060fd4d275d9a4ffae97917c13a6327903a8be2153cd964f7085" dependencies = [ "heck 0.5.0", "proc-macro2", From abdaccb88ac747ca380fa0ceadd3800f446ad249 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Jul 2024 02:52:39 +0000 Subject: [PATCH 050/215] chore(deps): Bump subst from 0.3.2 to 0.3.3 (#1392) Bumps [subst](https://github.com/fizyr/subst) from 0.3.2 to 0.3.3.
Changelog

Sourced from subst's changelog.

Version 0.3.3 - 2024-06-29

  • [add][minor] Add support for substitution in all string values of TOML data.
  • [add][minor] Add support for substitution in all string values of JSON data.
Commits
  • c7f313f Bump version to 0.3.3.
  • 084354d Merge pull request #23 from fizyr/json
  • 39fd59e Add comments to the features in the package manifest.
  • e97b9e0 Add support for substituting string values in JSON.
  • 4e1d60d Merge pull request #22 from fizyr/toml
  • 92f701f Use doc-cfg in docs-rs build.
  • 9e7016f Add support for substituting string values in TOML.
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=subst&package-manager=cargo&previous-version=0.3.2&new-version=0.3.3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0c0f4407a..9b5a80780 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4327,9 +4327,9 @@ dependencies = [ [[package]] name = "subst" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b95bc3d9b5ec35dabec6f7ac966e073ef28d4881c6a2009567632ab721df6203" +checksum = "266d3fe7ffc582b3a0c3fe36cdc88d5635a1c2d53e7c3f813c901d7bd1d34ba0" dependencies = [ "memchr", "serde", From 01d01a633c52993d9d6db9696685e341b422aafc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Jul 2024 02:59:05 +0000 Subject: [PATCH 051/215] chore(deps): Bump serde_json from 1.0.119 to 1.0.120 (#1396) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [serde_json](https://github.com/serde-rs/json) from 1.0.119 to 1.0.120.
Release notes

Sourced from serde_json's releases.

v1.0.120

  • Correctly specify required version of indexmap dependency (#1152, thanks @​cforycki)
Commits
  • bcedc3d Release 1.0.120
  • 962c0fb Merge pull request #1152 from cforycki/fix/index-map-minimal-version
  • 3480fed fix: indexmap minimal version with Map::shift_insert()
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=serde_json&package-manager=cargo&previous-version=1.0.119&new-version=1.0.120)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9b5a80780..94383ba10 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3799,9 +3799,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.119" +version = "1.0.120" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8eddb61f0697cc3989c5d64b452f5488e2b8a60fd7d5076a3045076ffef8cb0" +checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5" dependencies = [ "itoa", "ryu", From d270e8fb42906c0da8344485c209c81f7476f2e8 Mon Sep 17 00:00:00 2001 From: Mat_ <190149+agenceKanvas@users.noreply.github.com> Date: Wed, 3 Jul 2024 00:59:04 +0200 Subject: [PATCH 052/215] Create run-with-apache.md (#1394) I've created a page as simple as I could. Feel free to tell me if you want me to change anything. --------- Co-authored-by: Yuri Astrakhan --- docs/src/SUMMARY.md | 1 + docs/src/run-with-apache.md | 68 +++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 docs/src/run-with-apache.md diff --git a/docs/src/SUMMARY.md b/docs/src/SUMMARY.md index 62b84d8f8..d7e9e525f 100644 --- a/docs/src/SUMMARY.md +++ b/docs/src/SUMMARY.md @@ -12,6 +12,7 @@ - [Running with Docker](run-with-docker.md) - [Running with Docker Compose](run-with-docker-compose.md) - [Running with NGINX](run-with-nginx.md) + - [Running with Apache](run-with-apache.md) - [Running in AWS Lambda](run-with-lambda.md) - [Troubleshooting](troubleshooting.md) - [Configuration File](config-file.md) diff --git a/docs/src/run-with-apache.md b/docs/src/run-with-apache.md new file mode 100644 index 000000000..e387bf947 --- /dev/null +++ b/docs/src/run-with-apache.md @@ -0,0 +1,68 @@ +## Using with Apache + +You can run Martin behind Apache "kind of" proxy, so you can use HTTPs with it. Here is an example of the configuration file that runs Martin with Apache. + +First you have to setup a virtual host that is working on the port 443. + +### Enable necessary modules + +Ensure the required modules are enabled: + +```bash + +sudo a2enmod proxy +sudo a2enmod proxy_http +sudo a2enmod headers +sudo a2enmod rewrite + +``` + +### Modify your VHOST configuration + +Open your VHOST configuration file for the domaine you're using, mydomain.tld : + +```bash + +sudo nano /etc/apache2/sites-available/mydomain.tld.conf + +``` + +### Update the configuration + +```apache + + + ServerName mydomain.tld + ServerAdmin webmaster@localhost + DocumentRoot /var/www/mydomain + ProxyPreserveHost On + + RewriteEngine on + RewriteCond %{REQUEST_URI} ^/tiles/(.*)$ + RewriteRule ^/tiles/(.*)$ http://localhost:3000/tiles/$1 [P,L] + + + RequestHeader set X-Forwarded-Proto "https" + + + ProxyPass / http://localhost:3000/ + ProxyPassReverse / http://localhost:3000/ + + +``` + +### Check Configuration: Verify the Apache configuration for syntax errors + +```bash + +sudo apache2ctl configtest + +``` + +### Restart Apache: If the configuration is correct, restart Apache to apply the changes + +```bash + +sudo systemctl restart apache2 + +``` From 1a2e3810431791e65c156c97de7ddda254eb9e84 Mon Sep 17 00:00:00 2001 From: Kacper Golinski Date: Wed, 3 Jul 2024 23:35:57 +0200 Subject: [PATCH 053/215] add HEALTHCHECK instruction to the Dockerfile (#1397) Since Martin gives us `/health` endpoint we could use it by default in the Dockerfile. I've added extra info to the doc about https://github.com/willfarrell/docker-autoheal but not sure if that's ok. I can remove it. --- .github/files/multi-platform.Dockerfile | 1 + docs/src/run-with-docker-compose.md | 2 ++ 2 files changed, 3 insertions(+) diff --git a/.github/files/multi-platform.Dockerfile b/.github/files/multi-platform.Dockerfile index b7420a3da..4cbfa89a5 100644 --- a/.github/files/multi-platform.Dockerfile +++ b/.github/files/multi-platform.Dockerfile @@ -4,4 +4,5 @@ ARG TARGETPLATFORM LABEL org.opencontainers.image.description="Blazing fast and lightweight tile server with PostGIS, MBTiles, and PMTiles support" COPY target_releases/$TARGETPLATFORM/* /usr/local/bin +HEALTHCHECK CMD wget --spider http://localhost:3000/health || exit 1 ENTRYPOINT ["/usr/local/bin/martin"] diff --git a/docs/src/run-with-docker-compose.md b/docs/src/run-with-docker-compose.md index 31a6cd2a6..a9f6310fb 100644 --- a/docs/src/run-with-docker-compose.md +++ b/docs/src/run-with-docker-compose.md @@ -40,3 +40,5 @@ docker compose up -d martin ``` By default, Martin will be available at [localhost:3000](http://localhost:3000/) + +Official Docker image includes a `HEALTHCHECK` instruction which will be used by Docker Compose. Note that Compose won't restart unhealthy containers. To monitor and restart unhealthy containers you can use [Docker Autoheal](https://github.com/willfarrell/docker-autoheal). From 998d157e8ecefc61420b2dfac5eee6b996edb159 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Jul 2024 03:19:38 +0000 Subject: [PATCH 054/215] chore(deps): Bump rustls-native-certs from 0.7.0 to 0.7.1 (#1399) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [rustls-native-certs](https://github.com/rustls/rustls-native-certs) from 0.7.0 to 0.7.1.
Release notes

Sourced from rustls-native-certs's releases.

0.7.1

Notable changes

  • Include certificates from the SSL_CERT_DIR environment variable and openssl-probe ProbeResult::cert_dir in the set of returned certificates. This should improve results on FreeBSD (in case the ca_root_nss package is not installed).

What's changed

Full Changelog: https://github.com/rustls/rustls-native-certs/commits/v/0.7.1

Commits
  • 5292c99 Bump version to 0.7.1
  • 7127ef9 Move load_pem_certs() below load_pem_certs_from_dir()
  • e08693c Rewrite if let as match
  • e0b388a Inline trivial load_certs_from_env() function
  • 27d38db Move documentation from load_certs_from_env() to CertPaths::load()
  • 934b91a Move None checks into CertPaths::load()
  • f9bf59f Move struct definition above impl block
  • a5f46f6 Move CertPaths construction into constructor
  • db8ed40 Deal with SSL_CERT_{FILE,DIR} set by Cargo
  • a0a7012 Load certificate from cert file and directory
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=rustls-native-certs&package-manager=cargo&previous-version=0.7.0&new-version=0.7.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 94383ba10..e2ac8b79f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3653,9 +3653,9 @@ dependencies = [ [[package]] name = "rustls-native-certs" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f1fb85efa936c42c6d5fc28d2629bb51e4b2f4b8a5211e297d599cc5a093792" +checksum = "a88d6d420651b496bdd98684116959239430022a115c1240e6c3993be0b15fba" dependencies = [ "openssl-probe", "rustls-pemfile", From ff40c66ddd583a3a91f367daf64fb2b5b5f37f9d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Jul 2024 03:21:00 +0000 Subject: [PATCH 055/215] chore(deps): Bump xxhash-rust from 0.8.10 to 0.8.11 (#1401) Bumps [xxhash-rust](https://github.com/DoumanAsh/xxhash-rust) from 0.8.10 to 0.8.11.
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=xxhash-rust&package-manager=cargo&previous-version=0.8.10&new-version=0.8.11)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e2ac8b79f..27e2e342b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5325,9 +5325,9 @@ checksum = "ec7a2a501ed189703dba8b08142f057e887dfc4b2cc4db2d343ac6376ba3e0b9" [[package]] name = "xxhash-rust" -version = "0.8.10" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "927da81e25be1e1a2901d59b81b37dd2efd1fc9c9345a55007f09bf5a2d3ee03" +checksum = "63658493314859b4dfdf3fb8c1defd61587839def09582db50b8a4e93afca6bb" [[package]] name = "yansi" From 9487b4319e8959ff6563e5783ff011b2908a133b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Jul 2024 03:21:26 +0000 Subject: [PATCH 056/215] chore(deps): Bump serde_with from 3.8.2 to 3.8.3 (#1400) Bumps [serde_with](https://github.com/jonasbb/serde_with) from 3.8.2 to 3.8.3.
Release notes

Sourced from serde_with's releases.

serde_with v3.8.3

Fixed

  • Fix compile issues when dependency schemars_0_8 is used with the preserve_order features (#762)
Commits
  • 1c4b022 Bump version to v3.8.3 (#765)
  • 7de9838 Bump version to v3.8.3
  • 19bfe18 Make code compile with schemars_0_8/preserve_order enabled (#764)
  • 4c8c2db Make code compile with schemars_0_8/preserve_order enabled
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=serde_with&package-manager=cargo&previous-version=3.8.2&new-version=3.8.3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 27e2e342b..0bd574c47 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3843,9 +3843,9 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.8.2" +version = "3.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "079f3a42cd87588d924ed95b533f8d30a483388c4e400ab736a7058e34f16169" +checksum = "e73139bc5ec2d45e6c5fd85be5a46949c1c39a4c18e56915f5eb4c12f975e377" dependencies = [ "base64 0.22.1", "chrono", @@ -3861,9 +3861,9 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.8.2" +version = "3.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc03aad67c1d26b7de277d51c86892e7d9a0110a2fe44bf6b26cc569fba302d6" +checksum = "b80d3d6b56b64335c0180e5ffde23b3c5e08c14c585b51a15bd0e95393f46703" dependencies = [ "darling", "proc-macro2", From 13c7ba41ddaf1194709680e7121c232a480de40c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Jul 2024 03:15:03 +0000 Subject: [PATCH 057/215] chore(deps): Bump serde from 1.0.203 to 1.0.204 (#1407) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [serde](https://github.com/serde-rs/serde) from 1.0.203 to 1.0.204.
Release notes

Sourced from serde's releases.

v1.0.204

  • Apply #[diagnostic::on_unimplemented] attribute on Rust 1.78+ to suggest adding serde derive or enabling a "serde" feature flag in dependencies (#2767, thanks @​weiznich)
Commits
  • 18dcae0 Release 1.0.204
  • 58c307f Alphabetize list of rustc-check-cfg
  • 8cc4809 Merge pull request #2769 from dtolnay/onunimpl
  • 1179158 Update ui test with diagnostic::on_unimplemented from PR 2767
  • 91aa40e Add ui test of unsatisfied serde trait bound
  • 595019e Cut test_suite from workspace members in old toolchain CI jobs
  • b0d7917 Pull in trybuild 'following types implement trait' fix
  • 8e6637a Merge pull request #2767 from weiznich/feature/diagnostic_on_unimplemented
  • 694fe05 Use the #[diagnostic::on_unimplemented] attribute when possible
  • f3dfd2a Suppress dead code warning in test of unit struct remote derive
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=serde&package-manager=cargo&previous-version=1.0.203&new-version=1.0.204)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0bd574c47..462980d02 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3779,18 +3779,18 @@ checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" -version = "1.0.203" +version = "1.0.204" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094" +checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.203" +version = "1.0.204" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" +checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" dependencies = [ "proc-macro2", "quote", From a247f8cff776774beb4e8f4c62f9e6e17864c5ea Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Jul 2024 03:16:07 +0000 Subject: [PATCH 058/215] chore(deps): Bump async-trait from 0.1.80 to 0.1.81 (#1406) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [async-trait](https://github.com/dtolnay/async-trait) from 0.1.80 to 0.1.81.
Release notes

Sourced from async-trait's releases.

0.1.81

  • Turn off unneeded features of syn dependency (#272, thanks @​klensy)
Commits
  • 383f65f Release 0.1.81
  • 4ec740e Merge pull request #273 from dtolnay/cloneimpls
  • b6c6063 Ignore trivially_copy_pass_by_ref pedantic clippy lint
  • 315fd90 Turn off syn/clone-impls feature
  • 94a3165 Merge pull request #272 from klensy/syn-f
  • 2fac940 syn: remove derive feature
  • 4a00d73 Work around dead code warning in test
  • dba15b5 Merge pull request #270 from dtolnay/objsafety
  • d28c95b Former where_clauses_object_safety lint is now hard error
  • 78a5922 Fill in ignore reasons in all #[ignore] attributes
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=async-trait&package-manager=cargo&previous-version=0.1.80&new-version=0.1.81)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 462980d02..93a6ef90d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -403,9 +403,9 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.80" +version = "0.1.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" +checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" dependencies = [ "proc-macro2", "quote", From 1589d70abb96ebc4cfaeb87aacfca1b35d67334a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Jul 2024 03:22:45 +0000 Subject: [PATCH 059/215] chore(deps): Bump moka from 0.12.7 to 0.12.8 (#1408) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [moka](https://github.com/moka-rs/moka) from 0.12.7 to 0.12.8.
Changelog

Sourced from moka's changelog.

Version 0.12.8

Fixed

  • Avoid to use recent versions (v0.1.12 or newer) of triomphe crate to keep our MSRV (Minimum Supported Rust Version) at Rust 1.65 (#426[gh-pull-0426], by [@​eaufavor][gh-eaufavor]).
    • triomphe@v0.1.12 requires Rust 1.76 or newer, so it will not compile with our MSRV.
  • docs: Fix per-entry expiration policy documentation (#421[gh-pull-0421], by [@​arcstur][gh-arcstur]).
Commits
  • ebf2610 Merge pull request #438 from moka-rs/prepare-0.12.8
  • 00c987d Update the change log
  • f61dfc5 Bump the version to 0.12.8
  • 5a0cc07 Merge pull request #437 from moka-rs/run-cirrusci-only-by-cron
  • 36aa7d4 CI: Run Cirrus CI only by cron
  • 4b83184 Merge pull request #436 from moka-rs/remove-js-feature
  • bf10178 Remove an experimental js feature
  • 8f19775 Merge pull request #435 from moka-rs/ci-remove-cargo-tarpaulin
  • 5f19d5f Remove the CI for cargo tarpaulin + Coveralls
  • 0476097 Merge pull request #434 from moka-rs/fix-ci-2024-07-06/v0.12
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=moka&package-manager=cargo&previous-version=0.12.7&new-version=0.12.8)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 93a6ef90d..f9b0b6601 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2525,9 +2525,9 @@ checksum = "c9be0862c1b3f26a88803c4a49de6889c10e608b3ee9344e6ef5b45fb37ad3d1" [[package]] name = "moka" -version = "0.12.7" +version = "0.12.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e0d88686dc561d743b40de8269b26eaf0dc58781bde087b0984646602021d08" +checksum = "32cf62eb4dd975d2dde76432fb1075c49e3ee2331cf36f1f8fd4b66550d32b6f" dependencies = [ "async-lock", "async-trait", @@ -4735,9 +4735,9 @@ dependencies = [ [[package]] name = "triomphe" -version = "0.1.13" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6631e42e10b40c0690bf92f404ebcfe6e1fdb480391d15f17cc8e96eeed5369" +checksum = "859eb650cfee7434994602c3a68b25d77ad9e68c8a6cd491616ef86661382eb3" [[package]] name = "try-lock" From bf8f19b6445b9b351ab7d817aa9dc0d7817c1288 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Jul 2024 03:31:55 +0000 Subject: [PATCH 060/215] chore(deps): Bump rustls from 0.23.10 to 0.23.11 (#1410) Bumps [rustls](https://github.com/rustls/rustls) from 0.23.10 to 0.23.11.
Commits
  • 7b521da roadmap: reflect 0.23.11
  • cd9be0d Prepare 0.23.11
  • f781276 x509.rs: move asn1_wrap below callers
  • bc1e543 ring::sign: tidy up pkcs8 conversion
  • b5895c7 Add public_key() for all built-in SigningKeys
  • 20fdce6 Call CertifiedKey::keys_match from ConfigBuilder::with_single_cert*
  • 54b3b5e Refactor AlwaysResolvesChain to take existing CertifiedKey
  • 0e2d2ac chore(deps): lock file maintenance
  • 8b8d5dc Refactor and explain bulk total_data behaviour
  • fefc057 Hoist Arc into make_client/server_config return type
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=rustls&package-manager=cargo&previous-version=0.23.10&new-version=0.23.11)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 10 +++++----- Cargo.toml | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f9b0b6601..9d47018cc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2265,7 +2265,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e310b3a6b5907f99202fcdb4960ff45b93735d7c7d96b760fcff8db2dc0e103d" dependencies = [ "cfg-if", - "windows-targets 0.48.5", + "windows-targets 0.52.5", ] [[package]] @@ -3637,9 +3637,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.10" +version = "0.23.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05cff451f60db80f490f3c182b77c35260baace73209e9cdbbe526bfe3a4d402" +checksum = "4828ea528154ae444e5a642dbb7d5623354030dc9822b83fd9bb79683c7399d0" dependencies = [ "aws-lc-rs", "log", @@ -3682,9 +3682,9 @@ checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" [[package]] name = "rustls-webpki" -version = "0.102.4" +version = "0.102.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff448f7e92e913c4b7d4c6d8e4540a1724b319b4152b8aef6d4cf8339712b33e" +checksum = "f9a6fccd794a42c2c105b513a2f62bc3fd8f3ba57a4593677ceb0bd035164d78" dependencies = [ "aws-lc-rs", "ring", diff --git a/Cargo.toml b/Cargo.toml index f57a13121..ae3e65408 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -65,7 +65,7 @@ pprof = { version = "0.13", features = ["flamegraph", "criterion"] } pretty_assertions = "1" regex = "1" rstest = "0.21" -rustls = "0.23.10" +rustls = "0.23.11" # ring feature does not require NASM windows executable, but works slower #rustls = { version = "0.23", default-features = false, features = ["logging", "std", "tls12", "ring"] } rustls-native-certs = "0.7" From f2ada83e7ff39020d66767892fc1389a14930452 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Jul 2024 03:32:56 +0000 Subject: [PATCH 061/215] chore(deps): Bump clap from 4.5.8 to 4.5.9 (#1409) Bumps [clap](https://github.com/clap-rs/clap) from 4.5.8 to 4.5.9.
Release notes

Sourced from clap's releases.

v4.5.9

[4.5.9] - 2024-07-09

Fixes

  • (error) When defining a custom help flag, be sure to suggest it like we do the built-in one
Changelog

Sourced from clap's changelog.

[4.5.9] - 2024-07-09

Fixes

  • (error) When defining a custom help flag, be sure to suggest it like we do the built-in one
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=clap&package-manager=cargo&previous-version=4.5.8&new-version=4.5.9)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9d47018cc..72674794b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -749,9 +749,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.8" +version = "4.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84b3edb18336f4df585bc9aa31dd99c036dfa5dc5e9a2939a722a188f3a8970d" +checksum = "64acc1846d54c1fe936a78dc189c34e28d3f5afc348403f28ecf53660b9b8462" dependencies = [ "clap_builder", "clap_derive", @@ -759,9 +759,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.8" +version = "4.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1c09dd5ada6c6c78075d6fd0da3f90d8080651e2d6cc8eb2f1aaa4034ced708" +checksum = "6fb8393d67ba2e7bfaf28a23458e4e2b543cc73a99595511eb207fdb8aede942" dependencies = [ "anstream", "anstyle", From 259b994d75080d9d03ac97ca42174b5a7551a788 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Jul 2024 09:47:40 -0400 Subject: [PATCH 062/215] chore(deps): Bump dependabot/fetch-metadata from 2.1.0 to 2.2.0 (#1404) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [dependabot/fetch-metadata](https://github.com/dependabot/fetch-metadata) from 2.1.0 to 2.2.0.
Release notes

Sourced from dependabot/fetch-metadata's releases.

v2.2.0

What's Changed

Full Changelog: https://github.com/dependabot/fetch-metadata/compare/v2...v2.2.0

Commits
  • dbb049a v2.2.0 (#520)
  • 36bf1f9 Merge pull request #532 from dependabot/dependabot/npm_and_yarn/braces-3.0.3
  • a3420b5 Bump braces from 3.0.2 to 3.0.3
  • 006e43f Merge pull request #534 from dependabot/dependabot/github_actions/actions/cre...
  • 9c55ebe Bump actions/create-github-app-token from 1.10.0 to 1.10.2
  • 325b863 Merge pull request #523 from dependabot/dependabot/github_actions/actions/cre...
  • aec2f3e Bump actions/create-github-app-token from 1.9.0 to 1.10.0
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=dependabot/fetch-metadata&package-manager=github_actions&previous-version=2.1.0&new-version=2.2.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/dependabot.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dependabot.yml b/.github/workflows/dependabot.yml index c4d1d2365..802dc3df5 100644 --- a/.github/workflows/dependabot.yml +++ b/.github/workflows/dependabot.yml @@ -10,7 +10,7 @@ jobs: steps: - name: Dependabot metadata id: metadata - uses: dependabot/fetch-metadata@v2.1.0 + uses: dependabot/fetch-metadata@v2.2.0 with: github-token: "${{ secrets.GITHUB_TOKEN }}" - name: Approve Dependabot PRs From d4465426d81018036df0483f78eac4bbfed41e35 Mon Sep 17 00:00:00 2001 From: Yuri Astrakhan Date: Tue, 9 Jul 2024 10:20:51 -0400 Subject: [PATCH 063/215] Add port fwd test, dep update (#1411) * Add a test to verify forwarded host, port, schema, etc from proxy * bump a few dependencies --- Cargo.lock | 188 ++++++++++++++++----------------- Cargo.toml | 2 +- demo/frontend/nginx.conf | 2 +- martin/tests/pg_server_test.rs | 17 ++- 4 files changed, 108 insertions(+), 101 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 72674794b..5fface954 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -80,7 +80,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn 2.0.68", + "syn 2.0.70", ] [[package]] @@ -197,7 +197,7 @@ dependencies = [ "actix-router", "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.70", ] [[package]] @@ -398,7 +398,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.70", ] [[package]] @@ -409,7 +409,7 @@ checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.70", ] [[package]] @@ -522,24 +522,24 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.68", + "syn 2.0.70", "which", ] [[package]] name = "bit-set" -version = "0.5.3" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +checksum = "f0481a0e032742109b1133a095184ee93d88f3dc9e0d28a5d033dc77a073f44f" dependencies = [ "bit-vec", ] [[package]] name = "bit-vec" -version = "0.6.3" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" +checksum = "d2c54ff287cfc0a34f38a6b832ea1bd8e448a330b3e40a50859e6488bee07f22" [[package]] name = "bitflags" @@ -672,9 +672,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.0.101" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac367972e516d45567c7eafc73d24e1c193dcf200a8d94e9db7b3d38b349572d" +checksum = "eaff6f8ce506b9773fa786672d63fc7a191ffea1be33f72bbd4aeacefca9ffc8" dependencies = [ "jobserver", "libc", @@ -706,7 +706,7 @@ dependencies = [ "iana-time-zone", "num-traits", "serde", - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -778,7 +778,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.70", ] [[package]] @@ -789,9 +789,9 @@ checksum = "4b82cf0babdbd58558212896d1a4272303a57bdb245c2bf1147185fb45640e70" [[package]] name = "clap_mangen" -version = "0.2.21" +version = "0.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74b70fc13e60c0e1d490dc50eb73a749be6d81f4ef03783df1d9b7b0c62bc937" +checksum = "f50dde5bc0c853d6248de457e5eb6e5a674a54b93810a34ded88d882ca1fe2de" dependencies = [ "clap", "roff", @@ -1039,7 +1039,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edb49164822f3ee45b17acd4a208cfc1251410cf0cad9a833234c9890774dd9f" dependencies = [ "quote", - "syn 2.0.68", + "syn 2.0.70", ] [[package]] @@ -1063,7 +1063,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.68", + "syn 2.0.70", ] [[package]] @@ -1074,7 +1074,7 @@ checksum = "733cabb43482b1a1b53eee8583c2b9e8684d592215ea83efd305dd31bc2f0178" dependencies = [ "darling_core", "quote", - "syn 2.0.68", + "syn 2.0.70", ] [[package]] @@ -1157,7 +1157,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.68", + "syn 2.0.70", ] [[package]] @@ -1243,7 +1243,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.70", ] [[package]] @@ -1585,7 +1585,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.70", ] [[package]] @@ -1891,9 +1891,9 @@ dependencies = [ [[package]] name = "hyper" -version = "1.3.1" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe575dd17d0862a9a33781c8c4696a55c320909004a67a00fb286ba8b1bc496d" +checksum = "c4fe55fb7a772d59a5ff1dfbff4fe0258d19b89fec4b233e75d35d5d2316badc" dependencies = [ "bytes", "futures-channel", @@ -1916,7 +1916,7 @@ checksum = "5ee4be2c948921a1a5320b629c4193916ed787a7f7f293fd3f7f5a6c9de74155" dependencies = [ "futures-util", "http 1.1.0", - "hyper 1.3.1", + "hyper 1.4.0", "hyper-util", "rustls", "rustls-native-certs", @@ -1928,16 +1928,16 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b875924a60b96e5d7b9ae7b066540b1dd1cbd90d1828f54c92e02a283351c56" +checksum = "3ab92f4f49ee4fb4f997c784b7a2e0fa70050211e0b6a287f898c3c9785ca956" dependencies = [ "bytes", "futures-channel", "futures-util", "http 1.1.0", "http-body 1.0.0", - "hyper 1.3.1", + "hyper 1.4.0", "pin-project-lite", "socket2", "tokio", @@ -2265,7 +2265,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e310b3a6b5907f99202fcdb4960ff45b93735d7c7d96b760fcff8db2dc0e103d" dependencies = [ "cfg-if", - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -2695,9 +2695,9 @@ dependencies = [ [[package]] name = "object" -version = "0.36.0" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "576dfe1fc8f9df304abb159d767a29d0476f7750fbf8aa7ad07816004a207434" +checksum = "081b846d1d56ddfc18fdf1a922e4f6e07a11768ea1b92dec44e42b72712ccfce" dependencies = [ "memchr", ] @@ -2710,9 +2710,9 @@ checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "oorandom" -version = "11.1.3" +version = "11.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" +checksum = "b410bbe7e14ab526a0e86877eb47c6996a2bd7746f027ba551028c925390e4e9" [[package]] name = "openssl-probe" @@ -2767,7 +2767,7 @@ dependencies = [ "libc", "redox_syscall 0.5.2", "smallvec", - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -2793,7 +2793,7 @@ dependencies = [ "regex", "regex-syntax 0.7.5", "structmeta", - "syn 2.0.68", + "syn 2.0.70", ] [[package]] @@ -2884,7 +2884,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.70", ] [[package]] @@ -3095,7 +3095,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" dependencies = [ "proc-macro2", - "syn 2.0.68", + "syn 2.0.70", ] [[package]] @@ -3446,7 +3446,7 @@ dependencies = [ "http 1.1.0", "http-body 1.0.0", "http-body-util", - "hyper 1.3.1", + "hyper 1.4.0", "hyper-rustls", "hyper-util", "ipnet", @@ -3494,9 +3494,9 @@ dependencies = [ [[package]] name = "rgb" -version = "0.8.37" +version = "0.8.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05aaa8004b64fd573fc9d002f4e632d51ad4f026c2b5ba95fcb6c2f32c2c47d8" +checksum = "1aee83dc281d5a3200d37b299acd13b81066ea126a7f16f0eae70fc9aed241d9" dependencies = [ "bytemuck", ] @@ -3583,7 +3583,7 @@ dependencies = [ "regex", "relative-path", "rustc_version", - "syn 2.0.68", + "syn 2.0.70", "unicode-ident", ] @@ -3794,7 +3794,7 @@ checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.70", ] [[package]] @@ -3868,7 +3868,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.70", ] [[package]] @@ -4311,7 +4311,7 @@ dependencies = [ "proc-macro2", "quote", "structmeta-derive", - "syn 2.0.68", + "syn 2.0.70", ] [[package]] @@ -4322,7 +4322,7 @@ checksum = "a60bcaff7397072dca0017d1db428e30d5002e00b6847703e2e42005c95fbe00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.70", ] [[package]] @@ -4389,9 +4389,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.68" +version = "2.0.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "901fa70d88b9d6c98022e23b4136f9f3e54e4662c3bc1bd1d84a42a9a0f0c1e9" +checksum = "2f0209b68b3613b093e0ec905354eccaedcfe83b8cb37cbdeae64026c3064c16" dependencies = [ "proc-macro2", "quote", @@ -4445,7 +4445,7 @@ checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.70", ] [[package]] @@ -4529,9 +4529,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.6.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c55115c6fbe2d2bef26eb09ad74bde02d8255476fc0c7b515ef09fbb35742d82" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" dependencies = [ "tinyvec_macros", ] @@ -4569,7 +4569,7 @@ checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.70", ] [[package]] @@ -4721,7 +4721,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.70", ] [[package]] @@ -4924,9 +4924,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.9.1" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5de17fd2f7da591098415cff336e12965a28061ddace43b59cb3c430179c9439" +checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314" dependencies = [ "getrandom", ] @@ -5001,7 +5001,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.70", "wasm-bindgen-shared", ] @@ -5035,7 +5035,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.70", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -5122,7 +5122,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -5140,7 +5140,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.5", + "windows-targets 0.52.6", ] [[package]] @@ -5160,18 +5160,18 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.5", - "windows_aarch64_msvc 0.52.5", - "windows_i686_gnu 0.52.5", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", "windows_i686_gnullvm", - "windows_i686_msvc 0.52.5", - "windows_x86_64_gnu 0.52.5", - "windows_x86_64_gnullvm 0.52.5", - "windows_x86_64_msvc 0.52.5", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] [[package]] @@ -5182,9 +5182,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" @@ -5194,9 +5194,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" @@ -5206,15 +5206,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" @@ -5224,9 +5224,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" @@ -5236,9 +5236,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" @@ -5248,9 +5248,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" @@ -5260,9 +5260,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" @@ -5337,22 +5337,22 @@ checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" [[package]] name = "zerocopy" -version = "0.7.34" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.34" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.70", ] [[package]] @@ -5372,7 +5372,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.68", + "syn 2.0.70", ] [[package]] @@ -5391,27 +5391,27 @@ dependencies = [ [[package]] name = "zstd" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d789b1514203a1120ad2429eae43a7bd32b90976a7bb8a05f7ec02fa88cc23a" +checksum = "fcf2b778a664581e31e389454a7072dab1647606d44f7feea22cd5abb9c9f3f9" dependencies = [ "zstd-safe", ] [[package]] name = "zstd-safe" -version = "7.1.0" +version = "7.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd99b45c6bc03a018c8b8a86025678c87e55526064e38f9df301989dce7ec0a" +checksum = "fa556e971e7b568dc775c136fc9de8c779b1c2fc3a63defaafadffdbd3181afa" dependencies = [ "zstd-sys", ] [[package]] name = "zstd-sys" -version = "2.0.11+zstd.1.5.6" +version = "2.0.12+zstd.1.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75652c55c0b6f3e6f12eb786fe1bc960396bf05a1eb3bf1f3691c3610ac2e6d4" +checksum = "0a4e40c320c3cb459d9a9ff6de98cff88f4751ee9275d140e2be94a2b74e4c13" dependencies = [ "cc", "pkg-config", diff --git a/Cargo.toml b/Cargo.toml index ae3e65408..fd682f008 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -32,7 +32,7 @@ actix-web = "4" anyhow = "1.0" approx = "0.5.1" async-trait = "0.1" -bit-set = "0.5.3" +bit-set = "0.6.0" brotli = ">=5, <7" cargo-husky = { version = "1", features = ["user-hooks"], default-features = false } clap = { version = "4", features = ["derive"] } diff --git a/demo/frontend/nginx.conf b/demo/frontend/nginx.conf index e9803800b..b39c95630 100644 --- a/demo/frontend/nginx.conf +++ b/demo/frontend/nginx.conf @@ -65,7 +65,7 @@ http { proxy_set_header X-Forwarded-Proto "https"; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Host $host:$server_port; proxy_set_header X-Rewrite-URL $uri; proxy_redirect off; diff --git a/martin/tests/pg_server_test.rs b/martin/tests/pg_server_test.rs index 600e774ab..57b8420d6 100644 --- a/martin/tests/pg_server_test.rs +++ b/martin/tests/pg_server_test.rs @@ -852,18 +852,25 @@ postgres: result.tiles, &["http://localhost:8080/tiles/function_zxy_query/{z}/{x}/{y}?token=martin"] ); +} + +#[actix_rt::test] +async fn pg_get_function_source_ok_rewrite_all() { + let app = create_app! { " +postgres: + connection_string: $DATABASE_URL +"}; let req = TestRequest::get() .uri("/function_zxy_query_jsonb?token=martin") - .insert_header(( - "x-rewrite-url", - "/tiles/function_zxy_query_jsonb?token=martin", - )) + .insert_header(("X-Forwarded-Proto", "https")) + .insert_header(("X-Forwarded-Host", "example.org:7654")) + .insert_header(("X-Rewrite-URL", "/proxy/function_zxy_query_jsonb")) .to_request(); let result: TileJSON = call_and_read_body_json(&app, req).await; assert_eq!( result.tiles, - &["http://localhost:8080/tiles/function_zxy_query_jsonb/{z}/{x}/{y}?token=martin"] + &["https://example.org:7654/proxy/function_zxy_query_jsonb/{z}/{x}/{y}?token=martin"] ); } From 7446f54bc14a77392516ad9b9184c30b3ac175f9 Mon Sep 17 00:00:00 2001 From: Yuri Astrakhan Date: Thu, 11 Jul 2024 10:04:58 -0400 Subject: [PATCH 064/215] Minor lints (#1412) --- docs/src/config-file.md | 1 - mbtiles/src/bindiff.rs | 4 +++- tests/test.sh | 4 ++++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/docs/src/config-file.md b/docs/src/config-file.md index 2468893a4..fcdcf7b1f 100644 --- a/docs/src/config-file.md +++ b/docs/src/config-file.md @@ -26,7 +26,6 @@ keep_alive: 75 # The socket address to bind [default: 0.0.0.0:3000] listen_addresses: '0.0.0.0:3000' - # Set TileJSON URL path prefix, ignoring X-Rewrite-URL header. Must begin with a `/` base_path: /tiles diff --git a/mbtiles/src/bindiff.rs b/mbtiles/src/bindiff.rs index 0ba3f33b7..2526484b4 100644 --- a/mbtiles/src/bindiff.rs +++ b/mbtiles/src/bindiff.rs @@ -133,7 +133,9 @@ fn start_processor_threads, has_errors: Arc, ) { - (0..num_cpus::get()).for_each(|_| { + let cpus = num_cpus::get(); + info!("Processing bindiff patches using {cpus} threads..."); + (0..cpus).for_each(|_| { let rx_wrk = rx_wrk.clone(); let tx_ins = tx_ins.clone(); let has_errors = has_errors.clone(); diff --git a/tests/test.sh b/tests/test.sh index 5e8f66c54..1675918fd 100755 --- a/tests/test.sh +++ b/tests/test.sh @@ -470,11 +470,15 @@ if [[ "$MBTILES_BIN" != "-" ]]; then "$TEST_TEMP_DIR/world_cities_bindiff.mbtiles" \ --patch-type bin-diff-gz \ 2>&1 | tee "$TEST_OUT_DIR/copy_bindiff.txt" + test_log_has_str "$TEST_OUT_DIR/copy_bindiff.txt" '.*Processing bindiff patches using .* threads...' + $MBTILES_BIN copy \ ./tests/fixtures/mbtiles/world_cities.mbtiles \ --apply-patch "$TEST_TEMP_DIR/world_cities_bindiff.mbtiles" \ "$TEST_TEMP_DIR/world_cities_modified2.mbtiles" \ 2>&1 | tee "$TEST_OUT_DIR/copy_bindiff2.txt" + test_log_has_str "$TEST_OUT_DIR/copy_bindiff2.txt" '.*Processing bindiff patches using .* threads...' + # Ensure that world_cities_modified and world_cities_modified2 are identical (regular diff is empty) $MBTILES_BIN copy \ ./tests/fixtures/mbtiles/world_cities_modified.mbtiles \ From cf5d00d680d2fd5f357f38ad18278a6375f5288a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 12 Jul 2024 02:25:11 +0000 Subject: [PATCH 065/215] chore(deps): Bump thiserror from 1.0.61 to 1.0.62 (#1414) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [thiserror](https://github.com/dtolnay/thiserror) from 1.0.61 to 1.0.62.
Release notes

Sourced from thiserror's releases.

1.0.62

  • Support referring to nested tuple struct fields inside #[error("…", …)] attribute (#309)
Commits
  • 0bf6e3d Release 1.0.62
  • 4977932 Merge pull request #310 from dtolnay/nestedtuple
  • 40a7779 Support .0.0 nested tuple index
  • f1ca210 Add regression test for issue 309
  • 479744e No need for dead code if struct fields are public
  • 4db08b1 Ignore warning on unused struct in test
  • f2824ae Fill in ignore reasons in all #[ignore] attributes
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=thiserror&package-manager=cargo&previous-version=1.0.61&new-version=1.0.62)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5fface954..18d723374 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4430,18 +4430,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.61" +version = "1.0.62" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" +checksum = "f2675633b1499176c2dff06b0856a27976a8f9d436737b4cf4f312d4d91d8bbb" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.61" +version = "1.0.62" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" +checksum = "d20468752b09f49e909e55a5d338caa8bedf615594e9d80bc4c565d30faf798c" dependencies = [ "proc-macro2", "quote", From adb9a4aa86906b4fd184d9f5c3b5339db2df66f8 Mon Sep 17 00:00:00 2001 From: Yuri Astrakhan Date: Fri, 12 Jul 2024 16:17:45 -0400 Subject: [PATCH 066/215] Bump deps, CI cleanup --- .dockerignore | 11 +++++ .github/workflows/ci.yml | 5 +- .gitignore | 10 ++++ Cargo.lock | 104 +++++++++++++++++++-------------------- 4 files changed, 74 insertions(+), 56 deletions(-) diff --git a/.dockerignore b/.dockerignore index 05147945c..cc6a29ee7 100644 --- a/.dockerignore +++ b/.dockerignore @@ -10,7 +10,10 @@ justfile **/tests demo/ +#### #### This must match .gitignore #### +#### + .DS_Store target/ **/*.rs.bk @@ -22,5 +25,13 @@ test_log* pg_data/ config.yml tests/output/ +tests/mbtiles_temp_files/ tmp/ .aws-sam/ + +**/node_modules/ +**/dist/ + +#### +#### Above content must match .gitignore #### +#### diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9175346f6..c4dc90c75 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -142,11 +142,8 @@ jobs: for target in "aarch64-unknown-linux-musl" "x86_64-unknown-linux-musl"; do echo -e "\n----------------------------------------------" echo "Building $target" - export "CARGO_TARGET_$(echo $target | tr 'a-z-' 'A-Z_')_RUSTFLAGS"='-C strip=debuginfo' - cross build --release --target $target --package mbtiles - cross build --release --target $target --package martin - + cross build --release --target $target --workspace mkdir -p target_releases/$target mv target/$target/release/martin target_releases/$target mv target/$target/release/martin-cp target_releases/$target diff --git a/.gitignore b/.gitignore index d13179339..f6ef743d5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,7 @@ +#### #### This must match .dockerignore #### +#### + .DS_Store target/ **/*.rs.bk @@ -13,3 +16,10 @@ tests/output/ tests/mbtiles_temp_files/ tmp/ .aws-sam/ + +**/node_modules/ +**/dist/ + +#### +#### Above content must match .dockerignore #### +#### diff --git a/Cargo.lock b/Cargo.lock index 18d723374..06d84f9f2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -80,7 +80,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn 2.0.70", + "syn 2.0.71", ] [[package]] @@ -197,7 +197,7 @@ dependencies = [ "actix-router", "proc-macro2", "quote", - "syn 2.0.70", + "syn 2.0.71", ] [[package]] @@ -398,7 +398,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.70", + "syn 2.0.71", ] [[package]] @@ -409,7 +409,7 @@ checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" dependencies = [ "proc-macro2", "quote", - "syn 2.0.70", + "syn 2.0.71", ] [[package]] @@ -522,7 +522,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.70", + "syn 2.0.71", "which", ] @@ -672,9 +672,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaff6f8ce506b9773fa786672d63fc7a191ffea1be33f72bbd4aeacefca9ffc8" +checksum = "907d8581360765417f8f2e0e7d602733bbed60156b4465b7617243689ef9b83d" dependencies = [ "jobserver", "libc", @@ -778,7 +778,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.70", + "syn 2.0.71", ] [[package]] @@ -1039,14 +1039,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edb49164822f3ee45b17acd4a208cfc1251410cf0cad9a833234c9890774dd9f" dependencies = [ "quote", - "syn 2.0.70", + "syn 2.0.71", ] [[package]] name = "darling" -version = "0.20.9" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83b2eb4d90d12bdda5ed17de686c2acb4c57914f8f921b8da7e112b5a36f3fe1" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" dependencies = [ "darling_core", "darling_macro", @@ -1054,27 +1054,27 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.9" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622687fe0bac72a04e5599029151f5796111b90f1baaa9b544d807a5e31cd120" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim", - "syn 2.0.70", + "syn 2.0.71", ] [[package]] name = "darling_macro" -version = "0.20.9" +version = "0.20.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "733cabb43482b1a1b53eee8583c2b9e8684d592215ea83efd305dd31bc2f0178" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.70", + "syn 2.0.71", ] [[package]] @@ -1157,7 +1157,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.70", + "syn 2.0.71", ] [[package]] @@ -1243,7 +1243,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.70", + "syn 2.0.71", ] [[package]] @@ -1585,7 +1585,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.70", + "syn 2.0.71", ] [[package]] @@ -1827,9 +1827,9 @@ dependencies = [ [[package]] name = "http-body" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", "http 1.1.0", @@ -1844,7 +1844,7 @@ dependencies = [ "bytes", "futures-util", "http 1.1.0", - "http-body 1.0.0", + "http-body 1.0.1", "pin-project-lite", ] @@ -1868,9 +1868,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.29" +version = "0.14.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f361cde2f109281a220d4307746cdfd5ee3f410da58a70377762396775634b33" +checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" dependencies = [ "bytes", "futures-channel", @@ -1891,15 +1891,15 @@ dependencies = [ [[package]] name = "hyper" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4fe55fb7a772d59a5ff1dfbff4fe0258d19b89fec4b233e75d35d5d2316badc" +checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" dependencies = [ "bytes", "futures-channel", "futures-util", "http 1.1.0", - "http-body 1.0.0", + "http-body 1.0.1", "httparse", "itoa", "pin-project-lite", @@ -1916,7 +1916,7 @@ checksum = "5ee4be2c948921a1a5320b629c4193916ed787a7f7f293fd3f7f5a6c9de74155" dependencies = [ "futures-util", "http 1.1.0", - "hyper 1.4.0", + "hyper 1.4.1", "hyper-util", "rustls", "rustls-native-certs", @@ -1936,8 +1936,8 @@ dependencies = [ "futures-channel", "futures-util", "http 1.1.0", - "http-body 1.0.0", - "hyper 1.4.0", + "http-body 1.0.1", + "hyper 1.4.1", "pin-project-lite", "socket2", "tokio", @@ -2191,7 +2191,7 @@ dependencies = [ "bytes", "futures", "http 0.2.12", - "hyper 0.14.29", + "hyper 0.14.30", "lambda_runtime_api_client", "serde", "serde_json", @@ -2208,7 +2208,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7210012be904051520f0dc502140ba599bae3042b65b3737b87727f1aa88a7d6" dependencies = [ "http 0.2.12", - "hyper 0.14.29", + "hyper 0.14.30", "tokio", "tower-service", ] @@ -2793,7 +2793,7 @@ dependencies = [ "regex", "regex-syntax 0.7.5", "structmeta", - "syn 2.0.70", + "syn 2.0.71", ] [[package]] @@ -2884,7 +2884,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.70", + "syn 2.0.71", ] [[package]] @@ -3095,7 +3095,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" dependencies = [ "proc-macro2", - "syn 2.0.70", + "syn 2.0.71", ] [[package]] @@ -3444,9 +3444,9 @@ dependencies = [ "futures-core", "futures-util", "http 1.1.0", - "http-body 1.0.0", + "http-body 1.0.1", "http-body-util", - "hyper 1.4.0", + "hyper 1.4.1", "hyper-rustls", "hyper-util", "ipnet", @@ -3583,7 +3583,7 @@ dependencies = [ "regex", "relative-path", "rustc_version", - "syn 2.0.70", + "syn 2.0.71", "unicode-ident", ] @@ -3794,7 +3794,7 @@ checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" dependencies = [ "proc-macro2", "quote", - "syn 2.0.70", + "syn 2.0.71", ] [[package]] @@ -3868,7 +3868,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.70", + "syn 2.0.71", ] [[package]] @@ -4311,7 +4311,7 @@ dependencies = [ "proc-macro2", "quote", "structmeta-derive", - "syn 2.0.70", + "syn 2.0.71", ] [[package]] @@ -4322,7 +4322,7 @@ checksum = "a60bcaff7397072dca0017d1db428e30d5002e00b6847703e2e42005c95fbe00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.70", + "syn 2.0.71", ] [[package]] @@ -4389,9 +4389,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.70" +version = "2.0.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0209b68b3613b093e0ec905354eccaedcfe83b8cb37cbdeae64026c3064c16" +checksum = "b146dcf730474b4bcd16c311627b31ede9ab149045db4d6088b3becaea046462" dependencies = [ "proc-macro2", "quote", @@ -4445,7 +4445,7 @@ checksum = "d20468752b09f49e909e55a5d338caa8bedf615594e9d80bc4c565d30faf798c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.70", + "syn 2.0.71", ] [[package]] @@ -4569,7 +4569,7 @@ checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.70", + "syn 2.0.71", ] [[package]] @@ -4721,7 +4721,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.70", + "syn 2.0.71", ] [[package]] @@ -5001,7 +5001,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.70", + "syn 2.0.71", "wasm-bindgen-shared", ] @@ -5035,7 +5035,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.70", + "syn 2.0.71", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -5352,7 +5352,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.70", + "syn 2.0.71", ] [[package]] @@ -5372,7 +5372,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.70", + "syn 2.0.71", ] [[package]] From 7f18b6bbf24e9b4980dfe61f7fdc42887074b54e Mon Sep 17 00:00:00 2001 From: paigewilliams Date: Sun, 14 Jul 2024 10:39:29 -0700 Subject: [PATCH 067/215] add web UI placeholder (#1395) Add an optional web UI interface for Martin, including docker-based cross-compilation support. The UI itself is a placeholder with a logo, but will grow in subsequent PRs. This was branched off of https://github.com/maplibre/martin/pull/1142 to address the PR feedback from @nyurik . --------- Co-authored-by: Yuri Astrakhan Co-authored-by: Tomer Ronen Co-authored-by: tomeronen <45331634+tomeronen@users.noreply.github.com> --- .github/workflows/ci.yml | 3 + Cargo.lock | 69 + Cargo.toml | 2 + Cross.toml | 13 + docs/src/config-file.md | 3 + docs/src/run-with-cli.md | 13 +- docs/src/using.md | 2 +- justfile | 8 +- martin-ui/.eslintrc.cjs | 18 + martin-ui/README.md | 12 + martin-ui/index.html | 24 + martin-ui/package-lock.json | 3383 +++++++++++++++++++++++++ martin-ui/package.json | 33 + martin-ui/public/_/assets/favicon.ico | Bin 0 -> 34494 bytes martin-ui/src/App.css | 1 + martin-ui/src/App.tsx | 18 + martin-ui/src/assets/logo.png | 1 + martin-ui/src/index.css | 10 + martin-ui/src/main.tsx | 10 + martin-ui/src/vite-env.d.ts | 1 + martin-ui/tsconfig.json | 25 + martin-ui/tsconfig.node.json | 10 + martin-ui/vite.config.ts | 12 + martin/Cargo.toml | 10 +- martin/build.rs | 13 + martin/src/args/mod.rs | 2 +- martin/src/args/srv.rs | 27 +- martin/src/bin/martin.rs | 13 + martin/src/srv/config.rs | 9 +- martin/src/srv/server.rs | 64 +- martin/tests/mb_server_test.rs | 2 +- martin/tests/pg_server_test.rs | 4 +- martin/tests/pmt_server_test.rs | 2 +- 33 files changed, 3786 insertions(+), 31 deletions(-) create mode 100644 Cross.toml create mode 100644 martin-ui/.eslintrc.cjs create mode 100644 martin-ui/README.md create mode 100644 martin-ui/index.html create mode 100644 martin-ui/package-lock.json create mode 100644 martin-ui/package.json create mode 100644 martin-ui/public/_/assets/favicon.ico create mode 100644 martin-ui/src/App.css create mode 100644 martin-ui/src/App.tsx create mode 120000 martin-ui/src/assets/logo.png create mode 100644 martin-ui/src/index.css create mode 100644 martin-ui/src/main.tsx create mode 100644 martin-ui/src/vite-env.d.ts create mode 100644 martin-ui/tsconfig.json create mode 100644 martin-ui/tsconfig.node.json create mode 100644 martin-ui/vite.config.ts create mode 100644 martin/build.rs diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c4dc90c75..f7f76ca35 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -142,6 +142,9 @@ jobs: for target in "aarch64-unknown-linux-musl" "x86_64-unknown-linux-musl"; do echo -e "\n----------------------------------------------" echo "Building $target" + # See https://github.com/cross-rs/cross/issues/1526 + # TODO: Remove this once a version after cross 0.2.5 is released + export CROSS_BUILD_OPTS="--output=type=docker" export "CARGO_TARGET_$(echo $target | tr 'a-z-' 'A-Z_')_RUSTFLAGS"='-C strip=debuginfo' cross build --release --target $target --workspace mkdir -p target_releases/$target diff --git a/Cargo.lock b/Cargo.lock index 06d84f9f2..ad307c0aa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -200,6 +200,18 @@ dependencies = [ "syn 2.0.71", ] +[[package]] +name = "actix-web-static-files" +version = "4.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adf6d1ef6d7a60e084f9e0595e2a5234abda14e76c105ecf8e2d0e8800c41a1f" +dependencies = [ + "actix-web", + "derive_more", + "futures-util", + "static-files", +] + [[package]] name = "addr2line" version = "0.22.0" @@ -696,6 +708,16 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "change-detection" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "159fa412eae48a1d94d0b9ecdb85c97ce56eb2a347c62394d3fdbf221adabc1a" +dependencies = [ + "path-matchers", + "path-slash", +] + [[package]] name = "chrono" version = "0.4.38" @@ -2344,6 +2366,7 @@ dependencies = [ "actix-http", "actix-rt", "actix-web", + "actix-web-static-files", "async-trait", "bit-set", "brotli 6.0.0", @@ -2382,6 +2405,7 @@ dependencies = [ "serde_with", "serde_yaml", "spreet", + "static-files", "subst", "thiserror", "tilejson", @@ -2489,6 +2513,16 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "mime_guess" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" +dependencies = [ + "mime", + "unicase", +] + [[package]] name = "minimal-lexical" version = "0.2.1" @@ -2802,6 +2836,21 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +[[package]] +name = "path-matchers" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36cd9b72a47679ec193a5f0229d9ab686b7bd45e1fbc59ccf953c9f3d83f7b2b" +dependencies = [ + "glob", +] + +[[package]] +name = "path-slash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "498a099351efa4becc6a19c72aa9270598e8fd274ca47052e37455241c88b696" + [[package]] name = "pbf_font_tools" version = "2.5.1" @@ -4270,6 +4319,17 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +[[package]] +name = "static-files" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e8590e848e1c53be9258210bcd4a8f4118e08988f03a4e2d63b62e4ad9f7ced" +dependencies = [ + "change-detection", + "mime_guess", + "path-slash", +] + [[package]] name = "str_stack" version = "0.1.0" @@ -4757,6 +4817,15 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +[[package]] +name = "unicase" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" +dependencies = [ + "version_check", +] + [[package]] name = "unicode-bidi" version = "0.3.15" diff --git a/Cargo.toml b/Cargo.toml index fd682f008..b1b112946 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,6 +29,7 @@ actix-cors = "0.7" actix-http = "3" actix-rt = "2" actix-web = "4" +actix-web-static-files = "4" anyhow = "1.0" approx = "0.5.1" async-trait = "0.1" @@ -80,6 +81,7 @@ spreet = { version = "0.11", default-features = false } sqlite-compressions = { version = "0.2.12", default-features = false, features = ["bsdiffraw", "gzip"] } sqlite-hashes = { version = "0.7.3", default-features = false, features = ["md5", "aggregate", "hex"] } sqlx = { version = "0.7", features = ["sqlite", "runtime-tokio"] } +static-files = "0.2" subst = { version = "0.3", features = ["yaml"] } thiserror = "1" tile-grid = "0.6" diff --git a/Cross.toml b/Cross.toml new file mode 100644 index 000000000..78a1d6b02 --- /dev/null +++ b/Cross.toml @@ -0,0 +1,13 @@ +[build] +pre-build = [ + # install nodejs and npm to compile static web resources + # note that architecture could be the same as the container, not $CROSS_DEB_ARCH + # Need to use a fairly old Node.js version to support the old underlying docker image + "curl -fsSL https://deb.nodesource.com/setup_16.x -o nodesource_setup.sh", + "bash nodesource_setup.sh", + "apt-get install -y nodejs", + "node -v", + # Using old NPM, so must ensure correct access + "mkdir -p /.npm", + "chown -R 1001:127 /.npm", +] diff --git a/docs/src/config-file.md b/docs/src/config-file.md index fcdcf7b1f..4ed9cd5ca 100644 --- a/docs/src/config-file.md +++ b/docs/src/config-file.md @@ -38,6 +38,9 @@ cache_size_mb: 1024 # If the client accepts multiple compression formats, and the tile source is not pre-compressed, which compression should be used. `gzip` is faster, but `brotli` is smaller, and may be faster with caching. Default could be different depending on Martin version. preferred_encoding: gzip +# Enable or disable Martin web UI. At the moment, only allows `enable-for-all` which enables the web UI for all connections. This may be undesirable in a production environment. [default: disable] +web_ui: disable + # Database configuration. This can also be a list of PG configs. postgres: # Database connection string. You can use env vars too, for example: diff --git a/docs/src/run-with-cli.md b/docs/src/run-with-cli.md index fe6ddaf14..4c16e7ffa 100644 --- a/docs/src/run-with-cli.md +++ b/docs/src/run-with-cli.md @@ -17,6 +17,9 @@ Options: --save-config Save resulting config to a file or use "-" to print to stdout. By default, only print if sources are auto-detected + -C, --cache-size + Main cache size (in MB) + -s, --sprite Export a directory with SVG files as a sprite source. Can be specified multiple times @@ -28,6 +31,7 @@ Options: -l, --listen-addresses The socket address to bind. [DEFAULT: 0.0.0.0:3000] + --base-path Set TileJSON URL path prefix, ignoring X-Rewrite-URL header. Must begin with a `/`. Examples: `/`, `/tiles` @@ -35,10 +39,17 @@ Options: Number of web server workers --preferred-encoding - Martin server preferred tile encoding. If the client accepts multiple compression formats, and the tile source is not pre-compressed, which compression should be used. `gzip` is faster, but `brotli` is smaller, and may be faster with caching. Default could be different depending on Martin version + Martin server preferred tile encoding. If the client accepts multiple compression formats, and the tile source is not pre-compressed, which compression should be used. `gzip` is faster, but `brotli` is smaller, and may be faster with caching. Defaults to gzip [possible values: brotli, gzip] + -u, --webui + Control Martin web UI. Disabled by default + + Possible values: + - disable: Disable Web UI interface. This is the default, but once implemented, the default will be enabled for localhost + - enable-for-all: Enable Web UI interface on all connections + -b, --auto-bounds Specify how bounds should be computed for the spatial PG tables. [DEFAULT: quick] diff --git a/docs/src/using.md b/docs/src/using.md index 2d8c3c537..82c11ee41 100644 --- a/docs/src/using.md +++ b/docs/src/using.md @@ -4,7 +4,7 @@ Martin data is available via the HTTP `GET` endpoints: | URL | Description | |-----------------------------------------|------------------------------------------------| -| `/` | Status text, that will eventually show web UI | +| `/` | Web UI | | `/catalog` | [List of all sources](#catalog) | | `/{sourceID}` | [Source TileJSON](#source-tilejson) | | `/{sourceID}/{z}/{x}/{y}` | Map Tiles | diff --git a/justfile b/justfile index 4fb3341e8..7fa1989c8 100644 --- a/justfile +++ b/justfile @@ -21,7 +21,7 @@ dockercompose := `if docker-compose --version &> /dev/null; then echo "docker-co {{ just_executable() }} --list --unsorted # Start Martin server -run *ARGS: +run *ARGS="--webui enable-for-all": cargo run -p martin -- {{ ARGS }} # Start Martin server @@ -50,9 +50,13 @@ pg_dump *ARGS: pg_dump {{ ARGS }} {{ quote(DATABASE_URL) }} # Perform cargo clean to delete all build files -clean: clean-test stop +clean: clean-test stop && clean-martin-ui cargo clean +clean-martin-ui: + rm -rf martin-ui/dist martin-ui/node_modules + cargo clean -p static-files + # Delete test output files [private] clean-test: diff --git a/martin-ui/.eslintrc.cjs b/martin-ui/.eslintrc.cjs new file mode 100644 index 000000000..d6c953795 --- /dev/null +++ b/martin-ui/.eslintrc.cjs @@ -0,0 +1,18 @@ +module.exports = { + root: true, + env: { browser: true, es2020: true }, + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:react-hooks/recommended', + ], + ignorePatterns: ['dist', '.eslintrc.cjs'], + parser: '@typescript-eslint/parser', + plugins: ['react-refresh'], + rules: { + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, +} diff --git a/martin-ui/README.md b/martin-ui/README.md new file mode 100644 index 000000000..bb06e6bef --- /dev/null +++ b/martin-ui/README.md @@ -0,0 +1,12 @@ +# Martin Web UI + +A web interface for previewing tiles served by Martin. + +### Run locally + +To run just the web interface + +```bash +npm i +npm run dev +``` diff --git a/martin-ui/index.html b/martin-ui/index.html new file mode 100644 index 000000000..f07a6b8bc --- /dev/null +++ b/martin-ui/index.html @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + Martin — vector tiles server + + + +
+ + + diff --git a/martin-ui/package-lock.json b/martin-ui/package-lock.json new file mode 100644 index 000000000..23165225a --- /dev/null +++ b/martin-ui/package-lock.json @@ -0,0 +1,3383 @@ +{ + "name": "martin-ui", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "martin-ui", + "version": "0.0.0", + "dependencies": { + "react": "^18.2.0", + "react-dom": "^18.2.0", + "styled-components": "^6.1.8" + }, + "devDependencies": { + "@types/react": "^18.2.43", + "@types/react-dom": "^18.2.17", + "@typescript-eslint/eslint-plugin": "^6.14.0", + "@typescript-eslint/parser": "^6.14.0", + "@vitejs/plugin-react": "^4.2.1", + "eslint": "^8.55.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.5", + "typescript": "^5.2.2", + "vite": "^5.0.8" + }, + "engines": { + "node": ">=18.20.3", + "npm": ">=10.7.0" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.7.tgz", + "integrity": "sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.7", + "@babel/parser": "^7.23.6", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.7", + "@babel/types": "^7.23.6", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.23.6", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.23.8", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.8.tgz", + "integrity": "sha512-KDqYz4PiOWvDFrdHLPhKtCThtIcKVy6avWD2oG4GEvyQ+XDZwHD4YQd+H2vNMnq2rkdxsDkU82T+Vk8U/WXHRQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.7", + "@babel/types": "^7.23.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", + "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.23.3.tgz", + "integrity": "sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.23.3.tgz", + "integrity": "sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz", + "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.6", + "@babel/types": "^7.23.6", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", + "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", + "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==", + "dependencies": { + "@emotion/memoize": "^0.8.1" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "node_modules/@emotion/unitless": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.0.tgz", + "integrity": "sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz", + "integrity": "sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.11.tgz", + "integrity": "sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.11.tgz", + "integrity": "sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.11.tgz", + "integrity": "sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.11.tgz", + "integrity": "sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.11.tgz", + "integrity": "sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.11.tgz", + "integrity": "sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.11.tgz", + "integrity": "sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.11.tgz", + "integrity": "sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.11.tgz", + "integrity": "sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.11.tgz", + "integrity": "sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.11.tgz", + "integrity": "sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.11.tgz", + "integrity": "sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.11.tgz", + "integrity": "sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.11.tgz", + "integrity": "sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.11.tgz", + "integrity": "sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.11.tgz", + "integrity": "sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.11.tgz", + "integrity": "sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.11.tgz", + "integrity": "sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.11.tgz", + "integrity": "sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.11.tgz", + "integrity": "sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.11.tgz", + "integrity": "sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.11.tgz", + "integrity": "sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", + "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.21.tgz", + "integrity": "sha512-SRfKmRe1KvYnxjEMtxEr+J4HIeMX5YBg/qhRHpxEIGjhX1rshcHlnFUE9K0GazhVKWM7B+nARSkV8LuvJdJ5/g==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.5.tgz", + "integrity": "sha512-idWaG8xeSRCfRq9KpRysDHJ/rEHBEXcHuJ82XY0yYFIWnLMjZv9vF/7DOq8djQ2n3Lk6+3qfSH8AqlmHlmi1MA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.5.tgz", + "integrity": "sha512-f14d7uhAMtsCGjAYwZGv6TwuS3IFaM4ZnGMUn3aCBgkcHAYErhV1Ad97WzBvS2o0aaDv4mVz+syiN0ElMyfBPg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.5.tgz", + "integrity": "sha512-ndoXeLx455FffL68OIUrVr89Xu1WLzAG4n65R8roDlCoYiQcGGg6MALvs2Ap9zs7AHg8mpHtMpwC8jBBjZrT/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.5.tgz", + "integrity": "sha512-UmElV1OY2m/1KEEqTlIjieKfVwRg0Zwg4PLgNf0s3glAHXBN99KLpw5A5lrSYCa1Kp63czTpVll2MAqbZYIHoA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.5.tgz", + "integrity": "sha512-Q0LcU61v92tQB6ae+udZvOyZ0wfpGojtAKrrpAaIqmJ7+psq4cMIhT/9lfV6UQIpeItnq/2QDROhNLo00lOD1g==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.5.tgz", + "integrity": "sha512-dkRscpM+RrR2Ee3eOQmRWFjmV/payHEOrjyq1VZegRUa5OrZJ2MAxBNs05bZuY0YCtpqETDy1Ix4i/hRqX98cA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.5.tgz", + "integrity": "sha512-QaKFVOzzST2xzY4MAmiDmURagWLFh+zZtttuEnuNn19AiZ0T3fhPyjPPGwLNdiDT82ZE91hnfJsUiDwF9DClIQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.5.tgz", + "integrity": "sha512-HeGqmRJuyVg6/X6MpE2ur7GbymBPS8Np0S/vQFHDmocfORT+Zt76qu+69NUoxXzGqVP1pzaY6QIi0FJWLC3OPA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.5.tgz", + "integrity": "sha512-Dq1bqBdLaZ1Gb/l2e5/+o3B18+8TI9ANlA1SkejZqDgdU/jK/ThYaMPMJpVMMXy2uRHvGKbkz9vheVGdq3cJfA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.5.tgz", + "integrity": "sha512-ezyFUOwldYpj7AbkwyW9AJ203peub81CaAIVvckdkyH8EvhEIoKzaMFJj0G4qYJ5sw3BpqhFrsCc30t54HV8vg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.5.tgz", + "integrity": "sha512-aHSsMnUw+0UETB0Hlv7B/ZHOGY5bQdwMKJSzGfDfvyhnpmVxLMGnQPGNE9wgqkLUs3+gbG1Qx02S2LLfJ5GaRQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.5.tgz", + "integrity": "sha512-AiqiLkb9KSf7Lj/o1U3SEP9Zn+5NuVKgFdRIZkvd4N0+bYrTOovVd0+LmYCPQGbocT4kvFyK+LXCDiXPBF3fyA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.5.tgz", + "integrity": "sha512-1q+mykKE3Vot1kaFJIDoUFv5TuW+QQVaf2FmTT9krg86pQrGStOSJJ0Zil7CFagyxDuouTepzt5Y5TVzyajOdQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", + "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/prop-types": { + "version": "15.7.11", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", + "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==", + "dev": true + }, + "node_modules/@types/react": { + "version": "18.2.48", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.48.tgz", + "integrity": "sha512-qboRCl6Ie70DQQG9hhNREz81jqC1cs9EVNcjQ1AU+jH6NFfSAhVVbrrY/+nSF+Bsk4AOwm9Qa61InvMCyV+H3w==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.2.18", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.18.tgz", + "integrity": "sha512-TJxDm6OfAX2KJWJdMEVTwWke5Sc/E/RlnPGvGfS0W7+6ocy2xhDVQVh/KvC2Uf7kACs+gDytdusDSdWfWkaNzw==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", + "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==", + "dev": true + }, + "node_modules/@types/semver": { + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", + "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", + "dev": true + }, + "node_modules/@types/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-n4sx2bqL0mW1tvDf/loQ+aMX7GQD3lc3fkCMC55VFNDu/vBOabO+LTIeXKM14xK0ppk5TUGcWRjiSpIlUpghKw==" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.19.0.tgz", + "integrity": "sha512-DUCUkQNklCQYnrBSSikjVChdc84/vMPDQSgJTHBZ64G9bA9w0Crc0rd2diujKbTdp6w2J47qkeHQLoi0rpLCdg==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.19.0", + "@typescript-eslint/type-utils": "6.19.0", + "@typescript-eslint/utils": "6.19.0", + "@typescript-eslint/visitor-keys": "6.19.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.19.0.tgz", + "integrity": "sha512-1DyBLG5SH7PYCd00QlroiW60YJ4rWMuUGa/JBV0iZuqi4l4IK3twKPq5ZkEebmGqRjXWVgsUzfd3+nZveewgow==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "6.19.0", + "@typescript-eslint/types": "6.19.0", + "@typescript-eslint/typescript-estree": "6.19.0", + "@typescript-eslint/visitor-keys": "6.19.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.19.0.tgz", + "integrity": "sha512-dO1XMhV2ehBI6QN8Ufi7I10wmUovmLU0Oru3n5LVlM2JuzB4M+dVphCPLkVpKvGij2j/pHBWuJ9piuXx+BhzxQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.19.0", + "@typescript-eslint/visitor-keys": "6.19.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.19.0.tgz", + "integrity": "sha512-mcvS6WSWbjiSxKCwBcXtOM5pRkPQ6kcDds/juxcy/727IQr3xMEcwr/YLHW2A2+Fp5ql6khjbKBzOyjuPqGi/w==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "6.19.0", + "@typescript-eslint/utils": "6.19.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.19.0.tgz", + "integrity": "sha512-lFviGV/vYhOy3m8BJ/nAKoAyNhInTdXpftonhWle66XHAtT1ouBlkjL496b5H5hb8dWXHwtypTqgtb/DEa+j5A==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.19.0.tgz", + "integrity": "sha512-o/zefXIbbLBZ8YJ51NlkSAt2BamrK6XOmuxSR3hynMIzzyMY33KuJ9vuMdFSXW+H0tVvdF9qBPTHA91HDb4BIQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.19.0", + "@typescript-eslint/visitor-keys": "6.19.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.19.0.tgz", + "integrity": "sha512-QR41YXySiuN++/dC9UArYOg4X86OAYP83OWTewpVx5ct1IZhjjgTLocj7QNxGhWoTqknsgpl7L+hGygCO+sdYw==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.19.0", + "@typescript-eslint/types": "6.19.0", + "@typescript-eslint/typescript-estree": "6.19.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.19.0.tgz", + "integrity": "sha512-hZaUCORLgubBvtGpp1JEFEazcuEdfxta9j4iUwdSAr7mEsYYAp3EAUyCZk3VEEqGj6W+AV4uWyrDGtrlawAsgQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.19.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.2.1.tgz", + "integrity": "sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.23.5", + "@babel/plugin-transform-react-jsx-self": "^7.23.3", + "@babel/plugin-transform-react-jsx-source": "^7.23.3", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0" + } + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", + "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001565", + "electron-to-chromium": "^1.4.601", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", + "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001579", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001579.tgz", + "integrity": "sha512-u5AUVkixruKHJjw/pj9wISlcMpgFWzSrczLZbrqBSxukQixmg0SJ5sZTpvaFvxU0HoQKd4yoyAogyrAz9pzJnA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/css-to-react-native": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", + "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", + "dependencies": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.639", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.639.tgz", + "integrity": "sha512-CkKf3ZUVZchr+zDpAlNLEEy2NJJ9T64ULWaDgy3THXXlPVPkLu3VOs9Bac44nebVtdwl2geSj6AxTtGDOxoXhg==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.11.tgz", + "integrity": "sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.11", + "@esbuild/android-arm": "0.19.11", + "@esbuild/android-arm64": "0.19.11", + "@esbuild/android-x64": "0.19.11", + "@esbuild/darwin-arm64": "0.19.11", + "@esbuild/darwin-x64": "0.19.11", + "@esbuild/freebsd-arm64": "0.19.11", + "@esbuild/freebsd-x64": "0.19.11", + "@esbuild/linux-arm": "0.19.11", + "@esbuild/linux-arm64": "0.19.11", + "@esbuild/linux-ia32": "0.19.11", + "@esbuild/linux-loong64": "0.19.11", + "@esbuild/linux-mips64el": "0.19.11", + "@esbuild/linux-ppc64": "0.19.11", + "@esbuild/linux-riscv64": "0.19.11", + "@esbuild/linux-s390x": "0.19.11", + "@esbuild/linux-x64": "0.19.11", + "@esbuild/netbsd-x64": "0.19.11", + "@esbuild/openbsd-x64": "0.19.11", + "@esbuild/sunos-x64": "0.19.11", + "@esbuild/win32-arm64": "0.19.11", + "@esbuild/win32-ia32": "0.19.11", + "@esbuild/win32-x64": "0.19.11" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", + "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.56.0", + "@humanwhocodes/config-array": "^0.11.13", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.5.tgz", + "integrity": "sha512-D53FYKJa+fDmZMtriODxvhwrO+IOqrxoEo21gMA0sjHdU6dPVH4OhyFip9ypl8HOF5RV5KdTo+rBQLvnY2cO8w==", + "dev": true, + "peerDependencies": { + "eslint": ">=7" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", + "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ignore": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.4.33", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", + "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-refresh": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", + "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.9.5.tgz", + "integrity": "sha512-E4vQW0H/mbNMw2yLSqJyjtkHY9dslf/p0zuT1xehNRqUTBOFMqEjguDvqhXr7N7r/4ttb2jr4T41d3dncmIgbQ==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.9.5", + "@rollup/rollup-android-arm64": "4.9.5", + "@rollup/rollup-darwin-arm64": "4.9.5", + "@rollup/rollup-darwin-x64": "4.9.5", + "@rollup/rollup-linux-arm-gnueabihf": "4.9.5", + "@rollup/rollup-linux-arm64-gnu": "4.9.5", + "@rollup/rollup-linux-arm64-musl": "4.9.5", + "@rollup/rollup-linux-riscv64-gnu": "4.9.5", + "@rollup/rollup-linux-x64-gnu": "4.9.5", + "@rollup/rollup-linux-x64-musl": "4.9.5", + "@rollup/rollup-win32-arm64-msvc": "4.9.5", + "@rollup/rollup-win32-ia32-msvc": "4.9.5", + "@rollup/rollup-win32-x64-msvc": "4.9.5", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/styled-components": { + "version": "6.1.8", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.8.tgz", + "integrity": "sha512-PQ6Dn+QxlWyEGCKDS71NGsXoVLKfE1c3vApkvDYS5KAK+V8fNWGhbSUEo9Gg2iaID2tjLXegEW3bZDUGpofRWw==", + "dependencies": { + "@emotion/is-prop-valid": "1.2.1", + "@emotion/unitless": "0.8.0", + "@types/stylis": "4.2.0", + "css-to-react-native": "3.2.0", + "csstype": "3.1.2", + "postcss": "8.4.31", + "shallowequal": "1.1.0", + "stylis": "4.3.1", + "tslib": "2.5.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/styled-components" + }, + "peerDependencies": { + "react": ">= 16.8.0", + "react-dom": ">= 16.8.0" + } + }, + "node_modules/styled-components/node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + }, + "node_modules/styled-components/node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/stylis": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.1.tgz", + "integrity": "sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ==" + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "dev": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/vite": { + "version": "5.0.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.11.tgz", + "integrity": "sha512-XBMnDjZcNAw/G1gEiskiM1v6yzM4GE5aMGvhWTlHAYYhxb7S3/V1s3m2LDHa8Vh6yIWYYB0iJwsEaS523c4oYA==", + "dev": true, + "dependencies": { + "esbuild": "^0.19.3", + "postcss": "^8.4.32", + "rollup": "^4.2.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/martin-ui/package.json b/martin-ui/package.json new file mode 100644 index 000000000..93aa1dffa --- /dev/null +++ b/martin-ui/package.json @@ -0,0 +1,33 @@ +{ + "name": "martin-ui", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview" + }, + "dependencies": { + "react": "^18.2.0", + "react-dom": "^18.2.0", + "styled-components": "^6.1.8" + }, + "devDependencies": { + "@types/react": "^18.2.43", + "@types/react-dom": "^18.2.17", + "@typescript-eslint/eslint-plugin": "^6.14.0", + "@typescript-eslint/parser": "^6.14.0", + "@vitejs/plugin-react": "^4.2.1", + "eslint": "^8.55.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.5", + "typescript": "^5.2.2", + "vite": "^5.0.8" + }, + "engines": { + "node": ">=18.20.3", + "npm": ">=10.7.0" + } +} diff --git a/martin-ui/public/_/assets/favicon.ico b/martin-ui/public/_/assets/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..3dcce4ac67e1218e8bb99f0740d9a2acf235860c GIT binary patch literal 34494 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 literal 0 HcmV?d00001 diff --git a/martin-ui/src/App.css b/martin-ui/src/App.css new file mode 100644 index 000000000..978b6eb31 --- /dev/null +++ b/martin-ui/src/App.css @@ -0,0 +1 @@ +#root {} diff --git a/martin-ui/src/App.tsx b/martin-ui/src/App.tsx new file mode 100644 index 000000000..a92ef615e --- /dev/null +++ b/martin-ui/src/App.tsx @@ -0,0 +1,18 @@ +import martinCover from './assets/logo.png'; +import './App.css'; +import styled from 'styled-components'; + +const CoverImage = styled.img` + width: 100%; + height: 100%; +`; + +function App() { + return ( +
+ +
+ ); +} + +export default App; diff --git a/martin-ui/src/assets/logo.png b/martin-ui/src/assets/logo.png new file mode 120000 index 000000000..ace49bf18 --- /dev/null +++ b/martin-ui/src/assets/logo.png @@ -0,0 +1 @@ +../../../logo.png \ No newline at end of file diff --git a/martin-ui/src/index.css b/martin-ui/src/index.css new file mode 100644 index 000000000..c604ceb2f --- /dev/null +++ b/martin-ui/src/index.css @@ -0,0 +1,10 @@ +body { + margin: 0; + padding: 0; +} +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + color-scheme: dark light; +} diff --git a/martin-ui/src/main.tsx b/martin-ui/src/main.tsx new file mode 100644 index 000000000..3d7150da8 --- /dev/null +++ b/martin-ui/src/main.tsx @@ -0,0 +1,10 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import App from './App.tsx' +import './index.css' + +ReactDOM.createRoot(document.getElementById('root')!).render( + + + , +) diff --git a/martin-ui/src/vite-env.d.ts b/martin-ui/src/vite-env.d.ts new file mode 100644 index 000000000..11f02fe2a --- /dev/null +++ b/martin-ui/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/martin-ui/tsconfig.json b/martin-ui/tsconfig.json new file mode 100644 index 000000000..a7fc6fbf2 --- /dev/null +++ b/martin-ui/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/martin-ui/tsconfig.node.json b/martin-ui/tsconfig.node.json new file mode 100644 index 000000000..42872c59f --- /dev/null +++ b/martin-ui/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/martin-ui/vite.config.ts b/martin-ui/vite.config.ts new file mode 100644 index 000000000..c67d33cec --- /dev/null +++ b/martin-ui/vite.config.ts @@ -0,0 +1,12 @@ +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], + build: { + // assets can also be the name of a tile source + // so we use /_/assets to avoid conflicts + assetsDir: '_/assets' + }, +}); diff --git a/martin/Cargo.toml b/martin/Cargo.toml index f0b4ad50a..7d9196052 100644 --- a/martin/Cargo.toml +++ b/martin/Cargo.toml @@ -2,7 +2,7 @@ lints.workspace = true [package] name = "martin" -version = "0.14.2" +version = "0.15.0" authors = ["Stepan Kuzmin ", "Yuri Astrakhan ", "MapLibre contributors"] description = "Blazing fast and lightweight tile server with PostGIS, MBTiles, and PMTiles support" keywords = ["maps", "tiles", "mbtiles", "pmtiles", "postgis"] @@ -59,7 +59,8 @@ name = "bench" harness = false [features] -default = ["fonts", "lambda", "mbtiles", "pmtiles", "postgres", "sprites"] +default = ["webui", "fonts", "lambda", "mbtiles", "pmtiles", "postgres", "sprites"] +webui = ["dep:actix-web-static-files", "dep:static-files"] fonts = ["dep:bit-set", "dep:pbf_font_tools"] lambda = ["dep:lambda-web"] mbtiles = ["dep:mbtiles"] @@ -72,6 +73,7 @@ bless-tests = [] actix-cors.workspace = true actix-http.workspace = true actix-rt.workspace = true +actix-web-static-files = { workspace = true, optional = true } actix-web.workspace = true async-trait.workspace = true bit-set = { workspace = true, optional = true } @@ -104,6 +106,7 @@ serde_json.workspace = true serde_with.workspace = true serde_yaml.workspace = true spreet = { workspace = true, optional = true } +static-files = { workspace = true, optional = true } subst.workspace = true thiserror.workspace = true tilejson.workspace = true @@ -111,6 +114,9 @@ tokio = { workspace = true, features = ["io-std"] } tokio-postgres-rustls = { workspace = true, optional = true } url.workspace = true +[build-dependencies] +static-files = { workspace = true, optional = true } + [dev-dependencies] cargo-husky.workspace = true criterion.workspace = true diff --git a/martin/build.rs b/martin/build.rs new file mode 100644 index 000000000..9fcefb598 --- /dev/null +++ b/martin/build.rs @@ -0,0 +1,13 @@ +fn main() -> std::io::Result<()> { + #[cfg(feature = "webui")] + { + static_files::NpmBuild::new("../martin-ui") + .install()? + .run("build")? + .target("../martin-ui/dist") + .change_detection() + .to_resource_dir() + .build()?; + } + Ok(()) +} diff --git a/martin/src/args/mod.rs b/martin/src/args/mod.rs index a563833a8..d1a326c2a 100644 --- a/martin/src/args/mod.rs +++ b/martin/src/args/mod.rs @@ -13,4 +13,4 @@ mod root; pub use root::{Args, ExtraArgs, MetaArgs}; mod srv; -pub use srv::{PreferredEncoding, SrvArgs}; +pub use srv::{PreferredEncoding, SrvArgs, WebUiMode}; diff --git a/martin/src/args/srv.rs b/martin/src/args/srv.rs index 8bbd91178..00db9086b 100644 --- a/martin/src/args/srv.rs +++ b/martin/src/args/srv.rs @@ -20,6 +20,25 @@ pub struct SrvArgs { /// Martin server preferred tile encoding. If the client accepts multiple compression formats, and the tile source is not pre-compressed, which compression should be used. `gzip` is faster, but `brotli` is smaller, and may be faster with caching. Defaults to gzip. #[arg(long)] pub preferred_encoding: Option, + /// Control Martin web UI. Disabled by default. + #[arg(short = 'u', long = "webui")] + #[cfg(feature = "webui")] + pub web_ui: Option, +} + +#[derive(PartialEq, Eq, Debug, Clone, Copy, Default, Serialize, Deserialize, ValueEnum)] +#[serde(rename_all = "lowercase")] +pub enum WebUiMode { + /// Disable Web UI interface. This is the default, but once implemented, the default will be enabled for localhost. + #[default] + #[serde(alias = "false")] + Disable, + // /// Enable Web UI interface on connections from the localhost + // #[default] + // #[serde(alias = "true")] + // Enable, + /// Enable Web UI interface on all connections + EnableForAll, } #[derive(PartialEq, Eq, Debug, Clone, Copy, Serialize, Deserialize, ValueEnum)] @@ -40,14 +59,18 @@ impl SrvArgs { if self.listen_addresses.is_some() { srv_config.listen_addresses = self.listen_addresses; } + if self.base_path.is_some() { + srv_config.base_path = self.base_path; + } if self.workers.is_some() { srv_config.worker_processes = self.workers; } if self.preferred_encoding.is_some() { srv_config.preferred_encoding = self.preferred_encoding; } - if self.base_path.is_some() { - srv_config.base_path = self.base_path; + #[cfg(feature = "webui")] + if self.web_ui.is_some() { + srv_config.web_ui = self.web_ui; } } } diff --git a/martin/src/bin/martin.rs b/martin/src/bin/martin.rs index d54adeba5..e4637c4d6 100644 --- a/martin/src/bin/martin.rs +++ b/martin/src/bin/martin.rs @@ -29,9 +29,22 @@ async fn start(args: Args) -> MartinResult<()> { info!("Use --save-config to save or print Martin configuration."); } + #[cfg(feature = "webui")] + let web_ui_mode = config.srv.web_ui.unwrap_or_default(); + let (server, listen_addresses) = new_server(config.srv, sources)?; info!("Martin has been started on {listen_addresses}."); info!("Use http://{listen_addresses}/catalog to get the list of available sources."); + + #[cfg(feature = "webui")] + if web_ui_mode == martin::args::WebUiMode::EnableForAll { + log::warn!("Web UI is enabled for all connections at http://{listen_addresses}/"); + } else { + info!( + "Web UI is disabled. Use `--webui enable-for-all` in CLI or a config value to enable it for all connections." + ); + } + server.await } diff --git a/martin/src/srv/config.rs b/martin/src/srv/config.rs index f40fbbc33..6a11b49c4 100644 --- a/martin/src/srv/config.rs +++ b/martin/src/srv/config.rs @@ -13,6 +13,8 @@ pub struct SrvConfig { pub base_path: Option, pub worker_processes: Option, pub preferred_encoding: Option, + #[cfg(feature = "webui")] + pub web_ui: Option, } #[cfg(test)] @@ -35,8 +37,7 @@ mod tests { keep_alive: Some(75), listen_addresses: some("0.0.0.0:3000"), worker_processes: Some(8), - preferred_encoding: None, - base_path: None, + ..Default::default() } ); assert_eq!( @@ -52,7 +53,7 @@ mod tests { listen_addresses: some("0.0.0.0:3000"), worker_processes: Some(8), preferred_encoding: Some(PreferredEncoding::Brotli), - base_path: None + ..Default::default() } ); assert_eq!( @@ -68,7 +69,7 @@ mod tests { listen_addresses: some("0.0.0.0:3000"), worker_processes: Some(8), preferred_encoding: Some(PreferredEncoding::Brotli), - base_path: None, + ..Default::default() } ); } diff --git a/martin/src/srv/server.rs b/martin/src/srv/server.rs index fba334e86..df4157b4b 100755 --- a/martin/src/srv/server.rs +++ b/martin/src/srv/server.rs @@ -3,6 +3,13 @@ use std::pin::Pin; use std::string::ToString; use std::time::Duration; +use crate::config::ServerState; +use crate::source::TileCatalog; +use crate::srv::config::{SrvConfig, KEEP_ALIVE_DEFAULT, LISTEN_ADDRESSES_DEFAULT}; +use crate::srv::tiles::get_tile; +use crate::srv::tiles_info::get_source_info; +use crate::MartinError::BindingError; +use crate::MartinResult; use actix_cors::Cors; use actix_web::error::ErrorInternalServerError; use actix_web::http::header::CACHE_CONTROL; @@ -15,13 +22,15 @@ use lambda_web::{is_running_on_lambda, run_actix_on_lambda}; use log::error; use serde::{Deserialize, Serialize}; -use crate::config::ServerState; -use crate::source::TileCatalog; -use crate::srv::config::{SrvConfig, KEEP_ALIVE_DEFAULT, LISTEN_ADDRESSES_DEFAULT}; -use crate::srv::tiles::get_tile; -use crate::srv::tiles_info::get_source_info; -use crate::MartinError::BindingError; -use crate::MartinResult; +#[cfg(feature = "webui")] +use crate::args::WebUiMode; + +#[cfg(feature = "webui")] +mod webui { + #![allow(clippy::unreadable_literal)] + #![allow(clippy::wildcard_imports)] + include!(concat!(env!("OUT_DIR"), "/generated.rs")); +} /// List of keywords that cannot be used as source IDs. Some of these are reserved for future use. /// Reserved keywords must never end in a "dot number" (e.g. ".1"). @@ -57,12 +66,23 @@ pub fn map_internal_error(e: T) -> actix_web::Error { ErrorInternalServerError(e.to_string()) } -/// Root path will eventually have a web front. For now, just a stub. +/// Root path in case web front is disabled. +#[cfg(not(feature = "webui"))] #[route("/", method = "GET", method = "HEAD")] #[allow(clippy::unused_async)] -async fn get_index() -> &'static str { - // todo: once this becomes more substantial, add wrap = "middleware::Compress::default()" - "Martin server is running. Eventually this will be a nice web front.\n\n\ +async fn get_index_no_ui() -> &'static str { + "Martin server is running. The WebUI feature was disabled at the compile time.\n\n\ + A list of all available sources is at /catalog\n\n\ + See documentation https://github.com/maplibre/martin" +} + +/// Root path in case web front is disabled and the WebUI feature is enabled. +#[cfg(feature = "webui")] +#[route("/", method = "GET", method = "HEAD")] +#[allow(clippy::unused_async)] +async fn get_index_ui_disabled() -> &'static str { + "Martin server is running.\n\n + The WebUI feature can be enabled with the --webui enable-for-all CLI flag or in the config file, making it available to all users.\n\n A list of all available sources is at /catalog\n\n\ See documentation https://github.com/maplibre/martin" } @@ -87,9 +107,8 @@ async fn get_catalog(catalog: Data) -> impl Responder { HttpResponse::Ok().json(catalog) } -pub fn router(cfg: &mut web::ServiceConfig) { +pub fn router(cfg: &mut web::ServiceConfig, #[allow(unused_variables)] usr_cfg: &SrvConfig) { cfg.service(get_health) - .service(get_index) .service(get_catalog) .service(get_source_info) .service(get_tile); @@ -100,6 +119,23 @@ pub fn router(cfg: &mut web::ServiceConfig) { #[cfg(feature = "fonts")] cfg.service(crate::srv::fonts::get_font); + + #[cfg(feature = "webui")] + { + // TODO: this can probably be simplified with a wrapping middleware, + // which would share usr_cfg from Data<> with all routes. + if usr_cfg.web_ui.unwrap_or_default() == WebUiMode::EnableForAll { + cfg.service(actix_web_static_files::ResourceFiles::new( + "/", + webui::generate(), + )); + } else { + cfg.service(get_index_ui_disabled); + } + } + + #[cfg(not(feature = "webui"))] + cfg.service(get_index_no_ui); } type Server = Pin>>>; @@ -135,7 +171,7 @@ pub fn new_server(config: SrvConfig, state: ServerState) -> MartinResult<(Server .wrap(cors_middleware) .wrap(middleware::NormalizePath::new(TrailingSlash::MergeOnly)) .wrap(middleware::Logger::default()) - .configure(router) + .configure(|c| router(c, &config)) }; #[cfg(feature = "lambda")] diff --git a/martin/tests/mb_server_test.rs b/martin/tests/mb_server_test.rs index f8bfe6b1a..327a88fe4 100644 --- a/martin/tests/mb_server_test.rs +++ b/martin/tests/mb_server_test.rs @@ -26,7 +26,7 @@ macro_rules! create_app { .app_data(actix_web::web::Data::new(::martin::NO_MAIN_CACHE)) .app_data(actix_web::web::Data::new(state.tiles)) .app_data(actix_web::web::Data::new(SrvConfig::default())) - .configure(::martin::srv::router), + .configure(|c| ::martin::srv::router(c, &SrvConfig::default())), ) .await }}; diff --git a/martin/tests/pg_server_test.rs b/martin/tests/pg_server_test.rs index 57b8420d6..da2f040f0 100644 --- a/martin/tests/pg_server_test.rs +++ b/martin/tests/pg_server_test.rs @@ -30,7 +30,7 @@ macro_rules! create_app { .app_data(actix_web::web::Data::new(::martin::NO_MAIN_CACHE)) .app_data(actix_web::web::Data::new(state.tiles)) .app_data(actix_web::web::Data::new(SrvConfig::default())) - .configure(::martin::srv::router), + .configure(|c| ::martin::srv::router(c, &SrvConfig::default())), ) .await }}; @@ -1105,7 +1105,7 @@ tables: .app_data(actix_web::web::Data::new(::martin::NO_MAIN_CACHE)) .app_data(actix_web::web::Data::new(state.tiles)) .app_data(actix_web::web::Data::new(SrvConfig::default())) - .configure(::martin::srv::router), + .configure(|c| ::martin::srv::router(c, &SrvConfig::default())), ) .await; diff --git a/martin/tests/pmt_server_test.rs b/martin/tests/pmt_server_test.rs index 73db79dd7..63e8f775c 100644 --- a/martin/tests/pmt_server_test.rs +++ b/martin/tests/pmt_server_test.rs @@ -26,7 +26,7 @@ macro_rules! create_app { .app_data(actix_web::web::Data::new(::martin::NO_MAIN_CACHE)) .app_data(actix_web::web::Data::new(state.tiles)) .app_data(actix_web::web::Data::new(SrvConfig::default())) - .configure(::martin::srv::router), + .configure(|c| ::martin::srv::router(c, &SrvConfig::default())), ) .await }}; From 4861f0bf8a20aeaded762b7f8cb5f70687019659 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 14 Jul 2024 18:01:36 +0000 Subject: [PATCH 068/215] chore(deps-dev): Bump braces from 3.0.2 to 3.0.3 in /martin-ui (#1418) Bumps [braces](https://github.com/micromatch/braces) from 3.0.2 to 3.0.3.
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=braces&package-manager=npm_and_yarn&previous-version=3.0.2&new-version=3.0.3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/maplibre/martin/network/alerts).
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- martin-ui/package-lock.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/martin-ui/package-lock.json b/martin-ui/package-lock.json index 23165225a..0b2dc2bbf 100644 --- a/martin-ui/package-lock.json +++ b/martin-ui/package-lock.json @@ -1584,12 +1584,12 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -2202,9 +2202,9 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "dependencies": { "to-regex-range": "^5.0.1" From 51a823718adbc4fcf7e7b93053c90ba8fc85cb62 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 14 Jul 2024 18:04:53 +0000 Subject: [PATCH 069/215] chore(deps-dev): Bump vite from 5.0.11 to 5.0.13 in /martin-ui (#1419) Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.0.11 to 5.0.13.
Changelog

Sourced from vite's changelog.

5.0.13 (2024-03-24)

5.0.12 (2024-01-19)

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=vite&package-manager=npm_and_yarn&previous-version=5.0.11&new-version=5.0.13)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/maplibre/martin/network/alerts).
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- martin-ui/package-lock.json | 8 ++++---- martin-ui/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/martin-ui/package-lock.json b/martin-ui/package-lock.json index 0b2dc2bbf..a50e0ed63 100644 --- a/martin-ui/package-lock.json +++ b/martin-ui/package-lock.json @@ -22,7 +22,7 @@ "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.4.5", "typescript": "^5.2.2", - "vite": "^5.0.8" + "vite": "^5.0.13" }, "engines": { "node": ">=18.20.3", @@ -3286,9 +3286,9 @@ } }, "node_modules/vite": { - "version": "5.0.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.11.tgz", - "integrity": "sha512-XBMnDjZcNAw/G1gEiskiM1v6yzM4GE5aMGvhWTlHAYYhxb7S3/V1s3m2LDHa8Vh6yIWYYB0iJwsEaS523c4oYA==", + "version": "5.0.13", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.13.tgz", + "integrity": "sha512-/9ovhv2M2dGTuA+dY93B9trfyWMDRQw2jdVBhHNP6wr0oF34wG2i/N55801iZIpgUpnHDm4F/FabGQLyc+eOgg==", "dev": true, "dependencies": { "esbuild": "^0.19.3", diff --git a/martin-ui/package.json b/martin-ui/package.json index 93aa1dffa..8adbfa675 100644 --- a/martin-ui/package.json +++ b/martin-ui/package.json @@ -24,7 +24,7 @@ "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.4.5", "typescript": "^5.2.2", - "vite": "^5.0.8" + "vite": "^5.0.13" }, "engines": { "node": ">=18.20.3", From 5127bc845cbf9f64ace9f7700472eeda33d23754 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Jul 2024 11:22:53 -0400 Subject: [PATCH 070/215] chore(deps): Bump serde_with from 3.8.3 to 3.9.0 (#1421) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [serde_with](https://github.com/jonasbb/serde_with) from 3.8.3 to 3.9.0.
Release notes

Sourced from serde_with's releases.

serde_with v3.9.0

Added

  • Deserialize a map` and skip all elements failing to deserialize by @​johnmave126 (#763)

    MapSkipError acts like a map (HashMap/BTreeMap), but keys or values that fail to deserialize, like are ignored.

    For formats with heterogeneously typed maps, we can collect only the elements where both key and value are deserializable. This is also useful in conjunction to #[serde(flatten)] to ignore some entries when capturing additional fields.

    // JSON
    "value": {"0": "v0", "5":
    "v5", "str": "str", "10": 2},
    

    // Rust #[serde_as(as = "MapSkipError<DisplayFromStr, _>")] value: BTreeMap<u32, String>,

    // Only deserializes entries with a numerical key and a string value, i.e., {0 => "v0", 5 => "v5"}

Commits
  • c3e489f Bump version to 3.9.0 (#770)
  • 57ad877 Bump version to 3.9.0
  • d038657 Implement MapSkipError, analogous to VecSkipError, but for map-like data ...
  • aaa0a29 Update serde_with/src/guide/serde_as_transformations.md
  • 17dec11 Add tests to make sure syntax errors are not suppressed.
  • 97543d0 Implement MapSkipError, skipping un-deserializable entries.
  • bf6724d Move VecSkipError to a separate file, preparing for MapSkipError
  • 31e9172 Fix dead code warning by correcting a typo (#769)
  • f5b2626 Fix dead code warnings in tests
  • 4ad4a1b Fix dead code warning by correcting a typo
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=serde_with&package-manager=cargo&previous-version=3.8.3&new-version=3.9.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ad307c0aa..add5965c5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2287,7 +2287,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e310b3a6b5907f99202fcdb4960ff45b93735d7c7d96b760fcff8db2dc0e103d" dependencies = [ "cfg-if", - "windows-targets 0.52.6", + "windows-targets 0.48.5", ] [[package]] @@ -2360,7 +2360,7 @@ checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "martin" -version = "0.14.2" +version = "0.15.0" dependencies = [ "actix-cors", "actix-http", @@ -3892,9 +3892,9 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.8.3" +version = "3.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e73139bc5ec2d45e6c5fd85be5a46949c1c39a4c18e56915f5eb4c12f975e377" +checksum = "69cecfa94848272156ea67b2b1a53f20fc7bc638c4a46d2f8abde08f05f4b857" dependencies = [ "base64 0.22.1", "chrono", @@ -3910,9 +3910,9 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.8.3" +version = "3.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b80d3d6b56b64335c0180e5ffde23b3c5e08c14c585b51a15bd0e95393f46703" +checksum = "a8fee4991ef4f274617a51ad4af30519438dacb2f56ac773b08a1922ff743350" dependencies = [ "darling", "proc-macro2", From 387f0f3ae1b095c37db7640b2ca0e1db7422edd8 Mon Sep 17 00:00:00 2001 From: Frank Elsinga Date: Mon, 15 Jul 2024 17:24:28 +0200 Subject: [PATCH 071/215] chore(docs): tried to document the `--base-path` option better (#1420) As noted, the option could likely be more explicite in what it does Resolves https://github.com/maplibre/martin/issues/1415 --- docs/src/config-file.md | 5 ++++- docs/src/run-with-cli.md | 5 ++++- martin/src/args/srv.rs | 5 ++++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/docs/src/config-file.md b/docs/src/config-file.md index 4ed9cd5ca..11d7a5402 100644 --- a/docs/src/config-file.md +++ b/docs/src/config-file.md @@ -26,7 +26,10 @@ keep_alive: 75 # The socket address to bind [default: 0.0.0.0:3000] listen_addresses: '0.0.0.0:3000' -# Set TileJSON URL path prefix, ignoring X-Rewrite-URL header. Must begin with a `/` +# Set TileJSON URL path prefix. This overides the default of respecting the X-Rewrite-URL header. +# Only modifies the JSON (TileJSON) returned, martins' API-URLs remain unchanged. If you need to rewrite URLs, please use a reverse proxy. +# Must begin with a `/`. +# Examples: `/`, `/tiles` base_path: /tiles # Number of web server workers diff --git a/docs/src/run-with-cli.md b/docs/src/run-with-cli.md index 4c16e7ffa..0e96535cb 100644 --- a/docs/src/run-with-cli.md +++ b/docs/src/run-with-cli.md @@ -33,7 +33,10 @@ Options: The socket address to bind. [DEFAULT: 0.0.0.0:3000] --base-path - Set TileJSON URL path prefix, ignoring X-Rewrite-URL header. Must begin with a `/`. Examples: `/`, `/tiles` + Set TileJSON URL path prefix. This overides the default of respecting the X-Rewrite-URL header. + Only modifies the JSON (TileJSON) returned, martins' API-URLs remain unchanged. If you need to rewrite URLs, please use a reverse proxy. + Must begin with a `/`. + Examples: `/`, `/tiles` -W, --workers Number of web server workers diff --git a/martin/src/args/srv.rs b/martin/src/args/srv.rs index 00db9086b..318ef1f82 100644 --- a/martin/src/args/srv.rs +++ b/martin/src/args/srv.rs @@ -11,7 +11,10 @@ pub struct SrvArgs { pub keep_alive: Option, #[arg(help = format!("The socket address to bind. [DEFAULT: {LISTEN_ADDRESSES_DEFAULT}]"), short, long)] pub listen_addresses: Option, - /// Set TileJSON URL path prefix, ignoring X-Rewrite-URL header. Must begin with a `/`. Examples: `/`, `/tiles` + /// Set TileJSON URL path prefix. This overides the default of respecting the X-Rewrite-URL header. + /// Only modifies the JSON (TileJSON) returned, martins' API-URLs remain unchanged. If you need to rewrite URLs, please use a reverse proxy. + /// Must begin with a `/`. + /// Examples: `/`, `/tiles` #[arg(long)] pub base_path: Option, /// Number of web server workers From 48ab01a5c2ed60643f350c30214b67619e0411bf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 17 Jul 2024 02:28:22 +0000 Subject: [PATCH 072/215] chore(deps): Bump tokio from 1.38.0 to 1.38.1 (#1422) Bumps [tokio](https://github.com/tokio-rs/tokio) from 1.38.0 to 1.38.1.
Release notes

Sourced from tokio's releases.

Tokio v1.38.1

1.38.1 (July 16th, 2024)

This release fixes the bug identified as (#6682), which caused timers not to fire when they should.

Fixed

  • time: update wake_up while holding all the locks of sharded time wheels (#6683)

#6682: tokio-rs/tokio#6682 #6683: tokio-rs/tokio#6683

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=tokio&package-manager=cargo&previous-version=1.38.0&new-version=1.38.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index add5965c5..1f5cc6e0c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2287,7 +2287,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e310b3a6b5907f99202fcdb4960ff45b93735d7c7d96b760fcff8db2dc0e103d" dependencies = [ "cfg-if", - "windows-targets 0.48.5", + "windows-targets 0.52.6", ] [[package]] @@ -4604,9 +4604,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.38.0" +version = "1.38.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a" +checksum = "eb2caba9f80616f438e09748d5acda951967e1ea58508ef53d9c6402485a46df" dependencies = [ "backtrace", "bytes", From e4adcb7805e34a208558f41732b880c7a55642ad Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 18 Jul 2024 03:08:50 +0000 Subject: [PATCH 073/215] chore(deps): Bump thiserror from 1.0.62 to 1.0.63 (#1423) Bumps [thiserror](https://github.com/dtolnay/thiserror) from 1.0.62 to 1.0.63.
Release notes

Sourced from thiserror's releases.

1.0.63

  • Documentation improvements
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=thiserror&package-manager=cargo&previous-version=1.0.62&new-version=1.0.63)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1f5cc6e0c..a8f418455 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4490,18 +4490,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.62" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2675633b1499176c2dff06b0856a27976a8f9d436737b4cf4f312d4d91d8bbb" +checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.62" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d20468752b09f49e909e55a5d338caa8bedf615594e9d80bc4c565d30faf798c" +checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" dependencies = [ "proc-macro2", "quote", From 3d2510d9865a83921889ac429bd7403e6250abad Mon Sep 17 00:00:00 2001 From: Yuri Astrakhan Date: Thu, 18 Jul 2024 22:54:42 -0400 Subject: [PATCH 074/215] bump deps and the lock file (#1424) --- Cargo.lock | 55 +++++++++++++++++++++++++++--------------------------- Cargo.toml | 2 +- 2 files changed, 28 insertions(+), 29 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a8f418455..e614a25e4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -441,9 +441,9 @@ checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[package]] name = "aws-lc-rs" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8a47f2fb521b70c11ce7369a6c5fa4bd6af7e5d62ec06303875bafe7c6ba245" +checksum = "4ae74d9bd0a7530e8afd1770739ad34b36838829d6ad61818f9230f683f5ad77" dependencies = [ "aws-lc-sys", "mirai-annotations", @@ -453,9 +453,9 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.19.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2927c7af777b460b7ccd95f8b67acd7b4c04ec8896bf0c8e80ba30523cffc057" +checksum = "2e89b6941c2d1a7045538884d6e760ccfffdf8e1ffc2613d8efa74305e1f3752" dependencies = [ "bindgen", "cc", @@ -540,18 +540,18 @@ dependencies = [ [[package]] name = "bit-set" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0481a0e032742109b1133a095184ee93d88f3dc9e0d28a5d033dc77a073f44f" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" dependencies = [ "bit-vec", ] [[package]] name = "bit-vec" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2c54ff287cfc0a34f38a6b832ea1bd8e448a330b3e40a50859e6488bee07f22" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" [[package]] name = "bitflags" @@ -657,9 +657,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.6.0" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" +checksum = "a12916984aab3fa6e39d655a33e09c0071eb36d6ab3aea5c2d78551f1df6d952" [[package]] name = "bytestring" @@ -684,13 +684,12 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.1.1" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "907d8581360765417f8f2e0e7d602733bbed60156b4465b7617243689ef9b83d" +checksum = "324c74f2155653c90b04f25b2a47a8a631360cb908f92a772695f430c7e31052" dependencies = [ "jobserver", "libc", - "once_cell", ] [[package]] @@ -2044,9 +2043,9 @@ checksum = "b248f5224d1d606005e02c97f5aa4e88eeb230488bcc03bc9ca4d7991399f2b5" [[package]] name = "inferno" -version = "0.11.19" +version = "0.11.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "321f0f839cd44a4686e9504b0a62b4d69a50b62072144c71c68f5873c167b8d9" +checksum = "7c77a3ae7d4761b9c64d2c030f70746ceb8cfba32dce0325a56792e0a4816c31" dependencies = [ "ahash", "indexmap 2.2.6", @@ -2756,9 +2755,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "oxipng" -version = "9.1.1" +version = "9.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f398c53eb34e0cf71d9e0bc676cfa7c611e3844dd14ab05e92fb7b423c98ecf" +checksum = "ec25597808aff9f632f018f0fe8985c6f670598ac5241d220a9f2d32ff46812e" dependencies = [ "bitvec", "clap", @@ -2799,7 +2798,7 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.2", + "redox_syscall 0.5.3", "smallvec", "windows-targets 0.52.6", ] @@ -3384,9 +3383,9 @@ dependencies = [ [[package]] name = "raw-cpuid" -version = "11.0.2" +version = "11.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e29830cbb1290e404f24c73af91c5d8d631ce7e128691e9477556b540cd01ecd" +checksum = "cb9ee317cfe3fbd54b36a511efc1edd42e216903c9cd575e686dd68a2ba90d8d" dependencies = [ "bitflags 2.6.0", ] @@ -3428,9 +3427,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c82cf8cff14456045f55ec4241383baeff27af886adb72ffb2162f99911de0fd" +checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" dependencies = [ "bitflags 2.6.0", ] @@ -3543,9 +3542,9 @@ dependencies = [ [[package]] name = "rgb" -version = "0.8.44" +version = "0.8.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aee83dc281d5a3200d37b299acd13b81066ea126a7f16f0eae70fc9aed241d9" +checksum = "ade4539f42266ded9e755c605bdddf546242b2c961b03b06a7375260788a0523" dependencies = [ "bytemuck", ] @@ -3799,9 +3798,9 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.11.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ "bitflags 2.6.0", "core-foundation", @@ -3812,9 +3811,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.11.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" +checksum = "75da29fe9b9b08fe9d6b22b5b4bcbc75d8db3aa31e639aa56bb62e9d46bfceaf" dependencies = [ "core-foundation-sys", "libc", diff --git a/Cargo.toml b/Cargo.toml index b1b112946..e272938d4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -33,7 +33,7 @@ actix-web-static-files = "4" anyhow = "1.0" approx = "0.5.1" async-trait = "0.1" -bit-set = "0.6.0" +bit-set = "0.8" brotli = ">=5, <7" cargo-husky = { version = "1", features = ["user-hooks"], default-features = false } clap = { version = "4", features = ["derive"] } From 9c30634b723d14dad00b0aedc8aef406d018cec7 Mon Sep 17 00:00:00 2001 From: Yuri Astrakhan Date: Fri, 19 Jul 2024 00:27:40 -0400 Subject: [PATCH 075/215] Reorder brew install, hopefully speeds it up (#1425) --- .github/workflows/ci.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f7f76ca35..366473d18 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -326,18 +326,16 @@ jobs: - target: x86_64-unknown-linux-gnu os: ubuntu-latest steps: - - name: Checkout sources - uses: actions/checkout@v4 - - name: Start NGINX - uses: nyurik/action-setup-nginx@v1.1 - id: nginx - with: { port: '5412', output-unix-paths: 'yes' } - - name: Copy static files - run: cp -r tests/fixtures/pmtiles2/* ${{ steps.nginx.outputs.html-dir }} - name: Install and run Postgis uses: nyurik/action-setup-postgis@v2 id: pg with: { username: 'test', password: 'test', database: 'test' } + - name: Start NGINX + uses: nyurik/action-setup-nginx@v1.1 + id: nginx + with: { port: '5412', output-unix-paths: 'yes' } + - name: Checkout sources + uses: actions/checkout@v4 - name: Init database run: | echo "DATABASE_URL=${{ steps.pg.outputs.connection-uri }}" @@ -346,6 +344,8 @@ jobs: tests/fixtures/initdb.sh env: PGSERVICE: ${{ steps.pg.outputs.service-name }} + - name: Copy static files + run: cp -r tests/fixtures/pmtiles2/* ${{ steps.nginx.outputs.html-dir }} - name: Download build artifact build-${{ matrix.target }} uses: actions/download-artifact@v4 with: From 78e619ed27844864961fa08afc49de7f6944bb3a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Jul 2024 03:12:19 +0000 Subject: [PATCH 076/215] chore(deps): Bump postgres-protocol from 0.6.6 to 0.6.7 (#1426) Bumps [postgres-protocol](https://github.com/sfackler/rust-postgres) from 0.6.6 to 0.6.7.
Commits
  • c358077 Release postgres-protocol v0.6.7
  • 4b9cdca Merge pull request #1162 from sfackler/transaction-builder-cancellation
  • a0b2d70 Fix cancellation of TransactionBuilder::start
  • a1bdd0b Merge pull request #1160 from sfackler/query-typed-cleanup
  • 71c836b query_typed tweaks
  • 257bcfd Merge pull request #1147 from exograph/exograph
  • 0fa3247 Fix a clippy warning
  • dbd4d02 Address review comment to rename query_with_param_types to query_typed
  • 647a925 Merge pull request #1144 from rigby-dane/add_row_description
  • 2647024 PR Fix: Clone first then move
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=postgres-protocol&package-manager=cargo&previous-version=0.6.6&new-version=0.6.7)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e614a25e4..9730871b8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3061,11 +3061,11 @@ dependencies = [ [[package]] name = "postgres-protocol" -version = "0.6.6" +version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49b6c5ef183cd3ab4ba005f1ca64c21e8bd97ce4699cfea9e8d9a2c4958ca520" +checksum = "acda0ebdebc28befa84bee35e651e4c5f09073d668c7aed4cf7e23c3cda84b23" dependencies = [ - "base64 0.21.7", + "base64 0.22.1", "byteorder", "bytes", "fallible-iterator 0.2.0", From 59890bfc2bda8ccaf42785a61e99392871052038 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 24 Jul 2024 02:38:16 +0000 Subject: [PATCH 077/215] chore(deps): Bump sqlite-compressions from 0.2.12 to 0.2.13 (#1430) Bumps [sqlite-compressions](https://github.com/nyurik/sqlite-compressions) from 0.2.12 to 0.2.13.
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=sqlite-compressions&package-manager=cargo&previous-version=0.2.12&new-version=0.2.13)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9730871b8..9ede1ed38 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4098,9 +4098,9 @@ dependencies = [ [[package]] name = "sqlite-compressions" -version = "0.2.12" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d005d84196a3cc75a3113058d333de388cef7eb665dbcee09e31bb8166a1382" +checksum = "cc697a26c73b0f1f9e9ad89e5bc0445e7f6244882978c8998a272e0f1f96cd58" dependencies = [ "bsdiff", "flate2", diff --git a/Cargo.toml b/Cargo.toml index e272938d4..65926b5d5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -78,7 +78,7 @@ serde_with = "3" serde_yaml = "0.9" size_format = "1.0.2" spreet = { version = "0.11", default-features = false } -sqlite-compressions = { version = "0.2.12", default-features = false, features = ["bsdiffraw", "gzip"] } +sqlite-compressions = { version = "0.2.13", default-features = false, features = ["bsdiffraw", "gzip"] } sqlite-hashes = { version = "0.7.3", default-features = false, features = ["md5", "aggregate", "hex"] } sqlx = { version = "0.7", features = ["sqlite", "runtime-tokio"] } static-files = "0.2" From 4864e5c5151209e508c713e846fd5a7191ebde00 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 24 Jul 2024 02:41:39 +0000 Subject: [PATCH 078/215] chore(deps): Bump env_logger from 0.11.3 to 0.11.4 (#1431) Bumps [env_logger](https://github.com/rust-cli/env_logger) from 0.11.3 to 0.11.4.
Release notes

Sourced from env_logger's releases.

v0.11.4

[0.11.4] - 2024-07-23

Changelog

Sourced from env_logger's changelog.

[0.11.4] - 2024-07-23

Commits
  • 57f1bb7 chore: Release
  • ba2748f chore: Release
  • 4dd976b Merge pull request #324 from Maximkaaa/try_parse
  • 05aacb9 feat: Add Builder::try_parse method
  • faf5b3e chore: Tests for parse_spec error messages
  • c42511c refactor: Return errors from parse_spec
  • 0e25d9e chore(deps): Update Rust Stable to v1.79 (#322)
  • e1640c4 Merge pull request #320 from epage/template
  • f8acfee chore: Update from _rust/main template
  • 5212df9 Merge pull request #318 from rust-cli/renovate/stable-1.x
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=env_logger&package-manager=cargo&previous-version=0.11.3&new-version=0.11.4)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9ede1ed38..8775ef113 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1279,9 +1279,9 @@ dependencies = [ [[package]] name = "env_logger" -version = "0.11.3" +version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b35839ba51819680ba087cd351788c9a3c476841207e0b8cee0b04722343b9" +checksum = "06676b12debf7bba6903559720abca942d3a66b8acb88815fd2c7c6537e9ade1" dependencies = [ "anstream", "anstyle", @@ -2286,7 +2286,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e310b3a6b5907f99202fcdb4960ff45b93735d7c7d96b760fcff8db2dc0e103d" dependencies = [ "cfg-if", - "windows-targets 0.52.6", + "windows-targets 0.48.5", ] [[package]] From b13baa7a4b796320d835c69ee203470b35706814 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 24 Jul 2024 02:44:29 +0000 Subject: [PATCH 079/215] chore(deps): Bump clap from 4.5.9 to 4.5.10 (#1429) Bumps [clap](https://github.com/clap-rs/clap) from 4.5.9 to 4.5.10.
Release notes

Sourced from clap's releases.

v4.5.10

[4.5.10] - 2024-07-23

Changelog

Sourced from clap's changelog.

[4.5.10] - 2024-07-23

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=clap&package-manager=cargo&previous-version=4.5.9&new-version=4.5.10)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8775ef113..d00afda04 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -770,9 +770,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.9" +version = "4.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64acc1846d54c1fe936a78dc189c34e28d3f5afc348403f28ecf53660b9b8462" +checksum = "8f6b81fb3c84f5563d509c59b5a48d935f689e993afa90fe39047f05adef9142" dependencies = [ "clap_builder", "clap_derive", @@ -780,9 +780,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.9" +version = "4.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fb8393d67ba2e7bfaf28a23458e4e2b543cc73a99595511eb207fdb8aede942" +checksum = "5ca6706fd5224857d9ac5eb9355f6683563cc0541c7cd9d014043b57cbec78ac" dependencies = [ "anstream", "anstyle", From 5d6e447575b40c51a41d952709ed2db55748ce71 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 24 Jul 2024 02:49:01 +0000 Subject: [PATCH 080/215] chore(deps): Bump rustls from 0.23.11 to 0.23.12 (#1434) Bumps [rustls](https://github.com/rustls/rustls) from 0.23.11 to 0.23.12.
Commits
  • ebda385 Update version to 0.23.12
  • 127a0a7 build(deps): bump openssl from 0.10.64 to 0.10.66
  • 3cc2c2d Support P521 SHA-256/SHA-384 signatures with aws-lc-rs (#2050)
  • e58aaa8 ci: add rebaseWhen to renovate config
  • dfc8ae5 ci: remove stabilityDays from renovate config
  • 49c31cb chore(deps): lock file maintenance
  • 63eecac chore(deps): update rust crate tikv-jemallocator to 0.6
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=rustls&package-manager=cargo&previous-version=0.23.11&new-version=0.23.12)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 8 ++++---- Cargo.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d00afda04..b042181bd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3685,9 +3685,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.11" +version = "0.23.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4828ea528154ae444e5a642dbb7d5623354030dc9822b83fd9bb79683c7399d0" +checksum = "c58f8c84392efc0a126acce10fa59ff7b3d2ac06ab451a33f2741989b806b044" dependencies = [ "aws-lc-rs", "log", @@ -3730,9 +3730,9 @@ checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" [[package]] name = "rustls-webpki" -version = "0.102.5" +version = "0.102.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9a6fccd794a42c2c105b513a2f62bc3fd8f3ba57a4593677ceb0bd035164d78" +checksum = "8e6b52d4fda176fd835fdc55a835d4a89b8499cad995885a21149d5ad62f852e" dependencies = [ "aws-lc-rs", "ring", diff --git a/Cargo.toml b/Cargo.toml index 65926b5d5..3b4f3582a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -66,7 +66,7 @@ pprof = { version = "0.13", features = ["flamegraph", "criterion"] } pretty_assertions = "1" regex = "1" rstest = "0.21" -rustls = "0.23.11" +rustls = "0.23.12" # ring feature does not require NASM windows executable, but works slower #rustls = { version = "0.23", default-features = false, features = ["logging", "std", "tls12", "ring"] } rustls-native-certs = "0.7" From de713aa01dec2ff75277070a7110044906452e5c Mon Sep 17 00:00:00 2001 From: Yuri Astrakhan Date: Tue, 23 Jul 2024 22:52:07 -0400 Subject: [PATCH 081/215] Bump deps --- Cargo.lock | 136 ++++++++++++++++++++++++++++------------------------- 1 file changed, 73 insertions(+), 63 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b042181bd..33c9de3a6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -80,7 +80,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -120,7 +120,7 @@ dependencies = [ "actix-utils", "futures-core", "futures-util", - "mio", + "mio 0.8.11", "socket2", "tokio", "tracing", @@ -197,7 +197,7 @@ dependencies = [ "actix-router", "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -357,9 +357,9 @@ dependencies = [ [[package]] name = "arrayref" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" +checksum = "9d151e35f61089500b617991b791fc8bfd237ae50cd5950803758a179b41e67a" [[package]] name = "arrayvec" @@ -369,9 +369,9 @@ checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" [[package]] name = "async-compression" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd066d0b4ef8ecb03a55319dc13aa6910616d0f44008a045bb1835af830abff5" +checksum = "fec134f64e2bc57411226dfc4e52dec859ddfc7e711fc5e07b612584f000e4aa" dependencies = [ "flate2", "futures-core", @@ -410,7 +410,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -421,7 +421,7 @@ checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -534,7 +534,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.71", + "syn 2.0.72", "which", ] @@ -684,9 +684,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.1.5" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "324c74f2155653c90b04f25b2a47a8a631360cb908f92a772695f430c7e31052" +checksum = "2aba8f4e9906c7ce3c73463f62a7f0c65183ada1a2d47e397cc8810827f9694f" dependencies = [ "jobserver", "libc", @@ -799,7 +799,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -1060,7 +1060,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edb49164822f3ee45b17acd4a208cfc1251410cf0cad9a833234c9890774dd9f" dependencies = [ "quote", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -1084,7 +1084,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -1095,7 +1095,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -1178,7 +1178,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -1264,14 +1264,14 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] name = "env_filter" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a009aa4810eb158359dda09d0c87378e4bbb89b5a801f016885a4707ba24f7ea" +checksum = "c6dc8c8ff84895b051f07a0e65f975cf225131742531338752abfb324e4449ff" dependencies = [ "log", "regex", @@ -1606,7 +1606,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -2131,9 +2131,9 @@ checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "jobserver" -version = "0.1.31" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" dependencies = [ "libc", ] @@ -2281,12 +2281,12 @@ dependencies = [ [[package]] name = "libloading" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e310b3a6b5907f99202fcdb4960ff45b93735d7c7d96b760fcff8db2dc0e103d" +checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" dependencies = [ "cfg-if", - "windows-targets 0.48.5", + "windows-targets 0.52.6", ] [[package]] @@ -2550,6 +2550,18 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "mio" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4569e456d394deccd22ce1c1913e6ea0e54519f577285001215d33557431afe4" +dependencies = [ + "hermit-abi", + "libc", + "wasi", + "windows-sys 0.52.0", +] + [[package]] name = "mirai-annotations" version = "1.12.0" @@ -2826,7 +2838,7 @@ dependencies = [ "regex", "regex-syntax 0.7.5", "structmeta", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -2932,7 +2944,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -3047,9 +3059,9 @@ dependencies = [ [[package]] name = "postgres" -version = "0.19.7" +version = "0.19.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7915b33ed60abc46040cbcaa25ffa1c7ec240668e0477c4f3070786f5916d451" +checksum = "6c9ec84ab55b0f9e418675de50052d494ba893fd28c65769a6e68fcdacbee2b8" dependencies = [ "bytes", "fallible-iterator 0.2.0", @@ -3079,9 +3091,9 @@ dependencies = [ [[package]] name = "postgres-types" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d2234cdee9408b523530a9b6d2d6b373d1db34f6a8e51dc03ded1828d7fb67c" +checksum = "02048d9e032fb3cc3413bbf7b83a15d84a5d419778e2628751896d856498eee9" dependencies = [ "bytes", "fallible-iterator 0.2.0", @@ -3143,7 +3155,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" dependencies = [ "proc-macro2", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -3325,14 +3337,13 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.2" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9096629c45860fc7fb143e125eb826b5e721e10be3263160c7d60ca832cf8c46" +checksum = "8bffec3605b73c6f1754535084a85229fa8a30f86014e6c81aeec4abb68b0285" dependencies = [ "libc", "once_cell", "socket2", - "tracing", "windows-sys 0.52.0", ] @@ -3631,7 +3642,7 @@ dependencies = [ "regex", "relative-path", "rustc_version", - "syn 2.0.71", + "syn 2.0.72", "unicode-ident", ] @@ -3842,7 +3853,7 @@ checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -3916,7 +3927,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -3987,9 +3998,9 @@ checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" [[package]] name = "similar" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa42c91313f1d05da9b26f267f931cf178d4aba455b4c4622dd7355eb80c6640" +checksum = "1de1d4f81173b03af4c0cbed3c898f6bff5b870e4a7f5d6f4057d62a7a4b686e" [[package]] name = "simplecss" @@ -4109,9 +4120,9 @@ dependencies = [ [[package]] name = "sqlite-hashes" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e59834cb3c95e0993b5768ca9f408e8aecda5c9489d3f1f4a05fe848c4f77d" +checksum = "8949e8a8243d9f1e860f6eb332154f1ea7fe2d76f04e86f25dad96ec91fefd95" dependencies = [ "digest", "hex", @@ -4370,7 +4381,7 @@ dependencies = [ "proc-macro2", "quote", "structmeta-derive", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -4381,7 +4392,7 @@ checksum = "a60bcaff7397072dca0017d1db428e30d5002e00b6847703e2e42005c95fbe00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -4448,9 +4459,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.71" +version = "2.0.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b146dcf730474b4bcd16c311627b31ede9ab149045db4d6088b3becaea046462" +checksum = "dc4b9b9bf2add8093d3f2c0204471e951b2285580335de42f9d2534f3ae7a8af" dependencies = [ "proc-macro2", "quote", @@ -4504,7 +4515,7 @@ checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -4603,39 +4614,38 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.38.1" +version = "1.39.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb2caba9f80616f438e09748d5acda951967e1ea58508ef53d9c6402485a46df" +checksum = "d040ac2b29ab03b09d4129c2f5bbd012a3ac2f79d38ff506a4bf8dd34b0eac8a" dependencies = [ "backtrace", "bytes", "libc", - "mio", - "num_cpus", + "mio 1.0.1", "parking_lot", "pin-project-lite", "signal-hook-registry", "socket2", "tokio-macros", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "tokio-macros" -version = "2.3.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" +checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] name = "tokio-postgres" -version = "0.7.10" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d340244b32d920260ae7448cb72b6e238bddc3d4f7603394e7dd46ed8e48f5b8" +checksum = "03adcf0147e203b6032c0b2d30be1415ba03bc348901f3ff1cc0df6a733e60c3" dependencies = [ "async-trait", "byteorder", @@ -4780,7 +4790,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -5069,7 +5079,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", "wasm-bindgen-shared", ] @@ -5103,7 +5113,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -5420,7 +5430,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] @@ -5440,7 +5450,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.72", ] [[package]] From f5758c7bc5887390278f84f418caf7c2ded09086 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Jul 2024 03:18:29 +0000 Subject: [PATCH 082/215] chore(deps): Bump sqlite-hashes from 0.7.4 to 0.7.5 (#1436) Bumps [sqlite-hashes](https://github.com/nyurik/sqlite-hashes) from 0.7.4 to 0.7.5.
Release notes

Sourced from sqlite-hashes's releases.

v0.7.5

What's Changed

  • Fix CI release process

Full Changelog: https://github.com/nyurik/sqlite-hashes/compare/v0.7.3...v0.7.5

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=sqlite-hashes&package-manager=cargo&previous-version=0.7.4&new-version=0.7.5)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 33c9de3a6..e94a4651f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4120,9 +4120,9 @@ dependencies = [ [[package]] name = "sqlite-hashes" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8949e8a8243d9f1e860f6eb332154f1ea7fe2d76f04e86f25dad96ec91fefd95" +checksum = "b78a3cdbb0ca1c155437a42811dbb23df1ec5cd0d7d0f76216b08255dafb244b" dependencies = [ "digest", "hex", diff --git a/Cargo.toml b/Cargo.toml index 3b4f3582a..69b31acf9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -79,7 +79,7 @@ serde_yaml = "0.9" size_format = "1.0.2" spreet = { version = "0.11", default-features = false } sqlite-compressions = { version = "0.2.13", default-features = false, features = ["bsdiffraw", "gzip"] } -sqlite-hashes = { version = "0.7.3", default-features = false, features = ["md5", "aggregate", "hex"] } +sqlite-hashes = { version = "0.7.5", default-features = false, features = ["md5", "aggregate", "hex"] } sqlx = { version = "0.7", features = ["sqlite", "runtime-tokio"] } static-files = "0.2" subst = { version = "0.3", features = ["yaml"] } From 675efb5a9e3eac0044a6e8f16a68d1979ead7274 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Jul 2024 03:40:56 +0000 Subject: [PATCH 083/215] chore(deps): Bump sqlite-compressions from 0.2.13 to 0.2.14 (#1435) Bumps [sqlite-compressions](https://github.com/nyurik/sqlite-compressions) from 0.2.13 to 0.2.14.
Release notes

Sourced from sqlite-compressions's releases.

v0.2.14

What's Changed

  • Fix release pipeline

Full Changelog: https://github.com/nyurik/sqlite-compressions/compare/v0.2.13...v0.2.14

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=sqlite-compressions&package-manager=cargo&previous-version=0.2.13&new-version=0.2.14)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e94a4651f..c6b1fedb9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4109,9 +4109,9 @@ dependencies = [ [[package]] name = "sqlite-compressions" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc697a26c73b0f1f9e9ad89e5bc0445e7f6244882978c8998a272e0f1f96cd58" +checksum = "eb5573cbfea966f419e72571c5bcd8ab3dbb4d1fd1e9cecf036b5151016f2527" dependencies = [ "bsdiff", "flate2", diff --git a/Cargo.toml b/Cargo.toml index 69b31acf9..d2ad2760a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -78,7 +78,7 @@ serde_with = "3" serde_yaml = "0.9" size_format = "1.0.2" spreet = { version = "0.11", default-features = false } -sqlite-compressions = { version = "0.2.13", default-features = false, features = ["bsdiffraw", "gzip"] } +sqlite-compressions = { version = "0.2.14", default-features = false, features = ["bsdiffraw", "gzip"] } sqlite-hashes = { version = "0.7.5", default-features = false, features = ["md5", "aggregate", "hex"] } sqlx = { version = "0.7", features = ["sqlite", "runtime-tokio"] } static-files = "0.2" From 9d9bea87bee6705a094785fb81d81e51886b6dcb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 26 Jul 2024 03:06:13 +0000 Subject: [PATCH 084/215] chore(deps): Bump clap from 4.5.10 to 4.5.11 (#1442) Bumps [clap](https://github.com/clap-rs/clap) from 4.5.10 to 4.5.11.
Changelog

Sourced from clap's changelog.

[4.5.11] - 2024-07-25

Commits
  • 349ed30 chore: Release
  • 68ed9ff docs: Update changelog
  • afecaa4 Merge pull request #5576 from shannmu/option_value_new
  • 36c849b refactor(clap_complete): Reuse code about shortflag parsing
  • fc479ba feat(clap_complete): Add support for -fbar and -f=bar completion
  • 48a23f5 test(clap_complete): Add test cases for -fbar and -f=bar completion
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=clap&package-manager=cargo&previous-version=4.5.10&new-version=4.5.11)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c6b1fedb9..4a344e1ce 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -770,9 +770,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.10" +version = "4.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f6b81fb3c84f5563d509c59b5a48d935f689e993afa90fe39047f05adef9142" +checksum = "35723e6a11662c2afb578bcf0b88bf6ea8e21282a953428f240574fcc3a2b5b3" dependencies = [ "clap_builder", "clap_derive", @@ -780,9 +780,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.10" +version = "4.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca6706fd5224857d9ac5eb9355f6683563cc0541c7cd9d014043b57cbec78ac" +checksum = "49eb96cbfa7cfa35017b7cd548c75b14c3118c98b423041d70562665e07fb0fa" dependencies = [ "anstream", "anstyle", @@ -792,9 +792,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.8" +version = "4.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bac35c6dafb060fd4d275d9a4ffae97917c13a6327903a8be2153cd964f7085" +checksum = "5d029b67f89d30bbb547c89fd5161293c0aec155fc691d7924b64550662db93e" dependencies = [ "heck 0.5.0", "proc-macro2", @@ -2286,7 +2286,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" dependencies = [ "cfg-if", - "windows-targets 0.52.6", + "windows-targets 0.48.5", ] [[package]] From 674a2954daf5885b8e771002634231375b18481f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 26 Jul 2024 03:09:20 +0000 Subject: [PATCH 085/215] chore(deps): Bump env_logger from 0.11.4 to 0.11.5 (#1441) Bumps [env_logger](https://github.com/rust-cli/env_logger) from 0.11.4 to 0.11.5.
Release notes

Sourced from env_logger's releases.

v0.11.5

[0.11.5] - 2024-07-25

Changelog

Sourced from env_logger's changelog.

[0.11.5] - 2024-07-25

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=env_logger&package-manager=cargo&previous-version=0.11.4&new-version=0.11.5)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4a344e1ce..b0d5c7500 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1279,9 +1279,9 @@ dependencies = [ [[package]] name = "env_logger" -version = "0.11.4" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06676b12debf7bba6903559720abca942d3a66b8acb88815fd2c7c6537e9ade1" +checksum = "e13fa619b91fb2381732789fc5de83b45675e882f66623b7d8cb4f643017018d" dependencies = [ "anstream", "anstyle", From 175ff2d9fb493f6d87203709490f9f4dbee15359 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 29 Jul 2024 02:31:39 +0000 Subject: [PATCH 086/215] chore(deps): Bump serde_json from 1.0.120 to 1.0.121 (#1445) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [serde_json](https://github.com/serde-rs/json) from 1.0.120 to 1.0.121.
Release notes

Sourced from serde_json's releases.

v1.0.121

Commits
  • eca2658 Release 1.0.121
  • b0d678c Merge pull request #1160 from iex-rs/efficient-position
  • b1edc7d Optimize position search in error path
  • 40dd7f5 Merge pull request #1159 from iex-rs/fix-recursion
  • 6a306e6 Move call to tri! out of check_recursion!
  • 3f1c6de Ignore byte_char_slices clippy lint in test
  • 3fd6f5f Merge pull request #1153 from dpathakj/master
  • fcb5e83 Correct documentation URL for Value's Index impl.
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=serde_json&package-manager=cargo&previous-version=1.0.120&new-version=1.0.121)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b0d5c7500..0d9971a5d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3858,11 +3858,12 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.120" +version = "1.0.121" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5" +checksum = "4ab380d7d9f22ef3f21ad3e6c1ebe8e4fc7a2000ccba2e4d71fc96f15b2cb609" dependencies = [ "itoa", + "memchr", "ryu", "serde", ] From 334ffa180111e8915112a298d864c8b104eb703b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 29 Jul 2024 02:32:32 +0000 Subject: [PATCH 087/215] chore(deps): Bump xxhash-rust from 0.8.11 to 0.8.12 (#1446) Bumps [xxhash-rust](https://github.com/DoumanAsh/xxhash-rust) from 0.8.11 to 0.8.12.
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=xxhash-rust&package-manager=cargo&previous-version=0.8.11&new-version=0.8.12)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0d9971a5d..d938a8b5a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5404,9 +5404,9 @@ checksum = "ec7a2a501ed189703dba8b08142f057e887dfc4b2cc4db2d343ac6376ba3e0b9" [[package]] name = "xxhash-rust" -version = "0.8.11" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63658493314859b4dfdf3fb8c1defd61587839def09582db50b8a4e93afca6bb" +checksum = "6a5cbf750400958819fb6178eaa83bee5cd9c29a26a40cc241df8c70fdd46984" [[package]] name = "yansi" From ecc4bac96c943e1a7e9d4101a7e3a2c9595adbc5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 29 Jul 2024 02:35:22 +0000 Subject: [PATCH 088/215] chore(deps): Bump tokio from 1.39.1 to 1.39.2 (#1447) Bumps [tokio](https://github.com/tokio-rs/tokio) from 1.39.1 to 1.39.2.
Release notes

Sourced from tokio's releases.

Tokio v1.39.2

1.39.2 (July 27th, 2024)

This release fixes a regression where the select! macro stopped accepting expressions that make use of temporary lifetime extension. (#6722)

#6722: tokio-rs/tokio#6722

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=tokio&package-manager=cargo&previous-version=1.39.1&new-version=1.39.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d938a8b5a..b31b6c807 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4615,9 +4615,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.39.1" +version = "1.39.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d040ac2b29ab03b09d4129c2f5bbd012a3ac2f79d38ff506a4bf8dd34b0eac8a" +checksum = "daa4fb1bc778bd6f04cbfc4bb2d06a7396a8f299dc33ea1900cedaa316f467b1" dependencies = [ "backtrace", "bytes", From fb3e439d71a5ee262a711315d6e65ff03e26901a Mon Sep 17 00:00:00 2001 From: Yuri Astrakhan Date: Tue, 30 Jul 2024 10:53:22 -0400 Subject: [PATCH 089/215] Bump deps, fmt --- Cargo.lock | 89 +++++++++++++++++++++------------------- martin/src/srv/server.rs | 14 +++---- 2 files changed, 54 insertions(+), 49 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b31b6c807..286e1df30 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -293,9 +293,9 @@ checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" [[package]] name = "anstream" -version = "0.6.14" +version = "0.6.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b" +checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" dependencies = [ "anstyle", "anstyle-parse", @@ -308,33 +308,33 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.7" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" +checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" [[package]] name = "anstyle-parse" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" +checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad186efb764318d35165f1758e7dcef3b10628e26d41a44bc5550652e6804391" +checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" dependencies = [ "windows-sys 0.52.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.3" +version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19" +checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" dependencies = [ "anstyle", "windows-sys 0.52.0", @@ -684,9 +684,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.1.6" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2aba8f4e9906c7ce3c73463f62a7f0c65183ada1a2d47e397cc8810827f9694f" +checksum = "26a5c3fd7bfa1ce3897a3a3501d362b2d87b7f2583ebcb4a949ec25911025cbc" dependencies = [ "jobserver", "libc", @@ -804,15 +804,15 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b82cf0babdbd58558212896d1a4272303a57bdb245c2bf1147185fb45640e70" +checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" [[package]] name = "clap_mangen" -version = "0.2.22" +version = "0.2.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f50dde5bc0c853d6248de457e5eb6e5a674a54b93810a34ded88d882ca1fe2de" +checksum = "f17415fd4dfbea46e3274fcd8d368284519b358654772afb700dc2e8d2b24eeb" dependencies = [ "clap", "roff", @@ -835,9 +835,9 @@ checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" [[package]] name = "colorchoice" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" +checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" [[package]] name = "concurrent-queue" @@ -1269,9 +1269,9 @@ dependencies = [ [[package]] name = "env_filter" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6dc8c8ff84895b051f07a0e65f975cf225131742531338752abfb324e4449ff" +checksum = "4f2c92ceda6ceec50f43169f9ee8424fe2db276791afde7b2cd8bc084cb376ab" dependencies = [ "log", "regex", @@ -1463,11 +1463,11 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fontconfig-parser" -version = "0.5.6" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a595cb550439a117696039dfc69830492058211b771a2a165379f2a1a53d84d" +checksum = "c1fcfcd44ca6e90c921fee9fa665d530b21ef1327a4c1a6c5250ea44b776ada7" dependencies = [ - "roxmltree 0.19.0", + "roxmltree 0.20.0", ] [[package]] @@ -2092,9 +2092,9 @@ dependencies = [ [[package]] name = "is_terminal_polyfill" -version = "1.70.0" +version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" [[package]] name = "itertools" @@ -2286,7 +2286,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" dependencies = [ "cfg-if", - "windows-targets 0.48.5", + "windows-targets 0.52.6", ] [[package]] @@ -2740,9 +2740,9 @@ dependencies = [ [[package]] name = "object" -version = "0.36.1" +version = "0.36.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "081b846d1d56ddfc18fdf1a922e4f6e07a11768ea1b92dec44e42b72712ccfce" +checksum = "3f203fa8daa7bb185f760ae12bd8e097f63d17041dcdcaf675ac54cdf863170e" dependencies = [ "memchr", ] @@ -3134,9 +3134,13 @@ dependencies = [ [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "2288c0e17cc8d342c712bb43a257a80ebffce59cdb33d5000d8348f3ec02528b" +dependencies = [ + "zerocopy", + "zerocopy-derive", +] [[package]] name = "pretty_assertions" @@ -3577,9 +3581,9 @@ dependencies = [ [[package]] name = "roff" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b833d8d034ea094b1ea68aa6d5c740e0d04bad9d16568d08ba6f76823a114316" +checksum = "88f8660c1ff60292143c98d08fc6e2f654d722db50410e3f3797d40baaf9d8f3" [[package]] name = "roxmltree" @@ -3592,9 +3596,9 @@ dependencies = [ [[package]] name = "roxmltree" -version = "0.19.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cd14fd5e3b777a7422cca79358c57a8f6e3a703d9ac187448d0daf220c2407f" +checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97" [[package]] name = "rsa" @@ -4426,9 +4430,9 @@ dependencies = [ [[package]] name = "symbolic-common" -version = "12.9.2" +version = "12.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71297dc3e250f7dbdf8adb99e235da783d690f5819fdeb4cce39d9cfb0aca9f1" +checksum = "16629323a4ec5268ad23a575110a724ad4544aae623451de600c747bf87b36cf" dependencies = [ "debugid", "memmap2 0.9.4", @@ -4438,9 +4442,9 @@ dependencies = [ [[package]] name = "symbolic-demangle" -version = "12.9.2" +version = "12.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "424fa2c9bf2c862891b9cfd354a752751a6730fd838a4691e7f6c2c7957b9daf" +checksum = "48c043a45f08f41187414592b3ceb53fb0687da57209cc77401767fb69d5b596" dependencies = [ "cpp_demangle", "rustc-demangle", @@ -4728,9 +4732,9 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.6" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" [[package]] name = "toml_edit" @@ -5024,9 +5028,9 @@ checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "walkdir" @@ -5420,6 +5424,7 @@ version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ + "byteorder", "zerocopy-derive", ] diff --git a/martin/src/srv/server.rs b/martin/src/srv/server.rs index df4157b4b..c4f3e0f3a 100755 --- a/martin/src/srv/server.rs +++ b/martin/src/srv/server.rs @@ -3,13 +3,6 @@ use std::pin::Pin; use std::string::ToString; use std::time::Duration; -use crate::config::ServerState; -use crate::source::TileCatalog; -use crate::srv::config::{SrvConfig, KEEP_ALIVE_DEFAULT, LISTEN_ADDRESSES_DEFAULT}; -use crate::srv::tiles::get_tile; -use crate::srv::tiles_info::get_source_info; -use crate::MartinError::BindingError; -use crate::MartinResult; use actix_cors::Cors; use actix_web::error::ErrorInternalServerError; use actix_web::http::header::CACHE_CONTROL; @@ -24,6 +17,13 @@ use serde::{Deserialize, Serialize}; #[cfg(feature = "webui")] use crate::args::WebUiMode; +use crate::config::ServerState; +use crate::source::TileCatalog; +use crate::srv::config::{SrvConfig, KEEP_ALIVE_DEFAULT, LISTEN_ADDRESSES_DEFAULT}; +use crate::srv::tiles::get_tile; +use crate::srv::tiles_info::get_source_info; +use crate::MartinError::BindingError; +use crate::MartinResult; #[cfg(feature = "webui")] mod webui { From 0bc9f152b36ff7143adc27c0d2a380460dfb6160 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 Aug 2024 03:22:04 +0000 Subject: [PATCH 090/215] chore(deps): Bump clap from 4.5.11 to 4.5.13 (#1449) Bumps [clap](https://github.com/clap-rs/clap) from 4.5.11 to 4.5.13.
Release notes

Sourced from clap's releases.

v4.5.13

[4.5.13] - 2024-07-31

Fixes

  • (derive) Improve error message when #[flatten]ing an optional #[group(skip)]
  • (help) Properly wrap long subcommand descriptions in help

v4.5.12

[4.5.12] - 2024-07-31

Changelog

Sourced from clap's changelog.

[4.5.13] - 2024-07-31

Fixes

  • (derive) Improve error message when #[flatten]ing an optional #[group(skip)]
  • (help) Properly wrap long subcommand descriptions in help

[4.5.12] - 2024-07-31

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=clap&package-manager=cargo&previous-version=4.5.11&new-version=4.5.13)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 286e1df30..873da2a30 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -770,9 +770,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.11" +version = "4.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35723e6a11662c2afb578bcf0b88bf6ea8e21282a953428f240574fcc3a2b5b3" +checksum = "0fbb260a053428790f3de475e304ff84cdbc4face759ea7a3e64c1edd938a7fc" dependencies = [ "clap_builder", "clap_derive", @@ -780,9 +780,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.11" +version = "4.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49eb96cbfa7cfa35017b7cd548c75b14c3118c98b423041d70562665e07fb0fa" +checksum = "64b17d7ea74e9f833c7dbf2cbe4fb12ff26783eda4782a8975b72f895c9b4d99" dependencies = [ "anstream", "anstyle", @@ -792,9 +792,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.11" +version = "4.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d029b67f89d30bbb547c89fd5161293c0aec155fc691d7924b64550662db93e" +checksum = "501d359d5f3dcaf6ecdeee48833ae73ec6e42723a1e52419c79abf9507eec0a0" dependencies = [ "heck 0.5.0", "proc-macro2", @@ -2286,7 +2286,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" dependencies = [ "cfg-if", - "windows-targets 0.52.6", + "windows-targets 0.48.5", ] [[package]] From 0ff95b9e8aaa3500d6b5c308292ecf3ffda40eaf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 2 Aug 2024 03:17:54 +0000 Subject: [PATCH 091/215] chore(deps): Bump serde_json from 1.0.121 to 1.0.122 (#1450) Bumps [serde_json](https://github.com/serde-rs/json) from 1.0.121 to 1.0.122.
Release notes

Sourced from serde_json's releases.

v1.0.122

  • Support using json! in no-std crates (#1166)
Commits
  • 54381d6 Release 1.0.122
  • 16fb6e0 Work around buggy rust-analyzer behavior
  • 49d7d66 Merge pull request #1166 from dtolnay/allocvec
  • 6827c7b Fix json! invocations when std prelude is not in scope
  • 611b2a4 Merge pull request #1165 from serde-rs/jsonmac
  • 7633cb7 Eliminate local_inner_macros in favor of non-ident macro paths
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=serde_json&package-manager=cargo&previous-version=1.0.121&new-version=1.0.122)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 873da2a30..999717347 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3862,9 +3862,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.121" +version = "1.0.122" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ab380d7d9f22ef3f21ad3e6c1ebe8e4fc7a2000ccba2e4d71fc96f15b2cb609" +checksum = "784b6203951c57ff748476b126ccb5e8e2959a5c19e5c617ab1956be3dbc68da" dependencies = [ "itoa", "memchr", From 025022bbc34e19d583e16cdeadde3871d41a4dea Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Aug 2024 03:20:48 +0000 Subject: [PATCH 092/215] chore(deps): Bump rustls-pemfile from 2.1.2 to 2.1.3 (#1453) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [rustls-pemfile](https://github.com/rustls/pemfile) from 2.1.2 to 2.1.3.
Release notes

Sourced from rustls-pemfile's releases.

2.1.3

Notable changes

What's Changed

Commits
  • 38c6f8b Add RawPublicKeyCertificate
  • 5d9960f Bump pki-types from 1.3 to 1.7 and version from
  • bd9773d Bump base64 from 0.22.0 to 0.22.1
  • e4f1fae ci: add cron schedule trigger
  • 2433110 ci: switch linux hosts to ubuntu-latest
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=rustls-pemfile&package-manager=cargo&previous-version=2.1.2&new-version=2.1.3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 999717347..f55fa8ea0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3729,9 +3729,9 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "2.1.2" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" +checksum = "196fe16b00e106300d3e45ecfcb764fa292a535d7326a29a5875c579c7417425" dependencies = [ "base64 0.22.1", "rustls-pki-types", From 2ba7e8519fd622f303855b1d5beaf571cb04e0e8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Aug 2024 03:23:13 +0000 Subject: [PATCH 093/215] chore(deps): Bump flate2 from 1.0.30 to 1.0.31 (#1452) Bumps [flate2](https://github.com/rust-lang/flate2-rs) from 1.0.30 to 1.0.31.
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=flate2&package-manager=cargo&previous-version=1.0.30&new-version=1.0.31)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f55fa8ea0..e25a888dd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1403,9 +1403,9 @@ dependencies = [ [[package]] name = "flate2" -version = "1.0.30" +version = "1.0.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" +checksum = "7f211bbe8e69bbd0cfdea405084f128ae8b4aaa6b0b522fc8f2b009084797920" dependencies = [ "crc32fast", "miniz_oxide", From 3549b5f634fc82187b97b6f9e10279dcfb786a3d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Aug 2024 03:23:41 +0000 Subject: [PATCH 094/215] chore(deps): Bump regex from 1.10.5 to 1.10.6 (#1454) Bumps [regex](https://github.com/rust-lang/regex) from 1.10.5 to 1.10.6.
Changelog

Sourced from regex's changelog.

1.10.6 (2024-08-02)

This is a new patch release with a fix for the unstable crate feature that enables std::str::Pattern trait integration.

Bug fixes:

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=regex&package-manager=cargo&previous-version=1.10.5&new-version=1.10.6)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e25a888dd..8e9d89f83 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3451,9 +3451,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.5" +version = "1.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" +checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" dependencies = [ "aho-corasick", "memchr", From 86c73767ae72ebdf66164ab7e67ba1cc704ff326 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 8 Aug 2024 02:54:14 +0000 Subject: [PATCH 095/215] chore(deps): Bump serde from 1.0.204 to 1.0.205 (#1456) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [serde](https://github.com/serde-rs/serde) from 1.0.204 to 1.0.205.
Release notes

Sourced from serde's releases.

v1.0.205

  • Use serialize_entry instead of serialize_key + serialize_value when serialize flattened newtype enum variants (#2785, thanks @​Mingun)
  • Avoid triggering a collection_is_never_read lint in the deserialization of enums containing flattened fields (#2791)
Commits
  • 9b868ef Release 1.0.205
  • c3eaf76 Merge pull request #2791 from dtolnay/flatten
  • 32958de Skip collecting unmatched fields in variants that do not use flatten
  • d64a97b Ignore confusable_idents warning in test
  • c3df337 Add test of flatten in enum
  • 8764353 Enable collection_is_never_read nursury lint in test
  • e08c5de Merge pull request #2785 from Mingun/serialize_entry-in-flatten-newtype-variant
  • bc5af50 Use serialize_entry instead of serialize_key + serialize_value when serialize...
  • 28a0922 Work around test suite dead code warnings in nightly-2024-07-07
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=serde&package-manager=cargo&previous-version=1.0.204&new-version=1.0.205)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8e9d89f83..5a3c006d2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3842,18 +3842,18 @@ checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" -version = "1.0.204" +version = "1.0.205" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12" +checksum = "e33aedb1a7135da52b7c21791455563facbbcc43d0f0f66165b42c21b3dfb150" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.204" +version = "1.0.205" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" +checksum = "692d6f5ac90220161d6774db30c662202721e64aed9058d2c394f451261420c1" dependencies = [ "proc-macro2", "quote", From 7212e1242b96a7b6b08e692d9050f38e14e0b58d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 9 Aug 2024 03:31:16 +0000 Subject: [PATCH 096/215] chore(deps): Bump clap from 4.5.13 to 4.5.14 (#1457) Bumps [clap](https://github.com/clap-rs/clap) from 4.5.13 to 4.5.14.
Release notes

Sourced from clap's releases.

v4.5.14

[4.5.14] - 2024-08-08

Features

  • (unstable-ext) Added Arg::add for attaching arbitrary state, like completion hints, to Arg without Arg knowing about it
Changelog

Sourced from clap's changelog.

[4.5.14] - 2024-08-08

Features

  • (unstable-ext) Added Arg::add for attaching arbitrary state, like completion hints, to Arg without Arg knowing about it
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=clap&package-manager=cargo&previous-version=4.5.13&new-version=4.5.14)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5a3c006d2..ccc47ecd1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -770,9 +770,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.13" +version = "4.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fbb260a053428790f3de475e304ff84cdbc4face759ea7a3e64c1edd938a7fc" +checksum = "c937d4061031a6d0c8da4b9a4f98a172fc2976dfb1c19213a9cf7d0d3c837e36" dependencies = [ "clap_builder", "clap_derive", @@ -780,9 +780,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.13" +version = "4.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64b17d7ea74e9f833c7dbf2cbe4fb12ff26783eda4782a8975b72f895c9b4d99" +checksum = "85379ba512b21a328adf887e85f7742d12e96eb31f3ef077df4ffc26b506ffed" dependencies = [ "anstream", "anstyle", From 220b5d7955346a87d5e35595f3880fb2bc98dc82 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Aug 2024 03:24:07 +0000 Subject: [PATCH 097/215] chore(deps): Bump serde from 1.0.205 to 1.0.206 (#1460) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [serde](https://github.com/serde-rs/serde) from 1.0.205 to 1.0.206.
Release notes

Sourced from serde's releases.

v1.0.206

  • Improve support for flatten attribute inside of enums (#2567, thanks @​Mingun)
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=serde&package-manager=cargo&previous-version=1.0.205&new-version=1.0.206)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ccc47ecd1..4e594efac 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3842,18 +3842,18 @@ checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" -version = "1.0.205" +version = "1.0.206" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e33aedb1a7135da52b7c21791455563facbbcc43d0f0f66165b42c21b3dfb150" +checksum = "5b3e4cd94123dd520a128bcd11e34d9e9e423e7e3e50425cb1b4b1e3549d0284" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.205" +version = "1.0.206" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "692d6f5ac90220161d6774db30c662202721e64aed9058d2c394f451261420c1" +checksum = "fabfb6138d2383ea8208cf98ccf69cdfb1aff4088460681d84189aa259762f97" dependencies = [ "proc-macro2", "quote", From 4bfbeede633ab7218ea892d088330ca1d9483083 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Aug 2024 03:32:50 +0000 Subject: [PATCH 098/215] chore(deps): Bump clap from 4.5.14 to 4.5.15 (#1461) Bumps [clap](https://github.com/clap-rs/clap) from 4.5.14 to 4.5.15.
Release notes

Sourced from clap's releases.

v4.5.15

[4.5.15] - 2024-08-10

Compatiblity

  • (unstable-ext) Arg::remove changed return types

Fixes

  • (unstable-ext) Make Arg::remove return the removed item
Changelog

Sourced from clap's changelog.

[4.5.15] - 2024-08-10

Compatiblity

  • (unstable-ext) Arg::remove changed return types

Fixes

  • (unstable-ext) Make Arg::remove return the removed item
Commits
  • 7d14ce3 fix(builder)!: Move remove to reflection from builder
  • fba563a Merge pull request #5641 from epage/dynamic
  • a4775ef refactor(complete): Split up completion code
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=clap&package-manager=cargo&previous-version=4.5.14&new-version=4.5.15)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4e594efac..0b107c624 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -770,9 +770,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.14" +version = "4.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c937d4061031a6d0c8da4b9a4f98a172fc2976dfb1c19213a9cf7d0d3c837e36" +checksum = "11d8838454fda655dafd3accb2b6e2bea645b9e4078abe84a22ceb947235c5cc" dependencies = [ "clap_builder", "clap_derive", @@ -780,9 +780,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.14" +version = "4.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85379ba512b21a328adf887e85f7742d12e96eb31f3ef077df4ffc26b506ffed" +checksum = "216aec2b177652e3846684cbfe25c9964d18ec45234f0f5da5157b207ed1aab6" dependencies = [ "anstream", "anstyle", From 4a4a00aa60bb4b5900835f99842a61d3f645458b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Aug 2024 04:01:06 +0000 Subject: [PATCH 099/215] chore(deps): Bump serde_json from 1.0.122 to 1.0.124 (#1464) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [serde_json](https://github.com/serde-rs/json) from 1.0.122 to 1.0.124.
Release notes

Sourced from serde_json's releases.

v1.0.124

v1.0.123

Commits
  • cf771a0 Release 1.0.124
  • 8b314a7 Merge pull request #1173 from iex-rs/fix-big-endian
  • 8eba786 Fix skip_to_escape on BE architectures
  • 2cab07e Release 1.0.123
  • 346189a Fix needless_borrow clippy lint in new control character test
  • 859ead8 Merge pull request #1161 from iex-rs/vectorized-string-parsing
  • e43da5e Immediately bail-out on empty strings
  • 8389d8a Don't run the slow algorithm from the beginning
  • 1f0dcf7 Allow clippy::items_after_statements
  • a95d6df Big endian support
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=serde_json&package-manager=cargo&previous-version=1.0.122&new-version=1.0.124)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0b107c624..f3bcada06 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3862,9 +3862,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.122" +version = "1.0.124" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784b6203951c57ff748476b126ccb5e8e2959a5c19e5c617ab1956be3dbc68da" +checksum = "66ad62847a56b3dba58cc891acd13884b9c61138d330c0d7b6181713d4fce38d" dependencies = [ "itoa", "memchr", From 000bac6ee5d1434e6a5a823c4ef1efd05b9fc82f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 13 Aug 2024 02:51:29 +0000 Subject: [PATCH 100/215] chore(deps): Bump serde from 1.0.206 to 1.0.207 (#1465) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [serde](https://github.com/serde-rs/serde) from 1.0.206 to 1.0.207.
Release notes

Sourced from serde's releases.

v1.0.207

  • Improve interactions between flatten attribute and skip_serializing/skip_deserializing (#2795, thanks @​Mingun)
Commits
  • 1b4da41 Release 1.0.207
  • f61d452 Touch up PR 2795
  • f986609 Merge pull request #2795 from Mingun/has-flatten-rework
  • 77a6a9d Take into account only not skipped flatten fields when choose serialization form
  • 547d843 Remove dead code - serialize_struct_as_map always called when cattrs.has_flat...
  • 005cb84 Fail with an understandable message is number of fields for serialization is ...
  • fd5b5e9 Correctly calculate has_flatten attribute in all cases for deserialization
  • 0647a7c Fix creating and filling a collections that was not read
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=serde&package-manager=cargo&previous-version=1.0.206&new-version=1.0.207)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f3bcada06..2df201bfe 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3842,18 +3842,18 @@ checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" -version = "1.0.206" +version = "1.0.207" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b3e4cd94123dd520a128bcd11e34d9e9e423e7e3e50425cb1b4b1e3549d0284" +checksum = "5665e14a49a4ea1b91029ba7d3bca9f299e1f7cfa194388ccc20f14743e784f2" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.206" +version = "1.0.207" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fabfb6138d2383ea8208cf98ccf69cdfb1aff4088460681d84189aa259762f97" +checksum = "6aea2634c86b0e8ef2cfdc0c340baede54ec27b1e46febd7f80dffb2aa44a00e" dependencies = [ "proc-macro2", "quote", From af0f1244c22a379aa37f43c5ca74de07917b1ff1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 16 Aug 2024 03:28:52 +0000 Subject: [PATCH 101/215] chore(deps): Bump serde from 1.0.207 to 1.0.208 (#1469) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [serde](https://github.com/serde-rs/serde) from 1.0.207 to 1.0.208.
Release notes

Sourced from serde's releases.

v1.0.208

  • Support serializing and deserializing unit structs in a flatten field (#2802, thanks @​jonhoo)
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=serde&package-manager=cargo&previous-version=1.0.207&new-version=1.0.208)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2df201bfe..b53c34c0b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3842,18 +3842,18 @@ checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" -version = "1.0.207" +version = "1.0.208" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5665e14a49a4ea1b91029ba7d3bca9f299e1f7cfa194388ccc20f14743e784f2" +checksum = "cff085d2cb684faa248efb494c39b68e522822ac0de72ccf08109abde717cfb2" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.207" +version = "1.0.208" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6aea2634c86b0e8ef2cfdc0c340baede54ec27b1e46febd7f80dffb2aa44a00e" +checksum = "24008e81ff7613ed8e5ba0cfaf24e2c2f1e5b8a0495711e44fcd4882fca62bcf" dependencies = [ "proc-macro2", "quote", From e1fa946bc2d3fc0f283c83788d665b0a8c4c5e70 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 16 Aug 2024 03:32:50 +0000 Subject: [PATCH 102/215] chore(deps): Bump serde_json from 1.0.124 to 1.0.125 (#1468) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [serde_json](https://github.com/serde-rs/json) from 1.0.124 to 1.0.125.
Release notes

Sourced from serde_json's releases.

1.0.125

  • Speed up \uXXXX parsing and improve handling of unpaired surrogates when deserializing to bytes (#1172, #1175, thanks @​purplesyringa)
Commits
  • 6130f9b Release 1.0.125
  • cc7a160 Touch up PR 1175
  • 0f942e5 Merge pull request 1175 from iex-rs/faster-backslash-u
  • d8921cd Merge pull request #1172 from iex-rs/faster-hex
  • b4bc643 Merge pull request #1176 from dtolnay/miriname
  • 94a2aad Improve job names for miri jobs
  • 8073fc1 Merge pull request #1174 from iex-rs/miri-on-ci
  • 96ae604 Correct WTF-8 parsing
  • 236cc82 Simplify unicode escape handling
  • 2f28d10 Use the same UTF-8/WTF-8 impl for surrogates
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=serde_json&package-manager=cargo&previous-version=1.0.124&new-version=1.0.125)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b53c34c0b..982178bba 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3862,9 +3862,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.124" +version = "1.0.125" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66ad62847a56b3dba58cc891acd13884b9c61138d330c0d7b6181713d4fce38d" +checksum = "83c8e735a073ccf5be70aa8066aa984eaf2fa000db6c8d0100ae605b366d31ed" dependencies = [ "itoa", "memchr", From c000fd950151e119ae51e5b7777380e89485f641 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 16 Aug 2024 03:40:04 +0000 Subject: [PATCH 103/215] chore(deps): Bump clap from 4.5.15 to 4.5.16 (#1470) Bumps [clap](https://github.com/clap-rs/clap) from 4.5.15 to 4.5.16.
Release notes

Sourced from clap's releases.

v4.5.16

[4.5.16] - 2024-08-15

Fixes

  • (derive) Improve error messages when derive feature is missing
Changelog

Sourced from clap's changelog.

[4.5.16] - 2024-08-15

Fixes

  • (derive) Improve error messages when derive feature is missing
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=clap&package-manager=cargo&previous-version=4.5.15&new-version=4.5.16)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 982178bba..1e84147b8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -770,9 +770,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.15" +version = "4.5.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11d8838454fda655dafd3accb2b6e2bea645b9e4078abe84a22ceb947235c5cc" +checksum = "ed6719fffa43d0d87e5fd8caeab59be1554fb028cd30edc88fc4369b17971019" dependencies = [ "clap_builder", "clap_derive", From bfc622e8dcb432ffba745efc6b14730a61bdea20 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 19 Aug 2024 03:05:31 +0000 Subject: [PATCH 104/215] chore(deps): Bump tokio from 1.39.2 to 1.39.3 (#1476) Bumps [tokio](https://github.com/tokio-rs/tokio) from 1.39.2 to 1.39.3.
Release notes

Sourced from tokio's releases.

Tokio v1.39.3

1.39.3 (August 17th, 2024)

This release fixes a regression where the unix socket api stopped accepting the abstract socket namespace. (#6772)

#6772: tokio-rs/tokio#6772

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=tokio&package-manager=cargo&previous-version=1.39.2&new-version=1.39.3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1e84147b8..ffce574b0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4619,9 +4619,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.39.2" +version = "1.39.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daa4fb1bc778bd6f04cbfc4bb2d06a7396a8f299dc33ea1900cedaa316f467b1" +checksum = "9babc99b9923bfa4804bd74722ff02c0381021eafa4db9949217e3be8e84fff5" dependencies = [ "backtrace", "bytes", From 405faea5ef81657301cda8c04f617eb0c7dd4422 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 20 Aug 2024 03:21:11 +0000 Subject: [PATCH 105/215] chore(deps): Bump rustls-native-certs from 0.7.1 to 0.7.2 (#1478) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [rustls-native-certs](https://github.com/rustls/rustls-native-certs) from 0.7.1 to 0.7.2.
Release notes

Sourced from rustls-native-certs's releases.

0.7.2

  • Improve error reporting if we fail when loading certificates from the filesystem.

What's Changed

Full Changelog: https://github.com/rustls/rustls-native-certs/compare/v/0.7.1...v/0.7.2

Commits
  • 98612b4 Prepare 0.7.2
  • e8105cc Bump the crates-io group with 2 updates
  • 85a2d7a ci: add smoke-tests workflow
  • e58d2e2 tests: ignore smoketests by default
  • a3bd7f9 Bump the crates-io group across 1 directory with 3 updates
  • 1a6052b lib: add more error context when loading fails
  • e7cbf82 Bump rustls-webpki from 0.102.4 to 0.102.5 in the crates-io group
  • 0d12505 rust: update semver-compatible dependencies
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=rustls-native-certs&package-manager=cargo&previous-version=0.7.1&new-version=0.7.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ffce574b0..133069a2e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3716,9 +3716,9 @@ dependencies = [ [[package]] name = "rustls-native-certs" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a88d6d420651b496bdd98684116959239430022a115c1240e6c3993be0b15fba" +checksum = "04182dffc9091a404e0fc069ea5cd60e5b866c3adf881eff99a32d048242dffa" dependencies = [ "openssl-probe", "rustls-pemfile", From 2b7314f4dc77a4516ca235980ff96256c604dbeb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 Aug 2024 02:47:57 +0000 Subject: [PATCH 106/215] chore(deps): Bump flate2 from 1.0.31 to 1.0.32 (#1479) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [flate2](https://github.com/rust-lang/flate2-rs) from 1.0.31 to 1.0.32.
Release notes

Sourced from flate2's releases.

1.0.32 - turn panic into error

What's Changed

Fix

Other

New Contributors

Full Changelog: https://github.com/rust-lang/flate2-rs/compare/1.0.31...1.0.32

Changelog

Sourced from flate2's changelog.

Changelog

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

Commits
  • 367ec74 Merge pull request #423 from crazymerlyn/memerror
  • 6084e47 Bump version
  • d0fdac5 Return error instead of packing on Z_MEM_ERROR
  • 5d1ecf6 Merge pull request #422 from jongiddy/fix-main-ci
  • 35b4a63 Remove non-existent build in CI
  • d616177 Merge pull request #421 from jongiddy/test-minimal-version
  • 140b285 Check minimal version of Rust that compiles
  • 74b3c73 Merge pull request #419 from Byron/maintenance-guide
  • af8bcdb update maintenance guide with recent news
  • dc6cab4 Merge pull request #420 from oyvindln/update_miniz_oxide
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=flate2&package-manager=cargo&previous-version=1.0.31&new-version=1.0.32)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 133069a2e..640e8e6d6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -227,6 +227,12 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + [[package]] name = "ahash" version = "0.8.11" @@ -476,7 +482,7 @@ dependencies = [ "cc", "cfg-if", "libc", - "miniz_oxide", + "miniz_oxide 0.7.4", "object", "rustc-demangle", ] @@ -1403,12 +1409,12 @@ dependencies = [ [[package]] name = "flate2" -version = "1.0.31" +version = "1.0.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f211bbe8e69bbd0cfdea405084f128ae8b4aaa6b0b522fc8f2b009084797920" +checksum = "9c0596c1eac1f9e04ed902702e9878208b336edc9d6fddc8a48387349bab3666" dependencies = [ "crc32fast", - "miniz_oxide", + "miniz_oxide 0.8.0", ] [[package]] @@ -2538,6 +2544,15 @@ dependencies = [ "simd-adler32", ] +[[package]] +name = "miniz_oxide" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +dependencies = [ + "adler2", +] + [[package]] name = "mio" version = "0.8.11" @@ -3043,7 +3058,7 @@ dependencies = [ "crc32fast", "fdeflate", "flate2", - "miniz_oxide", + "miniz_oxide 0.7.4", ] [[package]] From 8f2645f86a5bd1f2d3cc732c310714ac034d1e14 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 Aug 2024 03:17:54 +0000 Subject: [PATCH 107/215] chore(deps): Bump serde from 1.0.208 to 1.0.209 (#1484) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [serde](https://github.com/serde-rs/serde) from 1.0.208 to 1.0.209.
Release notes

Sourced from serde's releases.

v1.0.209

  • Fix deserialization of empty structs and empty tuples inside of untagged enums (#2805, thanks @​Mingun)
Commits
  • 30752ac Release 1.0.209
  • b84e6ca Improve wording of PR 2805 comments
  • 87a2fb0 Wrap comments from PR 2805 to 80 columns
  • 9eaf7b9 Merge pull request #2805 from Mingun/untagged-tests
  • 7bde100 Replace MapRefDeserializer with value::MapDeserializer
  • da7fc79 Fix deserialization of empty struct variant in untagged enums
  • 4c5fec1 Test special cases that reaches SeqRefDeserializer::deserialize_any len==0 co...
  • 6588b0a Cover Content::Seq case in VariantRefDeserializer::struct_variant
  • 0093f74 Split test newtype_enum into four tests for each variant
  • 171c6da Complete coverage of ContentRefDeserializer::deserialize_newtype_struct
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=serde&package-manager=cargo&previous-version=1.0.208&new-version=1.0.209)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 640e8e6d6..cb4535c1a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3857,18 +3857,18 @@ checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" -version = "1.0.208" +version = "1.0.209" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cff085d2cb684faa248efb494c39b68e522822ac0de72ccf08109abde717cfb2" +checksum = "99fce0ffe7310761ca6bf9faf5115afbc19688edd00171d81b1bb1b116c63e09" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.208" +version = "1.0.209" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24008e81ff7613ed8e5ba0cfaf24e2c2f1e5b8a0495711e44fcd4882fca62bcf" +checksum = "a5831b979fd7b5439637af1752d535ff49f4860c0f341d1baeb6faf0f4242170" dependencies = [ "proc-macro2", "quote", From 9fe1eb239db634c00f4e5c6ef106d3fff1b3bd29 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 Aug 2024 03:18:20 +0000 Subject: [PATCH 108/215] chore(deps): Bump flate2 from 1.0.32 to 1.0.33 (#1485) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [flate2](https://github.com/rust-lang/flate2-rs) from 1.0.32 to 1.0.33.
Release notes

Sourced from flate2's releases.

1.0.33 - fix minimal manifest versions

What's Changed

New Contributors

Full Changelog: https://github.com/rust-lang/flate2-rs/compare/1.0.32...1.0.33

Commits
  • 50852c6 Merge pull request #425 from NobodyXu/patch-1
  • a2df1db bump tested MSRV to 1.63
  • 66c6907 bump patch level for new release that builds with -Zminimal-versions
  • a5d38e8 increase minimal versions of libz-ng-sys and libz-sys to their latest rel...
  • 80fc1e5 Do not check msrv for feature zlib-rs
  • b332bac Run msrv with different features
  • f51da32 Run msrv CI on windows and macos
  • 387b9c6 Fix msrv: Run msrv checks with minimal versions
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=flate2&package-manager=cargo&previous-version=1.0.32&new-version=1.0.33)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index cb4535c1a..73d464e92 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1409,9 +1409,9 @@ dependencies = [ [[package]] name = "flate2" -version = "1.0.32" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c0596c1eac1f9e04ed902702e9878208b336edc9d6fddc8a48387349bab3666" +checksum = "324a1be68054ef05ad64b861cc9eaf1d623d2d8cb25b4bf2cb9cdd902b4bf253" dependencies = [ "crc32fast", "miniz_oxide 0.8.0", From e242c25776a037464336b5e99b194a76a365fc24 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 Aug 2024 03:19:36 +0000 Subject: [PATCH 109/215] chore(deps): Bump serde_json from 1.0.125 to 1.0.127 (#1486) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [serde_json](https://github.com/serde-rs/json) from 1.0.125 to 1.0.127.
Release notes

Sourced from serde_json's releases.

1.0.127

1.0.126

  • Improve string parsing on targets that use 32-bit pointers but also have fast 64-bit integer arithmetic, such as aarch64-unknown-linux-gnu_ilp32 and x86_64-unknown-linux-gnux32 (#1182, thanks @​CryZe)
Commits
  • 5ebf65c Release 1.0.127
  • f287a3b Merge pull request 1179 from GREsau/patch-1
  • ec980b0 Release 1.0.126
  • e6282b0 Merge pull request #1184 from serde-rs/fastarithmetic
  • ffc4a43 Improve cfg names for fast arithmetic
  • 4b1048d Merge pull request #1183 from serde-rs/arithmetic
  • f268173 Unify chunk size choice between float and string parsing
  • fec0376 Merge pull request #1182 from CryZe/chunk-64bit
  • 3d837e1 Ensure the SWAR chunks are 64-bit in more cases
  • 11fc61c Add OccupiedEntry::shift_remove() and swap_remove()
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=serde_json&package-manager=cargo&previous-version=1.0.125&new-version=1.0.127)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 73d464e92..9a6b65da2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3877,9 +3877,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.125" +version = "1.0.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83c8e735a073ccf5be70aa8066aa984eaf2fa000db6c8d0100ae605b366d31ed" +checksum = "8043c06d9f82bd7271361ed64f415fe5e12a77fdb52e573e7f06a516dea329ad" dependencies = [ "itoa", "memchr", From cc690e11a44ee8a1cf059a317a985c9ee9fc5a04 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 29 Aug 2024 02:53:58 +0000 Subject: [PATCH 110/215] chore(deps): Bump rustls-native-certs from 0.7.2 to 0.7.3 (#1490) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [rustls-native-certs](https://github.com/rustls/rustls-native-certs) from 0.7.2 to 0.7.3.
Release notes

Sourced from rustls-native-certs's releases.

0.7.3

Release notes

  • If loading certificates from a directory fails, only raise that error if no certificates were successfully loaded from a file. See #124.

    In 0.8.0 we plan to alter the API to give the caller full error details, so they can choose the level of success they require; see #128.

What's Changed

Full Changelog: https://github.com/rustls/rustls-native-certs/compare/v/0.7.2...v/0.7.3

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=rustls-native-certs&package-manager=cargo&previous-version=0.7.2&new-version=0.7.3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9a6b65da2..5afa2ec90 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3731,9 +3731,9 @@ dependencies = [ [[package]] name = "rustls-native-certs" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04182dffc9091a404e0fc069ea5cd60e5b866c3adf881eff99a32d048242dffa" +checksum = "e5bfb394eeed242e909609f56089eecfe5fda225042e8b171791b9c95f5931e5" dependencies = [ "openssl-probe", "rustls-pemfile", From 554ee0f0c7f25a9c67217d299ec793f0d9b8e84a Mon Sep 17 00:00:00 2001 From: Frank Elsinga Date: Fri, 30 Aug 2024 04:55:55 +0200 Subject: [PATCH 111/215] docs: better differentiation between `image_id` and `sprite_id`s (#1491) made sure that the differences between image and sprite ids is clearer The rationale is that I got stuck here for a bit and got quite confused. After reading the sourcecode, this was much clear. I am a bit too explicite on purpose, feel free to (ask to) revert/reduce/rewrite as you see fit. Docs are never written alone ^^ --- docs/src/sources-sprites.md | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/docs/src/sources-sprites.md b/docs/src/sources-sprites.md index 298b011ea..5b24cb8e1 100644 --- a/docs/src/sources-sprites.md +++ b/docs/src/sources-sprites.md @@ -1,10 +1,11 @@ ## Sprite Sources -Given a directory with SVG images, Martin will generate a sprite -- a JSON index and a PNG image, for both low and high -resolution displays. The SVG filenames without extension will be used as the sprite image IDs. The images are searched -recursively in the given directory, so subdirectory names will be used as prefixes for the image IDs, -e.g. `icons/bicycle.svg` will be available as `icons/bicycle` sprite image. The sprite generation is not yet cached, and -may require external reverse proxy or CDN for faster operation. +Given a directory with SVG images, Martin will generate a sprite -- a JSON index and a PNG image, for both low and highresolution displays. The SVG filenames without extension will be used as the sprites' image IDs (remember that one sprite and thus `sprite_id` contains multiple images). +The images are searched recursively in the given directory, so subdirectory names will be used as prefixes for the image IDs. +For example `icons/bicycle.svg` will be available as `icons/bicycle` sprite image. + +The sprite generation is not yet cached, and may require external reverse proxy or CDN for faster operation. +If you would like to improve this, please drop us a pull request. ### API @@ -12,6 +13,8 @@ Martin uses [MapLibre sprites API](https://maplibre.org/maplibre-style-spec/spri several endpoints. The sprite image and index are generated on the fly, so if the sprite directory is updated, the changes will be reflected immediately. +You can use the `/catalog` api to see all the ``s with their contained sprites. + ##### Sprite PNG ![sprite](sources-sprites.png) @@ -39,14 +42,14 @@ the PNG, there is a high DPI version available at `/sprite/@2x.json`. #### Combining Multiple Sprites -Multiple sprite_id values can be combined into one sprite with the same pattern as for tile +Multiple `sprite_id` values can be combined into one sprite with the same pattern as for tile joining: `/sprite/,,...,`. No ID renaming is done, so identical sprite names will override one another. ### Configuring from CLI A sprite directory can be configured from the CLI with the `--sprite` flag. The flag can be used multiple times to -configure multiple sprite directories. The name of the sprite will be the name of the directory -- in the example below, +configure multiple sprite directories. The `sprite_id` of the sprite will be the name of the directory -- in the example below, the sprites will be available at `/sprite/sprite_a` and `/sprite/sprite_b`. Use `--save-config` to save the configuration to the config file. @@ -63,9 +66,11 @@ how [MBTiles and PMTiles](config-file.md) are configured. # Sprite configuration sprites: paths: - # all SVG files in this dir will be published as a "my_images" sprite source + # all SVG files in this directory will be published under the sprite_id "my_images" - /path/to/my_images sources: - # SVG images in this directory will be published as a "my_sprites" sprite source + # SVG images in this directory will be published under the sprite_id "my_sprites" my_sprites: /path/to/some_dir ``` + +The sprites are now avaliable at `/sprite/my_images,some_dir.png`/ ... From 50d6e2295ac80393c904aa8f581e22de20942e76 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 29 Aug 2024 22:56:19 -0400 Subject: [PATCH 112/215] chore(deps): Bump actix-http from 3.8.0 to 3.9.0 (#1463) Bumps [actix-http](https://github.com/actix/actix-web) from 3.8.0 to 3.9.0.
Release notes

Sourced from actix-http's releases.

actix-http: v3.9.0

Added

  • Implement FromIterator<(HeaderName, HeaderValue)> for HeaderMap.
Commits
  • 9ba326a chore(actix-http): prepare release 3.9.0
  • 882fb3d chore(actors): add version marker in changelog
  • be28a0b feat: add from_fn middleware (#3447)
  • a431b73 feat: add ThinData wrapper (#3446)
  • 5be5382 docs(actors): add maintenance badge
  • d7d9000 chore: address clippy warnings
  • e4e4bb7 chore(actix-web-actors): prepare release 4.3.1
  • 323d1fa build(deps): bump taiki-e/install-action from 2.42.9 to 2.42.17 (#3442)
  • 9aa6211 build(deps): bump taiki-e/install-action from 2.42.4 to 2.42.9 (#3441)
  • 270a6a3 build(deps): bump taiki-e/install-action from 2.41.17 to 2.42.4 (#3440)
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actix-http&package-manager=cargo&previous-version=3.8.0&new-version=3.9.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5afa2ec90..6307d95d4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -36,9 +36,9 @@ dependencies = [ [[package]] name = "actix-http" -version = "3.8.0" +version = "3.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ae682f693a9cd7b058f2b0b5d9a6d7728a8555779bedbbc35dd88528611d020" +checksum = "d48f96fc3003717aeb9856ca3d02a8c7de502667ad76eeacd830b48d2e91fac4" dependencies = [ "actix-codec", "actix-rt", From e7341c6dcfec300821e985e1fd059b697d2b3c1a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 Sep 2024 03:11:01 +0000 Subject: [PATCH 113/215] chore(deps): Bump async-trait from 0.1.81 to 0.1.82 (#1496) Bumps [async-trait](https://github.com/dtolnay/async-trait) from 0.1.81 to 0.1.82.
Release notes

Sourced from async-trait's releases.

0.1.82

  • Prevent elided_named_lifetimes lint being produced in generated code (#276)
Commits
  • f8e5bb4 Release 0.1.82
  • 8fbf118 Merge pull request #276 from dtolnay/elidednamed
  • 6fa246a Ignore nightly's new elided_named_lifetimes lint in generated code
  • d542a0d Upload CI Cargo.lock for reproducing failures
  • 8828c35 Sort dependency features in Cargo.toml
  • ba9793a Update ui test suite to nightly-2024-08-11
  • 82c62cd Update ui test suite to nightly-2024-07-25
  • 370ee12 Update ui test suite to nightly-2024-07-20
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=async-trait&package-manager=cargo&previous-version=0.1.81&new-version=0.1.82)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6307d95d4..9c735e97e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -421,9 +421,9 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.81" +version = "0.1.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" +checksum = "a27b8a3a6e1a44fa4c8baf1f653e4172e81486d4941f2237e20dc2d0cf4ddff1" dependencies = [ "proc-macro2", "quote", From bc3803c6c65ece90635efd0ed9a3eefd904917e5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 Sep 2024 21:16:55 +0000 Subject: [PATCH 114/215] chore(deps): Bump quinn-proto from 0.11.3 to 0.11.8 (#1497) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [quinn-proto](https://github.com/quinn-rs/quinn) from 0.11.3 to 0.11.8.
Release notes

Sourced from quinn-proto's releases.

quinn-proto 0.11.5

What's Changed

quinn-proto 0.11.4

What's Changed

... (truncated)

Commits
  • 7c09b02 proto: bump version to 0.11.8 for release (#1981)
  • 59bccd2 Version bump quinn to enforce patched quinn-proto
  • a8ec510 proto: avoid panicking on rustls server config errors
  • c26e8cd Bump versions
  • e01609c Merge commit from fork
  • c292a3c Fix and test validation of IDCID length
  • bb02a12 fix(.github/android): use API level 26
  • 5e5cc93 fix(.github/android): pass matrix.target and increase api to v26
  • cef42cc fix(udp): typo in sendmsg error log
  • edf16a6 ci(rust.yml): add workflow testing feature permutations
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=quinn-proto&package-manager=cargo&previous-version=0.11.3&new-version=0.11.8)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/maplibre/martin/network/alerts).
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9c735e97e..a951375ac 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -530,7 +530,7 @@ dependencies = [ "bitflags 2.6.0", "cexpr", "clang-sys", - "itertools 0.12.1", + "itertools 0.10.5", "lazy_static", "lazycell", "log", @@ -538,7 +538,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "rustc-hash", + "rustc-hash 1.1.0", "shlex", "syn 2.0.72", "which", @@ -2111,15 +2111,6 @@ dependencies = [ "either", ] -[[package]] -name = "itertools" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" -dependencies = [ - "either", -] - [[package]] name = "itertools" version = "0.13.0" @@ -2292,7 +2283,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" dependencies = [ "cfg-if", - "windows-targets 0.48.5", + "windows-targets 0.52.6", ] [[package]] @@ -2796,7 +2787,7 @@ dependencies = [ "log", "rayon", "rgb", - "rustc-hash", + "rustc-hash 1.1.0", "rustc_version", "zopfli", ] @@ -3330,7 +3321,7 @@ dependencies = [ "pin-project-lite", "quinn-proto", "quinn-udp", - "rustc-hash", + "rustc-hash 1.1.0", "rustls", "thiserror", "tokio", @@ -3339,14 +3330,14 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.3" +version = "0.11.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddf517c03a109db8100448a4be38d498df8a210a99fe0e1b9eaf39e78c640efe" +checksum = "fadfaed2cd7f389d0161bb73eeb07b7b78f8691047a6f3e73caaeae55310a4a6" dependencies = [ "bytes", "rand", "ring", - "rustc-hash", + "rustc-hash 2.0.0", "rustls", "slab", "thiserror", @@ -3691,6 +3682,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +[[package]] +name = "rustc-hash" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" + [[package]] name = "rustc_version" version = "0.4.0" From 015c8d6b5c858c8e1ad0b9d5d417c8391277ba74 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 5 Sep 2024 02:55:35 +0000 Subject: [PATCH 115/215] chore(deps): Bump clap from 4.5.16 to 4.5.17 (#1499) Bumps [clap](https://github.com/clap-rs/clap) from 4.5.16 to 4.5.17.
Release notes

Sourced from clap's releases.

v4.5.17

[4.5.17] - 2024-09-04

Fixes

  • (help) Style required argument groups
  • (derive) Improve error messages when unsupported fields are used
Changelog

Sourced from clap's changelog.

[4.5.17] - 2024-09-04

Fixes

  • (help) Style required argument groups
  • (derive) Improve error messages when unsupported fields are used
Commits
  • 6013ad4 chore: Release
  • f98e3ee docs: Update changelog
  • addec17 Merge pull request #5681 from epage/static
  • 3c69aaa docs(complete): Add stdout warning to env
  • e46263a docs(complete): Redistribute dynamic's documentation
  • de723aa fix(complete)!: Flatten in prep for stabilization
  • 6727c15 fix(complete): Section off existing completions
  • 6842ed9 refactor(complete): Remove low-value w macro
  • 17d6d24 Merge pull request #5680 from epage/unstable
  • 23fb056 Merge pull request #5679 from epage/api
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=clap&package-manager=cargo&previous-version=4.5.16&new-version=4.5.17)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a951375ac..1d57264b7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -776,9 +776,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.16" +version = "4.5.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed6719fffa43d0d87e5fd8caeab59be1554fb028cd30edc88fc4369b17971019" +checksum = "3e5a21b8495e732f1b3c364c9949b201ca7bae518c502c80256c96ad79eaf6ac" dependencies = [ "clap_builder", "clap_derive", @@ -786,9 +786,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.15" +version = "4.5.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "216aec2b177652e3846684cbfe25c9964d18ec45234f0f5da5157b207ed1aab6" +checksum = "8cf2dd12af7a047ad9d6da2b6b249759a22a7abc0f474c1dae1777afa4b21a73" dependencies = [ "anstream", "anstyle", @@ -2283,7 +2283,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" dependencies = [ "cfg-if", - "windows-targets 0.52.6", + "windows-targets 0.48.5", ] [[package]] From ee100e0846c5220dadd6967845530c182863c643 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 5 Sep 2024 03:06:44 +0000 Subject: [PATCH 116/215] chore(deps): Bump serde_json from 1.0.127 to 1.0.128 (#1500) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [serde_json](https://github.com/serde-rs/json) from 1.0.127 to 1.0.128.
Release notes

Sourced from serde_json's releases.

1.0.128

  • Support serializing maps containing 128-bit integer keys to serde_json::Value (#1188, thanks @​Mrreadiness)
Commits
  • d96b1d9 Release 1.0.128
  • 599228d Merge pull request #1188 from Mrreadiness/feat/add-hashmap-key-128-serializer
  • 5416cee feat: add support for 128 bit HashMap key serialization
  • 27a4ca9 Upload CI Cargo.lock for reproducing failures
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=serde_json&package-manager=cargo&previous-version=1.0.127&new-version=1.0.128)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1d57264b7..d06220857 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3874,9 +3874,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.127" +version = "1.0.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8043c06d9f82bd7271361ed64f415fe5e12a77fdb52e573e7f06a516dea329ad" +checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" dependencies = [ "itoa", "memchr", From 542a90003390a19e9d7743aa23ccf2e26ba668cd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Sep 2024 02:58:19 +0000 Subject: [PATCH 117/215] chore(deps): Bump anyhow from 1.0.86 to 1.0.87 (#1504) Bumps [anyhow](https://github.com/dtolnay/anyhow) from 1.0.86 to 1.0.87.
Release notes

Sourced from anyhow's releases.

1.0.87

  • Support more APIs, including Error::new and Error::chain, in no-std mode on Rust 1.81+ (#383)
Commits
  • afe93e7 Release 1.0.87
  • d58fa4b Fix outdated html_root_url
  • c18d807 Disable unused doc_cfg feature
  • 8ecfcdf Merge pull request #383 from dtolnay/nostd
  • bee814a Support error sources in no-std on Rust 1.81+
  • 1eabf69 Merge pull request #382 from dtolnay/corerequest
  • 3e70139 Access generic_member_access APIs through core
  • c378a2c Upload CI Cargo.lock for reproducing failures
  • e38edc0 Raise rustc required for backtrace feature to 1.67
  • eb976a4 Merge pull request #378 from dtolnay/ttpretty
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=anyhow&package-manager=cargo&previous-version=1.0.86&new-version=1.0.87)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d06220857..95e060815 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -348,9 +348,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.86" +version = "1.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" +checksum = "10f00e1f6e58a40e807377c75c6a7f97bf9044fab57816f2414e6f5f4499d7b8" [[package]] name = "approx" From 40d481bd86ba93cbef69a138a3616b351dd437eb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Sep 2024 03:02:38 +0000 Subject: [PATCH 118/215] chore(deps): Bump serde from 1.0.209 to 1.0.210 (#1506) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [serde](https://github.com/serde-rs/serde) from 1.0.209 to 1.0.210.
Release notes

Sourced from serde's releases.

v1.0.210

  • Support serializing and deserializing IpAddr and SocketAddr in no-std mode on Rust 1.77+ (#2816, thanks @​MathiasKoch)
  • Make serde::ser::StdError and serde::de::StdError equivalent to core::error::Error on Rust 1.81+ (#2818)
Commits
  • 89c4b02 Release 1.0.210
  • eeb8e44 Merge pull request #2818 from dtolnay/coreerror
  • 785c2d9 Stabilize no-std StdError trait
  • d549f04 Reformat parse_ip_impl definition and calls
  • 4c0dd63 Delete attr support from core::net deserialization macros
  • 26fb134 Relocate cfg attrs out of parse_ip_impl and parse_socket_impl
  • 07e614b Merge pull request #2817 from dtolnay/corenet
  • b1f899f Delete doc(cfg) attribute from impls that are supported in no-std
  • b4f860e Merge pull request #2816 from MathiasKoch/chore/core-net
  • d940fe1 Reuse existing Buf wrapper as replacement for std::io::Write
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=serde&package-manager=cargo&previous-version=1.0.209&new-version=1.0.210)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 95e060815..06bbcd180 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3854,18 +3854,18 @@ checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" -version = "1.0.209" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99fce0ffe7310761ca6bf9faf5115afbc19688edd00171d81b1bb1b116c63e09" +checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.209" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5831b979fd7b5439637af1752d535ff49f4860c0f341d1baeb6faf0f4242170" +checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ "proc-macro2", "quote", From a6b5ee8a19f788ccbd2bbd06fa3b5493331e41d5 Mon Sep 17 00:00:00 2001 From: Yuri Astrakhan Date: Wed, 11 Sep 2024 15:32:24 -0400 Subject: [PATCH 119/215] Bump all dependencies (#1509) --- Cargo.lock | 554 +++++++++++++++++++++++++++++------------------------ 1 file changed, 308 insertions(+), 246 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 06bbcd180..d9724b63e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -80,7 +80,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn 2.0.72", + "syn 2.0.77", ] [[package]] @@ -111,16 +111,16 @@ dependencies = [ [[package]] name = "actix-server" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b02303ce8d4e8be5b855af6cf3c3a08f3eff26880faad82bab679c22d3650cb5" +checksum = "7ca2549781d8dd6d75c40cf6b6051260a2cc2f3c62343d761a969a0640646894" dependencies = [ "actix-rt", "actix-service", "actix-utils", "futures-core", "futures-util", - "mio 0.8.11", + "mio", "socket2", "tokio", "tracing", @@ -149,9 +149,9 @@ dependencies = [ [[package]] name = "actix-web" -version = "4.8.0" +version = "4.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1988c02af8d2b718c05bc4aeb6a66395b7cdf32858c2c71131e5637a8c05a9ff" +checksum = "9180d76e5cc7ccbc4d60a506f2c727730b154010262df5b910eb17dbe4b8cb38" dependencies = [ "actix-codec", "actix-http", @@ -171,6 +171,7 @@ dependencies = [ "encoding_rs", "futures-core", "futures-util", + "impl-more", "itoa", "language-tags", "log", @@ -197,7 +198,7 @@ dependencies = [ "actix-router", "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.77", ] [[package]] @@ -214,9 +215,9 @@ dependencies = [ [[package]] name = "addr2line" -version = "0.22.0" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" +checksum = "f5fb1d8e4442bd405fdfd1dacb42792696b0cf9cb15882e5d097b742a676d375" dependencies = [ "gimli", ] @@ -348,9 +349,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.87" +version = "1.0.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10f00e1f6e58a40e807377c75c6a7f97bf9044fab57816f2414e6f5f4499d7b8" +checksum = "4e1496f8fb1fbf272686b8d37f523dab3e4a7443300055e74cdaa449f3114356" [[package]] name = "approx" @@ -369,9 +370,9 @@ checksum = "9d151e35f61089500b617991b791fc8bfd237ae50cd5950803758a179b41e67a" [[package]] name = "arrayvec" -version = "0.7.4" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] name = "async-compression" @@ -416,7 +417,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.77", ] [[package]] @@ -427,7 +428,7 @@ checksum = "a27b8a3a6e1a44fa4c8baf1f653e4172e81486d4941f2237e20dc2d0cf4ddff1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.77", ] [[package]] @@ -447,9 +448,9 @@ checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[package]] name = "aws-lc-rs" -version = "1.8.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ae74d9bd0a7530e8afd1770739ad34b36838829d6ad61818f9230f683f5ad77" +checksum = "2f95446d919226d587817a7d21379e6eb099b97b45110a7f272a444ca5c54070" dependencies = [ "aws-lc-sys", "mirai-annotations", @@ -459,9 +460,9 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.20.0" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e89b6941c2d1a7045538884d6e760ccfffdf8e1ffc2613d8efa74305e1f3752" +checksum = "234314bd569802ec87011d653d6815c6d7b9ffb969e9fee5b8b20ef860e8dce9" dependencies = [ "bindgen", "cc", @@ -474,17 +475,17 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.73" +version = "0.3.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" dependencies = [ "addr2line", - "cc", "cfg-if", "libc", - "miniz_oxide 0.7.4", + "miniz_oxide 0.8.0", "object", "rustc-demangle", + "windows-targets 0.52.6", ] [[package]] @@ -530,7 +531,7 @@ dependencies = [ "bitflags 2.6.0", "cexpr", "clang-sys", - "itertools 0.10.5", + "itertools 0.12.1", "lazy_static", "lazycell", "log", @@ -540,7 +541,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.72", + "syn 2.0.77", "which", ] @@ -651,9 +652,9 @@ checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytemuck" -version = "1.16.1" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b236fc92302c97ed75b38da1f4917b5cdda4984745740f153a5d3059e48d725e" +checksum = "94bbb0ad554ad961ddc5da507a12a29b14e4ae5bda06b19f575a3e6079d2e2ae" [[package]] name = "byteorder" @@ -663,9 +664,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.6.1" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a12916984aab3fa6e39d655a33e09c0071eb36d6ab3aea5c2d78551f1df6d952" +checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" [[package]] name = "bytestring" @@ -690,12 +691,13 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.1.7" +version = "1.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26a5c3fd7bfa1ce3897a3a3501d362b2d87b7f2583ebcb4a949ec25911025cbc" +checksum = "b62ac837cdb5cb22e10a256099b4fc502b1dfe560cb282963a974d7abd80e476" dependencies = [ "jobserver", "libc", + "shlex", ] [[package]] @@ -805,7 +807,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.77", ] [[package]] @@ -826,9 +828,9 @@ dependencies = [ [[package]] name = "cmake" -version = "0.1.50" +version = "0.1.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130" +checksum = "fb1e43aa7fd152b1f968787f7dbcdeb306d1867ff373c69955211876c053f91a" dependencies = [ "cc", ] @@ -910,24 +912,24 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpp_demangle" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8227005286ec39567949b33df9896bcadfa6051bccca2488129f108ca23119" +checksum = "96e58d342ad113c2b878f16d5d034c03be492ae460cdbc02b7f0f2284d310c7d" dependencies = [ "cfg-if", ] [[package]] name = "cpufeatures" -version = "0.2.12" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" dependencies = [ "libc", ] @@ -1066,7 +1068,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edb49164822f3ee45b17acd4a208cfc1251410cf0cad9a833234c9890774dd9f" dependencies = [ "quote", - "syn 2.0.72", + "syn 2.0.77", ] [[package]] @@ -1090,7 +1092,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.72", + "syn 2.0.77", ] [[package]] @@ -1101,7 +1103,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.72", + "syn 2.0.77", ] [[package]] @@ -1184,7 +1186,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.72", + "syn 2.0.77", ] [[package]] @@ -1213,9 +1215,9 @@ checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" [[package]] name = "dunce" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" [[package]] name = "either" @@ -1270,7 +1272,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.77", ] [[package]] @@ -1370,9 +1372,9 @@ checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" [[package]] name = "fastrand" -version = "2.1.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" +checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" [[package]] name = "fdeflate" @@ -1385,14 +1387,14 @@ dependencies = [ [[package]] name = "filetime" -version = "0.2.23" +version = "0.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd" +checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.4.1", - "windows-sys 0.52.0", + "libredox", + "windows-sys 0.59.0", ] [[package]] @@ -1612,7 +1614,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.77", ] [[package]] @@ -1695,9 +1697,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.29.0" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" +checksum = "32085ea23f3234fc7846555e85283ba4de91e21016dc0455a16286d87a292d64" [[package]] name = "glob" @@ -1717,7 +1719,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.2.6", + "indexmap 2.5.0", "slab", "tokio", "tokio-util", @@ -1780,6 +1782,12 @@ version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" +[[package]] +name = "hermit-abi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" + [[package]] name = "hex" version = "0.4.3" @@ -1937,16 +1945,16 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.2" +version = "0.27.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee4be2c948921a1a5320b629c4193916ed787a7f7f293fd3f7f5a6c9de74155" +checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" dependencies = [ "futures-util", "http 1.1.0", "hyper 1.4.1", "hyper-util", "rustls", - "rustls-native-certs", + "rustls-native-certs 0.8.0", "rustls-pki-types", "tokio", "tokio-rustls", @@ -1955,9 +1963,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ab92f4f49ee4fb4f997c784b7a2e0fa70050211e0b6a287f898c3c9785ca956" +checksum = "da62f120a8a37763efb0cf8fdf264b884c7b8b9ac8660b900c8661030c00e6ba" dependencies = [ "bytes", "futures-channel", @@ -2018,6 +2026,12 @@ version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "029d73f573d8e8d63e6d5020011d3255b28c3ba85d6cf870a07184ed23de9284" +[[package]] +name = "impl-more" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "206ca75c9c03ba3d4ace2460e57b189f39f43de612c2f85836e65c929701bb2d" + [[package]] name = "indexmap" version = "1.9.3" @@ -2031,9 +2045,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.2.6" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5" dependencies = [ "equivalent", "hashbrown 0.14.5", @@ -2049,12 +2063,12 @@ checksum = "b248f5224d1d606005e02c97f5aa4e88eeb230488bcc03bc9ca4d7991399f2b5" [[package]] name = "inferno" -version = "0.11.20" +version = "0.11.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c77a3ae7d4761b9c64d2c030f70746ceb8cfba32dce0325a56792e0a4816c31" +checksum = "232929e1d75fe899576a3d5c7416ad0d88dbfbb3c3d6aa00873a7408a50ddb88" dependencies = [ "ahash", - "indexmap 2.2.6", + "indexmap 2.5.0", "is-terminal", "itoa", "log", @@ -2067,9 +2081,9 @@ dependencies = [ [[package]] name = "insta" -version = "1.39.0" +version = "1.40.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "810ae6042d48e2c9e9215043563a58a80b877bc863228a74cf10c49d4620a6f5" +checksum = "6593a41c7a73841868772495db7dc1e8ecab43bb5c0b6da2059246c4b506ab60" dependencies = [ "console", "lazy_static", @@ -2081,17 +2095,17 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.9.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +checksum = "187674a687eed5fe42285b40c6291f9a01517d415fad1c3cbc6a9f778af7fcd4" [[package]] name = "is-terminal" -version = "0.4.12" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" +checksum = "261f68e344040fbd0edea105bef17c66edf46f984ddb1115b775ce31be948f4b" dependencies = [ - "hermit-abi", + "hermit-abi 0.4.0", "libc", "windows-sys 0.52.0", ] @@ -2111,6 +2125,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + [[package]] name = "itertools" version = "0.13.0" @@ -2143,9 +2166,9 @@ checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" [[package]] name = "js-sys" -version = "0.3.69" +version = "0.3.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" dependencies = [ "wasm-bindgen", ] @@ -2254,24 +2277,24 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.155" +version = "0.2.158" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" +checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" [[package]] name = "libdeflate-sys" -version = "1.20.0" +version = "1.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "669ea17f9257bcb48c09c7ee4bef3957777504acffac557263e20c11001977bc" +checksum = "7b14a6afa4e2e1d343fd793a1c0a7e5857a73a2697c2ff2c98ac00d6c4ecc820" dependencies = [ "cc", ] [[package]] name = "libdeflater" -version = "1.20.0" +version = "1.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8dfd6424f7010ee0a3416f1d796d0450e3ad3ac237a237644f728277c4ded016" +checksum = "a17fe2badabdaf756f620748311e99ef99a5fdd681562dfd343fdb16ed7d4797" dependencies = [ "libdeflate-sys", ] @@ -2283,7 +2306,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" dependencies = [ "cfg-if", - "windows-targets 0.48.5", + "windows-targets 0.52.6", ] [[package]] @@ -2292,6 +2315,17 @@ version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.6.0", + "libc", + "redox_syscall", +] + [[package]] name = "libsqlite3-sys" version = "0.27.0" @@ -2393,7 +2427,7 @@ dependencies = [ "regex", "rstest", "rustls", - "rustls-native-certs", + "rustls-native-certs 0.7.3", "rustls-pemfile", "semver", "serde", @@ -2546,25 +2580,14 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.11" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" dependencies = [ + "hermit-abi 0.3.9", "libc", "log", "wasi", - "windows-sys 0.48.0", -] - -[[package]] -name = "mio" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4569e456d394deccd22ce1c1913e6ea0e54519f577285001215d33557431afe4" -dependencies = [ - "hermit-abi", - "libc", - "wasi", "windows-sys 0.52.0", ] @@ -2740,15 +2763,15 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi", + "hermit-abi 0.3.9", "libc", ] [[package]] name = "object" -version = "0.36.2" +version = "0.36.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f203fa8daa7bb185f760ae12bd8e097f63d17041dcdcaf675ac54cdf863170e" +checksum = "084f1a5821ac4c651660a94a7153d27ac9d8a53736203f58b31945ded098070a" dependencies = [ "memchr", ] @@ -2782,7 +2805,7 @@ dependencies = [ "clap_mangen", "crossbeam-channel", "filetime", - "indexmap 2.2.6", + "indexmap 2.5.0", "libdeflater", "log", "rayon", @@ -2794,9 +2817,9 @@ dependencies = [ [[package]] name = "parking" -version = "2.2.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "parking_lot" @@ -2816,7 +2839,7 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.3", + "redox_syscall", "smallvec", "windows-targets 0.52.6", ] @@ -2844,7 +2867,7 @@ dependencies = [ "regex", "regex-syntax 0.7.5", "structmeta", - "syn 2.0.72", + "syn 2.0.77", ] [[package]] @@ -2950,7 +2973,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.77", ] [[package]] @@ -2994,9 +3017,9 @@ checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] name = "plotters" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a15b6eccb8484002195a3e44fe65a4ce8e93a625797a063735536fd59cb01cf3" +checksum = "5aeb6f403d7a4911efb1e33402027fc44f29b5bf6def3effcc22d7bb75f2b747" dependencies = [ "num-traits", "plotters-backend", @@ -3007,15 +3030,15 @@ dependencies = [ [[package]] name = "plotters-backend" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "414cec62c6634ae900ea1c56128dfe87cf63e7caece0852ec76aba307cebadb7" +checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a" [[package]] name = "plotters-svg" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81b30686a7d9c3e010b84284bdd26a29f2138574f52f5eb6f794fc0ad924e705" +checksum = "51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670" dependencies = [ "plotters-backend", ] @@ -3140,12 +3163,11 @@ dependencies = [ [[package]] name = "ppv-lite86" -version = "0.2.19" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2288c0e17cc8d342c712bb43a257a80ebffce59cdb33d5000d8348f3ec02528b" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" dependencies = [ "zerocopy", - "zerocopy-derive", ] [[package]] @@ -3160,19 +3182,19 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.20" +version = "0.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" +checksum = "479cf940fbbb3426c32c5d5176f62ad57549a0bb84773423ba8be9d089f5faba" dependencies = [ "proc-macro2", - "syn 2.0.72", + "syn 2.0.77", ] [[package]] name = "proc-macro-crate" -version = "3.1.0" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" +checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" dependencies = [ "toml_edit", ] @@ -3188,9 +3210,9 @@ dependencies = [ [[package]] name = "protobuf" -version = "3.5.0" +version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df67496db1a89596beaced1579212e9b7c53c22dca1d9745de00ead76573d514" +checksum = "0bcc343da15609eaecd65f8aa76df8dc4209d325131d8219358c0aaaebab0bf6" dependencies = [ "once_cell", "protobuf-support", @@ -3199,9 +3221,9 @@ dependencies = [ [[package]] name = "protobuf-codegen" -version = "3.5.0" +version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eab09155fad2d39333d3796f67845d43e29b266eea74f7bc93f153f707f126dc" +checksum = "c4d0cde5642ea4df842b13eb9f59ea6fafa26dcb43e3e1ee49120e9757556189" dependencies = [ "anyhow", "once_cell", @@ -3214,12 +3236,12 @@ dependencies = [ [[package]] name = "protobuf-parse" -version = "3.5.0" +version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a16027030d4ec33e423385f73bb559821827e9ec18c50e7874e4d6de5a4e96f" +checksum = "1b0e9b447d099ae2c4993c0cbb03c7a9d6c937b17f2d56cfc0b1550e6fcfdb76" dependencies = [ "anyhow", - "indexmap 2.2.6", + "indexmap 2.5.0", "log", "protobuf", "protobuf-support", @@ -3230,9 +3252,9 @@ dependencies = [ [[package]] name = "protobuf-support" -version = "3.5.0" +version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70e2d30ab1878b2e72d1e2fc23ff5517799c9929e2cf81a8516f9f4dcf2b9cf3" +checksum = "f0766e3675a627c327e4b3964582594b0e8741305d628a98a5de75a1d15f99b9" dependencies = [ "thiserror", ] @@ -3313,16 +3335,17 @@ dependencies = [ [[package]] name = "quinn" -version = "0.11.2" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4ceeeeabace7857413798eb1ffa1e9c905a9946a57d81fb69b4b71c4d8eb3ad" +checksum = "8c7c5fdde3cdae7203427dc4f0a68fe0ed09833edc525a03456b153b79828684" dependencies = [ "bytes", "pin-project-lite", "quinn-proto", "quinn-udp", - "rustc-hash 1.1.0", + "rustc-hash 2.0.0", "rustls", + "socket2", "thiserror", "tokio", "tracing", @@ -3347,21 +3370,22 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.4" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bffec3605b73c6f1754535084a85229fa8a30f86014e6c81aeec4abb68b0285" +checksum = "4fe68c2e9e1a1234e218683dbdf9f9dfcb094113c5ac2b938dfcb9bab4c4140b" dependencies = [ "libc", "once_cell", "socket2", - "windows-sys 0.52.0", + "tracing", + "windows-sys 0.59.0", ] [[package]] name = "quote" -version = "1.0.36" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" dependencies = [ "proc-macro2", ] @@ -3437,15 +3461,6 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b42e27ef78c35d3998403c1d26f3efd9e135d3e5121b0a4845cc5cc27547f4f" -[[package]] -name = "redox_syscall" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" -dependencies = [ - "bitflags 1.3.2", -] - [[package]] name = "redox_syscall" version = "0.5.3" @@ -3504,9 +3519,9 @@ checksum = "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2" [[package]] name = "reqwest" -version = "0.12.5" +version = "0.12.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7d6d2a27d57148378eb5e111173f4276ad26340ecc5c49a4a2152167a2d6a37" +checksum = "f8f4955649ef5c38cc7f9e8aa41761d48fb9677197daea9984dc54f56aad5e63" dependencies = [ "base64 0.22.1", "bytes", @@ -3527,7 +3542,7 @@ dependencies = [ "pin-project-lite", "quinn", "rustls", - "rustls-native-certs", + "rustls-native-certs 0.7.3", "rustls-pemfile", "rustls-pki-types", "serde", @@ -3541,7 +3556,7 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "winreg", + "windows-registry", ] [[package]] @@ -3563,9 +3578,9 @@ dependencies = [ [[package]] name = "rgb" -version = "0.8.45" +version = "0.8.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ade4539f42266ded9e755c605bdddf546242b2c961b03b06a7375260788a0523" +checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" dependencies = [ "bytemuck", ] @@ -3652,7 +3667,7 @@ dependencies = [ "regex", "relative-path", "rustc_version", - "syn 2.0.72", + "syn 2.0.77", "unicode-ident", ] @@ -3690,18 +3705,18 @@ checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" [[package]] name = "rustc_version" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ "semver", ] [[package]] name = "rustix" -version = "0.38.34" +version = "0.38.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" dependencies = [ "bitflags 2.6.0", "errno", @@ -3712,9 +3727,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.12" +version = "0.23.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c58f8c84392efc0a126acce10fa59ff7b3d2ac06ab451a33f2741989b806b044" +checksum = "f2dabaac7466917e566adb06783a81ca48944c6898a1b08b9374106dd671f4c8" dependencies = [ "aws-lc-rs", "log", @@ -3739,6 +3754,19 @@ dependencies = [ "security-framework", ] +[[package]] +name = "rustls-native-certs" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcaf18a4f2be7326cd874a5fa579fae794320a0f388d365dca7e480e55f83f8a" +dependencies = [ + "openssl-probe", + "rustls-pemfile", + "rustls-pki-types", + "schannel", + "security-framework", +] + [[package]] name = "rustls-pemfile" version = "2.1.3" @@ -3751,15 +3779,15 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" +checksum = "fc0a2ce646f8655401bb81e7927b812614bd5d91dbc968696be50603510fcaf0" [[package]] name = "rustls-webpki" -version = "0.102.6" +version = "0.102.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e6b52d4fda176fd835fdc55a835d4a89b8499cad995885a21149d5ad62f852e" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" dependencies = [ "aws-lc-rs", "ring", @@ -3800,11 +3828,11 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +checksum = "e9aaafd5a2b6e3d657ff009d82fbd630b6bd54dd4eb06f21693925cdf80f9b8b" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -3869,7 +3897,7 @@ checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.77", ] [[package]] @@ -3927,7 +3955,7 @@ dependencies = [ "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.2.6", + "indexmap 2.5.0", "serde", "serde_derive", "serde_json", @@ -3944,7 +3972,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.77", ] [[package]] @@ -3953,7 +3981,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.2.6", + "indexmap 2.5.0", "itoa", "ryu", "serde", @@ -4116,9 +4144,9 @@ dependencies = [ [[package]] name = "sqlformat" -version = "0.2.4" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f895e3734318cc55f1fe66258926c9b910c124d47520339efecbb6c59cec7c1f" +checksum = "7bba3a93db0cc4f7bdece8bb09e77e2e785c20bfebf79eb8340ed80708048790" dependencies = [ "nom", "unicode_categories", @@ -4181,7 +4209,7 @@ dependencies = [ "futures-util", "hashlink", "hex", - "indexmap 2.2.6", + "indexmap 2.5.0", "log", "memchr", "once_cell", @@ -4398,7 +4426,7 @@ dependencies = [ "proc-macro2", "quote", "structmeta-derive", - "syn 2.0.72", + "syn 2.0.77", ] [[package]] @@ -4409,7 +4437,7 @@ checksum = "a60bcaff7397072dca0017d1db428e30d5002e00b6847703e2e42005c95fbe00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.77", ] [[package]] @@ -4442,9 +4470,9 @@ dependencies = [ [[package]] name = "symbolic-common" -version = "12.10.0" +version = "12.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16629323a4ec5268ad23a575110a724ad4544aae623451de600c747bf87b36cf" +checksum = "9c1db5ac243c7d7f8439eb3b8f0357888b37cf3732957e91383b0ad61756374e" dependencies = [ "debugid", "memmap2 0.9.4", @@ -4454,9 +4482,9 @@ dependencies = [ [[package]] name = "symbolic-demangle" -version = "12.10.0" +version = "12.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c043a45f08f41187414592b3ceb53fb0687da57209cc77401767fb69d5b596" +checksum = "ea26e430c27d4a8a5dea4c4b81440606c7c1a415bd611451ef6af8c81416afc3" dependencies = [ "cpp_demangle", "rustc-demangle", @@ -4476,9 +4504,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.72" +version = "2.0.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc4b9b9bf2add8093d3f2c0204471e951b2285580335de42f9d2534f3ae7a8af" +checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" dependencies = [ "proc-macro2", "quote", @@ -4490,6 +4518,9 @@ name = "sync_wrapper" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" +dependencies = [ + "futures-core", +] [[package]] name = "tagptr" @@ -4505,14 +4536,15 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tempfile" -version = "3.10.1" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" +checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" dependencies = [ "cfg-if", "fastrand", + "once_cell", "rustix", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -4532,7 +4564,7 @@ checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.77", ] [[package]] @@ -4631,14 +4663,14 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.39.3" +version = "1.40.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9babc99b9923bfa4804bd74722ff02c0381021eafa4db9949217e3be8e84fff5" +checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" dependencies = [ "backtrace", "bytes", "libc", - "mio 1.0.1", + "mio", "parking_lot", "pin-project-lite", "signal-hook-registry", @@ -4655,7 +4687,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.77", ] [[package]] @@ -4711,9 +4743,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.15" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" +checksum = "4f4e6ce100d0eb49a2734f8c0812bcd324cf357d21810932c5df6b96ef2b86f1" dependencies = [ "futures-core", "pin-project-lite", @@ -4722,9 +4754,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.11" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" +checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" dependencies = [ "bytes", "futures-core", @@ -4750,11 +4782,11 @@ checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" [[package]] name = "toml_edit" -version = "0.21.1" +version = "0.22.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" +checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d" dependencies = [ - "indexmap 2.2.6", + "indexmap 2.5.0", "toml_datetime", "winnow", ] @@ -4777,15 +4809,15 @@ dependencies = [ [[package]] name = "tower-layer" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" [[package]] name = "tower-service" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" @@ -4807,7 +4839,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.77", ] [[package]] @@ -4872,9 +4904,9 @@ checksum = "cc2520efa644f8268dce4dcd3050eaa7fc044fca03961e9998ac7e2e92b77cf1" [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" [[package]] name = "unicode-normalization" @@ -4887,9 +4919,9 @@ dependencies = [ [[package]] name = "unicode-properties" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4259d9d4425d9f0661581b804cb85fe66a4c631cadd8f490d1c13a35d5d9291" +checksum = "52ea75f83c0137a9b98608359a5f1af8144876eb67bcb1ce837368e906a9f524" [[package]] name = "unicode-script" @@ -5077,34 +5109,35 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" dependencies = [ "cfg-if", + "once_cell", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.77", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.42" +version = "0.4.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" dependencies = [ "cfg-if", "js-sys", @@ -5114,9 +5147,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -5124,28 +5157,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.77", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" +checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" [[package]] name = "web-sys" -version = "0.3.69" +version = "0.3.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" dependencies = [ "js-sys", "wasm-bindgen", @@ -5171,11 +5204,11 @@ dependencies = [ [[package]] name = "whoami" -version = "1.5.1" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44ab49fad634e88f55bf8f9bb3abd2f27d7204172a112c7c9987e01c1c94ea9" +checksum = "372d5b87f58ec45c384ba03563b03544dc5fadc3983e434b286913f5b4a9bb6d" dependencies = [ - "redox_syscall 0.4.1", + "redox_syscall", "wasite", "web-sys", ] @@ -5198,11 +5231,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -5220,6 +5253,36 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-registry" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" +dependencies = [ + "windows-result", + "windows-strings", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result", + "windows-targets 0.52.6", +] + [[package]] name = "windows-sys" version = "0.48.0" @@ -5238,6 +5301,15 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + [[package]] name = "windows-targets" version = "0.48.5" @@ -5361,23 +5433,13 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.5.40" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f" dependencies = [ "memchr", ] -[[package]] -name = "winreg" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - [[package]] name = "wyz" version = "0.5.1" @@ -5448,7 +5510,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.77", ] [[package]] @@ -5468,7 +5530,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.77", ] [[package]] @@ -5496,18 +5558,18 @@ dependencies = [ [[package]] name = "zstd-safe" -version = "7.2.0" +version = "7.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa556e971e7b568dc775c136fc9de8c779b1c2fc3a63defaafadffdbd3181afa" +checksum = "54a3ab4db68cea366acc5c897c7b4d4d1b8994a9cd6e6f841f8964566a419059" dependencies = [ "zstd-sys", ] [[package]] name = "zstd-sys" -version = "2.0.12+zstd.1.5.6" +version = "2.0.13+zstd.1.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a4e40c320c3cb459d9a9ff6de98cff88f4751ee9275d140e2be94a2b74e4c13" +checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa" dependencies = [ "cc", "pkg-config", From 9f06f552bc2c48a4f9e40cd134330af3b4c022cc Mon Sep 17 00:00:00 2001 From: Yuri Astrakhan Date: Wed, 11 Sep 2024 18:46:48 -0400 Subject: [PATCH 120/215] Bump a few more dependencies (#1510) --- Cargo.lock | 10 +++++----- Cargo.toml | 4 ++-- justfile | 26 +++++++++++++++----------- martin/src/pg/errors.rs | 4 ++-- martin/src/pg/tls.rs | 8 +++++--- 5 files changed, 29 insertions(+), 23 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d9724b63e..fcf68de1f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2427,7 +2427,7 @@ dependencies = [ "regex", "rstest", "rustls", - "rustls-native-certs 0.7.3", + "rustls-native-certs 0.8.0", "rustls-pemfile", "semver", "serde", @@ -3643,9 +3643,9 @@ dependencies = [ [[package]] name = "rstest" -version = "0.21.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afd55a67069d6e434a95161415f5beeada95a01c7b815508a82dcb0e1593682" +checksum = "7b423f0e62bdd61734b67cd21ff50871dfaeb9cc74f869dcd6af974fbcb19936" dependencies = [ "futures", "futures-timer", @@ -3655,9 +3655,9 @@ dependencies = [ [[package]] name = "rstest_macros" -version = "0.21.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4165dfae59a39dd41d8dec720d3cbfbc71f69744efb480a3920f5d4e0cc6798d" +checksum = "c5e1711e7d14f74b12a58411c542185ef7fb7f2e7f8ee6e2940a883628522b42" dependencies = [ "cfg-if", "glob", diff --git a/Cargo.toml b/Cargo.toml index d2ad2760a..6b5753b36 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -65,11 +65,11 @@ postgres-protocol = "0.6" pprof = { version = "0.13", features = ["flamegraph", "criterion"] } pretty_assertions = "1" regex = "1" -rstest = "0.21" +rstest = "0.22" rustls = "0.23.12" # ring feature does not require NASM windows executable, but works slower #rustls = { version = "0.23", default-features = false, features = ["logging", "std", "tls12", "ring"] } -rustls-native-certs = "0.7" +rustls-native-certs = "0.8" rustls-pemfile = "2" semver = "1" serde = { version = "1", features = ["derive"] } diff --git a/justfile b/justfile index 7fa1989c8..2603782b2 100644 --- a/justfile +++ b/justfile @@ -299,16 +299,16 @@ fmt2: # Run cargo check check: - RUSTFLAGS='-D warnings' cargo check --bins --tests --lib --benches --examples -p martin-tile-utils - RUSTFLAGS='-D warnings' cargo check --bins --tests --lib --benches --examples -p mbtiles - RUSTFLAGS='-D warnings' cargo check --bins --tests --lib --benches --examples -p mbtiles --no-default-features - RUSTFLAGS='-D warnings' cargo check --bins --tests --lib --benches --examples -p martin - RUSTFLAGS='-D warnings' cargo check --bins --tests --lib --benches --examples -p martin --no-default-features - RUSTFLAGS='-D warnings' cargo check --bins --tests --lib --benches --examples -p martin --no-default-features --features fonts - RUSTFLAGS='-D warnings' cargo check --bins --tests --lib --benches --examples -p martin --no-default-features --features mbtiles - RUSTFLAGS='-D warnings' cargo check --bins --tests --lib --benches --examples -p martin --no-default-features --features pmtiles - RUSTFLAGS='-D warnings' cargo check --bins --tests --lib --benches --examples -p martin --no-default-features --features postgres - RUSTFLAGS='-D warnings' cargo check --bins --tests --lib --benches --examples -p martin --no-default-features --features sprites + RUSTFLAGS='-D warnings' cargo check --all-targets -p martin-tile-utils + RUSTFLAGS='-D warnings' cargo check --all-targets -p mbtiles + RUSTFLAGS='-D warnings' cargo check --all-targets -p mbtiles --no-default-features + RUSTFLAGS='-D warnings' cargo check --all-targets -p martin + RUSTFLAGS='-D warnings' cargo check --all-targets -p martin --no-default-features + RUSTFLAGS='-D warnings' cargo check --all-targets -p martin --no-default-features --features fonts + RUSTFLAGS='-D warnings' cargo check --all-targets -p martin --no-default-features --features mbtiles + RUSTFLAGS='-D warnings' cargo check --all-targets -p martin --no-default-features --features pmtiles + RUSTFLAGS='-D warnings' cargo check --all-targets -p martin --no-default-features --features postgres + RUSTFLAGS='-D warnings' cargo check --all-targets -p martin --no-default-features --features sprites # Verify doc build check-doc: @@ -316,13 +316,17 @@ check-doc: # Run cargo clippy clippy: - cargo clippy --workspace --all-targets --bins --tests --lib --benches --examples -- -D warnings + cargo clippy --workspace --all-targets -- -D warnings # Validate markdown URLs with markdown-link-check clippy-md: docker run -it --rm -v ${PWD}:/workdir --entrypoint sh ghcr.io/tcort/markdown-link-check -c \ 'echo -e "/workdir/README.md\n$(find /workdir/docs/src -name "*.md")" | tr "\n" "\0" | xargs -0 -P 5 -n1 -I{} markdown-link-check --config /workdir/.github/files/markdown.links.config.json {}' +# Update all dependencies including the breaking ones +update-breaking: + cargo +nightly -Z unstable-options update --breaking + # These steps automatically run before git push via a git hook git-pre-push: env-info restart fmt clippy check-doc test check diff --git a/martin/src/pg/errors.rs b/martin/src/pg/errors.rs index 37cd6e7c0..69fc0fb91 100644 --- a/martin/src/pg/errors.rs +++ b/martin/src/pg/errors.rs @@ -13,8 +13,8 @@ pub type PgResult = Result; #[derive(thiserror::Error, Debug)] pub enum PgError { - #[error("Cannot load platform root certificates: {0}")] - CannotLoadRoots(#[source] io::Error), + #[error("Cannot load platform root certificates: {0:?}")] + CannotLoadRoots(Vec), #[error("Cannot open certificate file {}: {0}", .1.display())] CannotOpenCert(#[source] io::Error, PathBuf), diff --git a/martin/src/pg/tls.rs b/martin/src/pg/tls.rs index 894373c06..84e2e2d90 100644 --- a/martin/src/pg/tls.rs +++ b/martin/src/pg/tls.rs @@ -9,7 +9,6 @@ use deadpool_postgres::tokio_postgres::Config; use log::{info, warn}; use regex::Regex; use rustls::client::danger::{HandshakeSignatureValid, ServerCertVerified, ServerCertVerifier}; -// use rustls::crypto::ring::default_provider; use rustls::crypto::aws_lc_rs::default_provider; use rustls::crypto::{verify_tls12_signature, verify_tls13_signature}; use rustls::pki_types::{CertificateDer, ServerName, UnixTime}; @@ -156,8 +155,11 @@ pub fn make_connector( } if verify_ca || pg_certs.ssl_root_cert.is_some() || pg_certs.ssl_cert.is_some() { - let certs = load_native_certs().map_err(CannotLoadRoots)?; - for cert in certs { + let certs = load_native_certs(); + if !certs.errors.is_empty() { + return Err(CannotLoadRoots(certs.errors)); + } + for cert in certs.certs { roots.add(cert)?; } } From 69c2a2e31b44bbe49f10b2953171262c3070e3e7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Sep 2024 18:49:38 -0400 Subject: [PATCH 121/215] chore(deps): Bump DavidAnson/markdownlint-cli2-action from 16 to 17 (#1511) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [DavidAnson/markdownlint-cli2-action](https://github.com/davidanson/markdownlint-cli2-action) from 16 to 17.
Release notes

Sourced from DavidAnson/markdownlint-cli2-action's releases.

Update markdownlint version (markdownlint-cli2 v0.14.0, markdownlint v0.35.0).

No release notes provided.

Update markdownlint version (markdownlint-cli2 v0.13.0, markdownlint v0.34.0).

No release notes provided.

Update markdownlint version (markdownlint-cli2 v0.12.1, markdownlint v0.33.0).

Update markdownlint version (markdownlint-cli2 v0.11.0, markdownlint v0.32.1), remove deprecated "command" input.

No release notes provided.

Update markdownlint version (markdownlint-cli2 v0.10.0, markdownlint v0.31.1).

No release notes provided.

Update markdownlint version (markdownlint-cli2 v0.9.2, markdownlint v0.30.0).

No release notes provided.

Update markdownlint version (markdownlint-cli2 v0.8.1, markdownlint v0.29.0), add "config" and "fix" inputs, deprecate "command" input.

No release notes provided.

Update markdownlint version (markdownlint-cli2 v0.7.1, markdownlint v0.28.2).

No release notes provided.

Update markdownlint version (markdownlint-cli2 v0.7.0, markdownlint v0.28.1), include link to rule information in title of annotations (clickable in GitHub).

No release notes provided.

Update markdownlint version (markdownlint-cli2 v0.6.0, markdownlint v0.27.0).

No release notes provided.

Update markdownlint version (markdownlint-cli2 v0.5.1, markdownlint v0.26.2).

No release notes provided.

Update markdownlint version (markdownlint-cli2 v0.4.0, markdownlint v0.25.1)

No release notes provided.

Commits
  • db43aef Update to version 17.0.0.
  • c0decc5 Bump @​stylistic/eslint-plugin from 2.7.2 to 2.8.0
  • dd2171b Bump eslint from 9.9.1 to 9.10.0
  • 85b2286 Bump @​eslint/js from 9.9.1 to 9.10.0
  • 95aa6ed Freshen generated index.js file.
  • 476aead Bump markdownlint-cli2 from 0.13.0 to 0.14.0
  • da0291d Freshen generated index.js file.
  • 235535b Add @​stylistic/eslint-plugin to ESLint configuration.
  • 2038498 Bump eslint from 9.9.0 to 9.9.1
  • ea9d2c1 Bump @​eslint/js from 9.9.0 to 9.9.1
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=DavidAnson/markdownlint-cli2-action&package-manager=github_actions&previous-version=16&new-version=17)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build-deploy-docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-deploy-docs.yml b/.github/workflows/build-deploy-docs.yml index 3bd642b34..6dd9b377c 100644 --- a/.github/workflows/build-deploy-docs.yml +++ b/.github/workflows/build-deploy-docs.yml @@ -16,7 +16,7 @@ jobs: - uses: Swatinem/rust-cache@v2 - name: 'Validate .md files (use "just fmt-md" to fix)' - uses: DavidAnson/markdownlint-cli2-action@v16 + uses: DavidAnson/markdownlint-cli2-action@v17 with: config: '.github/files/config.markdownlint-cli2.jsonc' From edcb2203d2d4e1c7cda33ff351cfdb46732e4f19 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Sep 2024 18:50:01 -0400 Subject: [PATCH 122/215] chore(deps): Bump peter-evans/create-pull-request from 6 to 7 (#1498) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 6 to 7.
Release notes

Sourced from peter-evans/create-pull-request's releases.

Create Pull Request v7.0.0

:sparkles: Now supports commit signing with bot-generated tokens! See "What's new" below. :writing_hand::robot:

Behaviour changes

  • Action input git-token has been renamed branch-token, to be more clear about its purpose. The branch-token is the token that the action will use to create and update the branch.
  • The action now handles requests that have been rate-limited by GitHub. Requests hitting a primary rate limit will retry twice, for a total of three attempts. Requests hitting a secondary rate limit will not be retried.
  • The pull-request-operation output now returns none when no operation was executed.
  • Removed deprecated output environment variable PULL_REQUEST_NUMBER. Please use the pull-request-number action output instead.

What's new

  • The action can now sign commits as github-actions[bot] when using GITHUB_TOKEN, or your own bot when using GitHub App tokens. See commit signing for details.
  • Action input draft now accepts a new value always-true. This will set the pull request to draft status when the pull request is updated, as well as on creation.
  • A new action input maintainer-can-modify indicates whether maintainers can modify the pull request. The default is true, which retains the existing behaviour of the action.
  • A new output pull-request-commits-verified returns true or false, indicating whether GitHub considers the signature of the branch's commits to be verified.

What's Changed

New Contributors

Full Changelog: https://github.com/peter-evans/create-pull-request/compare/v6.1.0...v7.0.0

Create Pull Request v6.1.0

✨ Adds pull-request-branch as an action output.

What's Changed

... (truncated)

Commits
  • 4320041 feat: signed commits (v7) (#3057)
  • 0c2a66f build(deps-dev): bump ts-jest from 29.2.4 to 29.2.5 (#3256)
  • 17121bc build(deps-dev): bump @​types/node from 18.19.45 to 18.19.46 (#3254)
  • 87b5d6d build(deps-dev): bump eslint-import-resolver-typescript (#3255)
  • 00897e0 build: update distribution (#3221)
  • 4cfc1fc build(deps-dev): bump @​types/node from 18.19.44 to 18.19.45 (#3214)
  • cb4ed64 build(deps): bump undici from 6.19.7 to 6.19.8 (#3213)
  • 4eb90b7 ci: separate test suite commands in pr comment
  • 5308ecb ci: add sign-commits flag to test suite comment
  • ba864ad build: update distribution (#3154)
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=peter-evans/create-pull-request&package-manager=github_actions&previous-version=6&new-version=7)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 366473d18..8a6799f33 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -665,7 +665,7 @@ jobs: - name: Create a PR for maplibre/homebrew-martin if: startsWith(github.ref, 'refs/tags/') - uses: peter-evans/create-pull-request@v6 + uses: peter-evans/create-pull-request@v7 with: # Create a personal access token # Gen: https://github.com/settings/personal-access-tokens/new From 59fb87cea971b95c0fce9bdf85c21e04bb55a068 Mon Sep 17 00:00:00 2001 From: Yuri Astrakhan Date: Wed, 11 Sep 2024 19:20:28 -0400 Subject: [PATCH 123/215] Fix clippy lint --- martin/src/pg/tls.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/martin/src/pg/tls.rs b/martin/src/pg/tls.rs index 84e2e2d90..ba3544aa5 100644 --- a/martin/src/pg/tls.rs +++ b/martin/src/pg/tls.rs @@ -55,7 +55,8 @@ pub fn parse_conn_str(conn_str: &str) -> PgResult<(Config, SslModeOverride)> { } let crate_ver = env!("CARGO_PKG_VERSION"); if pg_cfg.get_application_name().is_none() { - pg_cfg.application_name(&format!("Martin v{crate_ver} - pid={}", std::process::id())); + let pid = std::process::id(); + pg_cfg.application_name(format!("Martin v{crate_ver} - pid={pid}")); } Ok((pg_cfg, mode)) } From 2aa4627cf3753d09ae8b145279ffd05f3d154056 Mon Sep 17 00:00:00 2001 From: Yuri Astrakhan Date: Wed, 11 Sep 2024 19:37:54 -0400 Subject: [PATCH 124/215] Fix Demo CI, update just files --- .github/workflows/demo.yml | 7 ++-- demo/justfile | 12 +++--- justfile | 76 +++++++++++++++++++------------------- 3 files changed, 47 insertions(+), 48 deletions(-) diff --git a/.github/workflows/demo.yml b/.github/workflows/demo.yml index f92ac4369..3cb3e435e 100644 --- a/.github/workflows/demo.yml +++ b/.github/workflows/demo.yml @@ -19,7 +19,6 @@ jobs: steps: - name: Checkout sources uses: actions/checkout@v4 - - - run: | - cd demo/frontend - docker-compose build + - uses: taiki-e/install-action@v2 + with: { tool: just } + - run: cd demo && just build diff --git a/demo/justfile b/demo/justfile index 0d10f4267..0ad462073 100644 --- a/demo/justfile +++ b/demo/justfile @@ -11,20 +11,20 @@ clean: rm -rf frontend/node_modules up: - {{ dockercompose }} up + {{dockercompose}} up up-build: - {{ dockercompose }} up --build + {{dockercompose}} up --build build: - {{ dockercompose }} build + {{dockercompose}} build up-backend: - {{ dockercompose }} up db tiles --detach + {{dockercompose}} up db tiles --detach frontend *ARGS: - {{ dockercompose }} up frontend {{ ARGS }} + {{dockercompose}} up frontend {{ARGS}} [no-exit-message] frontend-sh: - {{ dockercompose }} run --interactive --entrypoint sh frontend + {{dockercompose}} run --interactive --entrypoint sh frontend diff --git a/justfile b/justfile index 2603782b2..4915a7a52 100644 --- a/justfile +++ b/justfile @@ -18,36 +18,36 @@ export CARGO_TERM_COLOR := "always" dockercompose := `if docker-compose --version &> /dev/null; then echo "docker-compose"; else echo "docker compose"; fi` @_default: - {{ just_executable() }} --list --unsorted + {{just_executable()}} --list --unsorted # Start Martin server run *ARGS="--webui enable-for-all": - cargo run -p martin -- {{ ARGS }} + cargo run -p martin -- {{ARGS}} # Start Martin server cp *ARGS: - cargo run --bin martin-cp -- {{ ARGS }} + cargo run --bin martin-cp -- {{ARGS}} # Run mbtiles command mbtiles *ARGS: - cargo run -p mbtiles -- {{ ARGS }} + cargo run -p mbtiles -- {{ARGS}} # Start release-compiled Martin server and a test database run-release *ARGS: start - cargo run -- {{ ARGS }} + cargo run -- {{ARGS}} # Start Martin server and open a test page debug-page *ARGS: start open tests/debug.html # run will not exit, so open debug page first - {{ just_executable() }} run {{ ARGS }} + {{just_executable()}} run {{ARGS}} # Run PSQL utility against the test database psql *ARGS: - psql {{ ARGS }} {{ quote(DATABASE_URL) }} + psql {{ARGS}} {{quote(DATABASE_URL)}} # Run pg_dump utility against the test database pg_dump *ARGS: - pg_dump {{ ARGS }} {{ quote(DATABASE_URL) }} + pg_dump {{ARGS}} {{quote(DATABASE_URL)}} # Perform cargo clean to delete all build files clean: clean-test stop && clean-martin-ui @@ -77,12 +77,12 @@ start-legacy: (docker-up "db-legacy") docker-is-ready # Start a specific test database, e.g. db or db-legacy [private] docker-up name: start-pmtiles-server - {{ dockercompose }} up -d {{ name }} + {{dockercompose}} up -d {{name}} # Wait for the test database to be ready [private] docker-is-ready: - {{ dockercompose }} run -T --rm db-is-ready + {{dockercompose}} run -T --rm db-is-ready alias _down := stop alias _stop-db := stop @@ -90,16 +90,16 @@ alias _stop-db := stop # Restart the test database restart: # sometimes Just optimizes targets, so here we force stop & start by using external just executable - {{ just_executable() }} stop - {{ just_executable() }} start + {{just_executable()}} stop + {{just_executable()}} start # Stop the test database stop: - {{ dockercompose }} down --remove-orphans + {{dockercompose}} down --remove-orphans # Start test server for testing HTTP pmtiles start-pmtiles-server: - {{ dockercompose }} up -d fileserver + {{dockercompose}} up -d fileserver # Run benchmark tests bench: @@ -146,9 +146,9 @@ test-ssl-cert: start-ssl-cert export PGSSLROOTCERT="$KEY_DIR/ssl-cert-snakeoil.pem" export PGSSLCERT="$KEY_DIR/ssl-cert-snakeoil.pem" export PGSSLKEY="$KEY_DIR/ssl-cert-snakeoil.key" - {{ just_executable() }} test-cargo --all-targets - {{ just_executable() }} clean-test - {{ just_executable() }} test-doc + {{just_executable()}} test-cargo --all-targets + {{just_executable()}} clean-test + {{just_executable()}} test-doc tests/test.sh # Run all tests using the oldest supported version of the database @@ -156,18 +156,18 @@ test-legacy: start-legacy (test-cargo "--all-targets") test-doc test-int # Run Rust unit tests (cargo test) test-cargo *ARGS: - cargo test {{ ARGS }} + cargo test {{ARGS}} # Run Rust doc tests test-doc *ARGS: - cargo test --doc {{ ARGS }} + cargo test --doc {{ARGS}} # Run integration tests test-int: clean-test install-sqlx #!/usr/bin/env bash set -euo pipefail tests/test.sh - if [ "{{ os() }}" != "linux" ]; then + if [ "{{os()}}" != "linux" ]; then echo "** Integration tests are only supported on Linux" echo "** Skipping diffing with the expected output" else @@ -201,15 +201,15 @@ bless-tests: # Run integration tests and save its output as the new expected output bless-insta-mbtiles *ARGS: (cargo-install "cargo-insta") #rm -rf mbtiles/tests/snapshots - cargo insta test --accept --unreferenced=auto -p mbtiles {{ ARGS }} + cargo insta test --accept --unreferenced=auto -p mbtiles {{ARGS}} # Run integration tests and save its output as the new expected output bless-insta-martin *ARGS: (cargo-install "cargo-insta") - cargo insta test --accept --unreferenced=auto -p martin {{ ARGS }} + cargo insta test --accept --unreferenced=auto -p martin {{ARGS}} # Run integration tests and save its output as the new expected output bless-insta-cp *ARGS: (cargo-install "cargo-insta") - cargo insta test --accept --bin martin-cp {{ ARGS }} + cargo insta test --accept --bin martin-cp {{ARGS}} # Build and open mdbook documentation book: (cargo-install "mdbook") @@ -232,14 +232,14 @@ coverage FORMAT='html': (cargo-install "grcov") rustup component add llvm-tools-preview ;\ fi - {{ just_executable() }} clean - {{ just_executable() }} start + {{just_executable()}} clean + {{just_executable()}} start PROF_DIR=target/prof mkdir -p "$PROF_DIR" PROF_DIR=$(realpath "$PROF_DIR") - OUTPUT_RESULTS_DIR=target/coverage/{{ FORMAT }} + OUTPUT_RESULTS_DIR=target/coverage/{{FORMAT}} mkdir -p "$OUTPUT_RESULTS_DIR" export CARGO_INCREMENTAL=0 @@ -254,33 +254,33 @@ coverage FORMAT='html': (cargo-install "grcov") set -x grcov --binary-path ./target/debug \ -s . \ - -t {{ FORMAT }} \ + -t {{FORMAT}} \ --branch \ --ignore 'benches/*' \ --ignore 'tests/*' \ --ignore-not-existing \ - -o target/coverage/{{ FORMAT }} \ + -o target/coverage/{{FORMAT}} \ --llvm \ "$PROF_DIR" { set +x; } 2>/dev/null # if this is html, open it in the browser - if [ "{{ FORMAT }}" = "html" ]; then + if [ "{{FORMAT}}" = "html" ]; then open "$OUTPUT_RESULTS_DIR/index.html" fi # Build and run martin docker image docker-run *ARGS: - docker run -it --rm --net host -e DATABASE_URL -v $PWD/tests:/tests ghcr.io/maplibre/martin {{ ARGS }} + docker run -it --rm --net host -e DATABASE_URL -v $PWD/tests:/tests ghcr.io/maplibre/martin {{ARGS}} # Do any git command, ensuring that the testing environment is set up. Accepts the same arguments as git. [no-exit-message] git *ARGS: start - git {{ ARGS }} + git {{ARGS}} # Print the connection string for the test database print-conn-str: - @echo {{ quote(DATABASE_URL) }} + @echo {{quote(DATABASE_URL)}} # Run cargo fmt and cargo clippy lint: fmt clippy @@ -333,8 +333,8 @@ git-pre-push: env-info restart fmt clippy check-doc test check # Get environment info [private] env-info: - @echo "OS is {{ os() }}, arch is {{ arch() }}" - {{ just_executable() }} --version + @echo "OS is {{os()}}, arch is {{arch()}}" + {{just_executable()}} --version rustc --version cargo --version rustup --version @@ -355,10 +355,10 @@ cargo-install $COMMAND $INSTALL_CMD="" *ARGS="": set -eu if ! command -v $COMMAND > /dev/null; then if ! command -v cargo-binstall > /dev/null; then - echo "$COMMAND could not be found. Installing it with cargo install ${INSTALL_CMD:-$COMMAND} --locked {{ ARGS }}" - cargo install ${INSTALL_CMD:-$COMMAND} --locked {{ ARGS }} + echo "$COMMAND could not be found. Installing it with cargo install ${INSTALL_CMD:-$COMMAND} --locked {{ARGS}}" + cargo install ${INSTALL_CMD:-$COMMAND} --locked {{ARGS}} else - echo "$COMMAND could not be found. Installing it with cargo binstall ${INSTALL_CMD:-$COMMAND} --locked {{ ARGS }}" - cargo binstall ${INSTALL_CMD:-$COMMAND} --locked {{ ARGS }} + echo "$COMMAND could not be found. Installing it with cargo binstall ${INSTALL_CMD:-$COMMAND} --locked {{ARGS}}" + cargo binstall ${INSTALL_CMD:-$COMMAND} --locked {{ARGS}} fi fi From 30de14c1a4ac963c9cf6dfee050b79ea8ee73132 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Sep 2024 03:03:44 +0000 Subject: [PATCH 125/215] chore(deps): Bump anyhow from 1.0.88 to 1.0.89 (#1512) Bumps [anyhow](https://github.com/dtolnay/anyhow) from 1.0.88 to 1.0.89.
Release notes

Sourced from anyhow's releases.

1.0.89

  • Make anyhow::Error's UnwindSafe and RefUnwindSafe impl consistently available between versions of Rust newer and older than 1.72 (#386)
Commits
  • 9d3fb6d Release 1.0.89
  • 830c399 Merge pull request #386 from dtolnay/unwindsafe
  • 8454be3 Ensure UnwindSafe even with "backtrace" feature enabled and old Rust
  • a85e414 Add more autotraits tests
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=anyhow&package-manager=cargo&previous-version=1.0.88&new-version=1.0.89)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index fcf68de1f..ed83960fd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -349,9 +349,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.88" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e1496f8fb1fbf272686b8d37f523dab3e4a7443300055e74cdaa449f3114356" +checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6" [[package]] name = "approx" From 6caa9ba7ad6d201f400b3c948e757d232222667c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Sep 2024 03:04:35 +0000 Subject: [PATCH 126/215] chore(deps): Bump subst from 0.3.3 to 0.3.5 (#1513) Bumps [subst](https://github.com/fizyr/subst) from 0.3.3 to 0.3.5.
Changelog

Sourced from subst's changelog.

Version 0.3.5 - 2024-09-15

  • [change][patch] Update README for new feature flags.

Version 0.3.4 - 2024-09-15

  • [add][minor] Add optional support for the indexmap crate.
Commits
  • 8d5ecb9 Bump version to 0.3.5.
  • 5e4bf30 Merge pull request #26 from fizyr/update-readme
  • 656f21c Update README for new feature flags.
  • b8a16e8 Bump version to 0.3.4.
  • 2a5cc1a Merge pull request #25 from fizyr/indexmap
  • 35c4f92 Add optional support for the indexmap crate.
  • cdf6832 Move all optional features to the features module.
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=subst&package-manager=cargo&previous-version=0.3.3&new-version=0.3.5)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ed83960fd..3f2294193 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4442,9 +4442,9 @@ dependencies = [ [[package]] name = "subst" -version = "0.3.3" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "266d3fe7ffc582b3a0c3fe36cdc88d5635a1c2d53e7c3f813c901d7bd1d34ba0" +checksum = "7a3c1ba4fd019bc866333a61fe205fc9b686e3cf5971dd8dfc116657d933031c" dependencies = [ "memchr", "serde", From d00bd244236456925864882c93454eefe90b6179 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Sep 2024 03:06:18 +0000 Subject: [PATCH 127/215] chore(deps): Bump pretty_assertions from 1.4.0 to 1.4.1 (#1514) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [pretty_assertions](https://github.com/rust-pretty-assertions/rust-pretty-assertions) from 1.4.0 to 1.4.1.
Release notes

Sourced from pretty_assertions's releases.

v1.4.1

Fixed

  • Show feature-flagged code in documentation. Thanks to @​sandydoo for the fix! (#130)

Internal

  • Bump yansi version to 1.x. Thanks to @​SergioBenitez for the update, and maintaining this library! (#121)
Changelog

Sourced from pretty_assertions's changelog.

v1.4.1

Fixed

  • Show feature-flagged code in documentation. Thanks to @​sandydoo for the fix! (#130)

Internal

  • Bump yansi version to 1.x. Thanks to @​SergioBenitez for the update, and maintaining this library! (#121)
Commits
  • f5c5b24 chore: prep 1.4.1 release
  • d34d524 chore: display feature-flagged docs on docs.rs
  • fac4273 Merge pull request #131 from sandydoo/fix-yansi-deprecation
  • 1e51cce chore: rename deprecated yansi methods
  • 4a0e5a3 Merge pull request #121 from SergioBenitez/yansi-update
  • 08838fe internal: bump MSRV to 1.63.0 for yansi
  • 777387d ci: bump runner to windows-2022
  • 35c08fe chore: update 'yansi' to 1.0.0-rc
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=pretty_assertions&package-manager=cargo&previous-version=1.4.0&new-version=1.4.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3f2294193..a99135f9d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3172,9 +3172,9 @@ dependencies = [ [[package]] name = "pretty_assertions" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af7cee1a6c8a5b9208b3cb1061f10c0cb689087b3d8ce85fb9d2dd7a29b6ba66" +checksum = "3ae130e2f271fbc2ac3a40fb1d07180839cdbbe443c7a27e1e3c13c5cac0116d" dependencies = [ "diff", "yansi", @@ -5488,9 +5488,9 @@ checksum = "6a5cbf750400958819fb6178eaa83bee5cd9c29a26a40cc241df8c70fdd46984" [[package]] name = "yansi" -version = "0.5.1" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" +checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" [[package]] name = "zerocopy" From 613c76fbb71cc8d99f8faa538b5cb0c39d0724a6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Sep 2024 03:24:36 +0000 Subject: [PATCH 128/215] chore(deps): Bump clap from 4.5.17 to 4.5.18 (#1516) Bumps [clap](https://github.com/clap-rs/clap) from 4.5.17 to 4.5.18.
Release notes

Sourced from clap's releases.

v4.5.18

[4.5.18] - 2024-09-20

Features

  • (builder) Expose Arg::get_display_order and Command::get_display_order
Changelog

Sourced from clap's changelog.

[4.5.18] - 2024-09-20

Features

  • (builder) Expose Arg::get_display_order and Command::get_display_order
Commits
  • d811585 chore: Release
  • ab948b3 docs: Update changelog
  • 82e599e Merge pull request #5602 from shannmu/delimiter_values
  • 59bf26d feat(clap_complete): Support delimiter values in native completions
  • ccecab3 test(clap_complete): Add test cases for delimiter_values support
  • a3a4764 docs(derive): Specify Parser::update_from semantics
  • df165a2 docs(derive): Flatten isn't just for update
  • 5488bcf docs(derive): Connect more dots for Args/Subcommand
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=clap&package-manager=cargo&previous-version=4.5.17&new-version=4.5.18)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a99135f9d..4f1818542 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -778,9 +778,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.17" +version = "4.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e5a21b8495e732f1b3c364c9949b201ca7bae518c502c80256c96ad79eaf6ac" +checksum = "b0956a43b323ac1afaffc053ed5c4b7c1f1800bacd1683c353aabbb752515dd3" dependencies = [ "clap_builder", "clap_derive", @@ -788,9 +788,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.17" +version = "4.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cf2dd12af7a047ad9d6da2b6b249759a22a7abc0f474c1dae1777afa4b21a73" +checksum = "4d72166dd41634086d5803a47eb71ae740e61d84709c36f3c34110173db3961b" dependencies = [ "anstream", "anstyle", @@ -800,9 +800,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.13" +version = "4.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "501d359d5f3dcaf6ecdeee48833ae73ec6e42723a1e52419c79abf9507eec0a0" +checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" dependencies = [ "heck 0.5.0", "proc-macro2", @@ -2306,7 +2306,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" dependencies = [ "cfg-if", - "windows-targets 0.52.6", + "windows-targets 0.48.5", ] [[package]] From 2235b124e6ce666b75198f550d351937ab94233c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Sep 2024 03:25:27 +0000 Subject: [PATCH 129/215] chore(deps): Bump thiserror from 1.0.63 to 1.0.64 (#1517) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [thiserror](https://github.com/dtolnay/thiserror) from 1.0.63 to 1.0.64.
Release notes

Sourced from thiserror's releases.

1.0.64

  • Exclude derived impls from coverage instrumentation (#322, thanks @​oxalica)
Commits
  • 84484bc Release 1.0.64
  • 023f036 Merge pull request #322 from oxalica/feat/mark-auto-derived
  • ae1f47e Mark #[automatically_derived] for generated impls
  • ab5b5e3 Upload CI Cargo.lock for reproducing failures
  • 00b3c14 Work around new dead code warning in test
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=thiserror&package-manager=cargo&previous-version=1.0.63&new-version=1.0.64)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4f1818542..1dcf83783 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4549,18 +4549,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.63" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" +checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.63" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" +checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" dependencies = [ "proc-macro2", "quote", From 55a6f2981dcf364f998e7c5aa1691f5574ef15f0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 25 Sep 2024 03:09:30 +0000 Subject: [PATCH 130/215] chore(deps): Bump async-trait from 0.1.82 to 0.1.83 (#1521) Bumps [async-trait](https://github.com/dtolnay/async-trait) from 0.1.82 to 0.1.83.
Release notes

Sourced from async-trait's releases.

0.1.83

  • Prevent needless_arbitrary_self_type lint being produced in generated code (#278)
Commits
  • e6b4d47 Release 0.1.83
  • bfe8d61 Merge pull request #278 from dtolnay/arbself
  • 7bd974b Ignore needless_arbitrary_self_type clippy lint in generated code
  • b53b4e7 Add regression test for issue 277
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=async-trait&package-manager=cargo&previous-version=0.1.82&new-version=0.1.83)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1dcf83783..d4ec0cbe2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -422,9 +422,9 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.82" +version = "0.1.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a27b8a3a6e1a44fa4c8baf1f653e4172e81486d4941f2237e20dc2d0cf4ddff1" +checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", From 629eaea189003a5fabcb175810b5d3b3da52b9f4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 27 Sep 2024 02:36:19 +0000 Subject: [PATCH 131/215] chore(deps): Bump flate2 from 1.0.33 to 1.0.34 (#1524) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [flate2](https://github.com/rust-lang/flate2-rs) from 1.0.33 to 1.0.34.
Release notes

Sourced from flate2's releases.

1.0.34

What's Changed

New Contributors

Full Changelog: https://github.com/rust-lang/flate2-rs/compare/1.0.33...1.0.34

Commits
  • 1a28821 Merge pull request #431 from Shnatsel/better-wording
  • 2c29780 Merge pull request #428 from Shnatsel/upgrade-zlib-rs
  • 423981a Better wording in compression level docs
  • da5c8cf Bump version
  • eeee4c6 Merge pull request #430 from Shnatsel/detailed-level-docs
  • 731df32 Update Cargo.toml
  • 8210288 Document backend differences
  • 1f78c5c Upgrade zlib-rs to 0.3.0 to get multiple bugfixes:
  • 6fbd6d2 Merge pull request #427 from ByteBaker/main
  • 936aa35 docs: correctly mention compression level
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=flate2&package-manager=cargo&previous-version=1.0.33&new-version=1.0.34)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d4ec0cbe2..37a0b05d2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1411,9 +1411,9 @@ dependencies = [ [[package]] name = "flate2" -version = "1.0.33" +version = "1.0.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "324a1be68054ef05ad64b861cc9eaf1d623d2d8cb25b4bf2cb9cdd902b4bf253" +checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" dependencies = [ "crc32fast", "miniz_oxide 0.8.0", From 29b4adc219e238461ebe71d1798fb1320c65eaab Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Oct 2024 03:15:03 +0000 Subject: [PATCH 132/215] chore(deps): Bump sqlite-hashes from 0.7.5 to 0.7.6 (#1527) Bumps [sqlite-hashes](https://github.com/nyurik/sqlite-hashes) from 0.7.5 to 0.7.6.
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=sqlite-hashes&package-manager=cargo&previous-version=0.7.5&new-version=0.7.6)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 6 +++--- Cargo.toml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 37a0b05d2..e0a63b6b3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2306,7 +2306,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" dependencies = [ "cfg-if", - "windows-targets 0.48.5", + "windows-targets 0.52.6", ] [[package]] @@ -4165,9 +4165,9 @@ dependencies = [ [[package]] name = "sqlite-hashes" -version = "0.7.5" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b78a3cdbb0ca1c155437a42811dbb23df1ec5cd0d7d0f76216b08255dafb244b" +checksum = "b780e3dfa3f6de81934a7d5e60bfbf6c797faf97dc152a24a913c044a93f8b25" dependencies = [ "digest", "hex", diff --git a/Cargo.toml b/Cargo.toml index 6b5753b36..df12dd425 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -79,7 +79,7 @@ serde_yaml = "0.9" size_format = "1.0.2" spreet = { version = "0.11", default-features = false } sqlite-compressions = { version = "0.2.14", default-features = false, features = ["bsdiffraw", "gzip"] } -sqlite-hashes = { version = "0.7.5", default-features = false, features = ["md5", "aggregate", "hex"] } +sqlite-hashes = { version = "0.7.6", default-features = false, features = ["md5", "aggregate", "hex"] } sqlx = { version = "0.7", features = ["sqlite", "runtime-tokio"] } static-files = "0.2" subst = { version = "0.3", features = ["yaml"] } From 42f6ac804a5100369421469e793f9c9febaf968c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Oct 2024 04:05:17 +0000 Subject: [PATCH 133/215] chore(deps): Bump sqlite-compressions from 0.2.14 to 0.2.15 (#1528) Bumps [sqlite-compressions](https://github.com/nyurik/sqlite-compressions) from 0.2.14 to 0.2.15.
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=sqlite-compressions&package-manager=cargo&previous-version=0.2.14&new-version=0.2.15)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e0a63b6b3..4815200a1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4154,9 +4154,9 @@ dependencies = [ [[package]] name = "sqlite-compressions" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb5573cbfea966f419e72571c5bcd8ab3dbb4d1fd1e9cecf036b5151016f2527" +checksum = "556f9a7149983ee0d6708f1d65a5bf30e81f560d3713b3a1e64b2e512cdd7364" dependencies = [ "bsdiff", "flate2", diff --git a/Cargo.toml b/Cargo.toml index df12dd425..4cb837c9d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -78,7 +78,7 @@ serde_with = "3" serde_yaml = "0.9" size_format = "1.0.2" spreet = { version = "0.11", default-features = false } -sqlite-compressions = { version = "0.2.14", default-features = false, features = ["bsdiffraw", "gzip"] } +sqlite-compressions = { version = "0.2.15", default-features = false, features = ["bsdiffraw", "gzip"] } sqlite-hashes = { version = "0.7.6", default-features = false, features = ["md5", "aggregate", "hex"] } sqlx = { version = "0.7", features = ["sqlite", "runtime-tokio"] } static-files = "0.2" From 81153f38afa433554b3739867c33c5a2e822d613 Mon Sep 17 00:00:00 2001 From: Yuri Astrakhan Date: Tue, 1 Oct 2024 00:10:06 -0400 Subject: [PATCH 134/215] Update dependencies, tests, connection limit (#1530) --- .github/workflows/grcov.yml | 2 +- Cargo.lock | 321 ++++++++++++-------------- Cargo.toml | 4 +- docker-compose.yml | 3 + justfile | 2 +- tests/expected/auto/mb_jpg.json | 4 +- tests/expected/auto/mb_png.json | 8 +- tests/expected/auto/pmt.json | 12 +- tests/expected/auto/table_source.json | 6 +- 9 files changed, 175 insertions(+), 187 deletions(-) diff --git a/.github/workflows/grcov.yml b/.github/workflows/grcov.yml index d50fecb55..8b1f92778 100644 --- a/.github/workflows/grcov.yml +++ b/.github/workflows/grcov.yml @@ -51,7 +51,7 @@ jobs: - name: Install nightly toolchain uses: dtolnay/rust-toolchain@master with: - toolchain: nightly-2024-05-24 + toolchain: nightly-2024-10-01 override: true - name: Cleanup GCDA files diff --git a/Cargo.lock b/Cargo.lock index 4815200a1..3fda19695 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -80,7 +80,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -198,7 +198,7 @@ dependencies = [ "actix-router", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -222,12 +222,6 @@ dependencies = [ "gimli", ] -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - [[package]] name = "adler2" version = "2.0.0" @@ -364,9 +358,9 @@ dependencies = [ [[package]] name = "arrayref" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d151e35f61089500b617991b791fc8bfd237ae50cd5950803758a179b41e67a" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" [[package]] name = "arrayvec" @@ -417,7 +411,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -428,7 +422,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -442,9 +436,9 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "aws-lc-rs" @@ -460,9 +454,9 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.21.1" +version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "234314bd569802ec87011d653d6815c6d7b9ffb969e9fee5b8b20ef860e8dce9" +checksum = "b3ddc4a5b231dd6958b140ff3151b6412b3f4321fab354f399eec8f14b06df62" dependencies = [ "bindgen", "cc", @@ -482,7 +476,7 @@ dependencies = [ "addr2line", "cfg-if", "libc", - "miniz_oxide 0.8.0", + "miniz_oxide", "object", "rustc-demangle", "windows-targets 0.52.6", @@ -541,7 +535,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.77", + "syn 2.0.79", "which", ] @@ -664,9 +658,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.7.1" +version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" +checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" [[package]] name = "bytestring" @@ -691,9 +685,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.1.18" +version = "1.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b62ac837cdb5cb22e10a256099b4fc502b1dfe560cb282963a974d7abd80e476" +checksum = "3bbb537bb4a30b90362caddba8f360c0a56bc13d3a5570028e7197204cb54a17" dependencies = [ "jobserver", "libc", @@ -807,7 +801,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -1068,7 +1062,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edb49164822f3ee45b17acd4a208cfc1251410cf0cad9a833234c9890774dd9f" dependencies = [ "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -1092,7 +1086,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -1103,7 +1097,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -1186,7 +1180,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -1272,7 +1266,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -1378,9 +1372,9 @@ checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" [[package]] name = "fdeflate" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f9bfee30e4dedf0ab8b422f03af778d9612b63f502710fc500a334ebe2de645" +checksum = "d8090f921a24b04994d9929e204f50b498a33ea6ba559ffaa05e04f7ee7fb5ab" dependencies = [ "simd-adler32", ] @@ -1416,7 +1410,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" dependencies = [ "crc32fast", - "miniz_oxide 0.8.0", + "miniz_oxide", ] [[package]] @@ -1614,7 +1608,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -1885,9 +1879,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.9.4" +version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" +checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" [[package]] name = "httpdate" @@ -1954,7 +1948,7 @@ dependencies = [ "hyper 1.4.1", "hyper-util", "rustls", - "rustls-native-certs 0.8.0", + "rustls-native-certs", "rustls-pki-types", "tokio", "tokio-rustls", @@ -1963,9 +1957,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da62f120a8a37763efb0cf8fdf264b884c7b8b9ac8660b900c8661030c00e6ba" +checksum = "41296eb09f183ac68eec06e03cdbea2e759633d4067b2f6552fc2e009bcad08b" dependencies = [ "bytes", "futures-channel", @@ -1976,16 +1970,15 @@ dependencies = [ "pin-project-lite", "socket2", "tokio", - "tower", "tower-service", "tracing", ] [[package]] name = "iana-time-zone" -version = "0.1.60" +version = "0.1.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -2277,9 +2270,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.158" +version = "0.2.159" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" +checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" [[package]] name = "libdeflate-sys" @@ -2427,7 +2420,7 @@ dependencies = [ "regex", "rstest", "rustls", - "rustls-native-certs 0.8.0", + "rustls-native-certs", "rustls-pemfile", "semver", "serde", @@ -2521,9 +2514,9 @@ dependencies = [ [[package]] name = "memmap2" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe751422e4a8caa417e13c3ea66452215d7d63e19e604f4980461212f3ae1322" +checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" dependencies = [ "libc", ] @@ -2559,16 +2552,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" -[[package]] -name = "miniz_oxide" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" -dependencies = [ - "adler", - "simd-adler32", -] - [[package]] name = "miniz_oxide" version = "0.8.0" @@ -2576,6 +2559,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" dependencies = [ "adler2", + "simd-adler32", ] [[package]] @@ -2778,9 +2762,12 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.19.0" +version = "1.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "82881c4be219ab5faaf2ad5e5e5ecdff8c66bd7402ca3160975c93b24961afd1" +dependencies = [ + "portable-atomic", +] [[package]] name = "oorandom" @@ -2867,7 +2854,7 @@ dependencies = [ "regex", "regex-syntax 0.7.5", "structmeta", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -2973,7 +2960,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -3011,9 +2998,9 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" [[package]] name = "plotters" @@ -3045,9 +3032,9 @@ dependencies = [ [[package]] name = "pmtiles" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e39d63d8051c398a45214a806202db469fc1089d9f8de6c5cfc2bcebbdffb13" +checksum = "d18dabde2a77b24221be77404aa1adb4998715447abf4b6d87d550d6a9f4df75" dependencies = [ "async-compression", "bytes", @@ -3064,17 +3051,23 @@ dependencies = [ [[package]] name = "png" -version = "0.17.13" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06e4b0d3d1312775e782c86c91a111aa1f910cbb65e1337f9975b5f9a554b5e1" +checksum = "52f9d46a34a05a6a57566bc2bfae066ef07585a6e3fa30fbbdff5936380623f0" dependencies = [ "bitflags 1.3.2", "crc32fast", "fdeflate", "flate2", - "miniz_oxide 0.7.4", + "miniz_oxide", ] +[[package]] +name = "portable-atomic" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2" + [[package]] name = "postgis" version = "0.9.0" @@ -3088,9 +3081,9 @@ dependencies = [ [[package]] name = "postgres" -version = "0.19.8" +version = "0.19.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c9ec84ab55b0f9e418675de50052d494ba893fd28c65769a6e68fcdacbee2b8" +checksum = "95c918733159f4d55d2ceb262950f00b0aebd6af4aa97b5a47bb0655120475ed" dependencies = [ "bytes", "fallible-iterator 0.2.0", @@ -3120,9 +3113,9 @@ dependencies = [ [[package]] name = "postgres-types" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02048d9e032fb3cc3413bbf7b83a15d84a5d419778e2628751896d856498eee9" +checksum = "f66ea23a2d0e5734297357705193335e0a957696f34bed2f2faefacb2fec336f" dependencies = [ "bytes", "fallible-iterator 0.2.0", @@ -3187,7 +3180,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479cf940fbbb3426c32c5d5176f62ad57549a0bb84773423ba8be9d089f5faba" dependencies = [ "proc-macro2", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -3210,9 +3203,9 @@ dependencies = [ [[package]] name = "protobuf" -version = "3.5.1" +version = "3.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bcc343da15609eaecd65f8aa76df8dc4209d325131d8219358c0aaaebab0bf6" +checksum = "3018844a02746180074f621e847703737d27d89d7f0721a7a4da317f88b16385" dependencies = [ "once_cell", "protobuf-support", @@ -3221,9 +3214,9 @@ dependencies = [ [[package]] name = "protobuf-codegen" -version = "3.5.1" +version = "3.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4d0cde5642ea4df842b13eb9f59ea6fafa26dcb43e3e1ee49120e9757556189" +checksum = "411c15a212b4de05eb8bc989fd066a74c86bd3c04e27d6e86bd7703b806d7734" dependencies = [ "anyhow", "once_cell", @@ -3236,9 +3229,9 @@ dependencies = [ [[package]] name = "protobuf-parse" -version = "3.5.1" +version = "3.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b0e9b447d099ae2c4993c0cbb03c7a9d6c937b17f2d56cfc0b1550e6fcfdb76" +checksum = "06f45f16b522d92336e839b5e40680095a045e36a1e7f742ba682ddc85236772" dependencies = [ "anyhow", "indexmap 2.5.0", @@ -3252,62 +3245,69 @@ dependencies = [ [[package]] name = "protobuf-support" -version = "3.5.1" +version = "3.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0766e3675a627c327e4b3964582594b0e8741305d628a98a5de75a1d15f99b9" +checksum = "faf96d872914fcda2b66d66ea3fff2be7c66865d31c7bb2790cff32c0e714880" dependencies = [ "thiserror", ] [[package]] name = "protoc-bin-vendored" -version = "3.0.0" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "005ca8623e5633e298ad1f917d8be0a44bcf406bf3cde3b80e63003e49a3f27d" +checksum = "dd89a830d0eab2502c81a9b8226d446a52998bb78e5e33cb2637c0cdd6068d99" dependencies = [ "protoc-bin-vendored-linux-aarch_64", "protoc-bin-vendored-linux-ppcle_64", "protoc-bin-vendored-linux-x86_32", "protoc-bin-vendored-linux-x86_64", + "protoc-bin-vendored-macos-aarch_64", "protoc-bin-vendored-macos-x86_64", "protoc-bin-vendored-win32", ] [[package]] name = "protoc-bin-vendored-linux-aarch_64" -version = "3.0.0" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fb9fc9cce84c8694b6ea01cc6296617b288b703719b725b8c9c65f7c5874435" +checksum = "f563627339f1653ea1453dfbcb4398a7369b768925eb14499457aeaa45afe22c" [[package]] name = "protoc-bin-vendored-linux-ppcle_64" -version = "3.0.0" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02d2a07dcf7173a04d49974930ccbfb7fd4d74df30ecfc8762cf2f895a094516" +checksum = "5025c949a02cd3b60c02501dd0f348c16e8fff464f2a7f27db8a9732c608b746" [[package]] name = "protoc-bin-vendored-linux-x86_32" -version = "3.0.0" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54fef0b04fcacba64d1d80eed74a20356d96847da8497a59b0a0a436c9165b0" +checksum = "9c9500ce67d132c2f3b572504088712db715755eb9adf69d55641caa2cb68a07" [[package]] name = "protoc-bin-vendored-linux-x86_64" -version = "3.0.0" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8782f2ce7d43a9a5c74ea4936f001e9e8442205c244f7a3d4286bd4c37bc924" +checksum = "5462592380cefdc9f1f14635bcce70ba9c91c1c2464c7feb2ce564726614cc41" + +[[package]] +name = "protoc-bin-vendored-macos-aarch_64" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c637745681b68b4435484543667a37606c95ddacf15e917710801a0877506030" [[package]] name = "protoc-bin-vendored-macos-x86_64" -version = "3.0.0" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5de656c7ee83f08e0ae5b81792ccfdc1d04e7876b1d9a38e6876a9e09e02537" +checksum = "38943f3c90319d522f94a6dfd4a134ba5e36148b9506d2d9723a82ebc57c8b55" [[package]] name = "protoc-bin-vendored-win32" -version = "3.0.0" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9653c3ed92974e34c5a6e0a510864dab979760481714c172e0a34e437cb98804" +checksum = "7dc55d7dec32ecaf61e0bd90b3d2392d721a28b95cfd23c3e176eccefbeab2f2" [[package]] name = "quanta" @@ -3463,34 +3463,34 @@ checksum = "3b42e27ef78c35d3998403c1d26f3efd9e135d3e5121b0a4845cc5cc27547f4f" [[package]] name = "redox_syscall" -version = "0.5.3" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" dependencies = [ "bitflags 2.6.0", ] [[package]] name = "regex" -version = "1.10.6" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" +checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8" dependencies = [ "aho-corasick", "memchr", "regex-automata", - "regex-syntax 0.8.4", + "regex-syntax 0.8.5", ] [[package]] name = "regex-automata" -version = "0.4.7" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.4", + "regex-syntax 0.8.5", ] [[package]] @@ -3507,9 +3507,9 @@ checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" [[package]] name = "regex-syntax" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "relative-path" @@ -3519,9 +3519,9 @@ checksum = "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2" [[package]] name = "reqwest" -version = "0.12.7" +version = "0.12.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8f4955649ef5c38cc7f9e8aa41761d48fb9677197daea9984dc54f56aad5e63" +checksum = "f713147fbe92361e52392c73b8c9e48c04c6625bce969ef54dc901e58e042a7b" dependencies = [ "base64 0.22.1", "bytes", @@ -3542,7 +3542,7 @@ dependencies = [ "pin-project-lite", "quinn", "rustls", - "rustls-native-certs 0.7.3", + "rustls-native-certs", "rustls-pemfile", "rustls-pki-types", "serde", @@ -3643,9 +3643,9 @@ dependencies = [ [[package]] name = "rstest" -version = "0.22.0" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b423f0e62bdd61734b67cd21ff50871dfaeb9cc74f869dcd6af974fbcb19936" +checksum = "0a2c585be59b6b5dd66a9d2084aa1d8bd52fbdb806eafdeffb52791147862035" dependencies = [ "futures", "futures-timer", @@ -3655,9 +3655,9 @@ dependencies = [ [[package]] name = "rstest_macros" -version = "0.22.0" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e1711e7d14f74b12a58411c542185ef7fb7f2e7f8ee6e2940a883628522b42" +checksum = "825ea780781b15345a146be27eaefb05085e337e869bff01b4306a4fd4a9ad5a" dependencies = [ "cfg-if", "glob", @@ -3667,7 +3667,7 @@ dependencies = [ "regex", "relative-path", "rustc_version", - "syn 2.0.77", + "syn 2.0.79", "unicode-ident", ] @@ -3741,19 +3741,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "rustls-native-certs" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5bfb394eeed242e909609f56089eecfe5fda225042e8b171791b9c95f5931e5" -dependencies = [ - "openssl-probe", - "rustls-pemfile", - "rustls-pki-types", - "schannel", - "security-framework", -] - [[package]] name = "rustls-native-certs" version = "0.8.0" @@ -3769,19 +3756,18 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "2.1.3" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "196fe16b00e106300d3e45ecfcb764fa292a535d7326a29a5875c579c7417425" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" dependencies = [ - "base64 0.22.1", "rustls-pki-types", ] [[package]] name = "rustls-pki-types" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0a2ce646f8655401bb81e7927b812614bd5d91dbc968696be50603510fcaf0" +checksum = "0e696e35370c65c9c541198af4543ccd580cf17fc25d8e05c5a242b202488c55" [[package]] name = "rustls-webpki" @@ -3866,9 +3852,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.11.1" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75da29fe9b9b08fe9d6b22b5b4bcbc75d8db3aa31e639aa56bb62e9d46bfceaf" +checksum = "ea4a292869320c0272d7bc55a5a6aafaff59b4f63404a003887b679a2e05b4b6" dependencies = [ "core-foundation-sys", "libc", @@ -3897,7 +3883,7 @@ checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -3972,7 +3958,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -4426,7 +4412,7 @@ dependencies = [ "proc-macro2", "quote", "structmeta-derive", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -4437,7 +4423,7 @@ checksum = "a60bcaff7397072dca0017d1db428e30d5002e00b6847703e2e42005c95fbe00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -4470,21 +4456,21 @@ dependencies = [ [[package]] name = "symbolic-common" -version = "12.11.0" +version = "12.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c1db5ac243c7d7f8439eb3b8f0357888b37cf3732957e91383b0ad61756374e" +checksum = "9fdf97c441f18a4f92425b896a4ec7a27e03631a0b1047ec4e34e9916a9a167e" dependencies = [ "debugid", - "memmap2 0.9.4", + "memmap2 0.9.5", "stable_deref_trait", "uuid", ] [[package]] name = "symbolic-demangle" -version = "12.11.0" +version = "12.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea26e430c27d4a8a5dea4c4b81440606c7c1a415bd611451ef6af8c81416afc3" +checksum = "bc8ece6b129e97e53d1fbb3f61d33a6a9e5369b11d01228c068094d6d134eaea" dependencies = [ "cpp_demangle", "rustc-demangle", @@ -4504,9 +4490,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.77" +version = "2.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" +checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" dependencies = [ "proc-macro2", "quote", @@ -4536,9 +4522,9 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tempfile" -version = "3.12.0" +version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" +checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" dependencies = [ "cfg-if", "fastrand", @@ -4564,7 +4550,7 @@ checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -4687,14 +4673,14 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] name = "tokio-postgres" -version = "0.7.11" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03adcf0147e203b6032c0b2d30be1415ba03bc348901f3ff1cc0df6a733e60c3" +checksum = "3b5d3742945bc7d7f210693b0c58ae542c6fd47b17adbbda0885f3dcb34a6bdb" dependencies = [ "async-trait", "byteorder", @@ -4782,9 +4768,9 @@ checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" [[package]] name = "toml_edit" -version = "0.22.20" +version = "0.22.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d" +checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ "indexmap 2.5.0", "toml_datetime", @@ -4801,7 +4787,6 @@ dependencies = [ "futures-util", "pin-project", "pin-project-lite", - "tokio", "tower-layer", "tower-service", "tracing", @@ -4839,7 +4824,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -4910,30 +4895,30 @@ checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" [[package]] name = "unicode-normalization" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" dependencies = [ "tinyvec", ] [[package]] name = "unicode-properties" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52ea75f83c0137a9b98608359a5f1af8144876eb67bcb1ce837368e906a9f524" +checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" [[package]] name = "unicode-script" -version = "0.5.6" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad8d71f5726e5f285a935e9fe8edfd53f0491eb6e9a5774097fdabee7cd8c9cd" +checksum = "9fb421b350c9aff471779e262955939f565ec18b86c15364e6bdf0d662ca7c1f" [[package]] name = "unicode-segmentation" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" [[package]] name = "unicode-vo" @@ -4943,9 +4928,9 @@ checksum = "b1d386ff53b415b7fe27b50bb44679e2cc4660272694b7b6f3326d8480823a94" [[package]] name = "unicode-width" -version = "0.1.13" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" [[package]] name = "unicode_categories" @@ -5129,7 +5114,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", "wasm-bindgen-shared", ] @@ -5163,7 +5148,7 @@ checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -5433,9 +5418,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.6.18" +version = "0.6.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f" +checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" dependencies = [ "memchr", ] @@ -5510,7 +5495,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] @@ -5530,7 +5515,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.79", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 4cb837c9d..25b8a3693 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -58,14 +58,14 @@ md5 = "0.7.0" moka = { version = "0.12", features = ["future"] } num_cpus = "1" pbf_font_tools = { version = "2.5.1", features = ["freetype"] } -pmtiles = { version = "0.10", features = ["http-async", "mmap-async-tokio", "tilejson", "reqwest-rustls-tls-native-roots"] } +pmtiles = { version = "0.11", features = ["http-async", "mmap-async-tokio", "tilejson", "reqwest-rustls-tls-native-roots"] } postgis = "0.9" postgres = { version = "0.19", features = ["with-time-0_3", "with-uuid-1", "with-serde_json-1"] } postgres-protocol = "0.6" pprof = { version = "0.13", features = ["flamegraph", "criterion"] } pretty_assertions = "1" regex = "1" -rstest = "0.22" +rstest = "0.23" rustls = "0.23.12" # ring feature does not require NASM windows executable, but works slower #rustls = { version = "0.23", default-features = false, features = ["logging", "std", "tls12", "ring"] } diff --git a/docker-compose.yml b/docker-compose.yml index aeaa433ea..96f7a3af2 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -29,6 +29,9 @@ services: restart: unless-stopped ports: - '${PGPORT:-5411}:5432' + command: + - '-c' + - 'max_connections=200' environment: # POSTGRES_* variables are used by the postgis/postgres image # PG_* variables are used by psql diff --git a/justfile b/justfile index 4915a7a52..8784f757e 100644 --- a/justfile +++ b/justfile @@ -227,7 +227,7 @@ docs: coverage FORMAT='html': (cargo-install "grcov") #!/usr/bin/env bash set -euo pipefail - if ! rustup component list | grep llvm-tools-preview &> /dev/null; then \ + if ! rustup component list | grep llvm-tools-preview > /dev/null; then \ echo "llvm-tools-preview could not be found. Installing..." ;\ rustup component add llvm-tools-preview ;\ fi diff --git a/tests/expected/auto/mb_jpg.json b/tests/expected/auto/mb_jpg.json index 0ea277215..ff08e27b5 100644 --- a/tests/expected/auto/mb_jpg.json +++ b/tests/expected/auto/mb_jpg.json @@ -4,9 +4,9 @@ "http://localhost:3111/geography-class-jpg/{z}/{x}/{y}" ], "bounds": [ - -180, + -180.0, -85.0511, - 180, + 180.0, 85.0511 ], "description": "One of the example maps that comes with TileMill - a bright & colorful world map that blends retro and high-tech with its folded paper texture and interactive flag tooltips. ", diff --git a/tests/expected/auto/mb_png.json b/tests/expected/auto/mb_png.json index 55c42294b..11ec3b88f 100644 --- a/tests/expected/auto/mb_png.json +++ b/tests/expected/auto/mb_png.json @@ -4,14 +4,14 @@ "http://localhost:3111/geography-class-png/{z}/{x}/{y}" ], "bounds": [ - -180, + -180.0, -85.0511, - 180, + 180.0, 85.0511 ], "center": [ - 0, - 20, + 0.0, + 20.0, 0 ], "description": "One of the example maps that comes with TileMill - a bright & colorful world map that blends retro and high-tech with its folded paper texture and interactive flag tooltips. ", diff --git a/tests/expected/auto/pmt.json b/tests/expected/auto/pmt.json index 96f570c07..9d9f6370f 100644 --- a/tests/expected/auto/pmt.json +++ b/tests/expected/auto/pmt.json @@ -4,14 +4,14 @@ "http://localhost:3111/stamen_toner__raster_CC-BY-ODbL_z3/{z}/{x}/{y}" ], "bounds": [ - -180, - -85, - 180, - 85 + -180.0, + -85.0, + 180.0, + 85.0 ], "center": [ - 0, - 0, + 0.0, + 0.0, 0 ], "maxzoom": 3, diff --git a/tests/expected/auto/table_source.json b/tests/expected/auto/table_source.json index 609c974b5..f429acd09 100644 --- a/tests/expected/auto/table_source.json +++ b/tests/expected/auto/table_source.json @@ -12,10 +12,10 @@ } ], "bounds": [ - -2, - -1, + -2.0, + -1.0, 142.84131509869133, - 45 + 45.0 ], "name": "table_source", "foo": { From 63495c4a98a72a6938c9bd6e403cbb95abcb3de0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Oct 2024 00:20:40 -0400 Subject: [PATCH 135/215] chore(deps): Bump rollup from 3.29.4 to 3.29.5 in /demo/frontend (#1529) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [rollup](https://github.com/rollup/rollup) from 3.29.4 to 3.29.5.
Changelog

Sourced from rollup's changelog.

rollup changelog

4.22.5

2024-09-27

Bug Fixes

  • Allow parsing of certain unicode characters again (#5674)

Pull Requests

4.22.4

2024-09-21

Bug Fixes

  • Fix a vulnerability in generated code that affects IIFE, UMD and CJS bundles when run in a browser context (#5671)

Pull Requests

4.22.3

2024-09-21

Bug Fixes

  • Ensure that mutations in modules without side effects are observed while properly handling transitive dependencies (#5669)

Pull Requests

4.22.2

2024-09-20

Bug Fixes

... (truncated)

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=rollup&package-manager=npm_and_yarn&previous-version=3.29.4&new-version=3.29.5)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/maplibre/martin/network/alerts).
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- demo/frontend/yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/demo/frontend/yarn.lock b/demo/frontend/yarn.lock index cd949ef39..e3dc03bf9 100644 --- a/demo/frontend/yarn.lock +++ b/demo/frontend/yarn.lock @@ -3936,9 +3936,9 @@ rimraf@^3.0.2: glob "^7.1.3" rollup@^3.27.1: - version "3.29.4" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.29.4.tgz#4d70c0f9834146df8705bfb69a9a19c9e1109981" - integrity sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw== + version "3.29.5" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.29.5.tgz#8a2e477a758b520fb78daf04bca4c522c1da8a54" + integrity sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w== optionalDependencies: fsevents "~2.3.2" From 92942d0b38f8e3d385ccea47399f8d4d51dd5b08 Mon Sep 17 00:00:00 2001 From: Yuri Astrakhan Date: Tue, 1 Oct 2024 00:28:15 -0400 Subject: [PATCH 136/215] Update martin-ui NPM dependencies --- martin-ui/package-lock.json | 1523 ++++++++++++++++++++--------------- 1 file changed, 876 insertions(+), 647 deletions(-) diff --git a/martin-ui/package-lock.json b/martin-ui/package-lock.json index a50e0ed63..e17f67765 100644 --- a/martin-ui/package-lock.json +++ b/martin-ui/package-lock.json @@ -29,66 +29,61 @@ "npm": ">=10.7.0" } }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz", + "integrity": "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.7.tgz", - "integrity": "sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", + "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", "dev": true, + "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.7", - "@babel/parser": "^7.23.6", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.7", - "@babel/types": "^7.23.6", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-module-transforms": "^7.25.2", + "@babel/helpers": "^7.25.0", + "@babel/parser": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.2", + "@babel/types": "^7.25.2", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -108,19 +103,21 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.6.tgz", + "integrity": "sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", + "@babel/types": "^7.25.6", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" }, "engines": { @@ -128,14 +125,15 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", + "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", + "@babel/compat-data": "^7.25.2", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -148,67 +146,36 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.15" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", + "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.2" }, "engines": { "node": ">=6.9.0" @@ -218,98 +185,98 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", + "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", + "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.8.tgz", - "integrity": "sha512-KDqYz4PiOWvDFrdHLPhKtCThtIcKVy6avWD2oG4GEvyQ+XDZwHD4YQd+H2vNMnq2rkdxsDkU82T+Vk8U/WXHRQ==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.6.tgz", + "integrity": "sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.7", - "@babel/types": "^7.23.6" + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-validator-identifier": "^7.24.7", "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", - "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", + "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.6" + }, "bin": { "parser": "bin/babel-parser.js" }, @@ -318,12 +285,13 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.23.3.tgz", - "integrity": "sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.7.tgz", + "integrity": "sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -333,12 +301,13 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.23.3.tgz", - "integrity": "sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.7.tgz", + "integrity": "sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -348,33 +317,32 @@ } }, "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", + "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz", - "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.6", - "@babel/types": "^7.23.6", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.6.tgz", + "integrity": "sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.6", + "@babel/parser": "^7.25.6", + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.6", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -383,13 +351,14 @@ } }, "node_modules/@babel/types": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", - "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", + "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", "to-fast-properties": "^2.0.0" }, "engines": { @@ -397,9 +366,10 @@ } }, "node_modules/@emotion/is-prop-valid": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", - "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", + "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", + "license": "MIT", "dependencies": { "@emotion/memoize": "^0.8.1" } @@ -407,21 +377,24 @@ "node_modules/@emotion/memoize": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", - "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==", + "license": "MIT" }, "node_modules/@emotion/unitless": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.0.tgz", - "integrity": "sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==" + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==", + "license": "MIT" }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz", - "integrity": "sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "aix" @@ -431,13 +404,14 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.11.tgz", - "integrity": "sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -447,13 +421,14 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.11.tgz", - "integrity": "sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -463,13 +438,14 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.11.tgz", - "integrity": "sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -479,13 +455,14 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.11.tgz", - "integrity": "sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -495,13 +472,14 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.11.tgz", - "integrity": "sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -511,13 +489,14 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.11.tgz", - "integrity": "sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -527,13 +506,14 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.11.tgz", - "integrity": "sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -543,13 +523,14 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.11.tgz", - "integrity": "sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -559,13 +540,14 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.11.tgz", - "integrity": "sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -575,13 +557,14 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.11.tgz", - "integrity": "sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -591,13 +574,14 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.11.tgz", - "integrity": "sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", "cpu": [ "loong64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -607,13 +591,14 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.11.tgz", - "integrity": "sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", "cpu": [ "mips64el" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -623,13 +608,14 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.11.tgz", - "integrity": "sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -639,13 +625,14 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.11.tgz", - "integrity": "sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", "cpu": [ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -655,13 +642,14 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.11.tgz", - "integrity": "sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", "cpu": [ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -671,13 +659,14 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.11.tgz", - "integrity": "sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -687,13 +676,14 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.11.tgz", - "integrity": "sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "netbsd" @@ -703,13 +693,14 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.11.tgz", - "integrity": "sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openbsd" @@ -719,13 +710,14 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.11.tgz", - "integrity": "sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "sunos" @@ -735,13 +727,14 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.11.tgz", - "integrity": "sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -751,13 +744,14 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.11.tgz", - "integrity": "sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -767,13 +761,14 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.11.tgz", - "integrity": "sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -787,6 +782,7 @@ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, + "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.3.0" }, @@ -798,10 +794,11 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", + "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", "dev": true, + "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -811,6 +808,7 @@ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -834,6 +832,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -844,6 +843,7 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -859,6 +859,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -867,22 +868,24 @@ } }, "node_modules/@eslint/js": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", - "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", "dev": true, + "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", "deprecated": "Use @eslint/config-array instead", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", + "@humanwhocodes/object-schema": "^2.0.3", "debug": "^4.3.1", "minimatch": "^3.0.5" }, @@ -895,6 +898,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -905,6 +909,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -917,6 +922,7 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=12.22" }, @@ -926,55 +932,61 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", "deprecated": "Use @eslint/object-schema instead", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.21", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.21.tgz", - "integrity": "sha512-SRfKmRe1KvYnxjEMtxEr+J4HIeMX5YBg/qhRHpxEIGjhX1rshcHlnFUE9K0GazhVKWM7B+nARSkV8LuvJdJ5/g==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -985,6 +997,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -998,6 +1011,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } @@ -1007,6 +1021,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -1016,169 +1031,224 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.5.tgz", - "integrity": "sha512-idWaG8xeSRCfRq9KpRysDHJ/rEHBEXcHuJ82XY0yYFIWnLMjZv9vF/7DOq8djQ2n3Lk6+3qfSH8AqlmHlmi1MA==", + "version": "4.22.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.5.tgz", + "integrity": "sha512-SU5cvamg0Eyu/F+kLeMXS7GoahL+OoizlclVFX3l5Ql6yNlywJJ0OuqTzUx0v+aHhPHEB/56CT06GQrRrGNYww==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.5.tgz", - "integrity": "sha512-f14d7uhAMtsCGjAYwZGv6TwuS3IFaM4ZnGMUn3aCBgkcHAYErhV1Ad97WzBvS2o0aaDv4mVz+syiN0ElMyfBPg==", + "version": "4.22.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.5.tgz", + "integrity": "sha512-S4pit5BP6E5R5C8S6tgU/drvgjtYW76FBuG6+ibG3tMvlD1h9LHVF9KmlmaUBQ8Obou7hEyS+0w+IR/VtxwNMQ==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.5.tgz", - "integrity": "sha512-ndoXeLx455FffL68OIUrVr89Xu1WLzAG4n65R8roDlCoYiQcGGg6MALvs2Ap9zs7AHg8mpHtMpwC8jBBjZrT/w==", + "version": "4.22.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.5.tgz", + "integrity": "sha512-250ZGg4ipTL0TGvLlfACkIxS9+KLtIbn7BCZjsZj88zSg2Lvu3Xdw6dhAhfe/FjjXPVNCtcSp+WZjVsD3a/Zlw==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.5.tgz", - "integrity": "sha512-UmElV1OY2m/1KEEqTlIjieKfVwRg0Zwg4PLgNf0s3glAHXBN99KLpw5A5lrSYCa1Kp63czTpVll2MAqbZYIHoA==", + "version": "4.22.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.5.tgz", + "integrity": "sha512-D8brJEFg5D+QxFcW6jYANu+Rr9SlKtTenmsX5hOSzNYVrK5oLAEMTUgKWYJP+wdKyCdeSwnapLsn+OVRFycuQg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.5.tgz", - "integrity": "sha512-Q0LcU61v92tQB6ae+udZvOyZ0wfpGojtAKrrpAaIqmJ7+psq4cMIhT/9lfV6UQIpeItnq/2QDROhNLo00lOD1g==", + "version": "4.22.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.5.tgz", + "integrity": "sha512-PNqXYmdNFyWNg0ma5LdY8wP+eQfdvyaBAojAXgO7/gs0Q/6TQJVXAXe8gwW9URjbS0YAammur0fynYGiWsKlXw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.22.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.5.tgz", + "integrity": "sha512-kSSCZOKz3HqlrEuwKd9TYv7vxPYD77vHSUvM2y0YaTGnFc8AdI5TTQRrM1yIp3tXCKrSL9A7JLoILjtad5t8pQ==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.5.tgz", - "integrity": "sha512-dkRscpM+RrR2Ee3eOQmRWFjmV/payHEOrjyq1VZegRUa5OrZJ2MAxBNs05bZuY0YCtpqETDy1Ix4i/hRqX98cA==", + "version": "4.22.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.5.tgz", + "integrity": "sha512-oTXQeJHRbOnwRnRffb6bmqmUugz0glXaPyspp4gbQOPVApdpRrY/j7KP3lr7M8kTfQTyrBUzFjj5EuHAhqH4/w==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.5.tgz", - "integrity": "sha512-QaKFVOzzST2xzY4MAmiDmURagWLFh+zZtttuEnuNn19AiZ0T3fhPyjPPGwLNdiDT82ZE91hnfJsUiDwF9DClIQ==", + "version": "4.22.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.5.tgz", + "integrity": "sha512-qnOTIIs6tIGFKCHdhYitgC2XQ2X25InIbZFor5wh+mALH84qnFHvc+vmWUpyX97B0hNvwNUL4B+MB8vJvH65Fw==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.22.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.5.tgz", + "integrity": "sha512-TMYu+DUdNlgBXING13rHSfUc3Ky5nLPbWs4bFnT+R6Vu3OvXkTkixvvBKk8uO4MT5Ab6lC3U7x8S8El2q5o56w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.5.tgz", - "integrity": "sha512-HeGqmRJuyVg6/X6MpE2ur7GbymBPS8Np0S/vQFHDmocfORT+Zt76qu+69NUoxXzGqVP1pzaY6QIi0FJWLC3OPA==", + "version": "4.22.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.5.tgz", + "integrity": "sha512-PTQq1Kz22ZRvuhr3uURH+U/Q/a0pbxJoICGSprNLAoBEkyD3Sh9qP5I0Asn0y0wejXQBbsVMRZRxlbGFD9OK4A==", "cpu": [ "riscv64" ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.22.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.5.tgz", + "integrity": "sha512-bR5nCojtpuMss6TDEmf/jnBnzlo+6n1UhgwqUvRoe4VIotC7FG1IKkyJbwsT7JDsF2jxR+NTnuOwiGv0hLyDoQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.5.tgz", - "integrity": "sha512-Dq1bqBdLaZ1Gb/l2e5/+o3B18+8TI9ANlA1SkejZqDgdU/jK/ThYaMPMJpVMMXy2uRHvGKbkz9vheVGdq3cJfA==", + "version": "4.22.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.5.tgz", + "integrity": "sha512-N0jPPhHjGShcB9/XXZQWuWBKZQnC1F36Ce3sDqWpujsGjDz/CQtOL9LgTrJ+rJC8MJeesMWrMWVLKKNR/tMOCA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.5.tgz", - "integrity": "sha512-ezyFUOwldYpj7AbkwyW9AJ203peub81CaAIVvckdkyH8EvhEIoKzaMFJj0G4qYJ5sw3BpqhFrsCc30t54HV8vg==", + "version": "4.22.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.5.tgz", + "integrity": "sha512-uBa2e28ohzNNwjr6Uxm4XyaA1M/8aTgfF2T7UIlElLaeXkgpmIJ2EitVNQxjO9xLLLy60YqAgKn/AqSpCUkE9g==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.5.tgz", - "integrity": "sha512-aHSsMnUw+0UETB0Hlv7B/ZHOGY5bQdwMKJSzGfDfvyhnpmVxLMGnQPGNE9wgqkLUs3+gbG1Qx02S2LLfJ5GaRQ==", + "version": "4.22.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.5.tgz", + "integrity": "sha512-RXT8S1HP8AFN/Kr3tg4fuYrNxZ/pZf1HemC5Tsddc6HzgGnJm0+Lh5rAHJkDuW3StI0ynNXukidROMXYl6ew8w==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.5.tgz", - "integrity": "sha512-AiqiLkb9KSf7Lj/o1U3SEP9Zn+5NuVKgFdRIZkvd4N0+bYrTOovVd0+LmYCPQGbocT4kvFyK+LXCDiXPBF3fyA==", + "version": "4.22.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.5.tgz", + "integrity": "sha512-ElTYOh50InL8kzyUD6XsnPit7jYCKrphmddKAe1/Ytt74apOxDq5YEcbsiKs0fR3vff3jEneMM+3I7jbqaMyBg==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.5.tgz", - "integrity": "sha512-1q+mykKE3Vot1kaFJIDoUFv5TuW+QQVaf2FmTT9krg86pQrGStOSJJ0Zil7CFagyxDuouTepzt5Y5TVzyajOdQ==", + "version": "4.22.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.5.tgz", + "integrity": "sha512-+lvL/4mQxSV8MukpkKyyvfwhH266COcWlXE/1qxwN08ajovta3459zrjLghYMgDerlzNwLAcFpvU+WWE5y6nAQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -1189,6 +1259,7 @@ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", @@ -1202,6 +1273,7 @@ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.0.0" } @@ -1211,86 +1283,89 @@ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, + "license": "MIT", "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__traverse": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", - "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.20.7" } }, "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT" }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/prop-types": { - "version": "15.7.11", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", - "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==", - "dev": true + "version": "15.7.13", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", + "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==", + "dev": true, + "license": "MIT" }, "node_modules/@types/react": { - "version": "18.2.48", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.48.tgz", - "integrity": "sha512-qboRCl6Ie70DQQG9hhNREz81jqC1cs9EVNcjQ1AU+jH6NFfSAhVVbrrY/+nSF+Bsk4AOwm9Qa61InvMCyV+H3w==", + "version": "18.3.10", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.10.tgz", + "integrity": "sha512-02sAAlBnP39JgXwkAq3PeU9DVaaGpZyF3MGcC0MKgQVkZor5IiiDAipVaxQHtDJAmO4GIy/rVBy/LzVj76Cyqg==", "dev": true, + "license": "MIT", "dependencies": { "@types/prop-types": "*", - "@types/scheduler": "*", "csstype": "^3.0.2" } }, "node_modules/@types/react-dom": { - "version": "18.2.18", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.18.tgz", - "integrity": "sha512-TJxDm6OfAX2KJWJdMEVTwWke5Sc/E/RlnPGvGfS0W7+6ocy2xhDVQVh/KvC2Uf7kACs+gDytdusDSdWfWkaNzw==", + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", + "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", "dev": true, + "license": "MIT", "dependencies": { "@types/react": "*" } }, - "node_modules/@types/scheduler": { - "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", - "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==", - "dev": true - }, "node_modules/@types/semver": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", - "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", - "dev": true + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "dev": true, + "license": "MIT" }, "node_modules/@types/stylis": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.0.tgz", - "integrity": "sha512-n4sx2bqL0mW1tvDf/loQ+aMX7GQD3lc3fkCMC55VFNDu/vBOabO+LTIeXKM14xK0ppk5TUGcWRjiSpIlUpghKw==" + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.5.tgz", + "integrity": "sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==", + "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.19.0.tgz", - "integrity": "sha512-DUCUkQNklCQYnrBSSikjVChdc84/vMPDQSgJTHBZ64G9bA9w0Crc0rd2diujKbTdp6w2J47qkeHQLoi0rpLCdg==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", + "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.19.0", - "@typescript-eslint/type-utils": "6.19.0", - "@typescript-eslint/utils": "6.19.0", - "@typescript-eslint/visitor-keys": "6.19.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/type-utils": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -1316,15 +1391,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.19.0.tgz", - "integrity": "sha512-1DyBLG5SH7PYCd00QlroiW60YJ4rWMuUGa/JBV0iZuqi4l4IK3twKPq5ZkEebmGqRjXWVgsUzfd3+nZveewgow==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/scope-manager": "6.19.0", - "@typescript-eslint/types": "6.19.0", - "@typescript-eslint/typescript-estree": "6.19.0", - "@typescript-eslint/visitor-keys": "6.19.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4" }, "engines": { @@ -1344,13 +1420,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.19.0.tgz", - "integrity": "sha512-dO1XMhV2ehBI6QN8Ufi7I10wmUovmLU0Oru3n5LVlM2JuzB4M+dVphCPLkVpKvGij2j/pHBWuJ9piuXx+BhzxQ==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "6.19.0", - "@typescript-eslint/visitor-keys": "6.19.0" + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -1361,13 +1438,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.19.0.tgz", - "integrity": "sha512-mcvS6WSWbjiSxKCwBcXtOM5pRkPQ6kcDds/juxcy/727IQr3xMEcwr/YLHW2A2+Fp5ql6khjbKBzOyjuPqGi/w==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", + "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "6.19.0", - "@typescript-eslint/utils": "6.19.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/utils": "6.21.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -1388,10 +1466,11 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.19.0.tgz", - "integrity": "sha512-lFviGV/vYhOy3m8BJ/nAKoAyNhInTdXpftonhWle66XHAtT1ouBlkjL496b5H5hb8dWXHwtypTqgtb/DEa+j5A==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", "dev": true, + "license": "MIT", "engines": { "node": "^16.0.0 || >=18.0.0" }, @@ -1401,13 +1480,14 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.19.0.tgz", - "integrity": "sha512-o/zefXIbbLBZ8YJ51NlkSAt2BamrK6XOmuxSR3hynMIzzyMY33KuJ9vuMdFSXW+H0tVvdF9qBPTHA91HDb4BIQ==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "6.19.0", - "@typescript-eslint/visitor-keys": "6.19.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1429,17 +1509,18 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.19.0.tgz", - "integrity": "sha512-QR41YXySiuN++/dC9UArYOg4X86OAYP83OWTewpVx5ct1IZhjjgTLocj7QNxGhWoTqknsgpl7L+hGygCO+sdYw==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.19.0", - "@typescript-eslint/types": "6.19.0", - "@typescript-eslint/typescript-estree": "6.19.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", "semver": "^7.5.4" }, "engines": { @@ -1454,12 +1535,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.19.0.tgz", - "integrity": "sha512-hZaUCORLgubBvtGpp1JEFEazcuEdfxta9j4iUwdSAr7mEsYYAp3EAUyCZk3VEEqGj6W+AV4uWyrDGtrlawAsgQ==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "6.19.0", + "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -1474,19 +1556,21 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/@vitejs/plugin-react": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.2.1.tgz", - "integrity": "sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.2.tgz", + "integrity": "sha512-hieu+o05v4glEBucTcKMK3dlES0OeJlD9YVOAPraVMOInBCwzumaIFiUjr4bHK7NPgnAHgiskUoceKercrN8vg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/core": "^7.23.5", - "@babel/plugin-transform-react-jsx-self": "^7.23.3", - "@babel/plugin-transform-react-jsx-source": "^7.23.3", + "@babel/core": "^7.25.2", + "@babel/plugin-transform-react-jsx-self": "^7.24.7", + "@babel/plugin-transform-react-jsx-source": "^7.24.7", "@types/babel__core": "^7.20.5", - "react-refresh": "^0.14.0" + "react-refresh": "^0.14.2" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -1496,10 +1580,11 @@ } }, "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -1512,6 +1597,7 @@ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, + "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -1521,6 +1607,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -1537,6 +1624,7 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -1546,6 +1634,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -1557,13 +1646,15 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "dev": true, + "license": "Python-2.0" }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -1572,13 +1663,15 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -1588,6 +1681,7 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, + "license": "MIT", "dependencies": { "fill-range": "^7.1.1" }, @@ -1596,9 +1690,9 @@ } }, "node_modules/browserslist": { - "version": "4.22.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", - "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz", + "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==", "dev": true, "funding": [ { @@ -1614,11 +1708,12 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001565", - "electron-to-chromium": "^1.4.601", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" + "caniuse-lite": "^1.0.30001663", + "electron-to-chromium": "^1.5.28", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" }, "bin": { "browserslist": "cli.js" @@ -1632,6 +1727,7 @@ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -1640,14 +1736,15 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/caniuse-lite": { - "version": "1.0.30001579", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001579.tgz", - "integrity": "sha512-u5AUVkixruKHJjw/pj9wISlcMpgFWzSrczLZbrqBSxukQixmg0SJ5sZTpvaFvxU0HoQKd4yoyAogyrAz9pzJnA==", + "version": "1.0.30001664", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001664.tgz", + "integrity": "sha512-AmE7k4dXiNKQipgn7a2xg558IRqPN3jMQY/rOsbxDhrd0tyChwbITBfiwtnqz8bi2M5mIWbxAYBvk7W7QBUS2g==", "dev": true, "funding": [ { @@ -1662,13 +1759,15 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -1683,6 +1782,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "1.1.3" } @@ -1691,25 +1791,29 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -1723,6 +1827,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", + "license": "ISC", "engines": { "node": ">=4" } @@ -1731,6 +1836,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", + "license": "MIT", "dependencies": { "camelize": "^1.0.0", "css-color-keywords": "^1.0.0", @@ -1741,15 +1847,16 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true + "license": "MIT" }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dev": true, + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -1764,13 +1871,15 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, + "license": "MIT", "dependencies": { "path-type": "^4.0.0" }, @@ -1783,6 +1892,7 @@ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, + "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -1791,17 +1901,19 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.639", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.639.tgz", - "integrity": "sha512-CkKf3ZUVZchr+zDpAlNLEEy2NJJ9T64ULWaDgy3THXXlPVPkLu3VOs9Bac44nebVtdwl2geSj6AxTtGDOxoXhg==", - "dev": true + "version": "1.5.30", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.30.tgz", + "integrity": "sha512-sXI35EBN4lYxzc/pIGorlymYNzDBOqkSlVRe6MkgBsW/hW1tpC/HDJ2fjG7XnjakzfLEuvdmux0Mjs6jHq4UOA==", + "dev": true, + "license": "ISC" }, "node_modules/esbuild": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.11.tgz", - "integrity": "sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, "hasInstallScript": true, + "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -1809,36 +1921,37 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.19.11", - "@esbuild/android-arm": "0.19.11", - "@esbuild/android-arm64": "0.19.11", - "@esbuild/android-x64": "0.19.11", - "@esbuild/darwin-arm64": "0.19.11", - "@esbuild/darwin-x64": "0.19.11", - "@esbuild/freebsd-arm64": "0.19.11", - "@esbuild/freebsd-x64": "0.19.11", - "@esbuild/linux-arm": "0.19.11", - "@esbuild/linux-arm64": "0.19.11", - "@esbuild/linux-ia32": "0.19.11", - "@esbuild/linux-loong64": "0.19.11", - "@esbuild/linux-mips64el": "0.19.11", - "@esbuild/linux-ppc64": "0.19.11", - "@esbuild/linux-riscv64": "0.19.11", - "@esbuild/linux-s390x": "0.19.11", - "@esbuild/linux-x64": "0.19.11", - "@esbuild/netbsd-x64": "0.19.11", - "@esbuild/openbsd-x64": "0.19.11", - "@esbuild/sunos-x64": "0.19.11", - "@esbuild/win32-arm64": "0.19.11", - "@esbuild/win32-ia32": "0.19.11", - "@esbuild/win32-x64": "0.19.11" + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -1848,21 +1961,23 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.0" } }, "node_modules/eslint": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", - "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.56.0", - "@humanwhocodes/config-array": "^0.11.13", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", @@ -1908,10 +2023,11 @@ } }, "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -1920,10 +2036,11 @@ } }, "node_modules/eslint-plugin-react-refresh": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.5.tgz", - "integrity": "sha512-D53FYKJa+fDmZMtriODxvhwrO+IOqrxoEo21gMA0sjHdU6dPVH4OhyFip9ypl8HOF5RV5KdTo+rBQLvnY2cO8w==", + "version": "0.4.12", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.12.tgz", + "integrity": "sha512-9neVjoGv20FwYtCP6CB1dzR1vr57ZDNOXst21wd2xJ/cTlM2xLq0GWVlSNTdMn/4BtP6cHYBMCSp1wFBJ9jBsg==", "dev": true, + "license": "MIT", "peerDependencies": { "eslint": ">=7" } @@ -1933,6 +2050,7 @@ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -1949,6 +2067,7 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -1961,6 +2080,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -1976,6 +2096,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1986,6 +2107,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -2002,6 +2124,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -2013,13 +2136,15 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/eslint/node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -2032,6 +2157,7 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -2047,6 +2173,7 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -2056,6 +2183,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -2068,6 +2196,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -2080,6 +2209,7 @@ "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", @@ -2093,10 +2223,11 @@ } }, "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -2109,6 +2240,7 @@ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -2121,6 +2253,7 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -2130,6 +2263,7 @@ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } @@ -2138,13 +2272,15 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-glob": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -2161,6 +2297,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -2172,19 +2309,22 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fastq": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", - "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, + "license": "ISC", "dependencies": { "reusify": "^1.0.4" } @@ -2194,6 +2334,7 @@ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, + "license": "MIT", "dependencies": { "flat-cache": "^3.0.4" }, @@ -2206,6 +2347,7 @@ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -2218,6 +2360,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -2234,6 +2377,7 @@ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, + "license": "MIT", "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", @@ -2244,16 +2388,18 @@ } }, "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", - "dev": true + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true, + "license": "ISC" }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/fsevents": { "version": "2.3.3", @@ -2261,6 +2407,7 @@ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -2274,6 +2421,7 @@ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -2284,6 +2432,7 @@ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -2304,6 +2453,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -2316,6 +2466,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2326,6 +2477,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -2338,6 +2490,7 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -2347,6 +2500,7 @@ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, + "license": "MIT", "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -2366,22 +2520,25 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } @@ -2391,6 +2548,7 @@ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -2407,6 +2565,7 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.19" } @@ -2417,6 +2576,7 @@ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, + "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -2426,13 +2586,15 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -2442,6 +2604,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -2454,6 +2617,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -2463,6 +2627,7 @@ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -2471,18 +2636,21 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -2495,6 +2663,7 @@ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true, + "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, @@ -2506,25 +2675,29 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, + "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -2537,6 +2710,7 @@ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, + "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } @@ -2546,6 +2720,7 @@ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -2559,6 +2734,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -2573,12 +2749,14 @@ "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, @@ -2591,6 +2769,7 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^3.0.2" } @@ -2600,17 +2779,19 @@ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, + "license": "MIT", "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -2622,6 +2803,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -2633,10 +2815,11 @@ } }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" }, "node_modules/nanoid": { "version": "3.3.7", @@ -2648,6 +2831,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -2659,35 +2843,39 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "dev": true, + "license": "MIT" }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, + "license": "ISC", "dependencies": { "wrappy": "1" } }, "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, + "license": "MIT", "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" @@ -2698,6 +2886,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -2713,6 +2902,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -2728,6 +2918,7 @@ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, + "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -2740,6 +2931,7 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -2749,6 +2941,7 @@ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -2758,6 +2951,7 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -2767,20 +2961,23 @@ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -2789,10 +2986,9 @@ } }, "node_modules/postcss": { - "version": "8.4.33", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", - "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", - "dev": true, + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", "funding": [ { "type": "opencollective", @@ -2807,10 +3003,11 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "source-map-js": "^1.2.0" }, "engines": { "node": "^10 || ^12 || >=14" @@ -2819,13 +3016,15 @@ "node_modules/postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8.0" } @@ -2835,6 +3034,7 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -2857,12 +3057,14 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" }, @@ -2871,22 +3073,24 @@ } }, "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" + "scheduler": "^0.23.2" }, "peerDependencies": { - "react": "^18.2.0" + "react": "^18.3.1" } }, "node_modules/react-refresh": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", - "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", + "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -2896,6 +3100,7 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -2905,6 +3110,7 @@ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, + "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -2916,6 +3122,7 @@ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, + "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -2927,12 +3134,13 @@ } }, "node_modules/rollup": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.9.5.tgz", - "integrity": "sha512-E4vQW0H/mbNMw2yLSqJyjtkHY9dslf/p0zuT1xehNRqUTBOFMqEjguDvqhXr7N7r/4ttb2jr4T41d3dncmIgbQ==", + "version": "4.22.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.5.tgz", + "integrity": "sha512-WoinX7GeQOFMGznEcWA1WrTQCd/tpEbMkc3nuMs9BT0CPjMdSjPMTVClwWd4pgSQwJdP65SK9mTCNvItlr5o7w==", "dev": true, + "license": "MIT", "dependencies": { - "@types/estree": "1.0.5" + "@types/estree": "1.0.6" }, "bin": { "rollup": "dist/bin/rollup" @@ -2942,19 +3150,22 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.9.5", - "@rollup/rollup-android-arm64": "4.9.5", - "@rollup/rollup-darwin-arm64": "4.9.5", - "@rollup/rollup-darwin-x64": "4.9.5", - "@rollup/rollup-linux-arm-gnueabihf": "4.9.5", - "@rollup/rollup-linux-arm64-gnu": "4.9.5", - "@rollup/rollup-linux-arm64-musl": "4.9.5", - "@rollup/rollup-linux-riscv64-gnu": "4.9.5", - "@rollup/rollup-linux-x64-gnu": "4.9.5", - "@rollup/rollup-linux-x64-musl": "4.9.5", - "@rollup/rollup-win32-arm64-msvc": "4.9.5", - "@rollup/rollup-win32-ia32-msvc": "4.9.5", - "@rollup/rollup-win32-x64-msvc": "4.9.5", + "@rollup/rollup-android-arm-eabi": "4.22.5", + "@rollup/rollup-android-arm64": "4.22.5", + "@rollup/rollup-darwin-arm64": "4.22.5", + "@rollup/rollup-darwin-x64": "4.22.5", + "@rollup/rollup-linux-arm-gnueabihf": "4.22.5", + "@rollup/rollup-linux-arm-musleabihf": "4.22.5", + "@rollup/rollup-linux-arm64-gnu": "4.22.5", + "@rollup/rollup-linux-arm64-musl": "4.22.5", + "@rollup/rollup-linux-powerpc64le-gnu": "4.22.5", + "@rollup/rollup-linux-riscv64-gnu": "4.22.5", + "@rollup/rollup-linux-s390x-gnu": "4.22.5", + "@rollup/rollup-linux-x64-gnu": "4.22.5", + "@rollup/rollup-linux-x64-musl": "4.22.5", + "@rollup/rollup-win32-arm64-msvc": "4.22.5", + "@rollup/rollup-win32-ia32-msvc": "4.22.5", + "@rollup/rollup-win32-x64-msvc": "4.22.5", "fsevents": "~2.3.2" } }, @@ -2977,26 +3188,26 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } }, "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" } }, "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -3004,34 +3215,18 @@ "node": ">=10" } }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/shallowequal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "license": "MIT" }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -3044,6 +3239,7 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -3053,14 +3249,16 @@ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -3070,6 +3268,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -3082,6 +3281,7 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -3090,19 +3290,20 @@ } }, "node_modules/styled-components": { - "version": "6.1.8", - "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.8.tgz", - "integrity": "sha512-PQ6Dn+QxlWyEGCKDS71NGsXoVLKfE1c3vApkvDYS5KAK+V8fNWGhbSUEo9Gg2iaID2tjLXegEW3bZDUGpofRWw==", - "dependencies": { - "@emotion/is-prop-valid": "1.2.1", - "@emotion/unitless": "0.8.0", - "@types/stylis": "4.2.0", + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.13.tgz", + "integrity": "sha512-M0+N2xSnAtwcVAQeFEsGWFFxXDftHUD7XrKla06QbpUMmbmtFBMMTcKWvFXtWxuD5qQkB8iU5gk6QASlx2ZRMw==", + "license": "MIT", + "dependencies": { + "@emotion/is-prop-valid": "1.2.2", + "@emotion/unitless": "0.8.1", + "@types/stylis": "4.2.5", "css-to-react-native": "3.2.0", - "csstype": "3.1.2", - "postcss": "8.4.31", + "csstype": "3.1.3", + "postcss": "8.4.38", "shallowequal": "1.1.0", - "stylis": "4.3.1", - "tslib": "2.5.0" + "stylis": "4.3.2", + "tslib": "2.6.2" }, "engines": { "node": ">= 16" @@ -3116,48 +3317,18 @@ "react-dom": ">= 16.8.0" } }, - "node_modules/styled-components/node_modules/csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" - }, - "node_modules/styled-components/node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, "node_modules/stylis": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.1.tgz", - "integrity": "sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ==" + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz", + "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==", + "license": "MIT" }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -3169,13 +3340,15 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -3185,6 +3358,7 @@ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -3193,27 +3367,30 @@ } }, "node_modules/ts-api-utils": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", - "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">=16.13.0" + "node": ">=16" }, "peerDependencies": { "typescript": ">=4.2.0" } }, "node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "license": "0BSD" }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -3226,6 +3403,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -3234,10 +3412,11 @@ } }, "node_modules/typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz", + "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -3247,9 +3426,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "dev": true, "funding": [ { @@ -3265,9 +3444,10 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.2.0", + "picocolors": "^1.1.0" }, "bin": { "update-browserslist-db": "cli.js" @@ -3281,19 +3461,21 @@ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } }, "node_modules/vite": { - "version": "5.0.13", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.13.tgz", - "integrity": "sha512-/9ovhv2M2dGTuA+dY93B9trfyWMDRQw2jdVBhHNP6wr0oF34wG2i/N55801iZIpgUpnHDm4F/FabGQLyc+eOgg==", + "version": "5.4.8", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.8.tgz", + "integrity": "sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==", "dev": true, + "license": "MIT", "dependencies": { - "esbuild": "^0.19.3", - "postcss": "^8.4.32", - "rollup": "^4.2.0" + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" }, "bin": { "vite": "bin/vite.js" @@ -3312,6 +3494,7 @@ "less": "*", "lightningcss": "^1.21.0", "sass": "*", + "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" @@ -3329,6 +3512,9 @@ "sass": { "optional": true }, + "sass-embedded": { + "optional": true + }, "stylus": { "optional": true }, @@ -3340,11 +3526,41 @@ } } }, + "node_modules/vite/node_modules/postcss": { + "version": "8.4.47", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", + "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.0", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -3355,23 +3571,36 @@ "node": ">= 8" } }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, From 143d09bb38ee089a8ff075c08dde3a12c0de1e2c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 2 Oct 2024 03:21:42 +0000 Subject: [PATCH 137/215] chore(deps): Bump clap from 4.5.18 to 4.5.19 (#1533) Bumps [clap](https://github.com/clap-rs/clap) from 4.5.18 to 4.5.19.
Release notes

Sourced from clap's releases.

v4.5.19

[4.5.19] - 2024-10-01

Internal

  • Update dependencies
Changelog

Sourced from clap's changelog.

[4.5.19] - 2024-10-01

Internal

  • Update dependencies
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=clap&package-manager=cargo&previous-version=4.5.18&new-version=4.5.19)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3fda19695..99b62a491 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -772,9 +772,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.18" +version = "4.5.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0956a43b323ac1afaffc053ed5c4b7c1f1800bacd1683c353aabbb752515dd3" +checksum = "7be5744db7978a28d9df86a214130d106a89ce49644cbc4e3f0c22c3fba30615" dependencies = [ "clap_builder", "clap_derive", @@ -782,9 +782,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.18" +version = "4.5.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d72166dd41634086d5803a47eb71ae740e61d84709c36f3c34110173db3961b" +checksum = "a5fbc17d3ef8278f55b282b2a2e75ae6f6c7d4bb70ed3d0382375104bfafdb4b" dependencies = [ "anstream", "anstyle", @@ -2299,7 +2299,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" dependencies = [ "cfg-if", - "windows-targets 0.52.6", + "windows-targets 0.48.5", ] [[package]] From a6795200637aaf05793444c16cdf02ef13c02610 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Oct 2024 03:09:41 +0000 Subject: [PATCH 138/215] chore(deps): Bump rustls from 0.23.13 to 0.23.14 (#1535) Bumps [rustls](https://github.com/rustls/rustls) from 0.23.13 to 0.23.14.
Commits
  • cf736e3 Prepare 0.23.14
  • 262ae99 Accept kyber deprecation
  • c9f5734 Take aws-lc-rs 1.10
  • 0560938 Take latest bogo release
  • 7bf82dc Send illegal_parameter alert on illegal group
  • d752eb2 Send illegal_parameter alert on invalid key share
  • 2d3b7ab default crypto provider improvements
  • bcc295d Fix new cargo doc warnings in examples
  • e7dd2fd fips.rs: reflect certificate issuance for aws-lc 2.0.0
  • 58a5891 fix(deps): update rust crate brotli to v7
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=rustls&package-manager=cargo&previous-version=0.23.13&new-version=0.23.14)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 6 +++--- Cargo.toml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 99b62a491..f3dbec603 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2299,7 +2299,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" dependencies = [ "cfg-if", - "windows-targets 0.48.5", + "windows-targets 0.52.6", ] [[package]] @@ -3727,9 +3727,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.13" +version = "0.23.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2dabaac7466917e566adb06783a81ca48944c6898a1b08b9374106dd671f4c8" +checksum = "415d9944693cb90382053259f89fbb077ea730ad7273047ec63b19bc9b160ba8" dependencies = [ "aws-lc-rs", "log", diff --git a/Cargo.toml b/Cargo.toml index 25b8a3693..b40fb7e7c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -66,7 +66,7 @@ pprof = { version = "0.13", features = ["flamegraph", "criterion"] } pretty_assertions = "1" regex = "1" rstest = "0.23" -rustls = "0.23.12" +rustls = "0.23.14" # ring feature does not require NASM windows executable, but works slower #rustls = { version = "0.23", default-features = false, features = ["logging", "std", "tls12", "ring"] } rustls-native-certs = "0.8" From 8f84f55b3837318669c90bab18ae8f03a7d369c1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Oct 2024 03:17:27 +0000 Subject: [PATCH 139/215] chore(deps): Bump clap from 4.5.19 to 4.5.20 (#1537) Bumps [clap](https://github.com/clap-rs/clap) from 4.5.19 to 4.5.20.
Changelog

Sourced from clap's changelog.

[4.5.20] - 2024-10-08

Features

  • (unstable) Add CommandExt
Commits
  • 5034cab chore: Release
  • b5b690c docs: Update changelog
  • abba196 Merge pull request #5688 from epage/rename
  • 6ddd5d4 fix(complete)!: Rename ArgValueCompleter to ArgValueCandidates
  • 71c5e27 fix(complete)!: Rename CustomCompleter to ValueCandidates
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=clap&package-manager=cargo&previous-version=4.5.19&new-version=4.5.20)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f3dbec603..86849e2e8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -772,9 +772,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.19" +version = "4.5.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7be5744db7978a28d9df86a214130d106a89ce49644cbc4e3f0c22c3fba30615" +checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" dependencies = [ "clap_builder", "clap_derive", @@ -782,9 +782,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.19" +version = "4.5.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5fbc17d3ef8278f55b282b2a2e75ae6f6c7d4bb70ed3d0382375104bfafdb4b" +checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" dependencies = [ "anstream", "anstyle", @@ -2299,7 +2299,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" dependencies = [ "cfg-if", - "windows-targets 0.52.6", + "windows-targets 0.48.5", ] [[package]] From c0f20fc6abd731090edcd9b722a04d226efb0832 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 17 Oct 2024 02:51:32 +0000 Subject: [PATCH 140/215] chore(deps): Bump rustls from 0.23.14 to 0.23.15 (#1540) Bumps [rustls](https://github.com/rustls/rustls) from 0.23.14 to 0.23.15.
Commits
  • 3099020 Prepare 0.23.15
  • 9a19b59 Take pki-types 1.10
  • d58f86d bench-measure.mk: rebuild bench each time
  • e653618 bench: decrease bench allocator traffic
  • 494f4da Use re-exported pki-types everywhere
  • 0254d00 clippy: needless_lifetimes fixes
  • 25f1e4f outbound: replace manual arithmetic check
  • 51e783a clippy: address nightly empty_line_after_doc_comments
  • 422a0c5 manual: include mention of client-side ECH
  • aaeff17 docs: update cpu project time allotment
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=rustls&package-manager=cargo&previous-version=0.23.14&new-version=0.23.15)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 10 +++++----- Cargo.toml | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 86849e2e8..cfde452bd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2299,7 +2299,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" dependencies = [ "cfg-if", - "windows-targets 0.48.5", + "windows-targets 0.52.6", ] [[package]] @@ -3727,9 +3727,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.14" +version = "0.23.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "415d9944693cb90382053259f89fbb077ea730ad7273047ec63b19bc9b160ba8" +checksum = "5fbb44d7acc4e873d613422379f69f237a1b141928c02f6bc6ccfddddc2d7993" dependencies = [ "aws-lc-rs", "log", @@ -3765,9 +3765,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e696e35370c65c9c541198af4543ccd580cf17fc25d8e05c5a242b202488c55" +checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" [[package]] name = "rustls-webpki" diff --git a/Cargo.toml b/Cargo.toml index b40fb7e7c..e73bb4cd9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -66,7 +66,7 @@ pprof = { version = "0.13", features = ["flamegraph", "criterion"] } pretty_assertions = "1" regex = "1" rstest = "0.23" -rustls = "0.23.14" +rustls = "0.23.15" # ring feature does not require NASM windows executable, but works slower #rustls = { version = "0.23", default-features = false, features = ["logging", "std", "tls12", "ring"] } rustls-native-certs = "0.8" From 2591400901ec6316200f949a32869a81fadcefb0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 18 Oct 2024 02:30:21 +0000 Subject: [PATCH 141/215] chore(deps): Bump serde_json from 1.0.128 to 1.0.129 (#1541) Bumps [serde_json](https://github.com/serde-rs/json) from 1.0.128 to 1.0.129.
Release notes

Sourced from serde_json's releases.

1.0.129

Commits
  • fe499e8 Release 1.0.129
  • 2679e30 Merge pull request #1199 from dtolnay/sort
  • c1a06c1 Add methods on Map and Value to destroy preserved ordering
  • faab2e8 Ignore needless_lifetimes clippy lint
  • ef9ca27 Resolve some needless_lifetimes clippy lints
  • 309cfc9 Resolve empty_line_after_doc_comments clippy lint in lexical
  • 1faf3a1 Replace bool::to_string with if
  • d254281 Replace str::to_string with to_owned
  • 3f4e30a Replace char::to_string with encode_utf8
  • 4921906 Replace integer to_string with itoa
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=serde_json&package-manager=cargo&previous-version=1.0.128&new-version=1.0.129)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index cfde452bd..24db7c9ad 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3888,9 +3888,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.128" +version = "1.0.129" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" +checksum = "6dbcf9b78a125ee667ae19388837dd12294b858d101fdd393cb9d5501ef09eb2" dependencies = [ "itoa", "memchr", From 7c42a21dfcd40885670a7c575212419835260111 Mon Sep 17 00:00:00 2001 From: Yuri Astrakhan Date: Sat, 19 Oct 2024 18:21:51 -0400 Subject: [PATCH 142/215] bump Cargo.lock --- Cargo.lock | 336 ++++++++++++++++++++++++++--------------------------- 1 file changed, 165 insertions(+), 171 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 24db7c9ad..6c036dc53 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -80,7 +80,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn 2.0.79", + "syn 2.0.80", ] [[package]] @@ -198,7 +198,7 @@ dependencies = [ "actix-router", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.80", ] [[package]] @@ -215,9 +215,9 @@ dependencies = [ [[package]] name = "addr2line" -version = "0.24.1" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5fb1d8e4442bd405fdfd1dacb42792696b0cf9cb15882e5d097b742a676d375" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ "gimli", ] @@ -343,9 +343,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.89" +version = "1.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6" +checksum = "37bf3594c4c988a53154954629820791dde498571819ae4ca50ca811e060cc95" [[package]] name = "approx" @@ -370,9 +370,9 @@ checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] name = "async-compression" -version = "0.4.12" +version = "0.4.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fec134f64e2bc57411226dfc4e52dec859ddfc7e711fc5e07b612584f000e4aa" +checksum = "103db485efc3e41214fe4fda9f3dbeae2eb9082f48fd236e6095627a9422066e" dependencies = [ "flate2", "futures-core", @@ -394,9 +394,9 @@ dependencies = [ [[package]] name = "async-stream" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" dependencies = [ "async-stream-impl", "futures-core", @@ -405,13 +405,13 @@ dependencies = [ [[package]] name = "async-stream-impl" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.80", ] [[package]] @@ -422,7 +422,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.80", ] [[package]] @@ -442,9 +442,9 @@ checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "aws-lc-rs" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f95446d919226d587817a7d21379e6eb099b97b45110a7f272a444ca5c54070" +checksum = "cdd82dba44d209fddb11c190e0a94b78651f95299598e472215667417a03ff1d" dependencies = [ "aws-lc-sys", "mirai-annotations", @@ -454,9 +454,9 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.21.2" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3ddc4a5b231dd6958b140ff3151b6412b3f4321fab354f399eec8f14b06df62" +checksum = "df7a4168111d7eb622a31b214057b8509c0a7e1794f44c546d742330dc793972" dependencies = [ "bindgen", "cc", @@ -518,9 +518,9 @@ dependencies = [ [[package]] name = "bindgen" -version = "0.69.4" +version = "0.69.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" +checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" dependencies = [ "bitflags 2.6.0", "cexpr", @@ -535,7 +535,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.79", + "syn 2.0.80", "which", ] @@ -646,9 +646,9 @@ checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytemuck" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94bbb0ad554ad961ddc5da507a12a29b14e4ae5bda06b19f575a3e6079d2e2ae" +checksum = "8334215b81e418a0a7bdb8ef0849474f40bb10c8b71f1c4ed315cff49f32494d" [[package]] name = "byteorder" @@ -685,9 +685,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.1.23" +version = "1.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bbb537bb4a30b90362caddba8f360c0a56bc13d3a5570028e7197204cb54a17" +checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" dependencies = [ "jobserver", "libc", @@ -801,7 +801,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.80", ] [[package]] @@ -812,9 +812,9 @@ checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" [[package]] name = "clap_mangen" -version = "0.2.23" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f17415fd4dfbea46e3274fcd8d368284519b358654772afb700dc2e8d2b24eeb" +checksum = "fbae9cbfdc5d4fa8711c09bd7b83f644cb48281ac35bf97af3e47b0675864bdf" dependencies = [ "clap", "roff", @@ -1062,7 +1062,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edb49164822f3ee45b17acd4a208cfc1251410cf0cad9a833234c9890774dd9f" dependencies = [ "quote", - "syn 2.0.79", + "syn 2.0.80", ] [[package]] @@ -1086,7 +1086,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.79", + "syn 2.0.80", ] [[package]] @@ -1097,7 +1097,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.79", + "syn 2.0.80", ] [[package]] @@ -1180,7 +1180,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.79", + "syn 2.0.80", ] [[package]] @@ -1266,7 +1266,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.80", ] [[package]] @@ -1430,9 +1430,9 @@ dependencies = [ [[package]] name = "flume" -version = "0.11.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" +checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" dependencies = [ "futures-core", "futures-sink", @@ -1543,9 +1543,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -1558,9 +1558,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -1568,15 +1568,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -1596,32 +1596,32 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-macro" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.80", ] [[package]] name = "futures-sink" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-timer" @@ -1631,9 +1631,9 @@ checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" [[package]] name = "futures-util" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-channel", "futures-core", @@ -1691,9 +1691,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.31.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32085ea23f3234fc7846555e85283ba4de91e21016dc0455a16286d87a292d64" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "glob" @@ -1713,7 +1713,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.5.0", + "indexmap 2.6.0", "slab", "tokio", "tokio-util", @@ -1746,6 +1746,12 @@ dependencies = [ "allocator-api2", ] +[[package]] +name = "hashbrown" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" + [[package]] name = "hashlink" version = "0.8.4" @@ -1897,9 +1903,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.30" +version = "0.14.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" +checksum = "8c08302e8fa335b151b788c775ff56e7a03ae64ff85c548ee820fecb70356e85" dependencies = [ "bytes", "futures-channel", @@ -1920,9 +1926,9 @@ dependencies = [ [[package]] name = "hyper" -version = "1.4.1" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" +checksum = "bbbff0a806a4728c99295b254c8838933b5b082d75e3cb70c8dab21fdfbcfa9a" dependencies = [ "bytes", "futures-channel", @@ -1945,7 +1951,7 @@ checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" dependencies = [ "futures-util", "http 1.1.0", - "hyper 1.4.1", + "hyper 1.5.0", "hyper-util", "rustls", "rustls-native-certs", @@ -1966,7 +1972,7 @@ dependencies = [ "futures-util", "http 1.1.0", "http-body 1.0.1", - "hyper 1.4.1", + "hyper 1.5.0", "pin-project-lite", "socket2", "tokio", @@ -2021,9 +2027,9 @@ checksum = "029d73f573d8e8d63e6d5020011d3255b28c3ba85d6cf870a07184ed23de9284" [[package]] name = "impl-more" -version = "0.1.6" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "206ca75c9c03ba3d4ace2460e57b189f39f43de612c2f85836e65c929701bb2d" +checksum = "aae21c3177a27788957044151cc2800043d127acaa460a47ebb9b84dfa2c6aa0" [[package]] name = "indexmap" @@ -2038,12 +2044,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", - "hashbrown 0.14.5", + "hashbrown 0.15.0", "rayon", "serde", ] @@ -2061,7 +2067,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "232929e1d75fe899576a3d5c7416ad0d88dbfbb3c3d6aa00873a7408a50ddb88" dependencies = [ "ahash", - "indexmap 2.5.0", + "indexmap 2.6.0", "is-terminal", "itoa", "log", @@ -2088,9 +2094,9 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.10.0" +version = "2.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "187674a687eed5fe42285b40c6291f9a01517d415fad1c3cbc6a9f778af7fcd4" +checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" [[package]] name = "is-terminal" @@ -2159,9 +2165,9 @@ checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" [[package]] name = "js-sys" -version = "0.3.70" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" +checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" dependencies = [ "wasm-bindgen", ] @@ -2225,7 +2231,7 @@ dependencies = [ "bytes", "futures", "http 0.2.12", - "hyper 0.14.30", + "hyper 0.14.31", "lambda_runtime_api_client", "serde", "serde_json", @@ -2242,7 +2248,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7210012be904051520f0dc502140ba599bae3042b65b3737b87727f1aa88a7d6" dependencies = [ "http 0.2.12", - "hyper 0.14.30", + "hyper 0.14.31", "tokio", "tower-service", ] @@ -2270,24 +2276,24 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.159" +version = "0.2.161" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" +checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" [[package]] name = "libdeflate-sys" -version = "1.21.0" +version = "1.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b14a6afa4e2e1d343fd793a1c0a7e5857a73a2697c2ff2c98ac00d6c4ecc820" +checksum = "2f4ae7b48098016dc3bc64a35605668f0af4425ec1a4a175ce2d0c1129067932" dependencies = [ "cc", ] [[package]] name = "libdeflater" -version = "1.21.0" +version = "1.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17fe2badabdaf756f620748311e99ef99a5fdd681562dfd343fdb16ed7d4797" +checksum = "567ff5eb948d34d3f93d8da568e72db0f5a12c89efb6c3913e4d6b142cc7ec34" dependencies = [ "libdeflate-sys", ] @@ -2753,21 +2759,18 @@ dependencies = [ [[package]] name = "object" -version = "0.36.4" +version = "0.36.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "084f1a5821ac4c651660a94a7153d27ac9d8a53736203f58b31945ded098070a" +checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.20.1" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82881c4be219ab5faaf2ad5e5e5ecdff8c66bd7402ca3160975c93b24961afd1" -dependencies = [ - "portable-atomic", -] +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "oorandom" @@ -2792,7 +2795,7 @@ dependencies = [ "clap_mangen", "crossbeam-channel", "filetime", - "indexmap 2.5.0", + "indexmap 2.6.0", "libdeflater", "log", "rayon", @@ -2854,7 +2857,7 @@ dependencies = [ "regex", "regex-syntax 0.7.5", "structmeta", - "syn 2.0.79", + "syn 2.0.80", ] [[package]] @@ -2945,22 +2948,22 @@ checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" [[package]] name = "pin-project" -version = "1.1.5" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +checksum = "baf123a161dde1e524adf36f90bc5d8d3462824a9c43553ad07a8183161189ec" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.5" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +checksum = "a4502d8515ca9f32f1fb543d987f63d95a14934883db45bdb48060b6b69257f8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.80", ] [[package]] @@ -3062,12 +3065,6 @@ dependencies = [ "miniz_oxide", ] -[[package]] -name = "portable-atomic" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2" - [[package]] name = "postgis" version = "0.9.0" @@ -3175,12 +3172,12 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.22" +version = "0.2.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479cf940fbbb3426c32c5d5176f62ad57549a0bb84773423ba8be9d089f5faba" +checksum = "904afd36257cdb6ce0bee88b7981847bd7b955e5e216bb32f466b302923ad446" dependencies = [ "proc-macro2", - "syn 2.0.79", + "syn 2.0.80", ] [[package]] @@ -3194,18 +3191,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.86" +version = "1.0.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "7c3a7fc5db1e57d5a779a352c8cdb57b29aa4c40cc69c3a68a7fedc815fbf2f9" dependencies = [ "unicode-ident", ] [[package]] name = "protobuf" -version = "3.6.0" +version = "3.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3018844a02746180074f621e847703737d27d89d7f0721a7a4da317f88b16385" +checksum = "a3a7c64d9bf75b1b8d981124c14c179074e8caa7dfe7b6a12e6222ddcd0c8f72" dependencies = [ "once_cell", "protobuf-support", @@ -3214,9 +3211,9 @@ dependencies = [ [[package]] name = "protobuf-codegen" -version = "3.6.0" +version = "3.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "411c15a212b4de05eb8bc989fd066a74c86bd3c04e27d6e86bd7703b806d7734" +checksum = "e26b833f144769a30e04b1db0146b2aaa53fd2fd83acf10a6b5f996606c18144" dependencies = [ "anyhow", "once_cell", @@ -3229,12 +3226,12 @@ dependencies = [ [[package]] name = "protobuf-parse" -version = "3.6.0" +version = "3.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06f45f16b522d92336e839b5e40680095a045e36a1e7f742ba682ddc85236772" +checksum = "322330e133eab455718444b4e033ebfac7c6528972c784fcde28d2cc783c6257" dependencies = [ "anyhow", - "indexmap 2.5.0", + "indexmap 2.6.0", "log", "protobuf", "protobuf-support", @@ -3245,9 +3242,9 @@ dependencies = [ [[package]] name = "protobuf-support" -version = "3.6.0" +version = "3.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faf96d872914fcda2b66d66ea3fff2be7c66865d31c7bb2790cff32c0e714880" +checksum = "b088fd20b938a875ea00843b6faf48579462630015c3788d397ad6a786663252" dependencies = [ "thiserror", ] @@ -3428,9 +3425,9 @@ dependencies = [ [[package]] name = "raw-cpuid" -version = "11.1.0" +version = "11.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb9ee317cfe3fbd54b36a511efc1edd42e216903c9cd575e686dd68a2ba90d8d" +checksum = "1ab240315c661615f2ee9f0f2cd32d5a7343a84d5ebcccb99d46e6637565e7b0" dependencies = [ "bitflags 2.6.0", ] @@ -3530,7 +3527,7 @@ dependencies = [ "http 1.1.0", "http-body 1.0.1", "http-body-util", - "hyper 1.4.1", + "hyper 1.5.0", "hyper-rustls", "hyper-util", "ipnet", @@ -3667,7 +3664,7 @@ dependencies = [ "regex", "relative-path", "rustc_version", - "syn 2.0.79", + "syn 2.0.80", "unicode-ident", ] @@ -3814,9 +3811,9 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.24" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9aaafd5a2b6e3d657ff009d82fbd630b6bd54dd4eb06f21693925cdf80f9b8b" +checksum = "01227be5826fa0690321a2ba6c5cd57a19cf3f6a09e76973b58e61de6ab9d1c1" dependencies = [ "windows-sys 0.59.0", ] @@ -3883,14 +3880,14 @@ checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.80", ] [[package]] name = "serde_json" -version = "1.0.129" +version = "1.0.132" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbcf9b78a125ee667ae19388837dd12294b858d101fdd393cb9d5501ef09eb2" +checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" dependencies = [ "itoa", "memchr", @@ -3933,15 +3930,15 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.9.0" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cecfa94848272156ea67b2b1a53f20fc7bc638c4a46d2f8abde08f05f4b857" +checksum = "8e28bdad6db2b8340e449f7108f020b3b092e8583a9e3fb82713e1d4e71fe817" dependencies = [ "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.5.0", + "indexmap 2.6.0", "serde", "serde_derive", "serde_json", @@ -3951,14 +3948,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.9.0" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8fee4991ef4f274617a51ad4af30519438dacb2f56ac773b08a1922ff743350" +checksum = "9d846214a9854ef724f3da161b426242d8de7c1fc7de2f89bb1efcb154dca79d" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.80", ] [[package]] @@ -3967,7 +3964,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.5.0", + "indexmap 2.6.0", "itoa", "ryu", "serde", @@ -4195,7 +4192,7 @@ dependencies = [ "futures-util", "hashlink", "hex", - "indexmap 2.5.0", + "indexmap 2.6.0", "log", "memchr", "once_cell", @@ -4412,7 +4409,7 @@ dependencies = [ "proc-macro2", "quote", "structmeta-derive", - "syn 2.0.79", + "syn 2.0.80", ] [[package]] @@ -4423,7 +4420,7 @@ checksum = "a60bcaff7397072dca0017d1db428e30d5002e00b6847703e2e42005c95fbe00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.80", ] [[package]] @@ -4456,9 +4453,9 @@ dependencies = [ [[package]] name = "symbolic-common" -version = "12.11.1" +version = "12.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fdf97c441f18a4f92425b896a4ec7a27e03631a0b1047ec4e34e9916a9a167e" +checksum = "366f1b4c6baf6cfefc234bbd4899535fca0b06c74443039a73f6dfb2fad88d77" dependencies = [ "debugid", "memmap2 0.9.5", @@ -4468,9 +4465,9 @@ dependencies = [ [[package]] name = "symbolic-demangle" -version = "12.11.1" +version = "12.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc8ece6b129e97e53d1fbb3f61d33a6a9e5369b11d01228c068094d6d134eaea" +checksum = "aba05ba5b9962ea5617baf556293720a8b2d0a282aa14ee4bf10e22efc7da8c8" dependencies = [ "cpp_demangle", "rustc-demangle", @@ -4490,9 +4487,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.79" +version = "2.0.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" +checksum = "e6e185e337f816bc8da115b8afcb3324006ccc82eeaddf35113888d3bd8e44ac" dependencies = [ "proc-macro2", "quote", @@ -4550,7 +4547,7 @@ checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.80", ] [[package]] @@ -4673,7 +4670,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.80", ] [[package]] @@ -4772,7 +4769,7 @@ version = "0.22.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ - "indexmap 2.5.0", + "indexmap 2.6.0", "toml_datetime", "winnow", ] @@ -4824,7 +4821,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.80", ] [[package]] @@ -4862,18 +4859,15 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "unicase" -version = "2.7.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" -dependencies = [ - "version_check", -] +checksum = "7e51b68083f157f853b6379db119d1c1be0e6e4dec98101079dec41f6f5cf6df" [[package]] name = "unicode-bidi" -version = "0.3.15" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" +checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" [[package]] name = "unicode-bidi-mirroring" @@ -5036,9 +5030,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314" +checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" dependencies = [ "getrandom", ] @@ -5094,9 +5088,9 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" +checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" dependencies = [ "cfg-if", "once_cell", @@ -5105,24 +5099,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" +checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.80", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.43" +version = "0.4.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" +checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" dependencies = [ "cfg-if", "js-sys", @@ -5132,9 +5126,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" +checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -5142,28 +5136,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" +checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.80", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" +checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" [[package]] name = "web-sys" -version = "0.3.70" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" +checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" dependencies = [ "js-sys", "wasm-bindgen", @@ -5495,7 +5489,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.80", ] [[package]] @@ -5515,7 +5509,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.79", + "syn 2.0.80", ] [[package]] From 4ec9a2f7ef58deee1f4753029b9228a18cd7f523 Mon Sep 17 00:00:00 2001 From: Yuri Astrakhan Date: Sat, 19 Oct 2024 18:28:53 -0400 Subject: [PATCH 143/215] more dep bump --- Cargo.lock | 102 ++++++++++++++++++++++++++++------------------------- Cargo.toml | 4 +-- 2 files changed, 55 insertions(+), 51 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6c036dc53..c669dc527 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -506,16 +506,6 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" -[[package]] -name = "bcder" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c627747a6774aab38beb35990d88309481378558875a41da1a4b2e373c906ef0" -dependencies = [ - "bytes", - "smallvec", -] - [[package]] name = "bindgen" version = "0.69.5" @@ -1156,10 +1146,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" dependencies = [ "const-oid", + "der_derive", + "flagset", "pem-rfc7468", "zeroize", ] +[[package]] +name = "der_derive" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8034092389675178f570469e6c3b0465d3d30b4505c294a6550db47f3c17ad18" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.80", +] + [[package]] name = "deranged" version = "0.3.11" @@ -1403,6 +1406,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "flagset" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3ea1ec5f8307826a5b71094dd91fc04d4ae75d5709b20ad351c7fb4815c86ec" + [[package]] name = "flate2" version = "1.0.34" @@ -1419,15 +1428,6 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" -[[package]] -name = "fluent-uri" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17c704e9dbe1ddd863da1e6ff3567795087b1eb201ce80d8fa81162e1516500d" -dependencies = [ - "bitflags 1.3.2", -] - [[package]] name = "flume" version = "0.11.1" @@ -2174,9 +2174,9 @@ dependencies = [ [[package]] name = "json-patch" -version = "2.0.0" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b1fb8864823fad91877e6caea0baca82e49e8db50f8e5c9f9a453e27d3330fc" +checksum = "863726d7afb6bc2590eeff7135d923545e5e964f004c2ccf8716c25e70a86f08" dependencies = [ "jsonptr", "serde", @@ -2186,11 +2186,10 @@ dependencies = [ [[package]] name = "jsonptr" -version = "0.4.7" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c6e529149475ca0b2820835d3dce8fcc41c6b943ca608d32f35b449255e4627" +checksum = "5dea2b27dd239b2556ed7a25ba842fe47fd602e7fc7433c2a8d6106d4d9edd70" dependencies = [ - "fluent-uri", "serde", "serde_json", ] @@ -2897,16 +2896,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "pem" -version = "3.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e459365e590736a54c3fa561947c84837534b8e9af6fc5bf781307e82658fae" -dependencies = [ - "base64 0.22.1", - "serde", -] - [[package]] name = "pem-rfc7468" version = "0.7.0" @@ -4644,6 +4633,27 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" +[[package]] +name = "tls_codec" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e78c9c330f8c85b2bae7c8368f2739157db9991235123aa1b15ef9502bfb6a" +dependencies = [ + "tls_codec_derive", + "zeroize", +] + +[[package]] +name = "tls_codec_derive" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d9ef545650e79f30233c0003bcc2504d7efac6dad25fca40744de773fe2049c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.80", +] + [[package]] name = "tokio" version = "1.40.0" @@ -4701,16 +4711,17 @@ dependencies = [ [[package]] name = "tokio-postgres-rustls" -version = "0.12.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04fb792ccd6bbcd4bba408eb8a292f70fc4a3589e5d793626f45190e6454b6ab" +checksum = "27d684bad428a0f2481f42241f821db42c54e2dc81d8c00db8536c506b0a0144" dependencies = [ + "const-oid", "ring", "rustls", "tokio", "tokio-postgres", "tokio-rustls", - "x509-certificate", + "x509-cert", ] [[package]] @@ -5429,22 +5440,15 @@ dependencies = [ ] [[package]] -name = "x509-certificate" -version = "0.23.1" +name = "x509-cert" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66534846dec7a11d7c50a74b7cdb208b9a581cad890b7866430d438455847c85" +checksum = "1301e935010a701ae5f8655edc0ad17c44bad3ac5ce8c39185f75453b720ae94" dependencies = [ - "bcder", - "bytes", - "chrono", + "const-oid", "der", - "hex", - "pem", - "ring", - "signature", "spki", - "thiserror", - "zeroize", + "tls_codec", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index e73bb4cd9..8ed9582af 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -48,7 +48,7 @@ futures = "0.3" indoc = "2" insta = "1" itertools = "0.13" -json-patch = "2.0" +json-patch = "3.0" lambda-web = { version = "0.2.1", features = ["actix4"] } libsqlite3-sys = { version = ">=0.27", features = ["bundled"] } log = "0.4" @@ -87,7 +87,7 @@ thiserror = "1" tile-grid = "0.6" tilejson = "0.4" tokio = { version = "1", features = ["macros"] } -tokio-postgres-rustls = "0.12" +tokio-postgres-rustls = "0.13" url = "2.5" xxhash-rust = { version = "0.8", features = ["xxh3"] } From dc0631352c67606ab184ac7aef0f1759d6197c93 Mon Sep 17 00:00:00 2001 From: Yuri Astrakhan Date: Sat, 19 Oct 2024 18:54:10 -0400 Subject: [PATCH 144/215] CI cleanup --- .github/workflows/grcov.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/grcov.yml b/.github/workflows/grcov.yml index 8b1f92778..6fe9998ba 100644 --- a/.github/workflows/grcov.yml +++ b/.github/workflows/grcov.yml @@ -52,7 +52,6 @@ jobs: uses: dtolnay/rust-toolchain@master with: toolchain: nightly-2024-10-01 - override: true - name: Cleanup GCDA files run: rm -rf martin/target/debug/deps/*.gcda From a3222b1da4cbaca101bbc32f891c580e062444f6 Mon Sep 17 00:00:00 2001 From: Yuri Astrakhan Date: Sat, 19 Oct 2024 22:13:49 -0400 Subject: [PATCH 145/215] cleanup test.sh, fix json rounding issue (#1543) Fixes #1532 --- tests/expected/auto/mb_jpg.json | 4 +- tests/expected/auto/mb_png.json | 8 +-- tests/expected/auto/pmt.json | 12 ++--- tests/expected/auto/table_source.json | 6 +-- tests/test.sh | 78 ++++++++++++--------------- 5 files changed, 48 insertions(+), 60 deletions(-) diff --git a/tests/expected/auto/mb_jpg.json b/tests/expected/auto/mb_jpg.json index ff08e27b5..0ea277215 100644 --- a/tests/expected/auto/mb_jpg.json +++ b/tests/expected/auto/mb_jpg.json @@ -4,9 +4,9 @@ "http://localhost:3111/geography-class-jpg/{z}/{x}/{y}" ], "bounds": [ - -180.0, + -180, -85.0511, - 180.0, + 180, 85.0511 ], "description": "One of the example maps that comes with TileMill - a bright & colorful world map that blends retro and high-tech with its folded paper texture and interactive flag tooltips. ", diff --git a/tests/expected/auto/mb_png.json b/tests/expected/auto/mb_png.json index 11ec3b88f..55c42294b 100644 --- a/tests/expected/auto/mb_png.json +++ b/tests/expected/auto/mb_png.json @@ -4,14 +4,14 @@ "http://localhost:3111/geography-class-png/{z}/{x}/{y}" ], "bounds": [ - -180.0, + -180, -85.0511, - 180.0, + 180, 85.0511 ], "center": [ - 0.0, - 20.0, + 0, + 20, 0 ], "description": "One of the example maps that comes with TileMill - a bright & colorful world map that blends retro and high-tech with its folded paper texture and interactive flag tooltips. ", diff --git a/tests/expected/auto/pmt.json b/tests/expected/auto/pmt.json index 9d9f6370f..96f570c07 100644 --- a/tests/expected/auto/pmt.json +++ b/tests/expected/auto/pmt.json @@ -4,14 +4,14 @@ "http://localhost:3111/stamen_toner__raster_CC-BY-ODbL_z3/{z}/{x}/{y}" ], "bounds": [ - -180.0, - -85.0, - 180.0, - 85.0 + -180, + -85, + 180, + 85 ], "center": [ - 0.0, - 0.0, + 0, + 0, 0 ], "maxzoom": 3, diff --git a/tests/expected/auto/table_source.json b/tests/expected/auto/table_source.json index f429acd09..609c974b5 100644 --- a/tests/expected/auto/table_source.json +++ b/tests/expected/auto/table_source.json @@ -12,10 +12,10 @@ } ], "bounds": [ - -2.0, - -1.0, + -2, + -1, 142.84131509869133, - 45.0 + 45 ], "name": "table_source", "foo": { diff --git a/tests/test.sh b/tests/test.sh index 1675918fd..8e73fdf6e 100755 --- a/tests/test.sh +++ b/tests/test.sh @@ -34,7 +34,7 @@ function wait_for { PROC_NAME=$2 TEST_URL=$3 echo "Waiting for $PROC_NAME ($PROCESS_ID) to start by checking $TEST_URL to be valid..." - for i in {1..60}; do + for _ in {1..60}; do if $CURL "$TEST_URL" 2>/dev/null >/dev/null; then echo "$PROC_NAME is up!" if [[ "$PROC_NAME" == "Martin" ]]; then @@ -42,7 +42,7 @@ function wait_for { fi return fi - if ps -p $PROCESS_ID > /dev/null ; then + if ps -p "$PROCESS_ID" > /dev/null ; then echo "$PROC_NAME is not up yet, waiting for $TEST_URL ..." sleep 1 else @@ -62,9 +62,9 @@ function kill_process { PROCESS_ID=$1 PROC_NAME=$2 echo "Waiting for $PROC_NAME ($PROCESS_ID) to stop..." - kill $PROCESS_ID - for i in {1..50}; do - if ps -p $PROCESS_ID > /dev/null ; then + kill "$PROCESS_ID" + for _ in {1..50}; do + if ps -p "$PROCESS_ID" > /dev/null ; then sleep 0.1 else echo "$PROC_NAME ($PROCESS_ID) has stopped" @@ -72,22 +72,21 @@ function kill_process { fi done echo "$PROC_NAME did not stop in time, killing it" - kill -9 $PROCESS_ID + kill -9 "$PROCESS_ID" # wait for it to die using timeout and wait - timeout -k 1s 1s wait $PROCESS_ID || true; + timeout -k 1s 1s wait "$PROCESS_ID" || true; } -test_jsn() -{ +test_jsn() { FILENAME="$TEST_OUT_DIR/$1.json" URL="$MARTIN_URL/$2" echo "Testing $(basename "$FILENAME") from $URL" - $CURL "$URL" | jq -e > "$FILENAME" + # jq before 1.6 had a different float->int behavior, so trying to make it consistent in all + $CURL "$URL" | jq -e 'walk(if type == "number" then .+0.0 else . end)' > "$FILENAME" } -test_pbf() -{ +test_pbf() { FILENAME="$TEST_OUT_DIR/$1.pbf" URL="$MARTIN_URL/$2" @@ -100,8 +99,7 @@ test_pbf() fi } -test_png() -{ +test_png() { # 3rd argument is optional, .png by default FILENAME="$TEST_OUT_DIR/$1.${3:-png}" URL="$MARTIN_URL/$2" @@ -114,15 +112,12 @@ test_png() fi } -test_jpg() -{ +test_jpg() { # test_png can test any image format, but this is a separate function to make it easier to find all the jpeg tests - test_png $1 $2 jpg + test_png "$1" "$2" jpg } - -test_font() -{ +test_font() { FILENAME="$TEST_OUT_DIR/$1.pbf" URL="$MARTIN_URL/$2" @@ -131,8 +126,7 @@ test_font() } # Delete a line from a file $1 that matches parameter $2 -remove_line() -{ +remove_line() { FILE="$1" LINE_TO_REMOVE="$2" >&2 echo "Removing line '$LINE_TO_REMOVE' from $FILE" @@ -140,8 +134,7 @@ remove_line() mv "${FILE}.tmp" "${FILE}" } -test_log_has_str() -{ +test_log_has_str() { LOG_FILE="$1" EXPECTED_TEXT="$2" echo "Checking $LOG_FILE for expected text: '$EXPECTED_TEXT'" @@ -149,8 +142,7 @@ test_log_has_str() remove_line "$LOG_FILE" "$EXPECTED_TEXT" } -test_martin_cp() -{ +test_martin_cp() { TEST_NAME="$1" ARG=("${@:2}") @@ -171,11 +163,9 @@ test_martin_cp() # These tend to vary between runs. In theory, vacuuming might make it the same. remove_line "$SUMMARY_FILE" "File size: " remove_line "$SUMMARY_FILE" "Page count: " - } -validate_log() -{ +validate_log() { LOG_FILE="$1" >&2 echo "Validating log file $LOG_FILE" @@ -190,7 +180,10 @@ validate_log() fi } +echo "------------------------------------------------------------------------------------------------------------------------" curl --version +jq --version +grep --version # Make sure all targets are built - this way it won't timeout while waiting for it to start # If set to "-", skip this step (e.g. when testing a pre-built binary) @@ -199,7 +192,6 @@ if [[ "$MARTIN_BUILD_ALL" != "-" ]]; then $MARTIN_BUILD_ALL fi - echo "------------------------------------------------------------------------------------------------------------------------" echo "Check HTTP server is running" $CURL --head "$STATICS_URL/webp2.pmtiles" @@ -217,10 +209,10 @@ export DATABASE_URL="$MARTIN_DATABASE_URL" set -x $MARTIN_BIN "${ARG[@]}" 2>&1 | tee "$LOG_FILE" & -MARTIN_PROC_ID=`jobs -p | tail -n 1` +MARTIN_PROC_ID=$(jobs -p | tail -n 1) { set +x; } 2> /dev/null trap "echo 'Stopping Martin server $MARTIN_PROC_ID...'; kill -9 $MARTIN_PROC_ID 2> /dev/null || true; echo 'Stopped Martin server $MARTIN_PROC_ID';" EXIT HUP INT TERM -wait_for $MARTIN_PROC_ID Martin "$MARTIN_URL/health" +wait_for "$MARTIN_PROC_ID" Martin "$MARTIN_URL/health" unset DATABASE_URL >&2 echo "Test catalog" @@ -295,7 +287,7 @@ test_pbf points_empty_srid_0_0_0 points_empty_srid/0/0/0 test_jsn tbl_comment MixPoints test_jsn fnc_comment function_Mixed_Name -kill_process $MARTIN_PROC_ID Martin +kill_process "$MARTIN_PROC_ID" Martin test_log_has_str "$LOG_FILE" 'WARN martin::pg::query_tables] Table public.table_source has no spatial index on column geom' test_log_has_str "$LOG_FILE" 'WARN martin::fonts] Ignoring duplicate font Overpass Mono Regular from tests' @@ -314,16 +306,16 @@ mkdir -p "$TEST_OUT_DIR" ARG=(--save-config "${TEST_OUT_DIR}/save_config.yaml" tests/fixtures/pmtiles2) set -x $MARTIN_BIN "${ARG[@]}" 2>&1 | tee "$LOG_FILE" & -MARTIN_PROC_ID=`jobs -p | tail -n 1` +MARTIN_PROC_ID=$(jobs -p | tail -n 1) { set +x; } 2> /dev/null trap "echo 'Stopping Martin server $MARTIN_PROC_ID...'; kill -9 $MARTIN_PROC_ID 2> /dev/null || true; echo 'Stopped Martin server $MARTIN_PROC_ID';" EXIT HUP INT TERM -wait_for $MARTIN_PROC_ID Martin "$MARTIN_URL/health" +wait_for "$MARTIN_PROC_ID" Martin "$MARTIN_URL/health" >&2 echo "Test catalog" test_jsn catalog_auto catalog -kill_process $MARTIN_PROC_ID Martin +kill_process "$MARTIN_PROC_ID" Martin validate_log "$LOG_FILE" @@ -339,10 +331,10 @@ ARG=(--config tests/config.yaml --max-feature-count 1000 --save-config "${TEST_O export DATABASE_URL="$MARTIN_DATABASE_URL" set -x $MARTIN_BIN "${ARG[@]}" 2>&1 | tee "$LOG_FILE" & -MARTIN_PROC_ID=`jobs -p | tail -n 1` +MARTIN_PROC_ID=$(jobs -p | tail -n 1) { set +x; } 2> /dev/null trap "echo 'Stopping Martin server $MARTIN_PROC_ID...'; kill -9 $MARTIN_PROC_ID 2> /dev/null || true; echo 'Stopped Martin server $MARTIN_PROC_ID';" EXIT HUP INT TERM -wait_for $MARTIN_PROC_ID Martin "$MARTIN_URL/health" +wait_for "$MARTIN_PROC_ID" Martin "$MARTIN_URL/health" unset DATABASE_URL >&2 echo "Test catalog" @@ -379,7 +371,7 @@ test_font font_3 font/Overpass%20Mono%20Regular,Overpass%20Mono%20Light/0-2 test_jsn tbl_comment_cfg MixPoints test_jsn fnc_comment_cfg fnc_Mixed_Name -kill_process $MARTIN_PROC_ID Martin +kill_process "$MARTIN_PROC_ID" Martin test_log_has_str "$LOG_FILE" 'WARN martin::pg::query_tables] Table public.table_source has no spatial index on column geom' test_log_has_str "$LOG_FILE" 'WARN martin::fonts] Ignoring duplicate font Overpass Mono Regular from tests' validate_log "$LOG_FILE" @@ -435,18 +427,14 @@ if [[ "$MBTILES_BIN" != "-" ]]; then $MBTILES_BIN meta-get ./tests/fixtures/mbtiles/world_cities.mbtiles missing_value 2>&1 | tee "$TEST_OUT_DIR/meta-get_missing_value.txt" $MBTILES_BIN validate ./tests/fixtures/mbtiles/zoomed_world_cities.mbtiles 2>&1 | tee "$TEST_OUT_DIR/validate-ok.txt" - set +e - $MBTILES_BIN validate ./tests/fixtures/files/invalid-tile-idx.mbtiles 2>&1 | tee "$TEST_OUT_DIR/validate-bad-tiles.txt" - if [[ $? -eq 0 ]]; then + if $MBTILES_BIN validate ./tests/fixtures/files/invalid-tile-idx.mbtiles 2>&1 | tee "$TEST_OUT_DIR/validate-bad-tiles.txt"; then echo "ERROR: validate with invalid-tile-idx.mbtiles should have failed" exit 1 fi - $MBTILES_BIN validate ./tests/fixtures/files/bad_hash.mbtiles 2>&1 | tee "$TEST_OUT_DIR/validate-bad-hash.txt" - if [[ $? -eq 0 ]]; then + if $MBTILES_BIN validate ./tests/fixtures/files/bad_hash.mbtiles 2>&1 | tee "$TEST_OUT_DIR/validate-bad-hash.txt"; then echo "ERROR: validate with bad_hash.mbtiles should have failed" exit 1 fi - set -e cp ./tests/fixtures/files/bad_hash.mbtiles "$TEST_TEMP_DIR/fix_bad_hash.mbtiles" $MBTILES_BIN validate --agg-hash update "$TEST_TEMP_DIR/fix_bad_hash.mbtiles" 2>&1 | tee "$TEST_OUT_DIR/validate-fix.txt" From 5064d502d0e32104bc433c620772dc3f9c01d65f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 19 Oct 2024 23:25:09 -0400 Subject: [PATCH 146/215] chore(deps-dev): Bump vite from 4.5.3 to 4.5.5 in /demo/frontend (#1518) Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 4.5.3 to 4.5.5.
Changelog

Sourced from vite's changelog.

4.5.5 (2024-09-16)

4.5.4 (2024-09-16)

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=vite&package-manager=npm_and_yarn&previous-version=4.5.3&new-version=4.5.5)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/maplibre/martin/network/alerts).
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- demo/frontend/package.json | 2 +- demo/frontend/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/demo/frontend/package.json b/demo/frontend/package.json index 89992df7c..acec4b010 100644 --- a/demo/frontend/package.json +++ b/demo/frontend/package.json @@ -33,7 +33,7 @@ "eslint-config-airbnb-base": "15.0.0", "eslint-config-react-app": "7.0.1", "typescript": "^5.2.2", - "vite": "^4.5.3", + "vite": "^4.5.5", "vite-plugin-mkcert": "^1.16.0", "vite-tsconfig-paths": "^4.2.1" }, diff --git a/demo/frontend/yarn.lock b/demo/frontend/yarn.lock index e3dc03bf9..d696df1f5 100644 --- a/demo/frontend/yarn.lock +++ b/demo/frontend/yarn.lock @@ -4410,10 +4410,10 @@ vite-tsconfig-paths@^4.2.1: globrex "^0.1.2" tsconfck "^2.1.0" -vite@^4.5.3: - version "4.5.3" - resolved "https://registry.yarnpkg.com/vite/-/vite-4.5.3.tgz#d88a4529ea58bae97294c7e2e6f0eab39a50fb1a" - integrity sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg== +vite@^4.5.5: + version "4.5.5" + resolved "https://registry.yarnpkg.com/vite/-/vite-4.5.5.tgz#639b9feca5c0a3bfe3c60cb630ef28bf219d742e" + integrity sha512-ifW3Lb2sMdX+WU91s3R0FyQlAyLxOzCSCP37ujw0+r5POeHPwe6udWVIElKQq8gk3t7b8rkmvqC6IHBpCff4GQ== dependencies: esbuild "^0.18.10" postcss "^8.4.27" From 53e69abf4627a477c7950b9e85eb195dbdfede7b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 19 Oct 2024 23:26:14 -0400 Subject: [PATCH 147/215] chore(deps): Bump micromatch from 4.0.5 to 4.0.8 in /demo/frontend (#1487) Bumps [micromatch](https://github.com/micromatch/micromatch) from 4.0.5 to 4.0.8.
Changelog

Sourced from micromatch's changelog.

[4.0.8] - 2024-08-22

  • backported CVE-2024-4067 fix (from v4.0.6) over to 4.x branch

[4.0.7] - 2024-05-22

  • this is basically v4.0.5, with some README updates
  • it is vulnerable to CVE-2024-4067
  • Updated braces to v3.0.3 to avoid CVE-2024-4068
  • does NOT break API compatibility

[4.0.6] - 2024-05-21

  • Added hasBraces to check if a pattern contains braces.
  • Fixes CVE-2024-4067
  • BREAKS API COMPATIBILITY
  • Should be labeled as a major release, but it's not.
Commits
  • 8bd704e 4.0.8
  • a0e6841 run verb to generate README documentation
  • 4ec2884 Merge branch 'v4' into hauserkristof-feature/v4.0.8
  • 03aa805 Merge pull request #266 from hauserkristof/feature/v4.0.8
  • 814f5f7 lint
  • 67fcce6 fix: CHANGELOG about braces & CVE-2024-4068, v4.0.5
  • 113f2e3 fix: CVE numbers in CHANGELOG
  • d9dbd9a feat: updated CHANGELOG
  • 2ab1315 fix: use actions/setup-node@v4
  • 1406ea3 feat: rework test to work on macos with node 10,12 and 14
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=micromatch&package-manager=npm_and_yarn&previous-version=4.0.5&new-version=4.0.8)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) You can trigger a rebase of this PR by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/maplibre/martin/network/alerts).
> **Note** > Automatic rebases have been disabled on this pull request as it has been open for over 30 days. Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- demo/frontend/yarn.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/demo/frontend/yarn.lock b/demo/frontend/yarn.lock index d696df1f5..ec7b969e5 100644 --- a/demo/frontend/yarn.lock +++ b/demo/frontend/yarn.lock @@ -2044,7 +2044,7 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^3.0.2: +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== @@ -3478,11 +3478,11 @@ merge2@^1.3.0, merge2@^1.4.1: integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== micromatch@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + 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.2" + braces "^3.0.3" picomatch "^2.3.1" mime-db@1.52.0: From 398ca85c2b4413428149b64fecff264ab88492ed Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 19 Oct 2024 23:36:35 -0400 Subject: [PATCH 148/215] chore(deps): Bump axios from 1.6.1 to 1.7.7 in /demo/frontend (#1544) Bumps [axios](https://github.com/axios/axios) from 1.6.1 to 1.7.7.
Release notes

Sourced from axios's releases.

Release v1.7.7

Release notes:

Bug Fixes

  • fetch: fix stream handling in Safari by fallback to using a stream reader instead of an async iterator; (#6584) (d198085)
  • http: fixed support for IPv6 literal strings in url (#5731) (364993f)

Contributors to this release

Release v1.7.6

Release notes:

Bug Fixes

  • fetch: fix content length calculation for FormData payload; (#6524) (085f568)
  • fetch: optimize signals composing logic; (#6582) (df9889b)

Contributors to this release

Release v1.7.5

Release notes:

Bug Fixes

  • adapter: fix undefined reference to hasBrowserEnv (#6572) (7004707)
  • core: add the missed implementation of AxiosError#status property; (#6573) (6700a8a)
  • core: fix ReferenceError: navigator is not defined for custom environments; (#6567) (fed1a4b)
  • fetch: fix credentials handling in Cloudflare workers (#6533) (550d885)

Contributors to this release

Release v1.7.4

Release notes:

Bug Fixes

Contributors to this release

... (truncated)

Changelog

Sourced from axios's changelog.

1.7.7 (2024-08-31)

Bug Fixes

  • fetch: fix stream handling in Safari by fallback to using a stream reader instead of an async iterator; (#6584) (d198085)
  • http: fixed support for IPv6 literal strings in url (#5731) (364993f)

Contributors to this release

1.7.6 (2024-08-30)

Bug Fixes

  • fetch: fix content length calculation for FormData payload; (#6524) (085f568)
  • fetch: optimize signals composing logic; (#6582) (df9889b)

Contributors to this release

1.7.5 (2024-08-23)

Bug Fixes

  • adapter: fix undefined reference to hasBrowserEnv (#6572) (7004707)
  • core: add the missed implementation of AxiosError#status property; (#6573) (6700a8a)
  • core: fix ReferenceError: navigator is not defined for custom environments; (#6567) (fed1a4b)
  • fetch: fix credentials handling in Cloudflare workers (#6533) (550d885)

Contributors to this release

1.7.4 (2024-08-13)

Bug Fixes

... (truncated)

Commits
  • 5b8a826 chore(release): v1.7.7 (#6585)
  • 364993f fix(http): fixed support for IPv6 literal strings in url (#5731)
  • d198085 fix(fetch): fix stream handling in Safari by fallback to using a stream reade...
  • d584fcf chore(release): v1.7.6 (#6583)
  • bc03c6c chore(examples): fix module import (#6575)
  • df9889b fix(fetch): optimize signals composing logic; (#6582)
  • ee208cf chore(sponsor): update sponsor block (#6576)
  • 085f568 fix(fetch): fix content length calculation for FormData payload; (#6524)
  • 59cd6b0 chore(release): v1.7.5 (#6574)
  • 6700a8a fix(core): add the missed implementation of AxiosError#status property; (#6573)
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=axios&package-manager=npm_and_yarn&previous-version=1.6.1&new-version=1.7.7)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/maplibre/martin/network/alerts).
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- demo/frontend/yarn.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/demo/frontend/yarn.lock b/demo/frontend/yarn.lock index ec7b969e5..f750fbeb5 100644 --- a/demo/frontend/yarn.lock +++ b/demo/frontend/yarn.lock @@ -1946,11 +1946,11 @@ axe-core@=4.7.0: integrity sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ== axios@^1.2.2: - version "1.6.1" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.1.tgz#76550d644bf0a2d469a01f9244db6753208397d7" - integrity sha512-vfBmhDpKafglh0EldBEbVuoe7DyAavGSLWhuSm5ZSEKQnHhBf0xAAwybbNH1IkrJNGnS/VG4I5yxig1pCEXE4g== + version "1.7.7" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.7.tgz#2f554296f9892a72ac8d8e4c5b79c14a91d0a47f" + integrity sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q== dependencies: - follow-redirects "^1.15.0" + follow-redirects "^1.15.6" form-data "^4.0.0" proxy-from-env "^1.1.0" @@ -2795,10 +2795,10 @@ flatted@^3.2.9: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== -follow-redirects@^1.15.0: - version "1.15.6" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" - integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== +follow-redirects@^1.15.6: + version "1.15.9" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" + integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== for-each@^0.3.3: version "0.3.3" From 48cce661d55c0a48059469c1cd4483dd6f95ca85 Mon Sep 17 00:00:00 2001 From: Lucas Date: Sun, 20 Oct 2024 12:00:46 +0800 Subject: [PATCH 149/215] Use comment on view to generate TileJson (#1507) Try to fix #1494 - [x] Update [query_available_tables.sql](https://github.com/maplibre/martin/pull/1507/files#diff-449496b294ee2413fc0d5e4290688a50f008e07fece5a613da1c2417548a06bf) - [x] Add and update test --- martin/src/pg/scripts/query_available_tables.sql | 3 ++- martin/tests/pg_server_test.rs | 7 ++++--- martin/tests/pg_table_source_test.rs | 7 ++++--- tests/expected/auto/catalog_auto.json | 3 ++- tests/fixtures/tables/points1.sql | 9 +++++++++ 5 files changed, 21 insertions(+), 8 deletions(-) diff --git a/martin/src/pg/scripts/query_available_tables.sql b/martin/src/pg/scripts/query_available_tables.sql index 4c4d0be5c..783a0d30e 100755 --- a/martin/src/pg/scripts/query_available_tables.sql +++ b/martin/src/pg/scripts/query_available_tables.sql @@ -55,9 +55,10 @@ WITH SELECT pg_namespace.nspname AS schema_name, relname AS table_name, - CAST(obj_description(relfilenode, 'pg_class') AS VARCHAR) AS description + pg_description.description AS description FROM pg_class JOIN pg_namespace ON pg_class.relnamespace = pg_namespace.oid + LEFT JOIN pg_description ON pg_class.oid = pg_description.objoid WHERE relkind = 'r' OR relkind = 'v' ) SELECT schema, diff --git a/martin/tests/pg_server_test.rs b/martin/tests/pg_server_test.rs index da2f040f0..7fa96d2cf 100644 --- a/martin/tests/pg_server_test.rs +++ b/martin/tests/pg_server_test.rs @@ -52,7 +52,7 @@ postgres: let response = assert_response(response).await; let body = read_body(response).await; let body: serde_json::Value = serde_json::from_slice(&body).unwrap(); - assert_yaml_snapshot!(body, @r###" + assert_yaml_snapshot!(body, @r#" --- fonts: {} sprites: {} @@ -111,8 +111,9 @@ postgres: content_type: application/x-protobuf description: public.points1.geom points1_vw: + attribution: some attribution from SQL comment content_type: application/x-protobuf - description: public.points1_vw.geom + description: description from SQL comment points2: content_type: application/x-protobuf description: public.points2.geom @@ -127,7 +128,7 @@ postgres: table_source_multiple_geom.1: content_type: application/x-protobuf description: public.table_source_multiple_geom.geom2 - "###); + "#); } #[actix_rt::test] diff --git a/martin/tests/pg_table_source_test.rs b/martin/tests/pg_table_source_test.rs index ed9983ec3..9628d58eb 100644 --- a/martin/tests/pg_table_source_test.rs +++ b/martin/tests/pg_table_source_test.rs @@ -15,7 +15,7 @@ fn init() { #[actix_rt::test] async fn table_source() { let mock = mock_sources(mock_pgcfg("connection_string: $DATABASE_URL")).await; - assert_yaml_snapshot!(mock.0.tiles.get_catalog(), @r###" + assert_yaml_snapshot!(mock.0.tiles.get_catalog(), @r#" --- "-function.withweired---_-characters": content_type: application/x-protobuf @@ -72,7 +72,8 @@ async fn table_source() { description: public.points1.geom points1_vw: content_type: application/x-protobuf - description: public.points1_vw.geom + description: description from SQL comment + attribution: some attribution from SQL comment points2: content_type: application/x-protobuf description: public.points2.geom @@ -87,7 +88,7 @@ async fn table_source() { table_source_multiple_geom.1: content_type: application/x-protobuf description: public.table_source_multiple_geom.geom2 - "###); + "#); let source = table(&mock, "table_source"); assert_yaml_snapshot!(source, @r###" diff --git a/tests/expected/auto/catalog_auto.json b/tests/expected/auto/catalog_auto.json index cf0f37400..bd4b5b683 100644 --- a/tests/expected/auto/catalog_auto.json +++ b/tests/expected/auto/catalog_auto.json @@ -106,7 +106,8 @@ }, "points1_vw": { "content_type": "application/x-protobuf", - "description": "public.points1_vw.geom" + "description": "description from SQL comment", + "attribution": "some attribution from SQL comment" }, "points2": { "content_type": "application/x-protobuf", diff --git a/tests/fixtures/tables/points1.sql b/tests/fixtures/tables/points1.sql index 28bf6f7e9..02dc9e93e 100644 --- a/tests/fixtures/tables/points1.sql +++ b/tests/fixtures/tables/points1.sql @@ -53,3 +53,12 @@ values (1, '0101000020E6100000EC3A2806EDDA61401C2041E87DDA2740'), CREATE INDEX ON points1 USING GIST (geom); CLUSTER points1_geom_idx ON points1; + +DO $do$ BEGIN + EXECUTE 'COMMENT ON VIEW points1_vw IS $tj$' || $$ + { + "description": "description from SQL comment", + "attribution": "some attribution from SQL comment" + } + $$::json || '$tj$'; +END $do$; From 8ac8ef5f2314882019e60e203db99b56a9487e38 Mon Sep 17 00:00:00 2001 From: Frank Elsinga Date: Sun, 20 Oct 2024 08:07:54 +0200 Subject: [PATCH 150/215] feat:added a postgres version check (#1427) - [x] adds a postgres version check - [x] added a testcase (using testcontainers) that the version is parsed correctly Resolves #1230 (I think at this point the PR can be considered unasigned again, feel free to reject otherwise. Don't want to step on peoples toes ^^) Resolves #1229 (by using the minumum supported postgres version for postgis) --------- Co-authored-by: Yuri Astrakhan --- Cargo.lock | 275 ++++++++++++++++++++++++++++++++-- Cargo.toml | 3 +- martin/Cargo.toml | 2 + martin/src/pg/errors.rs | 6 + martin/src/pg/pool.rs | 145 ++++++++++++++---- martin/src/pg/query_tables.rs | 5 +- tests/test.sh | 1 + 7 files changed, 395 insertions(+), 42 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c669dc527..4c796d477 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -580,6 +580,56 @@ dependencies = [ "generic-array 0.14.7", ] +[[package]] +name = "bollard" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d41711ad46fda47cd701f6908e59d1bd6b9a2b7464c0d0aeab95c6d37096ff8a" +dependencies = [ + "base64 0.22.1", + "bollard-stubs", + "bytes", + "futures-core", + "futures-util", + "hex", + "home", + "http 1.1.0", + "http-body-util", + "hyper 1.5.0", + "hyper-named-pipe", + "hyper-rustls", + "hyper-util", + "hyperlocal", + "log", + "pin-project-lite", + "rustls", + "rustls-native-certs 0.7.3", + "rustls-pemfile", + "rustls-pki-types", + "serde", + "serde_derive", + "serde_json", + "serde_repr", + "serde_urlencoded", + "thiserror", + "tokio", + "tokio-util", + "tower-service", + "url", + "winapi", +] + +[[package]] +name = "bollard-stubs" +version = "1.45.0-rc.26.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d7c5415e3a6bc6d3e99eff6268e488fd4ee25e7b28c10f08fa6760bd9de16e4" +dependencies = [ + "serde", + "serde_repr", + "serde_with", +] + [[package]] name = "brotli" version = "3.5.0" @@ -602,6 +652,17 @@ dependencies = [ "brotli-decompressor 4.0.1", ] +[[package]] +name = "brotli" +version = "7.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc97b8f16f944bba54f0433f07e30be199b6dc2bd25937444bbad560bcea29bd" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor 4.0.1", +] + [[package]] name = "brotli-decompressor" version = "2.5.1" @@ -1204,6 +1265,17 @@ dependencies = [ "subtle", ] +[[package]] +name = "docker_credential" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31951f49556e34d90ed28342e1df7e1cb7a229c4cab0aecc627b5d91edd41d07" +dependencies = [ + "base64 0.21.7", + "serde", + "serde_json", +] + [[package]] name = "dotenvy" version = "0.15.7" @@ -1452,7 +1524,7 @@ dependencies = [ "enum_dispatch", "fs4", "memmapix", - "parse-display", + "parse-display 0.8.2", "pin-project-lite", "tokio", ] @@ -1936,6 +2008,7 @@ dependencies = [ "http 1.1.0", "http-body 1.0.1", "httparse", + "httpdate", "itoa", "pin-project-lite", "smallvec", @@ -1943,6 +2016,21 @@ dependencies = [ "want", ] +[[package]] +name = "hyper-named-pipe" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73b7d8abf35697b81a825e386fc151e0d503e8cb5fcb93cc8669c376dfd6f278" +dependencies = [ + "hex", + "hyper 1.5.0", + "hyper-util", + "pin-project-lite", + "tokio", + "tower-service", + "winapi", +] + [[package]] name = "hyper-rustls" version = "0.27.3" @@ -1954,7 +2042,7 @@ dependencies = [ "hyper 1.5.0", "hyper-util", "rustls", - "rustls-native-certs", + "rustls-native-certs 0.8.0", "rustls-pki-types", "tokio", "tokio-rustls", @@ -1980,6 +2068,21 @@ dependencies = [ "tracing", ] +[[package]] +name = "hyperlocal" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "986c5ce3b994526b3cd75578e62554abd09f0899d6206de48b3e96ab34ccc8c7" +dependencies = [ + "hex", + "http-body-util", + "hyper 1.5.0", + "hyper-util", + "pin-project-lite", + "tokio", + "tower-service", +] + [[package]] name = "iana-time-zone" version = "0.1.61" @@ -2321,7 +2424,7 @@ checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ "bitflags 2.6.0", "libc", - "redox_syscall", + "redox_syscall 0.5.7", ] [[package]] @@ -2395,9 +2498,10 @@ dependencies = [ "actix-rt", "actix-web", "actix-web-static-files", + "anyhow", "async-trait", "bit-set", - "brotli 6.0.0", + "brotli 7.0.0", "cargo-husky", "clap", "criterion", @@ -2425,7 +2529,7 @@ dependencies = [ "regex", "rstest", "rustls", - "rustls-native-certs", + "rustls-native-certs 0.8.0", "rustls-pemfile", "semver", "serde", @@ -2435,6 +2539,7 @@ dependencies = [ "spreet", "static-files", "subst", + "testcontainers-modules", "thiserror", "tilejson", "tokio", @@ -2447,7 +2552,7 @@ name = "martin-tile-utils" version = "0.5.1" dependencies = [ "approx", - "brotli 6.0.0", + "brotli 7.0.0", "flate2", "insta", ] @@ -2828,7 +2933,7 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall", + "redox_syscall 0.5.7", "smallvec", "windows-targets 0.52.6", ] @@ -2840,10 +2945,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6509d08722b53e8dafe97f2027b22ccbe3a5db83cb352931e9716b0aa44bc5c" dependencies = [ "once_cell", - "parse-display-derive", + "parse-display-derive 0.8.2", "regex", ] +[[package]] +name = "parse-display" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "914a1c2265c98e2446911282c6ac86d8524f495792c38c5bd884f80499c7538a" +dependencies = [ + "parse-display-derive 0.9.1", + "regex", + "regex-syntax 0.8.5", +] + [[package]] name = "parse-display-derive" version = "0.8.2" @@ -2855,7 +2971,21 @@ dependencies = [ "quote", "regex", "regex-syntax 0.7.5", - "structmeta", + "structmeta 0.2.0", + "syn 2.0.80", +] + +[[package]] +name = "parse-display-derive" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ae7800a4c974efd12df917266338e79a7a74415173caf7e70aa0a0707345281" +dependencies = [ + "proc-macro2", + "quote", + "regex", + "regex-syntax 0.8.5", + "structmeta 0.3.0", "syn 2.0.80", ] @@ -3447,6 +3577,15 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b42e27ef78c35d3998403c1d26f3efd9e135d3e5121b0a4845cc5cc27547f4f" +[[package]] +name = "redox_syscall" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +dependencies = [ + "bitflags 1.3.2", +] + [[package]] name = "redox_syscall" version = "0.5.7" @@ -3528,7 +3667,7 @@ dependencies = [ "pin-project-lite", "quinn", "rustls", - "rustls-native-certs", + "rustls-native-certs 0.8.0", "rustls-pemfile", "rustls-pki-types", "serde", @@ -3727,6 +3866,19 @@ dependencies = [ "zeroize", ] +[[package]] +name = "rustls-native-certs" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5bfb394eeed242e909609f56089eecfe5fda225042e8b171791b9c95f5931e5" +dependencies = [ + "openssl-probe", + "rustls-pemfile", + "rustls-pki-types", + "schannel", + "security-framework", +] + [[package]] name = "rustls-native-certs" version = "0.8.0" @@ -3884,6 +4036,17 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_repr" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.80", +] + [[package]] name = "serde_tuple" version = "0.5.0" @@ -4397,7 +4560,19 @@ checksum = "78ad9e09554f0456d67a69c1584c9798ba733a5b50349a6c0d0948710523922d" dependencies = [ "proc-macro2", "quote", - "structmeta-derive", + "structmeta-derive 0.2.0", + "syn 2.0.80", +] + +[[package]] +name = "structmeta" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e1575d8d40908d70f6fd05537266b90ae71b15dbbe7a8b7dffa2b759306d329" +dependencies = [ + "proc-macro2", + "quote", + "structmeta-derive 0.3.0", "syn 2.0.80", ] @@ -4412,6 +4587,17 @@ dependencies = [ "syn 2.0.80", ] +[[package]] +name = "structmeta-derive" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "152a0b65a590ff6c3da95cabe2353ee04e6167c896b28e3b14478c2636c922fc" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.80", +] + [[package]] name = "subst" version = "0.3.5" @@ -4519,6 +4705,44 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "testcontainers" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f40cc2bd72e17f328faf8ca7687fe337e61bccd8acf9674fa78dd3792b045e1" +dependencies = [ + "async-trait", + "bollard", + "bollard-stubs", + "bytes", + "docker_credential", + "either", + "etcetera", + "futures", + "log", + "memchr", + "parse-display 0.9.1", + "pin-project-lite", + "serde", + "serde_json", + "serde_with", + "thiserror", + "tokio", + "tokio-stream", + "tokio-tar", + "tokio-util", + "url", +] + +[[package]] +name = "testcontainers-modules" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "708fce58200e480633a428b7356fc39eb7fef02e47bd6faa94ba1d0746e6f17e" +dependencies = [ + "testcontainers", +] + [[package]] name = "thiserror" version = "1.0.64" @@ -4746,6 +4970,21 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-tar" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d5714c010ca3e5c27114c1cdeb9d14641ace49874aa5626d7149e47aedace75" +dependencies = [ + "filetime", + "futures-core", + "libc", + "redox_syscall 0.3.5", + "tokio", + "tokio-stream", + "xattr", +] + [[package]] name = "tokio-util" version = "0.7.12" @@ -4964,6 +5203,7 @@ dependencies = [ "form_urlencoded", "idna", "percent-encoding", + "serde", ] [[package]] @@ -5198,7 +5438,7 @@ version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "372d5b87f58ec45c384ba03563b03544dc5fadc3983e434b286913f5b4a9bb6d" dependencies = [ - "redox_syscall", + "redox_syscall 0.5.7", "wasite", "web-sys", ] @@ -5451,6 +5691,17 @@ dependencies = [ "tls_codec", ] +[[package]] +name = "xattr" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f" +dependencies = [ + "libc", + "linux-raw-sys", + "rustix", +] + [[package]] name = "xmlparser" version = "0.13.6" diff --git a/Cargo.toml b/Cargo.toml index 8ed9582af..27b11a0c1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -34,7 +34,7 @@ anyhow = "1.0" approx = "0.5.1" async-trait = "0.1" bit-set = "0.8" -brotli = ">=5, <7" +brotli = ">=5, <8" cargo-husky = { version = "1", features = ["user-hooks"], default-features = false } clap = { version = "4", features = ["derive"] } criterion = { version = "0.5", features = ["async_futures", "async_tokio", "html_reports"] } @@ -83,6 +83,7 @@ sqlite-hashes = { version = "0.7.6", default-features = false, features = ["md5" sqlx = { version = "0.7", features = ["sqlite", "runtime-tokio"] } static-files = "0.2" subst = { version = "0.3", features = ["yaml"] } +testcontainers-modules = { version = "0.11.3", features = ["postgres"] } thiserror = "1" tile-grid = "0.6" tilejson = "0.4" diff --git a/martin/Cargo.toml b/martin/Cargo.toml index 7d9196052..28dc1c4d8 100644 --- a/martin/Cargo.toml +++ b/martin/Cargo.toml @@ -118,6 +118,7 @@ url.workspace = true static-files = { workspace = true, optional = true } [dev-dependencies] +anyhow.workspace = true cargo-husky.workspace = true criterion.workspace = true ctor.workspace = true @@ -125,3 +126,4 @@ indoc.workspace = true insta = { workspace = true, features = ["yaml"] } pprof.workspace = true rstest.workspace = true +testcontainers-modules.workspace = true diff --git a/martin/src/pg/errors.rs b/martin/src/pg/errors.rs index 69fc0fb91..b8b995ccb 100644 --- a/martin/src/pg/errors.rs +++ b/martin/src/pg/errors.rs @@ -49,9 +49,15 @@ pub enum PgError { #[error("Unable to parse PostGIS version {1}: {0}")] BadPostgisVersion(#[source] semver::Error, String), + #[error("Unable to parse PostgreSQL version {1}: {0}")] + BadPostgresVersion(#[source] semver::Error, String), + #[error("PostGIS version {0} is too old, minimum required is {1}")] PostgisTooOld(Version, Version), + #[error("PostgreSQL version {0} is too old, minimum required is {1}")] + PostgresqlTooOld(Version, Version), + #[error("Invalid extent setting in source {0} for table {1}: extent=0")] InvalidTableExtent(String, String), diff --git a/martin/src/pg/pool.rs b/martin/src/pg/pool.rs index 6fb3c7103..efa7d3ec2 100755 --- a/martin/src/pg/pool.rs +++ b/martin/src/pg/pool.rs @@ -6,17 +6,22 @@ use semver::Version; use crate::pg::config::PgConfig; use crate::pg::tls::{make_connector, parse_conn_str, SslModeOverride}; use crate::pg::PgError::{ - BadPostgisVersion, PostgisTooOld, PostgresError, PostgresPoolBuildError, PostgresPoolConnError, + BadPostgisVersion, BadPostgresVersion, PostgisTooOld, PostgresError, PostgresPoolBuildError, + PostgresPoolConnError, PostgresqlTooOld, }; use crate::pg::PgResult; pub const POOL_SIZE_DEFAULT: usize = 20; -// We require ST_TileEnvelope that was added in PostGIS 3.0.0 -// See https://postgis.net/docs/ST_TileEnvelope.html +/// We require `ST_TileEnvelope` that was added in [`PostGIS 3.0.0`](https://postgis.net/2019/10/PostGIS-3.0.0/) +/// See const MINIMUM_POSTGIS_VER: Version = Version::new(3, 0, 0); -// After this version we can use margin parameter in ST_TileEnvelope +/// Minimum version of postgres required for [`MINIMUM_POSTGIS_VER`] according to the [Support Matrix](https://trac.osgeo.org/postgis/wiki/UsersWikiPostgreSQLPostGIS) +const MINIMUM_POSTGRES_VER: Version = Version::new(11, 0, 0); +/// After this [`PostGIS`](https://postgis.net/) version we can use margin parameter in `ST_TileEnvelope` const RECOMMENDED_POSTGIS_VER: Version = Version::new(3, 1, 0); +/// Minimum version of postgres required for [`RECOMMENDED_POSTGIS_VER`] according to the [Support Matrix](https://trac.osgeo.org/postgis/wiki/UsersWikiPostgreSQLPostGIS) +const RECOMMENDED_POSTGRES_VER: Version = Version::new(12, 0, 0); #[derive(Clone, Debug)] pub struct PgPool { @@ -35,32 +40,26 @@ impl PgPool { .build() .map_err(|e| PostgresPoolBuildError(e, id.clone()))?; - let version: String = get_conn(&pool, id.as_str()) - .await? - .query_one( - r" -SELECT - (regexp_matches( - PostGIS_Lib_Version(), - '^(\d+\.\d+\.\d+)', - 'g' - ))[1] as version; - ", - &[], - ) - .await - .map(|row| row.get("version")) - .map_err(|e| PostgresError(e, "querying postgis version"))?; - - let version: Version = version.parse().map_err(|e| BadPostgisVersion(e, version))?; - if version < MINIMUM_POSTGIS_VER { - return Err(PostgisTooOld(version, MINIMUM_POSTGIS_VER)); + let conn = get_conn(&pool, &id).await?; + let pg_ver = get_postgres_version(&conn).await?; + if pg_ver < MINIMUM_POSTGRES_VER { + return Err(PostgresqlTooOld(pg_ver, MINIMUM_POSTGRES_VER)); + } + if pg_ver < RECOMMENDED_POSTGRES_VER { + warn!("PostgreSQL {pg_ver} is older than the recommended {RECOMMENDED_POSTGRES_VER}."); } - if version < RECOMMENDED_POSTGIS_VER { - warn!("PostGIS {version} is before the recommended {RECOMMENDED_POSTGIS_VER}. Margin parameter in ST_TileEnvelope is not supported, so tiles may be cut off at the edges."); + + let postgis_ver = get_postgis_version(&conn).await?; + if postgis_ver < MINIMUM_POSTGIS_VER { + return Err(PostgisTooOld(postgis_ver, MINIMUM_POSTGIS_VER)); + } + let margin = postgis_ver >= RECOMMENDED_POSTGIS_VER; + if !margin { + warn!("PostGIS {postgis_ver} is older than the recommended {RECOMMENDED_POSTGIS_VER}. Margin parameter in ST_TileEnvelope is not supported, so tiles may be cut off at the edges."); } - let margin = version >= RECOMMENDED_POSTGIS_VER; + info!("Connected to PostgreSQL {pg_ver} / PostGIS {postgis_ver} for source {id}"); + Ok(Self { id, pool, margin }) } @@ -120,3 +119,95 @@ async fn get_conn(pool: &Pool, id: &str) -> PgResult { .await .map_err(|e| PostgresPoolConnError(e, id.to_string())) } + +/// Get [PostgreSQL version](https://www.postgresql.org/support/versioning/). +/// `PostgreSQL` only has a Major.Minor versioning, so we use 0 the patch version +async fn get_postgres_version(conn: &Object) -> PgResult { + let version: String = conn + .query_one( + r" +SELECT (regexp_matches( + current_setting('server_version'), + '^(\d+\.\d+)', + 'g' + ))[1] || '.0' as version;", + &[], + ) + .await + .map(|row| row.get("version")) + .map_err(|e| PostgresError(e, "querying postgres version"))?; + + let version: Version = version + .parse() + .map_err(|e| BadPostgresVersion(e, version))?; + + Ok(version) +} + +/// Get [PostGIS version](https://postgis.net/docs/PostGIS_Lib_Version.html) +async fn get_postgis_version(conn: &Object) -> PgResult { + let version: String = conn + .query_one( + r" +SELECT (regexp_matches( + PostGIS_Lib_Version(), + '^(\d+\.\d+\.\d+)', + 'g' + ))[1] as version;", + &[], + ) + .await + .map(|row| row.get("version")) + .map_err(|e| PostgresError(e, "querying postgis version"))?; + + let version: Version = version.parse().map_err(|e| BadPostgisVersion(e, version))?; + + Ok(version) +} + +#[cfg(test)] +mod tests { + use super::*; + use deadpool_postgres::tokio_postgres::Config; + use postgres::NoTls; + use testcontainers_modules::postgres::Postgres; + use testcontainers_modules::testcontainers::runners::AsyncRunner as _; + use testcontainers_modules::testcontainers::ImageExt as _; + + #[tokio::test] + async fn parse_version() -> anyhow::Result<()> { + let node = Postgres::default() + .with_name("postgis/postgis") + .with_tag("11-3.0") // purposely very old and stable + .start() + .await?; + + let pg_config = Config::new() + .host(node.get_host().await?.to_string()) + .port(node.get_host_port_ipv4(5432).await?) + .dbname("postgres") + .user("postgres") + .password("postgres") + .to_owned(); + + let mgr_config = ManagerConfig { + recycling_method: RecyclingMethod::Fast, + }; + + let mgr = Manager::from_config(pg_config, NoTls, mgr_config); + let pool = Pool::builder(mgr).max_size(2).build()?; + let conn = pool.get().await?; + + let pg_version = get_postgres_version(&conn).await?; + assert_eq!(pg_version.major, 11); + assert!(pg_version.minor >= 10); // we don't want to break this testcase just because postgis updates that image + assert_eq!(pg_version.patch, 0); + + let postgis_version = get_postgis_version(&conn).await?; + assert_eq!(postgis_version.major, 3); + assert_eq!(postgis_version.minor, 0); + assert!(postgis_version.patch >= 3); // we don't want to break this testcase just because postgis updates that image + + Ok(()) + } +} diff --git a/martin/src/pg/query_tables.rs b/martin/src/pg/query_tables.rs index 23a13c15a..9aea4d575 100644 --- a/martin/src/pg/query_tables.rs +++ b/martin/src/pg/query_tables.rs @@ -24,8 +24,9 @@ static DEFAULT_CLIP_GEOM: bool = true; /// Examine a database to get a list of all tables that have geometry columns. pub async fn query_available_tables(pool: &PgPool) -> PgResult { - let conn = pool.get().await?; - let rows = conn + let rows = pool + .get() + .await? .query(include_str!("scripts/query_available_tables.sql"), &[]) .await .map_err(|e| PostgresError(e, "querying available tables"))?; diff --git a/tests/test.sh b/tests/test.sh index 8e73fdf6e..af36adb2f 100755 --- a/tests/test.sh +++ b/tests/test.sh @@ -172,6 +172,7 @@ validate_log() { # Older versions of PostGIS don't support the margin parameter, so we need to remove it from the log remove_line "$LOG_FILE" 'Margin parameter in ST_TileEnvelope is not supported' remove_line "$LOG_FILE" 'Source IDs must be unique' + remove_line "$LOG_FILE" 'PostgreSQL 11.10.0 is older than the recommended 12.0.0' echo "Checking for no other warnings or errors in the log" if grep -e ' ERROR ' -e ' WARN ' "$LOG_FILE"; then From 6f201fcf69322272bb3681d6874839431954e264 Mon Sep 17 00:00:00 2001 From: Lucas Date: Sun, 20 Oct 2024 14:28:39 +0800 Subject: [PATCH 151/215] Use layer id if it is provided (#1501) Try to fix #1472 --------- Co-authored-by: zhangyijun <270361049@qq.com> Co-authored-by: Yuri Astrakhan --- martin/src/pg/config_table.rs | 11 ++++++++- tests/expected/configured/cmp.json | 36 ++++++++++++++++++++++++++++++ tests/test.sh | 3 ++- 3 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 tests/expected/configured/cmp.json diff --git a/martin/src/pg/config_table.rs b/martin/src/pg/config_table.rs index 9ef086a46..507e366bb 100644 --- a/martin/src/pg/config_table.rs +++ b/martin/src/pg/config_table.rs @@ -83,6 +83,8 @@ impl PgInfo for TableInfo { format!("{}.{}.{}", self.schema, self.table, self.geometry_column) } + /// Result `TileJson` will be patched by the `TileJson` from SQL comment if provided. + /// The `source_id` will be replaced by `self.layer_id` in the vector layer info if set. fn to_tilejson(&self, source_id: String) -> TileJSON { let mut tilejson = tilejson::tilejson! { tiles: vec![], // tile source is required, but not yet known @@ -92,8 +94,15 @@ impl PgInfo for TableInfo { tilejson.minzoom = self.minzoom; tilejson.maxzoom = self.maxzoom; tilejson.bounds = self.bounds; + + let id = if let Some(id) = &self.layer_id { + id.clone() + } else { + source_id + }; + let layer = VectorLayer { - id: source_id, + id, fields: self.properties.clone().unwrap_or_default(), description: None, maxzoom: None, diff --git a/tests/expected/configured/cmp.json b/tests/expected/configured/cmp.json new file mode 100644 index 000000000..7112ee6ab --- /dev/null +++ b/tests/expected/configured/cmp.json @@ -0,0 +1,36 @@ +{ + "tilejson": "3.0.0", + "tiles": [ + "http://localhost:3111/table_source,points1,points2/{z}/{x}/{y}" + ], + "vector_layers": [ + { + "id": "table_source", + "fields": { + "gid": "int4" + } + }, + { + "id": "abc", + "fields": { + "gid": "int4" + } + }, + { + "id": "points2", + "fields": { + "gid": "int4" + } + } + ], + "bounds": [ + -180, + -90, + 180, + 90 + ], + "description": "public.points1.geom\npublic.points2.geom", + "maxzoom": 30, + "minzoom": 0, + "name": "table_source,points1,points2" +} diff --git a/tests/test.sh b/tests/test.sh index af36adb2f..2b8ea6a14 100755 --- a/tests/test.sh +++ b/tests/test.sh @@ -339,7 +339,8 @@ wait_for "$MARTIN_PROC_ID" Martin "$MARTIN_URL/health" unset DATABASE_URL >&2 echo "Test catalog" -test_jsn catalog_cfg catalog +test_jsn catalog_cfg catalog +test_jsn cmp table_source,points1,points2 # Test tile sources test_pbf tbl_0_0_0 table_source/0/0/0 From 763f626b2c55b15ed82b443b0dce38ce378f9099 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 22 Oct 2024 03:10:54 +0000 Subject: [PATCH 152/215] chore(deps): Bump sqlite-compressions from 0.2.15 to 0.2.16 (#1547) Bumps [sqlite-compressions](https://github.com/nyurik/sqlite-compressions) from 0.2.15 to 0.2.16.
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=sqlite-compressions&package-manager=cargo&previous-version=0.2.15&new-version=0.2.16)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4c796d477..b15d9d86c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4289,9 +4289,9 @@ dependencies = [ [[package]] name = "sqlite-compressions" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "556f9a7149983ee0d6708f1d65a5bf30e81f560d3713b3a1e64b2e512cdd7364" +checksum = "e5a4d4aaf917cb6dc0758159f2ade412b62587dd85da48671d48702c607f0d5b" dependencies = [ "bsdiff", "flate2", diff --git a/Cargo.toml b/Cargo.toml index 27b11a0c1..0029a0349 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -78,7 +78,7 @@ serde_with = "3" serde_yaml = "0.9" size_format = "1.0.2" spreet = { version = "0.11", default-features = false } -sqlite-compressions = { version = "0.2.15", default-features = false, features = ["bsdiffraw", "gzip"] } +sqlite-compressions = { version = "0.2.16", default-features = false, features = ["bsdiffraw", "gzip"] } sqlite-hashes = { version = "0.7.6", default-features = false, features = ["md5", "aggregate", "hex"] } sqlx = { version = "0.7", features = ["sqlite", "runtime-tokio"] } static-files = "0.2" From b134cb2bc6eadb23256bdd648831a8b4e4f6bcb1 Mon Sep 17 00:00:00 2001 From: Frank Elsinga Date: Tue, 22 Oct 2024 18:49:36 +0200 Subject: [PATCH 153/215] Add `sdf` sprite support with `/sdf_sprite/...` endpoint (#1492) Given a set of SVGs as a sprite source X, Martin will now generate two endpoints: `/sprite/X` and `/sdf_sprite/X`, with the second endpoint serving [signed distance field](https://en.wikipedia.org/wiki/Signed_distance_function) images. Closes #1075 --- docs/src/sources-sprites.md | 16 ++++++- docs/src/using.md | 25 +++++----- martin/src/sprites/mod.rs | 44 ++++++++++++------ martin/src/srv/server.rs | 4 +- martin/src/srv/sprites.rs | 37 +++++++++++++-- tests/expected/configured/sdf_spr_cmp.json | 34 ++++++++++++++ tests/expected/configured/sdf_spr_cmp.png | Bin 0 -> 945 bytes tests/expected/configured/sdf_spr_cmp.png.txt | 1 + tests/expected/configured/sdf_spr_cmp_2.json | 34 ++++++++++++++ tests/expected/configured/sdf_spr_cmp_2.png | Bin 0 -> 1863 bytes .../expected/configured/sdf_spr_cmp_2.png.txt | 1 + tests/expected/configured/sdf_spr_mysrc.json | 10 ++++ tests/expected/configured/sdf_spr_mysrc.png | Bin 0 -> 675 bytes .../expected/configured/sdf_spr_mysrc.png.txt | 1 + tests/expected/configured/sdf_spr_src1.json | 26 +++++++++++ tests/expected/configured/sdf_spr_src1.png | Bin 0 -> 900 bytes .../expected/configured/sdf_spr_src1.png.txt | 1 + tests/expected/configured/sdf_spr_src1_.json | 26 +++++++++++ tests/expected/configured/sdf_spr_src1_.png | Bin 0 -> 1699 bytes .../expected/configured/sdf_spr_src1_.png.txt | 1 + .../fixtures/sprites/expected/all_1_sdf.json | 34 ++++++++++++++ tests/fixtures/sprites/expected/all_1_sdf.png | Bin 0 -> 945 bytes .../fixtures/sprites/expected/all_2_sdf.json | 34 ++++++++++++++ tests/fixtures/sprites/expected/all_2_sdf.png | Bin 0 -> 1863 bytes .../fixtures/sprites/expected/src1_1_sdf.json | 26 +++++++++++ .../fixtures/sprites/expected/src1_1_sdf.png | Bin 0 -> 900 bytes .../fixtures/sprites/expected/src1_2_sdf.json | 26 +++++++++++ .../fixtures/sprites/expected/src1_2_sdf.png | Bin 0 -> 1699 bytes .../fixtures/sprites/expected/src2_1_sdf.json | 10 ++++ .../fixtures/sprites/expected/src2_1_sdf.png | Bin 0 -> 377 bytes .../fixtures/sprites/expected/src2_2_sdf.json | 10 ++++ .../fixtures/sprites/expected/src2_2_sdf.png | Bin 0 -> 675 bytes tests/test.sh | 36 +++++++++----- 33 files changed, 394 insertions(+), 43 deletions(-) create mode 100644 tests/expected/configured/sdf_spr_cmp.json create mode 100644 tests/expected/configured/sdf_spr_cmp.png create mode 100644 tests/expected/configured/sdf_spr_cmp.png.txt create mode 100644 tests/expected/configured/sdf_spr_cmp_2.json create mode 100644 tests/expected/configured/sdf_spr_cmp_2.png create mode 100644 tests/expected/configured/sdf_spr_cmp_2.png.txt create mode 100644 tests/expected/configured/sdf_spr_mysrc.json create mode 100644 tests/expected/configured/sdf_spr_mysrc.png create mode 100644 tests/expected/configured/sdf_spr_mysrc.png.txt create mode 100644 tests/expected/configured/sdf_spr_src1.json create mode 100644 tests/expected/configured/sdf_spr_src1.png create mode 100644 tests/expected/configured/sdf_spr_src1.png.txt create mode 100644 tests/expected/configured/sdf_spr_src1_.json create mode 100644 tests/expected/configured/sdf_spr_src1_.png create mode 100644 tests/expected/configured/sdf_spr_src1_.png.txt create mode 100644 tests/fixtures/sprites/expected/all_1_sdf.json create mode 100644 tests/fixtures/sprites/expected/all_1_sdf.png create mode 100644 tests/fixtures/sprites/expected/all_2_sdf.json create mode 100644 tests/fixtures/sprites/expected/all_2_sdf.png create mode 100644 tests/fixtures/sprites/expected/src1_1_sdf.json create mode 100644 tests/fixtures/sprites/expected/src1_1_sdf.png create mode 100644 tests/fixtures/sprites/expected/src1_2_sdf.json create mode 100644 tests/fixtures/sprites/expected/src1_2_sdf.png create mode 100644 tests/fixtures/sprites/expected/src2_1_sdf.json create mode 100644 tests/fixtures/sprites/expected/src2_1_sdf.png create mode 100644 tests/fixtures/sprites/expected/src2_2_sdf.json create mode 100644 tests/fixtures/sprites/expected/src2_2_sdf.png diff --git a/docs/src/sources-sprites.md b/docs/src/sources-sprites.md index 5b24cb8e1..ac865b12c 100644 --- a/docs/src/sources-sprites.md +++ b/docs/src/sources-sprites.md @@ -1,6 +1,7 @@ ## Sprite Sources -Given a directory with SVG images, Martin will generate a sprite -- a JSON index and a PNG image, for both low and highresolution displays. The SVG filenames without extension will be used as the sprites' image IDs (remember that one sprite and thus `sprite_id` contains multiple images). +Given a directory with SVG images, Martin will generate a sprite -- a JSON index and a PNG image, for both low and highresolution displays. +The SVG filenames without extension will be used as the sprites' image IDs (remember that one sprite and thus `sprite_id` contains multiple images). The images are searched recursively in the given directory, so subdirectory names will be used as prefixes for the image IDs. For example `icons/bicycle.svg` will be available as `icons/bicycle` sprite image. @@ -40,6 +41,19 @@ the PNG, there is a high DPI version available at `/sprite/@2x.json`. } ``` +##### Coloring at runtime via Signed Distance Fields (SDFs) + +If you want to set the color of a sprite at runtime, you will need use the [Signed Distance Fields (SDFs)](https://steamcdn-a.akamaihd.net/apps/valve/2007/SIGGRAPH2007_AlphaTestedMagnification.pdf)-endpoints. +For example, maplibre does support the image being modified via the [`icon-color`](https://maplibre.org/maplibre-style-spec/layers/#icon-color) and [`icon-halo-color`](https://maplibre.org/maplibre-style-spec/layers/#icon-halo-color) properties if using SDFs. + +SDFs have the significant **downside of only allowing one color**. +If you want multiple colors, you will need to layer icons on top of each other. + +The following APIs are available: + +- `/sdf_sprite/.json` for getting a sprite index as SDF and +- `/sdf_sprite/.png` for getting sprite PNGs as SDF + #### Combining Multiple Sprites Multiple `sprite_id` values can be combined into one sprite with the same pattern as for tile diff --git a/docs/src/using.md b/docs/src/using.md index 82c11ee41..3e5c40567 100644 --- a/docs/src/using.md +++ b/docs/src/using.md @@ -2,18 +2,19 @@ Martin data is available via the HTTP `GET` endpoints: -| URL | Description | -|-----------------------------------------|------------------------------------------------| -| `/` | Web UI | -| `/catalog` | [List of all sources](#catalog) | -| `/{sourceID}` | [Source TileJSON](#source-tilejson) | -| `/{sourceID}/{z}/{x}/{y}` | Map Tiles | -| `/{source1},…,{sourceN}` | [Composite Source TileJSON](#source-tilejson) | -| `/{source1},…,{sourceN}/{z}/{x}/{y}` | [Composite Source Tiles](sources-composite.md) | -| `/sprite/{spriteID}[@2x].{json,png}` | [Sprite sources](sources-sprites.md) | -| `/font/{font}/{start}-{end}` | [Font source](sources-fonts.md) | -| `/font/{font1},…,{fontN}/{start}-{end}` | [Composite Font source](sources-fonts.md) | -| `/health` | Martin server health check: returns 200 `OK` | +| URL | Description | +|------------------------------------------|------------------------------------------------| +| `/` | Web UI | +| `/catalog` | [List of all sources](#catalog) | +| `/{sourceID}` | [Source TileJSON](#source-tilejson) | +| `/{sourceID}/{z}/{x}/{y}` | Map Tiles | +| `/{source1},…,{sourceN}` | [Composite Source TileJSON](#source-tilejson) | +| `/{source1},…,{sourceN}/{z}/{x}/{y}` | [Composite Source Tiles](sources-composite.md) | +| `/sprite/{spriteID}[@2x].{json,png}` | [Sprite sources](sources-sprites.md) | +| `/sdf_sprite/{spriteID}[@2x].{json,png}` | [SDF Sprite sources](sources-sprites.md) | +| `/font/{font}/{start}-{end}` | [Font source](sources-fonts.md) | +| `/font/{font1},…,{fontN}/{start}-{end}` | [Composite Font source](sources-fonts.md) | +| `/health` | Martin server health check: returns 200 `OK` | ### Duplicate Source ID diff --git a/martin/src/sprites/mod.rs b/martin/src/sprites/mod.rs index 07e1c769a..033f9631f 100644 --- a/martin/src/sprites/mod.rs +++ b/martin/src/sprites/mod.rs @@ -146,7 +146,7 @@ impl SpriteSources { /// Given a list of IDs in a format "id1,id2,id3", return a spritesheet with them all. /// `ids` may optionally end with "@2x" to request a high-DPI spritesheet. - pub async fn get_sprites(&self, ids: &str) -> SpriteResult { + pub async fn get_sprites(&self, ids: &str, as_sdf: bool) -> SpriteResult { let (ids, dpi) = if let Some(ids) = ids.strip_suffix("@2x") { (ids, 2) } else { @@ -162,7 +162,7 @@ impl SpriteSources { }) .collect::>>()?; - get_spritesheet(sprite_ids.into_iter(), dpi).await + get_spritesheet(sprite_ids.into_iter(), dpi, as_sdf).await } } @@ -175,6 +175,7 @@ async fn parse_sprite( name: String, path: PathBuf, pixel_ratio: u8, + as_sdf: bool, ) -> SpriteResult<(String, Sprite)> { let on_err = |e| SpriteError::IoError(e, path.clone()); @@ -186,7 +187,12 @@ async fn parse_sprite( let tree = Tree::from_data(&buffer, &Options::default()) .map_err(|e| SpriteParsingError(e, path.clone()))?; - let sprite = Sprite::new(tree, pixel_ratio).ok_or_else(|| SpriteInstError(path.clone()))?; + let sprite = if as_sdf { + Sprite::new_sdf(tree, pixel_ratio) + } else { + Sprite::new(tree, pixel_ratio) + }; + let sprite = sprite.ok_or_else(|| SpriteInstError(path.clone()))?; Ok((name, sprite)) } @@ -194,6 +200,7 @@ async fn parse_sprite( pub async fn get_spritesheet( sources: impl Iterator, pixel_ratio: u8, + as_sdf: bool, ) -> SpriteResult { // Asynchronously load all SVG files from the given sources let mut futures = Vec::new(); @@ -203,11 +210,14 @@ pub async fn get_spritesheet( for path in paths { let name = sprite_name(&path, &source.path) .map_err(|e| SpriteProcessingError(e, source.path.clone()))?; - futures.push(parse_sprite(name, path, pixel_ratio)); + futures.push(parse_sprite(name, path, pixel_ratio, as_sdf)); } } let sprites = try_join_all(futures).await?; let mut builder = SpritesheetBuilder::new(); + if as_sdf { + builder.make_sdf(); + } builder.sprites(sprites.into_iter().collect()); // TODO: decide if this is needed and/or configurable @@ -234,24 +244,32 @@ mod tests { let sprites = SpriteSources::resolve(&mut cfg).unwrap().0; assert_eq!(sprites.len(), 2); - test_src(sprites.values(), 1, "all_1").await; - test_src(sprites.values(), 2, "all_2").await; + //.sdf => generate sdf from png, add sdf == true + //- => does not generate sdf, omits sdf == true + for extension in ["_sdf", ""] { + test_src(sprites.values(), 1, "all_1", extension).await; + test_src(sprites.values(), 2, "all_2", extension).await; - test_src(sprites.get("src1").into_iter(), 1, "src1_1").await; - test_src(sprites.get("src1").into_iter(), 2, "src1_2").await; + test_src(sprites.get("src1").into_iter(), 1, "src1_1", extension).await; + test_src(sprites.get("src1").into_iter(), 2, "src1_2", extension).await; - test_src(sprites.get("src2").into_iter(), 1, "src2_1").await; - test_src(sprites.get("src2").into_iter(), 2, "src2_2").await; + test_src(sprites.get("src2").into_iter(), 1, "src2_1", extension).await; + test_src(sprites.get("src2").into_iter(), 2, "src2_2", extension).await; + } } async fn test_src( sources: impl Iterator, pixel_ratio: u8, filename: &str, + extension: &str, ) { - let path = PathBuf::from(format!("../tests/fixtures/sprites/expected/{filename}")); - - let sprites = get_spritesheet(sources, pixel_ratio).await.unwrap(); + let path = PathBuf::from(format!( + "../tests/fixtures/sprites/expected/{filename}{extension}" + )); + let sprites = get_spritesheet(sources, pixel_ratio, extension == "_sdf") + .await + .unwrap(); let mut json = serde_json::to_string_pretty(sprites.get_index()).unwrap(); json.push('\n'); let png = sprites.encode_png().unwrap(); diff --git a/martin/src/srv/server.rs b/martin/src/srv/server.rs index c4f3e0f3a..75af0e6b2 100755 --- a/martin/src/srv/server.rs +++ b/martin/src/srv/server.rs @@ -114,7 +114,9 @@ pub fn router(cfg: &mut web::ServiceConfig, #[allow(unused_variables)] usr_cfg: .service(get_tile); #[cfg(feature = "sprites")] - cfg.service(crate::srv::sprites::get_sprite_json) + cfg.service(crate::srv::sprites::get_sprite_sdf_json) + .service(crate::srv::sprites::get_sprite_json) + .service(crate::srv::sprites::get_sprite_sdf_png) .service(crate::srv::sprites::get_sprite_png); #[cfg(feature = "fonts")] diff --git a/martin/src/srv/sprites.rs b/martin/src/srv/sprites.rs index 55a61a81b..d9d4c2845 100644 --- a/martin/src/srv/sprites.rs +++ b/martin/src/srv/sprites.rs @@ -15,7 +15,18 @@ async fn get_sprite_png( path: Path, sprites: Data, ) -> ActixResult { - let sheet = get_sprite(&path, &sprites).await?; + let sheet = get_sprite(&path, &sprites, false).await?; + Ok(HttpResponse::Ok() + .content_type(ContentType::png()) + .body(sheet.encode_png().map_err(map_internal_error)?)) +} + +#[route("/sdf_sprite/{source_ids}.png", method = "GET", method = "HEAD")] +async fn get_sprite_sdf_png( + path: Path, + sprites: Data, +) -> ActixResult { + let sheet = get_sprite(&path, &sprites, true).await?; Ok(HttpResponse::Ok() .content_type(ContentType::png()) .body(sheet.encode_png().map_err(map_internal_error)?)) @@ -31,13 +42,31 @@ async fn get_sprite_json( path: Path, sprites: Data, ) -> ActixResult { - let sheet = get_sprite(&path, &sprites).await?; + let sheet = get_sprite(&path, &sprites, false).await?; + Ok(HttpResponse::Ok().json(sheet.get_index())) +} + +#[route( + "/sdf_sprite/{source_ids}.json", + method = "GET", + method = "HEAD", + wrap = "middleware::Compress::default()" +)] +async fn get_sprite_sdf_json( + path: Path, + sprites: Data, +) -> ActixResult { + let sheet = get_sprite(&path, &sprites, true).await?; Ok(HttpResponse::Ok().json(sheet.get_index())) } -async fn get_sprite(path: &SourceIDsRequest, sprites: &SpriteSources) -> ActixResult { +async fn get_sprite( + path: &SourceIDsRequest, + sprites: &SpriteSources, + as_sdf: bool, +) -> ActixResult { sprites - .get_sprites(&path.source_ids) + .get_sprites(&path.source_ids, as_sdf) .await .map_err(|e| match e { SpriteError::SpriteNotFound(_) => ErrorNotFound(e.to_string()), diff --git a/tests/expected/configured/sdf_spr_cmp.json b/tests/expected/configured/sdf_spr_cmp.json new file mode 100644 index 000000000..7a179b175 --- /dev/null +++ b/tests/expected/configured/sdf_spr_cmp.json @@ -0,0 +1,34 @@ +{ + "another_bicycle": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 26, + "y": 22, + "sdf": true + }, + "bear": { + "height": 22, + "pixelRatio": 1, + "width": 22, + "x": 26, + "y": 0, + "sdf": true + }, + "bicycle": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 0, + "y": 26, + "sdf": true + }, + "sub/circle": { + "height": 26, + "pixelRatio": 1, + "width": 26, + "x": 0, + "y": 0, + "sdf": true + } +} diff --git a/tests/expected/configured/sdf_spr_cmp.png b/tests/expected/configured/sdf_spr_cmp.png new file mode 100644 index 0000000000000000000000000000000000000000..0575b9f7d803d2775d1637e87ef2b5623f1cc860 GIT binary patch literal 945 zcmV;i15W&jP)5PcUex#o)GU&xI}KJWqL2jW9~A-@n#rN5AHPV8?$RfOCWMF>@{Yv?bm;T-sd zb~GCA){L-Nr0jsSYtPK{yq%p{$hbg&D}=Z~g!n)rdK%K(02iX&Yv|qK76bH21~j{C z*!8S?F}lYHUk_x2p(qOk&4+M$V?1EUE{8N5H|%a|_t)0w328$TJXz&yfrx1RghVu6 z@QATMJ<`hAjSxBa_txkQOO!Aq12b z?k7l*iR%q^Bo)s~2AMDf6U6{2R;*Pa$17&YNM zA?iv13~O%5m2pC=Ej``C)BpoAa_&FqrIrscgs>V4K*8U-$Cm!0DXT3itZIN;Jm8U; zZ@SkI8HiPm;SOVF`xh#u$uY^!j7gJzU+|16)*RY#*`TaruphO6(V9%p94To$kfwzD z4ugFwz|O`HgJ@-|oFmX;utdty4r+iB8>M#4EJh!3D?o+ZYBn;WT`CmT%vzleATQfV z`rHUKz!K&NneSH9<+L|N31;$PDy40b_Tj$8W0OO0xf7ChD$a#X(y#`2YavOe=@r*r zK0lm)|DWUvzin9=kR~E26r_0aK?@LCyB}PA+$mmTCIAsa1OSyf<}>ps6+vU0wao2a z1%TsoadNTix(JTQ#A<^16y?Q<<@%DXYC0p9%v; z0DSp`jv$pUcI(7N;KgUl9*~Y&vyB&@N3$qrTeaq>efiYq!0wZ*)xP=gsZX+%ky>-+ zdGV=gQPe2udfh|d&8IGoBB5II>G$SSmv@ma^t$8Ar|0nJ({uRq=`;NKJlFX@vN3Um T+6cww00000NkvXXu0mjfF6G3o literal 0 HcmV?d00001 diff --git a/tests/expected/configured/sdf_spr_cmp.png.txt b/tests/expected/configured/sdf_spr_cmp.png.txt new file mode 100644 index 000000000..8f3852018 --- /dev/null +++ b/tests/expected/configured/sdf_spr_cmp.png.txt @@ -0,0 +1 @@ +tests/output/configured/sdf_spr_cmp.png: PNG image data, 48 x 47, 8-bit gray+alpha, non-interlaced diff --git a/tests/expected/configured/sdf_spr_cmp_2.json b/tests/expected/configured/sdf_spr_cmp_2.json new file mode 100644 index 000000000..7da6e3238 --- /dev/null +++ b/tests/expected/configured/sdf_spr_cmp_2.json @@ -0,0 +1,34 @@ +{ + "another_bicycle": { + "height": 36, + "pixelRatio": 2, + "width": 36, + "x": 84, + "y": 0, + "sdf": true + }, + "bear": { + "height": 38, + "pixelRatio": 2, + "width": 38, + "x": 46, + "y": 0, + "sdf": true + }, + "bicycle": { + "height": 36, + "pixelRatio": 2, + "width": 36, + "x": 84, + "y": 36, + "sdf": true + }, + "sub/circle": { + "height": 46, + "pixelRatio": 2, + "width": 46, + "x": 0, + "y": 0, + "sdf": true + } +} diff --git a/tests/expected/configured/sdf_spr_cmp_2.png b/tests/expected/configured/sdf_spr_cmp_2.png new file mode 100644 index 0000000000000000000000000000000000000000..8f370ed6dd5cce870bb272483466b87a21264e78 GIT binary patch literal 1863 zcmV-N2e|l&P)6Q$ zFq+V>3RRW6iYliys?lUDK+bx78IO$245qXNmRMnxHP+c+lP23!Ws?mWtg*@pODvFW zpIG4wU)f6Bx5ZaJv%;s$wV$V6`$gBzseQs=g}TEYha63jL-yIBY1jsx{V3t?vY)+z!Ars)1D&doY?2@v18C#oe|@n;`g;U5pp9by7q(? ze)VaLoYxjvVmUE*%Pg_@QQWVBJ?6|_+ToTy_dF1pJkY1hrLd1VU{5+ro3`Wr;Dv|* zKlv6TZ>MBO*M8$C10tUJfg=~&WW&X6t_W9VCD;qPJPGraSH`?E=2gEu(W66~GmfRR z^lP?+@JPgn2_uFK_)d%Cscv#in_C79b#=s}khgL*`sKI2zgUbbvohFcB8G;Ul`%uZ zzT-kV+eM}wYk8X^({2<$6$Kg+~d-t%asj|;Yvolq<|NvX*3xpVyjqV z`D3^}hbQou{BW;JT>xhIl5=$-~Ed7;X1 zb>puh&BST}rXkysfH?c$O!dj^!vPHr+fjEcL92 zzqs(cERh8^v7jY9z0-!^l4ph*_#-7Z&15Dh{VFz3W&)mQyrpA4$H?u{gZaw6JxMVk zl?BRxW!N|J;Tt7HX5?{l~AfuN)P7P4b$AiXA-5n zk{c{&NnsH^8TEzwl?lekHfBfihWFV;q3g(uTEG>b9&x3B)ksd9mIXd2K6mZ!C4D04 zx^4eIX-4k4V;C}936q;$hCE3#n>cW<67Y>rFPcfra4idT`Nhb7dFIm6(<@^cs@F2X z7yz*eKWF(Sn+FVKVK6@lhE|5{* z>O(^UH{+SaG;caP(*O(=In>WBT?MX|UEz_uiGNT);C^^uSBx?`3tb9SPa0(J?+|Ga zEa~)T30NK+M9jSA1^j?QnQ2pjit9L1-^+a4^wIq?^M?d*Fb|d&&kH!tq6Du%)wciI z-mk3j$?iYV?G7OQ z+Vi+^<@tP#<#f=}X6|7kDCPDifggCCL(p3GOueKRPdsDOQgh0*WWH*Uns)O0eOgjX z3qLJstsR@yxWc-t$+|7$<0Y&o9+p_#dty=4KmWvI(N^0^UX>Gl)G507s%sh0CWRp> zwM?guMg2-G&Brb^{y|gAc*|`^e*Cf7-V#OW*LOjEsoB!vA+tCr=-1+5Q{(@{F! zAicmZ>Yx7x04!)*#y-O==?_EB4_4nLSV-29NF77k(B{5RrL8g7>q*Koj=J!U2 zn5Nt}H`&CL0!?#d19{I(k4a43pUtAi#%~0b}>o!Y`M-AJoH6Ar< zGuC+24SD7okGdg;s`02z3svJ$n-;3Zqc$y6jYn--s2Y#jv`{r3wP`cgc+?Ykh8mCm z0&roCNBx0I*Lc+3q)XR$)Hi6&P~%b0X{mCJM_m(-(ls7+Pc2K=c+`FIP`bvW?#sgp zH6Hce0H{>sQRgk5N;Mw!-o&d^<5BNz+W%Ym_BV#=4rJQV9dQ5v002ovPDHLkV1jL* BqW%B? literal 0 HcmV?d00001 diff --git a/tests/expected/configured/sdf_spr_cmp_2.png.txt b/tests/expected/configured/sdf_spr_cmp_2.png.txt new file mode 100644 index 000000000..803547c0b --- /dev/null +++ b/tests/expected/configured/sdf_spr_cmp_2.png.txt @@ -0,0 +1 @@ +tests/output/configured/sdf_spr_cmp_2.png: PNG image data, 120 x 72, 8-bit gray+alpha, non-interlaced diff --git a/tests/expected/configured/sdf_spr_mysrc.json b/tests/expected/configured/sdf_spr_mysrc.json new file mode 100644 index 000000000..03636083d --- /dev/null +++ b/tests/expected/configured/sdf_spr_mysrc.json @@ -0,0 +1,10 @@ +{ + "bicycle": { + "height": 36, + "pixelRatio": 2, + "width": 36, + "x": 0, + "y": 0, + "sdf": true + } +} diff --git a/tests/expected/configured/sdf_spr_mysrc.png b/tests/expected/configured/sdf_spr_mysrc.png new file mode 100644 index 0000000000000000000000000000000000000000..78f861308997171ea138243ab0f386c11d099fa1 GIT binary patch literal 675 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 literal 0 HcmV?d00001 diff --git a/tests/expected/configured/sdf_spr_src1_.png.txt b/tests/expected/configured/sdf_spr_src1_.png.txt new file mode 100644 index 000000000..b1c908d2d --- /dev/null +++ b/tests/expected/configured/sdf_spr_src1_.png.txt @@ -0,0 +1 @@ +tests/output/configured/sdf_spr_src1_.png: PNG image data, 120 x 46, 8-bit gray+alpha, non-interlaced diff --git a/tests/fixtures/sprites/expected/all_1_sdf.json b/tests/fixtures/sprites/expected/all_1_sdf.json new file mode 100644 index 000000000..7a179b175 --- /dev/null +++ b/tests/fixtures/sprites/expected/all_1_sdf.json @@ -0,0 +1,34 @@ +{ + "another_bicycle": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 26, + "y": 22, + "sdf": true + }, + "bear": { + "height": 22, + "pixelRatio": 1, + "width": 22, + "x": 26, + "y": 0, + "sdf": true + }, + "bicycle": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 0, + "y": 26, + "sdf": true + }, + "sub/circle": { + "height": 26, + "pixelRatio": 1, + "width": 26, + "x": 0, + "y": 0, + "sdf": true + } +} diff --git a/tests/fixtures/sprites/expected/all_1_sdf.png b/tests/fixtures/sprites/expected/all_1_sdf.png new file mode 100644 index 0000000000000000000000000000000000000000..0575b9f7d803d2775d1637e87ef2b5623f1cc860 GIT binary patch literal 945 zcmV;i15W&jP)5PcUex#o)GU&xI}KJWqL2jW9~A-@n#rN5AHPV8?$RfOCWMF>@{Yv?bm;T-sd zb~GCA){L-Nr0jsSYtPK{yq%p{$hbg&D}=Z~g!n)rdK%K(02iX&Yv|qK76bH21~j{C z*!8S?F}lYHUk_x2p(qOk&4+M$V?1EUE{8N5H|%a|_t)0w328$TJXz&yfrx1RghVu6 z@QATMJ<`hAjSxBa_txkQOO!Aq12b z?k7l*iR%q^Bo)s~2AMDf6U6{2R;*Pa$17&YNM zA?iv13~O%5m2pC=Ej``C)BpoAa_&FqrIrscgs>V4K*8U-$Cm!0DXT3itZIN;Jm8U; zZ@SkI8HiPm;SOVF`xh#u$uY^!j7gJzU+|16)*RY#*`TaruphO6(V9%p94To$kfwzD z4ugFwz|O`HgJ@-|oFmX;utdty4r+iB8>M#4EJh!3D?o+ZYBn;WT`CmT%vzleATQfV z`rHUKz!K&NneSH9<+L|N31;$PDy40b_Tj$8W0OO0xf7ChD$a#X(y#`2YavOe=@r*r zK0lm)|DWUvzin9=kR~E26r_0aK?@LCyB}PA+$mmTCIAsa1OSyf<}>ps6+vU0wao2a z1%TsoadNTix(JTQ#A<^16y?Q<<@%DXYC0p9%v; z0DSp`jv$pUcI(7N;KgUl9*~Y&vyB&@N3$qrTeaq>efiYq!0wZ*)xP=gsZX+%ky>-+ zdGV=gQPe2udfh|d&8IGoBB5II>G$SSmv@ma^t$8Ar|0nJ({uRq=`;NKJlFX@vN3Um T+6cww00000NkvXXu0mjfF6G3o literal 0 HcmV?d00001 diff --git a/tests/fixtures/sprites/expected/all_2_sdf.json b/tests/fixtures/sprites/expected/all_2_sdf.json new file mode 100644 index 000000000..7da6e3238 --- /dev/null +++ b/tests/fixtures/sprites/expected/all_2_sdf.json @@ -0,0 +1,34 @@ +{ + "another_bicycle": { + "height": 36, + "pixelRatio": 2, + "width": 36, + "x": 84, + "y": 0, + "sdf": true + }, + "bear": { + "height": 38, + "pixelRatio": 2, + "width": 38, + "x": 46, + "y": 0, + "sdf": true + }, + "bicycle": { + "height": 36, + "pixelRatio": 2, + "width": 36, + "x": 84, + "y": 36, + "sdf": true + }, + "sub/circle": { + "height": 46, + "pixelRatio": 2, + "width": 46, + "x": 0, + "y": 0, + "sdf": true + } +} diff --git a/tests/fixtures/sprites/expected/all_2_sdf.png b/tests/fixtures/sprites/expected/all_2_sdf.png new file mode 100644 index 0000000000000000000000000000000000000000..8f370ed6dd5cce870bb272483466b87a21264e78 GIT binary patch literal 1863 zcmV-N2e|l&P)6Q$ zFq+V>3RRW6iYliys?lUDK+bx78IO$245qXNmRMnxHP+c+lP23!Ws?mWtg*@pODvFW zpIG4wU)f6Bx5ZaJv%;s$wV$V6`$gBzseQs=g}TEYha63jL-yIBY1jsx{V3t?vY)+z!Ars)1D&doY?2@v18C#oe|@n;`g;U5pp9by7q(? ze)VaLoYxjvVmUE*%Pg_@QQWVBJ?6|_+ToTy_dF1pJkY1hrLd1VU{5+ro3`Wr;Dv|* zKlv6TZ>MBO*M8$C10tUJfg=~&WW&X6t_W9VCD;qPJPGraSH`?E=2gEu(W66~GmfRR z^lP?+@JPgn2_uFK_)d%Cscv#in_C79b#=s}khgL*`sKI2zgUbbvohFcB8G;Ul`%uZ zzT-kV+eM}wYk8X^({2<$6$Kg+~d-t%asj|;Yvolq<|NvX*3xpVyjqV z`D3^}hbQou{BW;JT>xhIl5=$-~Ed7;X1 zb>puh&BST}rXkysfH?c$O!dj^!vPHr+fjEcL92 zzqs(cERh8^v7jY9z0-!^l4ph*_#-7Z&15Dh{VFz3W&)mQyrpA4$H?u{gZaw6JxMVk zl?BRxW!N|J;Tt7HX5?{l~AfuN)P7P4b$AiXA-5n zk{c{&NnsH^8TEzwl?lekHfBfihWFV;q3g(uTEG>b9&x3B)ksd9mIXd2K6mZ!C4D04 zx^4eIX-4k4V;C}936q;$hCE3#n>cW<67Y>rFPcfra4idT`Nhb7dFIm6(<@^cs@F2X z7yz*eKWF(Sn+FVKVK6@lhE|5{* z>O(^UH{+SaG;caP(*O(=In>WBT?MX|UEz_uiGNT);C^^uSBx?`3tb9SPa0(J?+|Ga zEa~)T30NK+M9jSA1^j?QnQ2pjit9L1-^+a4^wIq?^M?d*Fb|d&&kH!tq6Du%)wciI z-mk3j$?iYV?G7OQ z+Vi+^<@tP#<#f=}X6|7kDCPDifggCCL(p3GOueKRPdsDOQgh0*WWH*Uns)O0eOgjX z3qLJstsR@yxWc-t$+|7$<0Y&o9+p_#dty=4KmWvI(N^0^UX>Gl)G507s%sh0CWRp> zwM?guMg2-G&Brb^{y|gAc*|`^e*Cf7-V#OW*LOjEsoB!vA+tCr=-1+5Q{(@{F! zAicmZ>Yx7x04!)*#y-O==?_EB4_4nLSV-29NF77k(B{5RrL8g7>q*Koj=J!U2 zn5Nt}H`&CL0!?#d19{I(k4a43pUtAi#%~0b}>o!Y`M-AJoH6Ar< zGuC+24SD7okGdg;s`02z3svJ$n-;3Zqc$y6jYn--s2Y#jv`{r3wP`cgc+?Ykh8mCm z0&roCNBx0I*Lc+3q)XR$)Hi6&P~%b0X{mCJM_m(-(ls7+Pc2K=c+`FIP`bvW?#sgp zH6Hce0H{>sQRgk5N;Mw!-o&d^<5BNz+W%Ym_BV#=4rJQV9dQ5v002ovPDHLkV1jL* BqW%B? literal 0 HcmV?d00001 diff --git a/tests/fixtures/sprites/expected/src1_1_sdf.json b/tests/fixtures/sprites/expected/src1_1_sdf.json new file mode 100644 index 000000000..d90ee2d88 --- /dev/null +++ b/tests/fixtures/sprites/expected/src1_1_sdf.json @@ -0,0 +1,26 @@ +{ + "another_bicycle": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 26, + "y": 22, + "sdf": true + }, + "bear": { + "height": 22, + "pixelRatio": 1, + "width": 22, + "x": 26, + "y": 0, + "sdf": true + }, + "sub/circle": { + "height": 26, + "pixelRatio": 1, + "width": 26, + "x": 0, + "y": 0, + "sdf": true + } +} diff --git a/tests/fixtures/sprites/expected/src1_1_sdf.png b/tests/fixtures/sprites/expected/src1_1_sdf.png new file mode 100644 index 0000000000000000000000000000000000000000..77717779ff2c6b09c4c56116630818ca92081691 GIT binary patch literal 900 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 literal 0 HcmV?d00001 diff --git a/tests/fixtures/sprites/expected/src2_1_sdf.json b/tests/fixtures/sprites/expected/src2_1_sdf.json new file mode 100644 index 000000000..bf3f7792a --- /dev/null +++ b/tests/fixtures/sprites/expected/src2_1_sdf.json @@ -0,0 +1,10 @@ +{ + "bicycle": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 0, + "y": 0, + "sdf": true + } +} diff --git a/tests/fixtures/sprites/expected/src2_1_sdf.png b/tests/fixtures/sprites/expected/src2_1_sdf.png new file mode 100644 index 0000000000000000000000000000000000000000..1fd1735ffda869dcdc0118e255eeb423d6942529 GIT binary patch literal 377 zcmV-<0fzpGP)ZrE5Jg`@la|&JS8!)b6gfaR!8U1}D}<6O#I7TA28zhCEGvZ-A%r*sSIO6C;>{9; zuU+=cB9B54kY62yNh|D*a4b(q~G%_>k-mv2-=3KC$(#DM=qvNyM8?T=8Mx22= zYTx+A#lVZuj(5*_XRw2Nj)t5W)PFM3bG4Zxdxr@Qp0zkLsC}vLgwImX+2H`n(!fbg zQ4Q@Z`pC)VPg-xp`3ns;@u7tqO2M$J#;xtvM%3Qd9=M>fx6Z4f@!zPeM~VKJL``$` z+?HPGvI4y=BtBLkt*h73eOlM}weG5;Prp{7&VN8xSb77CrsN*w!@OcDoR}ySiRiy{az72OBpSV2Dp%xEgTx%F(Cc2%nL7;cCR){o^dXQrY=Y^{rQ(iX2#WBDr^nl{f;3V0@aVJB< zOD~Qg@0o@kbb$Ww69=LyLH5Rj1_mWLd7#U5_W~f^j~$!>EIL46jBZsGdSSl0q180{ zDROg^SmC>XN~1fW-21BXFt-?Ef*Fi#nH}+n3JZgN;_5f|wpg1_8D)kEt!@P+n3T#n zjTDFid=^K~=FLID7CN=S+`<$TVU+d)6-2Cz8=Jit%!`71gp*XX$Xh7E7&kmrW3PPG z_Wgt%PV&v!{Gf`ed3ueqg~FJVTmc-R#4B&FwsRz$qtS-5S7XYAt8EK41}2!JXnELS zW1el%;1~Y#vu8*vgAo9A4jXw&C|b{nf*BU5XnIrtyaSbhdAq?#j~}Q-_*y5FS)!;2 zbpT5k)qqM2fMo8sY6N!P_=-jlyu$$ynj;(FJO&R-hu-+01qH zYXd)+ajE^wKqA;5^!ifz04NAeZ*7I5<9euH2B8IHKUn!cbjgh91#~X` Date: Wed, 23 Oct 2024 02:27:33 +0000 Subject: [PATCH 154/215] chore(deps): Bump thiserror from 1.0.64 to 1.0.65 (#1549) Bumps [thiserror](https://github.com/dtolnay/thiserror) from 1.0.64 to 1.0.65.
Release notes

Sourced from thiserror's releases.

1.0.65

  • Ensure OUT_DIR is left with deterministic contents after build script execution (#325)
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=thiserror&package-manager=cargo&previous-version=1.0.64&new-version=1.0.65)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b15d9d86c..42604b4ba 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4745,18 +4745,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.64" +version = "1.0.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" +checksum = "5d11abd9594d9b38965ef50805c5e469ca9cc6f197f883f717e0269a3057b3d5" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.64" +version = "1.0.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" +checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602" dependencies = [ "proc-macro2", "quote", From 0ba3a16c74ce12a9a3469f134c5022325bb86404 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 23 Oct 2024 02:28:13 +0000 Subject: [PATCH 155/215] chore(deps): Bump anyhow from 1.0.90 to 1.0.91 (#1548) Bumps [anyhow](https://github.com/dtolnay/anyhow) from 1.0.90 to 1.0.91.
Release notes

Sourced from anyhow's releases.

1.0.91

  • Ensure OUT_DIR is left with deterministic contents after build script execution (#388)
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=anyhow&package-manager=cargo&previous-version=1.0.90&new-version=1.0.91)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 42604b4ba..516ab2311 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -343,9 +343,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.90" +version = "1.0.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37bf3594c4c988a53154954629820791dde498571819ae4ca50ca811e060cc95" +checksum = "c042108f3ed77fd83760a5fd79b53be043192bb3b9dba91d8c574c0ada7850c8" [[package]] name = "approx" From 1326157490c6d6141ef16920d407224f4d529b7f Mon Sep 17 00:00:00 2001 From: Sarveshwaar SS <94345639+Saru2003@users.noreply.github.com> Date: Wed, 23 Oct 2024 16:02:30 +0530 Subject: [PATCH 156/215] Validate PgConfig to make sure pool size is non-zero and connection str is set (#1546) fixes #1542 --- martin/src/pg/config.rs | 19 +++++++++++++++++++ martin/src/pg/errors.rs | 3 +++ 2 files changed, 22 insertions(+) diff --git a/martin/src/pg/config.rs b/martin/src/pg/config.rs index 39ad64d9c..b25f5e7ec 100644 --- a/martin/src/pg/config.rs +++ b/martin/src/pg/config.rs @@ -12,6 +12,7 @@ use crate::pg::builder::PgBuilder; use crate::pg::config_function::FuncInfoSources; use crate::pg::config_table::TableInfoSources; use crate::pg::utils::on_slow; +use crate::pg::PgError; use crate::pg::PgResult; use crate::source::TileInfoSources; use crate::utils::{IdResolver, OptBoolObj, OptOneMany}; @@ -94,6 +95,23 @@ pub struct PgCfgPublishFuncs { impl PgConfig { /// Apply defaults to the config, and validate if there is a connection string + pub fn validate(&self) -> PgResult<()> { + if let Some(pool_size) = self.pool_size { + if pool_size < 1 { + return Err(PgError::ConfigError( + "pool_size must be greater than or equal to 1.", + )); + } + } + if self.connection_string.is_none() { + return Err(PgError::ConfigError( + "A connection string must be provided.", + )); + } + + Ok(()) + } + pub fn finalize(&mut self) -> PgResult { let mut res = UnrecognizedValues::new(); if let Some(ref ts) = self.tables { @@ -110,6 +128,7 @@ impl PgConfig { self.auto_publish = OptBoolObj::Bool(true); } + self.validate()?; Ok(res) } diff --git a/martin/src/pg/errors.rs b/martin/src/pg/errors.rs index b8b995ccb..d4220274f 100644 --- a/martin/src/pg/errors.rs +++ b/martin/src/pg/errors.rs @@ -69,4 +69,7 @@ pub enum PgError { #[error(r#"Unable to get tile {2:#} with {:?} params from {1}: {0}"#, query_to_json(.3.as_ref()))] GetTileWithQueryError(#[source] TokioPgError, String, TileCoord, Option), + + #[error("Configuration error: {0}")] + ConfigError(&'static str), } From 278c2f502599c5dcc591ce458f11a61bf58488c1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 23 Oct 2024 06:39:18 -0400 Subject: [PATCH 157/215] chore(deps): Bump tokio from 1.40.0 to 1.41.0 (#1550) Bumps [tokio](https://github.com/tokio-rs/tokio) from 1.40.0 to 1.41.0.
Release notes

Sourced from tokio's releases.

Tokio v1.41.0

1.41.0 (Oct 22th, 2024)

Added

  • metrics: stabilize global_queue_depth (#6854, #6918)
  • net: add conversions for unix SocketAddr (#6868)
  • sync: add watch::Sender::sender_count (#6836)
  • sync: add mpsc::Receiver::blocking_recv_many (#6867)
  • task: stabilize Id apis (#6793, #6891)

Added (unstable)

  • metrics: add H2 Histogram option to improve histogram granularity (#6897)
  • metrics: rename some histogram apis (#6924)
  • runtime: add LocalRuntime (#6808)

Changed

  • runtime: box futures larger than 16k on release mode (#6826)
  • sync: add #[must_use] to Notified (#6828)
  • sync: make watch cooperative (#6846)
  • sync: make broadcast::Receiver cooperative (#6870)
  • task: add task size to tracing instrumentation (#6881)
  • wasm: enable cfg_fs for wasi target (#6822)

Fixed

  • net: fix regression of abstract socket path in unix socket (#6838)

Documented

  • io: recommend OwnedFd with AsyncFd (#6821)
  • io: document cancel safety of AsyncFd methods (#6890)
  • macros: render more comprehensible documentation for join and try_join (#6814, #6841)
  • net: fix swapped examples for TcpSocket::set_nodelay and TcpSocket::nodelay (#6840)
  • sync: document runtime compatibility (#6833)

#6793: tokio-rs/tokio#6793 #6808: tokio-rs/tokio#6808 #6810: tokio-rs/tokio#6810 #6814: tokio-rs/tokio#6814 #6821: tokio-rs/tokio#6821 #6822: tokio-rs/tokio#6822 #6826: tokio-rs/tokio#6826 #6828: tokio-rs/tokio#6828 #6833: tokio-rs/tokio#6833 #6836: tokio-rs/tokio#6836 #6838: tokio-rs/tokio#6838 #6840: tokio-rs/tokio#6840

... (truncated)

Commits
  • 01e04da chore: prepare Tokio v1.41.0 (#6917)
  • 92ccade runtime: fix stability feature flags for docs (#6909)
  • fbfeb9a metrics: rename *_poll_count_* to *_poll_time_* (#6924)
  • da745ff metrics: add H2 Histogram option to improve histogram granularity (#6897)
  • ce1c74f metrics: fix deadlock in injection_queue_depth_multi_thread test (#6916)
  • 28c9a14 metrics: rename injection_queue_depth to global_queue_depth (#6918)
  • 32e0b43 ci: freeze FreeBSD and wasm-unknown-unknown on rustc 1.81 (#6911)
  • 1656d8e sync: add mpsc::Receiver::blocking_recv_many (#6867)
  • c9e998e ci: print the correct sort order of the dictionary on failure (#6905)
  • 512e9de rt: add LocalRuntime (#6808)
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=tokio&package-manager=cargo&previous-version=1.40.0&new-version=1.41.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 516ab2311..ee2609051 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2407,7 +2407,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" dependencies = [ "cfg-if", - "windows-targets 0.52.6", + "windows-targets 0.48.5", ] [[package]] @@ -4880,9 +4880,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.40.0" +version = "1.41.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" +checksum = "145f3413504347a2be84393cc8a7d2fb4d863b375909ea59f2158261aa258bbb" dependencies = [ "backtrace", "bytes", From b7c7a6b3649624cfc3c4e73188e24254062c7be6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 25 Oct 2024 03:05:18 +0000 Subject: [PATCH 158/215] chore(deps): Bump regex from 1.11.0 to 1.11.1 (#1553) Bumps [regex](https://github.com/rust-lang/regex) from 1.11.0 to 1.11.1.
Changelog

Sourced from regex's changelog.

1.11.1 (2024-10-24)

This is a new patch release of regex that fixes compilation on nightly Rust when the unstable pattern crate feature is enabled. Users on nightly Rust without this feature enabled are unaffected.

Bug fixes:

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=regex&package-manager=cargo&previous-version=1.11.0&new-version=1.11.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ee2609051..6eecbcdae 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3597,9 +3597,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.11.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", From d6836e28dd1dfc06dd605cee22f10aeff36a9cb8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 29 Oct 2024 03:08:40 +0000 Subject: [PATCH 159/215] chore(deps): Bump rustls from 0.23.15 to 0.23.16 (#1557) Bumps [rustls](https://github.com/rustls/rustls) from 0.23.15 to 0.23.16.
Commits
  • 276eb74 Bump version to 0.23.16 (#2183)
  • e07bdc9 Don't warn on UserCanceled alerts
  • a5d6350 chore(deps): lock file maintenance
  • 75e5503 builder: expose ConfigBuilder::crypto_provider()
  • aebe2c3 builder: store providers directly into ConfigBuilder
  • 121d813 Avoid feature unification for bogo
  • eb2a1c4 Move from kyber768 to ML-KEM768
  • 6264243 fix(deps): update rust crate asn1 to 0.18
  • 28ec955 ci: loosen lychee-action version
  • f7c9c30 ci: move lychee step before dir mv
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=rustls&package-manager=cargo&previous-version=0.23.15&new-version=0.23.16)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 6 +++--- Cargo.toml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6eecbcdae..ee66f72e3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2407,7 +2407,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" dependencies = [ "cfg-if", - "windows-targets 0.48.5", + "windows-targets 0.52.6", ] [[package]] @@ -3852,9 +3852,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.15" +version = "0.23.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fbb44d7acc4e873d613422379f69f237a1b141928c02f6bc6ccfddddc2d7993" +checksum = "eee87ff5d9b36712a58574e12e9f0ea80f915a5b0ac518d322b24a465617925e" dependencies = [ "aws-lc-rs", "log", diff --git a/Cargo.toml b/Cargo.toml index 0029a0349..5b11bd9c1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -66,7 +66,7 @@ pprof = { version = "0.13", features = ["flamegraph", "criterion"] } pretty_assertions = "1" regex = "1" rstest = "0.23" -rustls = "0.23.15" +rustls = "0.23.16" # ring feature does not require NASM windows executable, but works slower #rustls = { version = "0.23", default-features = false, features = ["logging", "std", "tls12", "ring"] } rustls-native-certs = "0.8" From 8f90404a1de3b617d7a88409922683d70531b8ce Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 Nov 2024 02:39:13 +0000 Subject: [PATCH 160/215] chore(deps): Bump thiserror from 1.0.65 to 1.0.66 (#1562) Bumps [thiserror](https://github.com/dtolnay/thiserror) from 1.0.65 to 1.0.66.
Release notes

Sourced from thiserror's releases.

1.0.66

  • Improve compile error on malformed format attribute (#327)
Commits
  • d1a8254 Release 1.0.66
  • e2e9da3 Merge pull request #328 from dtolnay/peekend
  • 3d79a90 Use peek2(End) instead of fork/advance_to
  • a9a6c98 Merge pull request #329 from dtolnay/up
  • 51a5e4c Raise minimum compiler for test suite to rust 1.70
  • 8fb92ff Resolve uninlined_format_args pedantic clippy lint in build script
  • 0e2bef9 Raise required compiler to rust 1.61
  • bb30f2e Merge pull request #327 from dtolnay/literal
  • 5d3edf9 Improve error on malformed format attribute
  • 003a89f Merge pull request #326 from dtolnay/sealed
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=thiserror&package-manager=cargo&previous-version=1.0.65&new-version=1.0.66)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 78 +++++++++++++++++++++++++++--------------------------- 1 file changed, 39 insertions(+), 39 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ee66f72e3..65658e9d4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -80,7 +80,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn 2.0.80", + "syn 2.0.86", ] [[package]] @@ -198,7 +198,7 @@ dependencies = [ "actix-router", "proc-macro2", "quote", - "syn 2.0.80", + "syn 2.0.86", ] [[package]] @@ -411,7 +411,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.80", + "syn 2.0.86", ] [[package]] @@ -422,7 +422,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.80", + "syn 2.0.86", ] [[package]] @@ -525,7 +525,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.80", + "syn 2.0.86", "which", ] @@ -852,7 +852,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.80", + "syn 2.0.86", ] [[package]] @@ -1113,7 +1113,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edb49164822f3ee45b17acd4a208cfc1251410cf0cad9a833234c9890774dd9f" dependencies = [ "quote", - "syn 2.0.80", + "syn 2.0.86", ] [[package]] @@ -1137,7 +1137,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.80", + "syn 2.0.86", ] [[package]] @@ -1148,7 +1148,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.80", + "syn 2.0.86", ] [[package]] @@ -1221,7 +1221,7 @@ checksum = "8034092389675178f570469e6c3b0465d3d30b4505c294a6550db47f3c17ad18" dependencies = [ "proc-macro2", "quote", - "syn 2.0.80", + "syn 2.0.86", ] [[package]] @@ -1244,7 +1244,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.80", + "syn 2.0.86", ] [[package]] @@ -1341,7 +1341,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.80", + "syn 2.0.86", ] [[package]] @@ -1680,7 +1680,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.80", + "syn 2.0.86", ] [[package]] @@ -2972,7 +2972,7 @@ dependencies = [ "regex", "regex-syntax 0.7.5", "structmeta 0.2.0", - "syn 2.0.80", + "syn 2.0.86", ] [[package]] @@ -2986,7 +2986,7 @@ dependencies = [ "regex", "regex-syntax 0.8.5", "structmeta 0.3.0", - "syn 2.0.80", + "syn 2.0.86", ] [[package]] @@ -3082,7 +3082,7 @@ checksum = "a4502d8515ca9f32f1fb543d987f63d95a14934883db45bdb48060b6b69257f8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.80", + "syn 2.0.86", ] [[package]] @@ -3296,7 +3296,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "904afd36257cdb6ce0bee88b7981847bd7b955e5e216bb32f466b302923ad446" dependencies = [ "proc-macro2", - "syn 2.0.80", + "syn 2.0.86", ] [[package]] @@ -3792,7 +3792,7 @@ dependencies = [ "regex", "relative-path", "rustc_version", - "syn 2.0.80", + "syn 2.0.86", "unicode-ident", ] @@ -4021,7 +4021,7 @@ checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.80", + "syn 2.0.86", ] [[package]] @@ -4044,7 +4044,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.80", + "syn 2.0.86", ] [[package]] @@ -4107,7 +4107,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.80", + "syn 2.0.86", ] [[package]] @@ -4561,7 +4561,7 @@ dependencies = [ "proc-macro2", "quote", "structmeta-derive 0.2.0", - "syn 2.0.80", + "syn 2.0.86", ] [[package]] @@ -4573,7 +4573,7 @@ dependencies = [ "proc-macro2", "quote", "structmeta-derive 0.3.0", - "syn 2.0.80", + "syn 2.0.86", ] [[package]] @@ -4584,7 +4584,7 @@ checksum = "a60bcaff7397072dca0017d1db428e30d5002e00b6847703e2e42005c95fbe00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.80", + "syn 2.0.86", ] [[package]] @@ -4595,7 +4595,7 @@ checksum = "152a0b65a590ff6c3da95cabe2353ee04e6167c896b28e3b14478c2636c922fc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.80", + "syn 2.0.86", ] [[package]] @@ -4662,9 +4662,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.80" +version = "2.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6e185e337f816bc8da115b8afcb3324006ccc82eeaddf35113888d3bd8e44ac" +checksum = "e89275301d38033efb81a6e60e3497e734dfcc62571f2854bf4b16690398824c" dependencies = [ "proc-macro2", "quote", @@ -4745,22 +4745,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.65" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d11abd9594d9b38965ef50805c5e469ca9cc6f197f883f717e0269a3057b3d5" +checksum = "5d171f59dbaa811dbbb1aee1e73db92ec2b122911a48e1390dfe327a821ddede" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.65" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602" +checksum = "b08be0f17bd307950653ce45db00cd31200d82b624b36e181337d9c7d92765b5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.80", + "syn 2.0.86", ] [[package]] @@ -4875,7 +4875,7 @@ checksum = "8d9ef545650e79f30233c0003bcc2504d7efac6dad25fca40744de773fe2049c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.80", + "syn 2.0.86", ] [[package]] @@ -4904,7 +4904,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.80", + "syn 2.0.86", ] [[package]] @@ -5071,7 +5071,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.80", + "syn 2.0.86", ] [[package]] @@ -5359,7 +5359,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.80", + "syn 2.0.86", "wasm-bindgen-shared", ] @@ -5393,7 +5393,7 @@ checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.80", + "syn 2.0.86", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -5744,7 +5744,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.80", + "syn 2.0.86", ] [[package]] @@ -5764,7 +5764,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.80", + "syn 2.0.86", ] [[package]] From eb115fba67c538404ca00cbe2194466815dd2629 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 Nov 2024 04:24:28 +0100 Subject: [PATCH 161/215] chore(deps): Bump insta from 1.40.0 to 1.41.1 (#1563) Bumps [insta](https://github.com/mitsuhiko/insta) from 1.40.0 to 1.41.1.
Release notes

Sourced from insta's releases.

1.41.1

Release Notes

  • Re-release of 1.41.0 to generate release artifacts correctly.

Install cargo-insta 1.41.1

Install prebuilt binaries via shell script

curl --proto '=https' --tlsv1.2 -LsSf
https://github.com/mitsuhiko/insta/releases/download/1.41.1/cargo-insta-installer.sh
| sh

Install prebuilt binaries via powershell script

powershell -c "irm
https://github.com/mitsuhiko/insta/releases/download/1.41.1/cargo-insta-installer.ps1
| iex"

Download cargo-insta 1.41.1

File Platform Checksum
cargo-insta-aarch64-apple-darwin.tar.xz Apple Silicon macOS checksum
cargo-insta-x86_64-apple-darwin.tar.xz Intel macOS checksum
cargo-insta-x86_64-pc-windows-msvc.zip x64 Windows checksum
cargo-insta-x86_64-unknown-linux-gnu.tar.xz x64 Linux checksum
cargo-insta-x86_64-unknown-linux-musl.tar.xz x64 MUSL Linux checksum

1.41.0

  • Experimental support for binary snapshots. #610 (Florian Plattner)

  • --force-update-snapshots now causes cargo-insta to write every snapshot, regardless of whether snapshots fully match, and now implies --accept. This allows for --force-update-snapshots to update inline snapshots' delimiters and indentation.

    For the previous behavior of --force-update-snapshots, which limited writes to snapshots which didn't fully match, use --require-full-match. The main difference between --require-full-match and the existing behavior of --force-update-snapshots is a non-zero exit code on any snapshots which don't fully match.

    Like the previous behavior or --force-update-snapshots, --require-full-match doesn't track inline snapshots' delimiters or indentation, so can't update if those don't match. #644

  • Inline snapshots only use # characters as delimiters when required. #603

  • Warnings for undiscovered snapshots are more robust, and include files with custom snapshot extensions. #637

  • Insta runs correctly on packages which reference rust files in a parent path. #626

  • Warnings are printed when any snapshot uses a legacy format. #599

  • cargo insta --version now prints a version. #665

... (truncated)

Changelog

Sourced from insta's changelog.

1.41.1

  • Re-release of 1.41.1 to generate release artifacts correctly.

1.41.0

  • Experimental support for binary snapshots. #610 (Florian Plattner)

  • --force-update-snapshots now causes cargo-insta to write every snapshot, regardless of whether snapshots fully match, and now implies --accept. This allows for --force-update-snapshots to update inline snapshots' delimiters and indentation.

    For the previous behavior of --force-update-snapshots, which limited writes to snapshots which didn't fully match, use --require-full-match. The main difference between --require-full-match and the existing behavior of --force-update-snapshots is a non-zero exit code on any snapshots which don't fully match.

    Like the previous behavior of --force-update-snapshots, --require-full-match doesn't track inline snapshots' delimiters or indentation, so can't update if those don't match. #644

  • Inline snapshots only use # characters as delimiters when required. #603

  • Warnings for undiscovered snapshots are more robust, and include files with custom snapshot extensions. #637

  • Insta runs correctly on packages which reference rust files in a parent path. #626

  • Warnings are printed when any snapshot uses a legacy format. #599

  • cargo insta --version now prints a version. #665

  • insta now internally uses INSTA_UPDATE=force rather than INSTA_FORCE_UPDATE=1. (This doesn't affect users of cargo-insta, which handles this internally.) #482

  • cargo-insta's integration tests continue to grow over the past couple of versions, and now offer coverage of most of cargo-insta's interface.

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=insta&package-manager=cargo&previous-version=1.40.0&new-version=1.41.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 65658e9d4..7a79a83cd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2183,9 +2183,9 @@ dependencies = [ [[package]] name = "insta" -version = "1.40.0" +version = "1.41.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6593a41c7a73841868772495db7dc1e8ecab43bb5c0b6da2059246c4b506ab60" +checksum = "7e9ffc4d4892617c50a928c52b2961cb5174b6fc6ebf252b2fac9d21955c48b8" dependencies = [ "console", "lazy_static", @@ -2407,7 +2407,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" dependencies = [ "cfg-if", - "windows-targets 0.52.6", + "windows-targets 0.48.5", ] [[package]] From ec98e8ba5a825fa518a65d5c5472c18755495e32 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Nov 2024 02:29:22 +0000 Subject: [PATCH 162/215] chore(deps): Bump anyhow from 1.0.91 to 1.0.92 (#1564) Bumps [anyhow](https://github.com/dtolnay/anyhow) from 1.0.91 to 1.0.92.
Release notes

Sourced from anyhow's releases.

1.0.92

  • Support Rust 1.82's &raw const and &raw mut syntax inside ensure! (#390)
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=anyhow&package-manager=cargo&previous-version=1.0.91&new-version=1.0.92)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7a79a83cd..1f5f4621b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -343,9 +343,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.91" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c042108f3ed77fd83760a5fd79b53be043192bb3b9dba91d8c574c0ada7850c8" +checksum = "74f37166d7d48a0284b99dd824694c26119c700b53bf0d1540cdb147dbdaaf13" [[package]] name = "approx" From 0768a26436eb231d94dc17c0e52d953821921f78 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Nov 2024 02:30:17 +0000 Subject: [PATCH 163/215] chore(deps): Bump thiserror from 1.0.66 to 1.0.67 (#1565) Bumps [thiserror](https://github.com/dtolnay/thiserror) from 1.0.66 to 1.0.67.
Release notes

Sourced from thiserror's releases.

1.0.67

  • Improve expression syntax support inside format arguments (#335, #337, #339, #340)
Commits
  • 925f2dd Release 1.0.67
  • b3bc3e7 Merge pull request #340 from dtolnay/fallbackscan
  • 0ab908a Ignore expected unnecessary_wraps pedantic clippy lint
  • c357f97 Add infallible expr scanner fallback for scanning invalid code
  • 60bc0f2 Merge pull request #339 from dtolnay/fullexpr
  • dabb96f Use syn's real expression parser if it has full syntax support
  • 144b3b6 Remove #[allow] for fixed clippy bug
  • 851f694 Merge pull request #337 from dtolnay/scan
  • 45e18f5 Ignore enum_glob_use pedantic clippy lint
  • 2585669 More robust scanning for fmt argument expressions
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=thiserror&package-manager=cargo&previous-version=1.0.66&new-version=1.0.67)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 78 +++++++++++++++++++++++++++--------------------------- 1 file changed, 39 insertions(+), 39 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1f5f4621b..4fe6d2adb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -80,7 +80,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -198,7 +198,7 @@ dependencies = [ "actix-router", "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -411,7 +411,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -422,7 +422,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -525,7 +525,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.86", + "syn 2.0.87", "which", ] @@ -852,7 +852,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -1113,7 +1113,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edb49164822f3ee45b17acd4a208cfc1251410cf0cad9a833234c9890774dd9f" dependencies = [ "quote", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -1137,7 +1137,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -1148,7 +1148,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -1221,7 +1221,7 @@ checksum = "8034092389675178f570469e6c3b0465d3d30b4505c294a6550db47f3c17ad18" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -1244,7 +1244,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -1341,7 +1341,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -1680,7 +1680,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -2972,7 +2972,7 @@ dependencies = [ "regex", "regex-syntax 0.7.5", "structmeta 0.2.0", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -2986,7 +2986,7 @@ dependencies = [ "regex", "regex-syntax 0.8.5", "structmeta 0.3.0", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -3082,7 +3082,7 @@ checksum = "a4502d8515ca9f32f1fb543d987f63d95a14934883db45bdb48060b6b69257f8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -3296,7 +3296,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "904afd36257cdb6ce0bee88b7981847bd7b955e5e216bb32f466b302923ad446" dependencies = [ "proc-macro2", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -3792,7 +3792,7 @@ dependencies = [ "regex", "relative-path", "rustc_version", - "syn 2.0.86", + "syn 2.0.87", "unicode-ident", ] @@ -4021,7 +4021,7 @@ checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -4044,7 +4044,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -4107,7 +4107,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -4561,7 +4561,7 @@ dependencies = [ "proc-macro2", "quote", "structmeta-derive 0.2.0", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -4573,7 +4573,7 @@ dependencies = [ "proc-macro2", "quote", "structmeta-derive 0.3.0", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -4584,7 +4584,7 @@ checksum = "a60bcaff7397072dca0017d1db428e30d5002e00b6847703e2e42005c95fbe00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -4595,7 +4595,7 @@ checksum = "152a0b65a590ff6c3da95cabe2353ee04e6167c896b28e3b14478c2636c922fc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -4662,9 +4662,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.86" +version = "2.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89275301d38033efb81a6e60e3497e734dfcc62571f2854bf4b16690398824c" +checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" dependencies = [ "proc-macro2", "quote", @@ -4745,22 +4745,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.66" +version = "1.0.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d171f59dbaa811dbbb1aee1e73db92ec2b122911a48e1390dfe327a821ddede" +checksum = "3b3c6efbfc763e64eb85c11c25320f0737cb7364c4b6336db90aa9ebe27a0bbd" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.66" +version = "1.0.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b08be0f17bd307950653ce45db00cd31200d82b624b36e181337d9c7d92765b5" +checksum = "b607164372e89797d78b8e23a6d67d5d1038c1c65efd52e1389ef8b77caba2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -4875,7 +4875,7 @@ checksum = "8d9ef545650e79f30233c0003bcc2504d7efac6dad25fca40744de773fe2049c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -4904,7 +4904,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -5071,7 +5071,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -5359,7 +5359,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", "wasm-bindgen-shared", ] @@ -5393,7 +5393,7 @@ checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -5744,7 +5744,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] @@ -5764,7 +5764,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.86", + "syn 2.0.87", ] [[package]] From c205565a8c49c8197fa6ebed1af61d26957a922d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Nov 2024 02:30:32 +0000 Subject: [PATCH 164/215] chore(deps): Bump serde from 1.0.210 to 1.0.214 (#1566) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [serde](https://github.com/serde-rs/serde) from 1.0.210 to 1.0.214.
Release notes

Sourced from serde's releases.

v1.0.214

  • Implement IntoDeserializer for all Deserializers in serde::de::value module (#2568, thanks @​Mingun)

v1.0.213

  • Fix support for macro-generated with attributes inside a newtype struct (#2847)

v1.0.212

  • Fix hygiene of macro-generated local variable accesses in serde(with) wrappers (#2845)

v1.0.211

  • Improve error reporting about mismatched signature in with and default attributes (#2558, thanks @​Mingun)
  • Show variant aliases in error message when variant deserialization fails (#2566, thanks @​Mingun)
  • Improve binary size of untagged enum and internally tagged enum deserialization by about 12% (#2821)
Commits
  • 4180621 Release 1.0.214
  • 210373b Merge pull request #2568 from Mingun/into_deserializer-for-deserializers
  • 9cda015 Implement IntoDeserializer for all Deserializers in serde::de::value module
  • 58a8d22 Release 1.0.213
  • ef0ed22 Merge pull request #2847 from dtolnay/newtypewith
  • 79925ac Ignore dead_code warning in regression test
  • b60e409 Hygiene for macro-generated newtype struct deserialization with 'with' attr
  • fdc36e5 Add regression test for issue 2846
  • 49e11ce Ignore trivially_copy_pass_by_ref pedantic clippy lint in test
  • 7ae1b5f Release 1.0.212
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=serde&package-manager=cargo&previous-version=1.0.210&new-version=1.0.214)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4fe6d2adb..1883078c8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4006,18 +4006,18 @@ checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" -version = "1.0.210" +version = "1.0.214" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" +checksum = "f55c3193aca71c12ad7890f1785d2b73e1b9f63a0bbc353c08ef26fe03fc56b5" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.210" +version = "1.0.214" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" +checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766" dependencies = [ "proc-macro2", "quote", From 757fa7276773724c1033029750c3ae2faf4c93bd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 5 Nov 2024 02:29:09 +0000 Subject: [PATCH 165/215] chore(deps): Bump thiserror from 1.0.67 to 1.0.68 (#1569) Bumps [thiserror](https://github.com/dtolnay/thiserror) from 1.0.67 to 1.0.68.
Release notes

Sourced from thiserror's releases.

1.0.68

  • Handle incomplete expressions more robustly in format arguments, such as while code is being typed (#341, #344)
Commits
  • 8d06fb5 Release 1.0.68
  • 372fd8a Merge pull request #344 from dtolnay/binop
  • 08f8992 Disregard equality binop in fallback parser
  • d2a823d Merge pull request #343 from dtolnay/unnamed
  • b3bf7a6 Add logic to determine whether unnamed fmt arguments are present
  • 490f9c0 Merge pull request #342 from dtolnay/synfull
  • 7daf1b1 Defer is_syn_full() call until first expression
  • c92ac99 Merge pull request #341 from dtolnay/parsescan
  • 40a53f7 Interleave Expr parsing and scanning better
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=thiserror&package-manager=cargo&previous-version=1.0.67&new-version=1.0.68)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1883078c8..effd44993 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4745,18 +4745,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.67" +version = "1.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3c6efbfc763e64eb85c11c25320f0737cb7364c4b6336db90aa9ebe27a0bbd" +checksum = "02dd99dc800bbb97186339685293e1cc5d9df1f8fae2d0aecd9ff1c77efea892" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.67" +version = "1.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b607164372e89797d78b8e23a6d67d5d1038c1c65efd52e1389ef8b77caba2a6" +checksum = "a7c61ec9a6f64d2793d8a45faba21efbe3ced62a886d44c36a009b2b519b4c7e" dependencies = [ "proc-macro2", "quote", From fafd3427bd88a4005f6094f6e006a124039beccd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 5 Nov 2024 02:30:54 +0000 Subject: [PATCH 166/215] chore(deps): Bump url from 2.5.2 to 2.5.3 (#1568) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [url](https://github.com/servo/rust-url) from 2.5.2 to 2.5.3.
Release notes

Sourced from url's releases.

v2.5.3

What's Changed

New Contributors

Full Changelog: https://github.com/servo/rust-url/compare/v2.5.2...v2.5.3

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=url&package-manager=cargo&previous-version=2.5.2&new-version=2.5.3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 270 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 264 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index effd44993..f24ed76f5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1265,6 +1265,17 @@ dependencies = [ "subtle", ] +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "docker_credential" version = "1.3.1" @@ -2106,6 +2117,124 @@ dependencies = [ "cc", ] +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "ident_case" version = "1.0.1" @@ -2114,12 +2243,23 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "0.5.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +dependencies = [ + "icu_normalizer", + "icu_properties", ] [[package]] @@ -2450,6 +2590,12 @@ version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +[[package]] +name = "litemap" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704" + [[package]] name = "local-channel" version = "0.1.5" @@ -4680,6 +4826,17 @@ dependencies = [ "futures-core", ] +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "tagptr" version = "0.2.0" @@ -4832,6 +4989,16 @@ dependencies = [ "strict-num", ] +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + [[package]] name = "tinytemplate" version = "1.2.1" @@ -5196,9 +5363,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.2" +version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +checksum = "8d157f1b96d14500ffdc1f10ba712e780825526c03d9a49b4d0324b0d9113ada" dependencies = [ "form_urlencoded", "idna", @@ -5273,6 +5440,18 @@ dependencies = [ "tiny-skia-path", ] +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "utf8parse" version = "0.2.2" @@ -5670,6 +5849,18 @@ dependencies = [ "memchr", ] +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + [[package]] name = "wyz" version = "0.5.1" @@ -5726,6 +5917,30 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" +[[package]] +name = "yoke" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", + "synstructure", +] + [[package]] name = "zerocopy" version = "0.7.35" @@ -5747,6 +5962,27 @@ dependencies = [ "syn 2.0.87", ] +[[package]] +name = "zerofrom" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", + "synstructure", +] + [[package]] name = "zeroize" version = "1.8.1" @@ -5767,6 +6003,28 @@ dependencies = [ "syn 2.0.87", ] +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "zopfli" version = "0.8.1" From 21d16856b155ee1bea7666b045c14a97c990d287 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 7 Nov 2024 02:55:10 +0000 Subject: [PATCH 167/215] chore(deps): Bump anyhow from 1.0.92 to 1.0.93 (#1570) Bumps [anyhow](https://github.com/dtolnay/anyhow) from 1.0.92 to 1.0.93.
Release notes

Sourced from anyhow's releases.

1.0.93

  • Update dev-dependencies to thiserror v2
Commits
  • 713bda9 Release 1.0.93
  • f91c247 Merge pull request #391 from dtolnay/thiserror
  • 2a3901c Isolate old rustc version tests from needing anyhow dev-dependencies in lockfile
  • 3ca2cdd Update dev-dependencies to thiserror v2
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=anyhow&package-manager=cargo&previous-version=1.0.92&new-version=1.0.93)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f24ed76f5..f4ba8655c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -343,9 +343,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.92" +version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74f37166d7d48a0284b99dd824694c26119c700b53bf0d1540cdb147dbdaaf13" +checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775" [[package]] name = "approx" From dbd37351eaf5d060ddfbb6b0c20b84f548d58f02 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 8 Nov 2024 02:35:55 +0000 Subject: [PATCH 168/215] chore(deps): Bump tokio from 1.41.0 to 1.41.1 (#1571) Bumps [tokio](https://github.com/tokio-rs/tokio) from 1.41.0 to 1.41.1.
Release notes

Sourced from tokio's releases.

Tokio v1.41.1

1.41.1 (Nov 7th, 2024)

Fixed

  • metrics: fix bug with wrong number of buckets for the histogram (#6957)
  • net: display net requirement for net::UdpSocket in docs (#6938)
  • net: fix typo in TcpStream internal comment (#6944)

#6957: tokio-rs/tokio#6957 #6938: tokio-rs/tokio#6938 #6944: tokio-rs/tokio#6944

Commits
  • bb7ca75 chore: prepare Tokio v1.41.1 (#6959)
  • 4a34b77 metrics: fix bug with wrong number of buckets for the histogram (#6957)
  • 8897885 docs: fix mismatched backticks in CONTRIBUTING.md (#6951)
  • 0dbdd19 ci: update cargo-check-external-types to 0.1.13 (#6949)
  • 94e55c0 net: fix typo in TcpStream internal comment (#6944)
  • 4468f27 metrics: fixed flaky worker_steal_count test (#6932)
  • 070a825 metrics: removed race condition from global_queue_depth_multi_thread test (#6...
  • 946401c net: display net requirement for net::UdpSocket in docs (#6938)
  • 0c01fd2 ci: use patched version of cargo-check-external-types to fix CI failure (#6937)
  • ebe2416 ci: use cargo deny (#6931)
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=tokio&package-manager=cargo&previous-version=1.41.0&new-version=1.41.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f4ba8655c..de1050f7b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5047,9 +5047,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.41.0" +version = "1.41.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "145f3413504347a2be84393cc8a7d2fb4d863b375909ea59f2158261aa258bbb" +checksum = "22cfb5bee7a6a52939ca9224d6ac897bb669134078daa8735560897f69de4d33" dependencies = [ "backtrace", "bytes", From e5a312ecf882314a4e473eac231fca2b17c2a97b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Nov 2024 02:43:52 +0000 Subject: [PATCH 169/215] chore(deps): Bump thiserror from 1.0.68 to 1.0.69 (#1573) Bumps [thiserror](https://github.com/dtolnay/thiserror) from 1.0.68 to 1.0.69.
Release notes

Sourced from thiserror's releases.

1.0.69

  • Backport 2.0.2 fixes
Commits
  • 41938bd Release 1.0.69
  • 9d6506e Merge pull request #382 from dtolnay/hang
  • 591a44d Fix fallback fmt expression parser hang
  • 5b36e37 Add ui test of invalid expression syntax in display attribute
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=thiserror&package-manager=cargo&previous-version=1.0.68&new-version=1.0.69)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index de1050f7b..32b53f055 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4902,18 +4902,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.68" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02dd99dc800bbb97186339685293e1cc5d9df1f8fae2d0aecd9ff1c77efea892" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.68" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7c61ec9a6f64d2793d8a45faba21efbe3ced62a886d44c36a009b2b519b4c7e" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", From 33ccad1b166854a029acd79d93635bb2db693fdb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Nov 2024 03:16:48 +0000 Subject: [PATCH 170/215] chore(deps): Bump testcontainers-modules from 0.11.3 to 0.11.4 (#1575) Bumps [testcontainers-modules](https://github.com/testcontainers/testcontainers-rs-modules-community) from 0.11.3 to 0.11.4.
Release notes

Sourced from testcontainers-modules's releases.

v0.11.4

Features

  • Add Gitea module (#238)

Miscellaneous Tasks

  • Update databend-driver requirement from 0.21.0 to 0.22.2 (#241)
Changelog

Sourced from testcontainers-modules's changelog.

[0.11.4] - 2024-11-12

Features

  • Add Gitea module (#238)

Miscellaneous Tasks

  • Update databend-driver requirement from 0.21.0 to 0.22.2 (#241)
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=testcontainers-modules&package-manager=cargo&previous-version=0.11.3&new-version=0.11.4)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 6 +++--- Cargo.toml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 32b53f055..6c6e2963b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2547,7 +2547,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" dependencies = [ "cfg-if", - "windows-targets 0.48.5", + "windows-targets 0.52.6", ] [[package]] @@ -4893,9 +4893,9 @@ dependencies = [ [[package]] name = "testcontainers-modules" -version = "0.11.3" +version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "708fce58200e480633a428b7356fc39eb7fef02e47bd6faa94ba1d0746e6f17e" +checksum = "064a2677e164cad39ef3c1abddb044d5a25c49d27005804563d8c4227aac8bd0" dependencies = [ "testcontainers", ] diff --git a/Cargo.toml b/Cargo.toml index 5b11bd9c1..fca6d4c8e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -83,7 +83,7 @@ sqlite-hashes = { version = "0.7.6", default-features = false, features = ["md5" sqlx = { version = "0.7", features = ["sqlite", "runtime-tokio"] } static-files = "0.2" subst = { version = "0.3", features = ["yaml"] } -testcontainers-modules = { version = "0.11.3", features = ["postgres"] } +testcontainers-modules = { version = "0.11.4", features = ["postgres"] } thiserror = "1" tile-grid = "0.6" tilejson = "0.4" From 9e043e416f7128b56e5f0069b16819747227eaf9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Nov 2024 03:26:26 +0000 Subject: [PATCH 171/215] chore(deps): Bump serde from 1.0.214 to 1.0.215 (#1576) Bumps [serde](https://github.com/serde-rs/serde) from 1.0.214 to 1.0.215.
Release notes

Sourced from serde's releases.

v1.0.215

  • Produce warning when multiple fields or variants have the same deserialization name (#2855, #2856, #2857)
Commits
  • 8939af4 Release 1.0.215
  • fa5d58c Use ui test syntax that does not interfere with rustfmt
  • 1a3cf4b Update PR 2562 ui tests
  • 7d96352 Merge pull request #2857 from dtolnay/collide
  • 111ecc5 Update ui tests for warning on colliding aliases
  • edd6fe9 Revert "Add checks for conflicts for aliases"
  • a20e924 Revert "pacify clippy"
  • b1353a9 Merge pull request #2856 from dtolnay/dename
  • c59e876 Produce a separate warning for every colliding name
  • 7f1e697 Merge pull request #2855 from dtolnay/namespan
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=serde&package-manager=cargo&previous-version=1.0.214&new-version=1.0.215)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6c6e2963b..0fd9db1de 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4152,18 +4152,18 @@ checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" -version = "1.0.214" +version = "1.0.215" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55c3193aca71c12ad7890f1785d2b73e1b9f63a0bbc353c08ef26fe03fc56b5" +checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.214" +version = "1.0.215" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766" +checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" dependencies = [ "proc-macro2", "quote", From a5b5e087a05728819dc890c18e4626f9847fc0d0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Nov 2024 03:09:38 +0000 Subject: [PATCH 172/215] chore(deps): Bump clap from 4.5.20 to 4.5.21 (#1577) Bumps [clap](https://github.com/clap-rs/clap) from 4.5.20 to 4.5.21.
Release notes

Sourced from clap's releases.

v4.5.21

[4.5.21] - 2024-11-13

Fixes

  • (parser) Ensure defaults are filled in on error with ignore_errors(true)
Changelog

Sourced from clap's changelog.

[4.5.21] - 2024-11-13

Fixes

  • (parser) Ensure defaults are filled in on error with ignore_errors(true)
Commits
  • 03d7226 chore: Release
  • 3df70fb docs: Update changelog
  • 3266c36 Merge pull request #5691 from epage/custom
  • 951762d feat(complete): Allow any OsString-compatible type to be a CompletionCandidate
  • bb6493e feat(complete): Offer - as a path option
  • 27b348d refactor(complete): Simplify ArgValueCandidates code
  • 49b8108 feat(complete): Add PathCompleter
  • 82a360a feat(complete): Add ArgValueCompleter
  • 47aedc6 fix(complete): Ensure paths are sorted
  • 431e2bc test(complete): Ensure ArgValueCandidates get filtered
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=clap&package-manager=cargo&previous-version=4.5.20&new-version=4.5.21)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0fd9db1de..cf7340161 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -823,9 +823,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.20" +version = "4.5.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" +checksum = "fb3b4b9e5a7c7514dfa52869339ee98b3156b0bfb4e8a77c4ff4babb64b1604f" dependencies = [ "clap_builder", "clap_derive", @@ -833,9 +833,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.20" +version = "4.5.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" +checksum = "b17a95aa67cc7b5ebd32aa5370189aa0d79069ef1c64ce893bd30fb24bff20ec" dependencies = [ "anstream", "anstyle", @@ -2547,7 +2547,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" dependencies = [ "cfg-if", - "windows-targets 0.52.6", + "windows-targets 0.48.5", ] [[package]] From d885897b3d8c1053406dd837ef654794ee250333 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 Nov 2024 02:48:20 +0000 Subject: [PATCH 173/215] chore(deps): Bump flate2 from 1.0.34 to 1.0.35 (#1580) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [flate2](https://github.com/rust-lang/flate2-rs) from 1.0.34 to 1.0.35.
Release notes

Sourced from flate2's releases.

1.0.35 - security update to zlib-rs

What's Changed

New Contributors

Full Changelog: https://github.com/rust-lang/flate2-rs/compare/1.0.34...1.0.35

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=flate2&package-manager=cargo&previous-version=1.0.34&new-version=1.0.35)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index cf7340161..4978820d8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1497,9 +1497,9 @@ checksum = "b3ea1ec5f8307826a5b71094dd91fc04d4ae75d5709b20ad351c7fb4815c86ec" [[package]] name = "flate2" -version = "1.0.34" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" +checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" dependencies = [ "crc32fast", "miniz_oxide", From 03c327fec5407766adcb17efd7c66c1cd9bbd77b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 Nov 2024 22:19:49 +0000 Subject: [PATCH 174/215] chore(deps): Bump codecov/codecov-action from 4 to 5 (#1579) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 4 to 5.
Release notes

Sourced from codecov/codecov-action's releases.

v5.0.0

v5 Release

v5 of the Codecov GitHub Action will use the Codecov Wrapper to encapsulate the CLI. This will help ensure that the Action gets updates quicker.

Migration Guide

The v5 release also coincides with the opt-out feature for tokens for public repositories. In the repository settings page in codecov.io, you can set the ability for Codecov to receive a coverage report from ANY souce. This will allow contributors or other members of a repository to upload without needing access to the Codecov token.

[!WARNING]
The following arguments have been changed

  • file (this has been deprecated in favor of files)
  • plugin (this has been deprecated in favor of plugins)

The following arguments have been added:

  • binary
  • gcov_args
  • gcov_executable
  • gcov_ignore
  • gcov_include
  • report_type
  • skip_validation
  • swift_project

You can see their usage in the action.yml file.

What's Changed

... (truncated)

Changelog

Sourced from codecov/codecov-action's changelog.

4.0.0-beta.2

Fixes

  • #1085 not adding -n if empty to do-upload command

4.0.0-beta.1

v4 represents a move from the universal uploader to the Codecov CLI. Although this will unlock new features for our users, the CLI is not yet at feature parity with the universal uploader.

Breaking Changes

  • No current support for aarch64 and alpine architectures.
  • Tokenless uploading is unsuported
  • Various arguments to the Action have been removed

3.1.4

Fixes

  • #967 Fix typo in README.md
  • #971 fix: add back in working dir
  • #969 fix: CLI option names for uploader

Dependencies

  • #970 build(deps-dev): bump @​types/node from 18.15.12 to 18.16.3
  • #979 build(deps-dev): bump @​types/node from 20.1.0 to 20.1.2
  • #981 build(deps-dev): bump @​types/node from 20.1.2 to 20.1.4

3.1.3

Fixes

  • #960 fix: allow for aarch64 build

Dependencies

  • #957 build(deps-dev): bump jest-junit from 15.0.0 to 16.0.0
  • #958 build(deps): bump openpgp from 5.7.0 to 5.8.0
  • #959 build(deps-dev): bump @​types/node from 18.15.10 to 18.15.12

3.1.2

Fixes

  • #718 Update README.md
  • #851 Remove unsupported path_to_write_report argument
  • #898 codeql-analysis.yml
  • #901 Update README to contain correct information - inputs and negate feature
  • #955 fix: add in all the extra arguments for uploader

Dependencies

  • #819 build(deps): bump openpgp from 5.4.0 to 5.5.0
  • #835 build(deps): bump node-fetch from 3.2.4 to 3.2.10
  • #840 build(deps): bump ossf/scorecard-action from 1.1.1 to 2.0.4
  • #841 build(deps): bump @​actions/core from 1.9.1 to 1.10.0
  • #843 build(deps): bump @​actions/github from 5.0.3 to 5.1.1
  • #869 build(deps): bump node-fetch from 3.2.10 to 3.3.0
  • #872 build(deps-dev): bump jest-junit from 13.2.0 to 15.0.0
  • #879 build(deps): bump decode-uri-component from 0.2.0 to 0.2.2

... (truncated)

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=codecov/codecov-action&package-manager=github_actions&previous-version=4&new-version=5)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
--------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Frank Elsinga --- .github/workflows/grcov.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/grcov.yml b/.github/workflows/grcov.yml index 6fe9998ba..0a73b18c9 100644 --- a/.github/workflows/grcov.yml +++ b/.github/workflows/grcov.yml @@ -69,9 +69,9 @@ jobs: uses: actions-rs/grcov@v0.1 - name: Codecov upload - uses: codecov/codecov-action@v4 + uses: codecov/codecov-action@v5 with: - file: ${{ steps.coverage.outputs.report }} + files: ${{ steps.coverage.outputs.report }} env: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} From 321af565bba544f5e656b60ce8ca1e5d14eac571 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 Nov 2024 23:06:31 +0000 Subject: [PATCH 175/215] chore(deps): Bump DavidAnson/markdownlint-cli2-action from 17 to 18 (#1583) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [DavidAnson/markdownlint-cli2-action](https://github.com/davidanson/markdownlint-cli2-action) from 17 to 18.
Release notes

Sourced from DavidAnson/markdownlint-cli2-action's releases.

Update markdownlint version (markdownlint-cli2 v0.15.0, markdownlint v0.36.1).

No release notes provided.

Update markdownlint version (markdownlint-cli2 v0.14.0, markdownlint v0.35.0).

No release notes provided.

Update markdownlint version (markdownlint-cli2 v0.13.0, markdownlint v0.34.0).

No release notes provided.

Update markdownlint version (markdownlint-cli2 v0.12.1, markdownlint v0.33.0).

Update markdownlint version (markdownlint-cli2 v0.11.0, markdownlint v0.32.1), remove deprecated "command" input.

No release notes provided.

Update markdownlint version (markdownlint-cli2 v0.10.0, markdownlint v0.31.1).

No release notes provided.

Update markdownlint version (markdownlint-cli2 v0.9.2, markdownlint v0.30.0).

No release notes provided.

Update markdownlint version (markdownlint-cli2 v0.8.1, markdownlint v0.29.0), add "config" and "fix" inputs, deprecate "command" input.

No release notes provided.

Update markdownlint version (markdownlint-cli2 v0.7.1, markdownlint v0.28.2).

No release notes provided.

Update markdownlint version (markdownlint-cli2 v0.7.0, markdownlint v0.28.1), include link to rule information in title of annotations (clickable in GitHub).

No release notes provided.

Update markdownlint version (markdownlint-cli2 v0.6.0, markdownlint v0.27.0).

No release notes provided.

Update markdownlint version (markdownlint-cli2 v0.5.1, markdownlint v0.26.2).

No release notes provided.

Update markdownlint version (markdownlint-cli2 v0.4.0, markdownlint v0.25.1)

No release notes provided.

Commits
  • eb5ca3a Update to version 18.0.0.
  • bd47e95 Freshen generated index.js file.
  • ad0fecf Bump markdownlint-cli2 from 0.14.0 to 0.15.0
  • 079995c Bump eslint-plugin-n from 17.13.0 to 17.13.1
  • 4163a2f Bump eslint-plugin-n from 17.12.0 to 17.13.0
  • 8b67109 Bump eslint from 9.13.0 to 9.14.0
  • f6d787a Bump @​eslint/js from 9.13.0 to 9.14.0
  • c05e13d Bump @​stylistic/eslint-plugin from 2.10.0 to 2.10.1
  • 6d12e16 Bump eslint-plugin-n from 17.11.1 to 17.12.0
  • 0f558ed Bump @​stylistic/eslint-plugin from 2.9.0 to 2.10.0
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=DavidAnson/markdownlint-cli2-action&package-manager=github_actions&previous-version=17&new-version=18)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build-deploy-docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-deploy-docs.yml b/.github/workflows/build-deploy-docs.yml index 6dd9b377c..e52f8a7ed 100644 --- a/.github/workflows/build-deploy-docs.yml +++ b/.github/workflows/build-deploy-docs.yml @@ -16,7 +16,7 @@ jobs: - uses: Swatinem/rust-cache@v2 - name: 'Validate .md files (use "just fmt-md" to fix)' - uses: DavidAnson/markdownlint-cli2-action@v17 + uses: DavidAnson/markdownlint-cli2-action@v18 with: config: '.github/files/config.markdownlint-cli2.jsonc' From 73a3c54a3e765341fb0f59853194076a548d1f9f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Nov 2024 03:09:30 +0000 Subject: [PATCH 176/215] chore(deps): Bump rustls from 0.23.16 to 0.23.17 (#1589) Bumps [rustls](https://github.com/rustls/rustls) from 0.23.16 to 0.23.17.
Commits
  • 5c5cdcc Prepare 0.23.17
  • 52d7c30 chore(deps): update codecov/codecov-action action to v5
  • 1d0e38c fix(deps): update rust crate zlib-rs to 0.4
  • a9472cf StoresServerSessions: guarantee keys are high entropy
  • 271170c add arm performance results
  • b66efdd lychee: ignore http responses beyond our control
  • af0229b deploy static landing page
  • 42be020 publish performance notes
  • a5b53b3 add landing page, using zola
  • d1c33f8 bench: support threaded bulk tests
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=rustls&package-manager=cargo&previous-version=0.23.16&new-version=0.23.17)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 6 +++--- Cargo.toml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4978820d8..8ac3f61da 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2547,7 +2547,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" dependencies = [ "cfg-if", - "windows-targets 0.48.5", + "windows-targets 0.52.6", ] [[package]] @@ -3998,9 +3998,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.16" +version = "0.23.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eee87ff5d9b36712a58574e12e9f0ea80f915a5b0ac518d322b24a465617925e" +checksum = "7f1a745511c54ba6d4465e8d5dfbd81b45791756de28d4981af70d6dca128f1e" dependencies = [ "aws-lc-rs", "log", diff --git a/Cargo.toml b/Cargo.toml index fca6d4c8e..d2dd41c55 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -66,7 +66,7 @@ pprof = { version = "0.13", features = ["flamegraph", "criterion"] } pretty_assertions = "1" regex = "1" rstest = "0.23" -rustls = "0.23.16" +rustls = "0.23.17" # ring feature does not require NASM windows executable, but works slower #rustls = { version = "0.23", default-features = false, features = ["logging", "std", "tls12", "ring"] } rustls-native-certs = "0.8" From 1fa7ed6dfe3b4ea422a4b2fc90c2ce51f78bb618 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Nov 2024 03:13:24 +0000 Subject: [PATCH 177/215] chore(deps): Bump serde_json from 1.0.132 to 1.0.133 (#1588) Bumps [serde_json](https://github.com/serde-rs/json) from 1.0.132 to 1.0.133.
Release notes

Sourced from serde_json's releases.

v1.0.133

  • Implement From<[T; N]> for serde_json::Value (#1215)
Commits
  • 0903de4 Release 1.0.133
  • 2b65ca0 Merge pull request #1215 from dtolnay/fromarray
  • 4e5f985 Implement From<[T; N]> for Value
  • 2ccb5b6 Disable question_mark clippy lint in lexical test
  • a11f5f2 Resolve unnecessary_map_or clippy lints
  • 07f280a Wrap PR 1213 to 80 columns
  • 75ed447 Merge pull request #1213 from djmitche/safety-comment
  • 73011c0 Add a safety comment to unsafe block
  • be2198a Prevent upload-artifact step from causing CI failure
  • 7cce517 Raise minimum version for preserve_order feature to Rust 1.65
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=serde_json&package-manager=cargo&previous-version=1.0.132&new-version=1.0.133)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8ac3f61da..a1ef886a2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4172,9 +4172,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.132" +version = "1.0.133" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" +checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" dependencies = [ "itoa", "memchr", From 97dce7566fe45d749c3bb11c22e4147ee3c14a22 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 21 Nov 2024 03:01:06 +0000 Subject: [PATCH 178/215] chore(deps): Bump ctor from 0.2.8 to 0.2.9 (#1593) Bumps [ctor](https://github.com/mmastrac/rust-ctor) from 0.2.8 to 0.2.9.
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=ctor&package-manager=cargo&previous-version=0.2.8&new-version=0.2.9)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a1ef886a2..20e94ef7d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1108,9 +1108,9 @@ dependencies = [ [[package]] name = "ctor" -version = "0.2.8" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edb49164822f3ee45b17acd4a208cfc1251410cf0cad9a833234c9890774dd9f" +checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" dependencies = [ "quote", "syn 2.0.87", From 9b13ed9dee314fa8bc9443d267c706127b4449aa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 22 Nov 2024 03:24:44 +0000 Subject: [PATCH 179/215] chore(deps): Bump rustls-native-certs from 0.8.0 to 0.8.1 (#1594) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [rustls-native-certs](https://github.com/rustls/rustls-native-certs) from 0.8.0 to 0.8.1.
Release notes

Sourced from rustls-native-certs's releases.

0.8.1

We are bumping the MSRV to 1.71 across the rustls project to accomodate newer Rust features and dependencies.

What's Changed

Commits
  • 7331138 build(deps): bump schannel in the crates-io group across 1 directory
  • 7afbcda Bump version to 0.8.1
  • 72217dc Upgrade to security-framework 3
  • 6b453de Update semver-compatible dependencies
  • c7a3395 Remove old release history from README
  • 13df7ca Bump MSRV to 1.71
  • 3147a4f build(deps): bump rustls from 0.23.15 to 0.23.16 in the crates-io group
  • c407a37 build(deps): bump rustls from 0.23.14 to 0.23.15 in the crates-io group
  • 79dc22e Use PEM decoding from rustls-pki-types directly
  • c44c331 Tweak Display impl for Error
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=rustls-native-certs&package-manager=cargo&previous-version=0.8.0&new-version=0.8.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 44 +++++++++++++++++++++++++++++++++----------- 1 file changed, 33 insertions(+), 11 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 20e94ef7d..5667fd198 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -955,6 +955,16 @@ dependencies = [ "libc", ] +[[package]] +name = "core-foundation" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" version = "0.8.7" @@ -2053,7 +2063,7 @@ dependencies = [ "hyper 1.5.0", "hyper-util", "rustls", - "rustls-native-certs 0.8.0", + "rustls-native-certs 0.8.1", "rustls-pki-types", "tokio", "tokio-rustls", @@ -2547,7 +2557,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" dependencies = [ "cfg-if", - "windows-targets 0.52.6", + "windows-targets 0.48.5", ] [[package]] @@ -2675,7 +2685,7 @@ dependencies = [ "regex", "rstest", "rustls", - "rustls-native-certs 0.8.0", + "rustls-native-certs 0.8.1", "rustls-pemfile", "semver", "serde", @@ -3813,7 +3823,7 @@ dependencies = [ "pin-project-lite", "quinn", "rustls", - "rustls-native-certs 0.8.0", + "rustls-native-certs 0.8.1", "rustls-pemfile", "rustls-pki-types", "serde", @@ -4022,20 +4032,19 @@ dependencies = [ "rustls-pemfile", "rustls-pki-types", "schannel", - "security-framework", + "security-framework 2.11.1", ] [[package]] name = "rustls-native-certs" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcaf18a4f2be7326cd874a5fa579fae794320a0f388d365dca7e480e55f83f8a" +checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" dependencies = [ "openssl-probe", - "rustls-pemfile", "rustls-pki-types", "schannel", - "security-framework", + "security-framework 3.0.1", ] [[package]] @@ -4128,7 +4137,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ "bitflags 2.6.0", - "core-foundation", + "core-foundation 0.9.4", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1415a607e92bec364ea2cf9264646dcce0f91e6d65281bd6f2819cca3bf39c8" +dependencies = [ + "bitflags 2.6.0", + "core-foundation 0.10.0", "core-foundation-sys", "libc", "security-framework-sys", @@ -5644,7 +5666,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.48.0", ] [[package]] From 81a1423e5a53f1f44ec438013b7dcd82e7703138 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Nov 2024 02:37:35 +0000 Subject: [PATCH 180/215] chore(deps): Bump url from 2.5.3 to 2.5.4 (#1595) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [url](https://github.com/servo/rust-url) from 2.5.3 to 2.5.4.
Release notes

Sourced from url's releases.

v2.5.4

What's Changed

  • Revert "Normalize URL paths: convert /.//p, /..//p, and //p to p (#943)" by @​valenting in servo/rust-url#999
  • Updates the MSRV to 1.63 required though the libc v0.2.164 dependency

Full Changelog: https://github.com/servo/rust-url/compare/v2.5.3...v2.5.4

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=url&package-manager=cargo&previous-version=2.5.3&new-version=2.5.4)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5667fd198..084d10143 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5385,9 +5385,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.3" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d157f1b96d14500ffdc1f10ba712e780825526c03d9a49b4d0324b0d9113ada" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" dependencies = [ "form_urlencoded", "idna", From 588f29c855ef764dc41840a800a4d55d2d6a5c25 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Nov 2024 02:37:48 +0000 Subject: [PATCH 181/215] chore(deps): Bump rustls from 0.23.17 to 0.23.18 (#1596) Bumps [rustls](https://github.com/rustls/rustls) from 0.23.17 to 0.23.18.
Commits
  • 33af2c3 Prepare 0.23.18
  • ffe646d Add reproducer for bug 2227
  • 69b6f74 Record and restore the processed cursor in first_handshake_message
  • 4ef3532 Upgrade to mio 1
  • 092a164 Manage dependencies via the workspace
  • a01bd6b rustls-bench: fix warnings with no features
  • 7d74de2 tests: linearize new test code helper
  • 499d797 fix: do not send session_ticket(35) extension for TLS 1.3
  • faca289 chore(deps): lock file maintenance
  • d12f423 fix(deps): update rust crate asn1 to 0.20
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=rustls&package-manager=cargo&previous-version=0.23.17&new-version=0.23.18)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 8 ++++---- Cargo.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 084d10143..491f4aa01 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2557,7 +2557,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" dependencies = [ "cfg-if", - "windows-targets 0.48.5", + "windows-targets 0.52.6", ] [[package]] @@ -4008,9 +4008,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.17" +version = "0.23.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f1a745511c54ba6d4465e8d5dfbd81b45791756de28d4981af70d6dca128f1e" +checksum = "9c9cc1d47e243d655ace55ed38201c19ae02c148ae56412ab8750e8f0166ab7f" dependencies = [ "aws-lc-rs", "log", @@ -5666,7 +5666,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index d2dd41c55..f0f5e00d7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -66,7 +66,7 @@ pprof = { version = "0.13", features = ["flamegraph", "criterion"] } pretty_assertions = "1" regex = "1" rstest = "0.23" -rustls = "0.23.17" +rustls = "0.23.18" # ring feature does not require NASM windows executable, but works slower #rustls = { version = "0.23", default-features = false, features = ["logging", "std", "tls12", "ring"] } rustls-native-certs = "0.8" From 2cc5175b353d3242b2a0c5447743e991fa00ac69 Mon Sep 17 00:00:00 2001 From: Frank Elsinga Date: Mon, 25 Nov 2024 18:21:11 +0100 Subject: [PATCH 182/215] fix docs typo (#1597) --- docs/src/martin-cp.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/src/martin-cp.md b/docs/src/martin-cp.md index 38660598b..32844952d 100644 --- a/docs/src/martin-cp.md +++ b/docs/src/martin-cp.md @@ -1,8 +1,8 @@ # Generating Tiles in Bulk `martin-cp` is a tool for generating tiles in bulk, from any source(s) supported by Martin, and save retrieved tiles -into a new or an existing MBTiles file. `martin-cp` can be used to generate tiles for a large area or multiple areas ( -bounding boxes). If multiple areas overlap, it will ensure each tile is generated only once. `martin-cp` supports the +into a new or an existing MBTiles file. `martin-cp` can be used to generate tiles for a large area or multiple areas +(bounding boxes). If multiple areas overlap, it will ensure each tile is generated only once. `martin-cp` supports the same configuration file and CLI arguments as Martin server, so it can support all sources and even combining sources. After copying, `martin-cp` will update the `agg_tiles_hash` metadata value unless `--skip-agg-tiles-hash` is specified. From 64e3484c48cc710d069865486259f330ee1ecb5a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 28 Nov 2024 03:08:07 +0000 Subject: [PATCH 183/215] chore(deps): Bump rustls from 0.23.18 to 0.23.19 (#1598) Bumps [rustls](https://github.com/rustls/rustls) from 0.23.18 to 0.23.19.
Commits
  • 4962141 Prepare 0.23.19
  • 82f5fce Prepare 0.23.18
  • 183a099 Add reproducer for bug 2227
  • d6d300d Record and restore the processed cursor in first_handshake_message
  • 970f501 rustls-bench: fix warnings with no features
  • 0fabb84 tests: linearize new test code helper
  • 976c746 fix: do not send session_ticket(35) extension for TLS 1.3
  • 9a46220 fix(deps): update rust crate asn1 to 0.20
  • 9103dc2 Upgrade hickory-resolver to alpha 3
  • fd88639 fix(deps): update rust crate asn1 to 0.19
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=rustls&package-manager=cargo&previous-version=0.23.18&new-version=0.23.19)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 491f4aa01..60a35b121 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4008,9 +4008,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.18" +version = "0.23.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c9cc1d47e243d655ace55ed38201c19ae02c148ae56412ab8750e8f0166ab7f" +checksum = "934b404430bb06b3fae2cba809eb45a1ab1aecd64491213d7c3301b88393f8d1" dependencies = [ "aws-lc-rs", "log", diff --git a/Cargo.toml b/Cargo.toml index f0f5e00d7..85eb687e9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -66,7 +66,7 @@ pprof = { version = "0.13", features = ["flamegraph", "criterion"] } pretty_assertions = "1" regex = "1" rstest = "0.23" -rustls = "0.23.18" +rustls = "0.23.19" # ring feature does not require NASM windows executable, but works slower #rustls = { version = "0.23", default-features = false, features = ["logging", "std", "tls12", "ring"] } rustls-native-certs = "0.8" From 8cf17207238d6a2eae26a5dfed47b71a566514df Mon Sep 17 00:00:00 2001 From: Yuri Astrakhan Date: Thu, 28 Nov 2024 19:52:41 -0500 Subject: [PATCH 184/215] Fix clippy lints 1.83, bump deps (#1599) Co-authored-by: Frank Elsinga --- Cargo.lock | 416 ++++++++++++++++++--------------- martin/src/args/environment.rs | 2 +- martin/src/utils/test_utils.rs | 2 +- 3 files changed, 228 insertions(+), 192 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 60a35b121..310b27dde 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -80,7 +80,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn 2.0.87", + "syn 2.0.89", ] [[package]] @@ -198,7 +198,7 @@ dependencies = [ "actix-router", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.89", ] [[package]] @@ -267,9 +267,9 @@ dependencies = [ [[package]] name = "allocator-api2" -version = "0.2.18" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" +checksum = "45862d1c77f2228b9e10bc609d5bc203d86ebc9b87ad8d5d5167a6c9abf739d9" [[package]] name = "android-tzdata" @@ -294,9 +294,9 @@ checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" [[package]] name = "anstream" -version = "0.6.15" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" dependencies = [ "anstyle", "anstyle-parse", @@ -309,36 +309,36 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.8" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" [[package]] name = "anstyle-parse" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.4" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" +checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" dependencies = [ "anstyle", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -370,9 +370,9 @@ checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] name = "async-compression" -version = "0.4.16" +version = "0.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "103db485efc3e41214fe4fda9f3dbeae2eb9082f48fd236e6095627a9422066e" +checksum = "df895a515f70646414f4b45c0b79082783b80552b373a68283012928df56f522" dependencies = [ "flate2", "futures-core", @@ -411,7 +411,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.89", ] [[package]] @@ -422,7 +422,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.89", ] [[package]] @@ -442,21 +442,20 @@ checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "aws-lc-rs" -version = "1.10.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdd82dba44d209fddb11c190e0a94b78651f95299598e472215667417a03ff1d" +checksum = "f47bb8cc16b669d267eeccf585aea077d0882f4777b1c1f740217885d6e6e5a3" dependencies = [ "aws-lc-sys", - "mirai-annotations", "paste", "zeroize", ] [[package]] name = "aws-lc-sys" -version = "0.22.0" +version = "0.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df7a4168111d7eb622a31b214057b8509c0a7e1794f44c546d742330dc793972" +checksum = "a2101df3813227bbaaaa0b04cd61c534c7954b22bd68d399b440be937dc63ff7" dependencies = [ "bindgen", "cc", @@ -525,7 +524,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.87", + "syn 2.0.89", "which", ] @@ -595,7 +594,7 @@ dependencies = [ "home", "http 1.1.0", "http-body-util", - "hyper 1.5.0", + "hyper 1.5.1", "hyper-named-pipe", "hyper-rustls", "hyper-util", @@ -611,7 +610,7 @@ dependencies = [ "serde_json", "serde_repr", "serde_urlencoded", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-util", "tower-service", @@ -697,9 +696,9 @@ checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytemuck" -version = "1.19.0" +version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8334215b81e418a0a7bdb8ef0849474f40bb10c8b71f1c4ed315cff49f32494d" +checksum = "8b37c88a63ffd85d15b406896cc343916d7cf57838a847b3a6f2ca5d39a5695a" [[package]] name = "byteorder" @@ -709,15 +708,15 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.7.2" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" +checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" [[package]] name = "bytestring" -version = "1.3.1" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d80203ea6b29df88012294f62733de21cfeab47f17b41af3a38bc30a03ee72" +checksum = "e465647ae23b2823b0753f50decb2d5a86d2bb2cac04788fafd1f80e45378e5f" dependencies = [ "bytes", ] @@ -736,9 +735,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.1.31" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" +checksum = "fd9de9f2205d5ef3fd67e685b0df337994ddd4495e2a28d185500d0e1edfea47" dependencies = [ "jobserver", "libc", @@ -760,6 +759,12 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + [[package]] name = "change-detection" version = "1.2.0" @@ -852,14 +857,14 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.89", ] [[package]] name = "clap_lex" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" +checksum = "afb84c814227b90d6895e01398aee0d8033c00e7466aca416fb6a8e0eb19d8a7" [[package]] name = "clap_mangen" @@ -873,9 +878,9 @@ dependencies = [ [[package]] name = "cmake" -version = "0.1.51" +version = "0.1.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb1e43aa7fd152b1f968787f7dbcdeb306d1867ff373c69955211876c053f91a" +checksum = "c682c223677e0e5b6b7f63a64b9351844c3f1b1678a68b7ee617e30fb082620e" dependencies = [ "cc", ] @@ -888,9 +893,9 @@ checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" [[package]] name = "colorchoice" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" [[package]] name = "concurrent-queue" @@ -982,9 +987,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.14" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" +checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" dependencies = [ "libc", ] @@ -1123,7 +1128,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" dependencies = [ "quote", - "syn 2.0.87", + "syn 2.0.89", ] [[package]] @@ -1147,7 +1152,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.87", + "syn 2.0.89", ] [[package]] @@ -1158,7 +1163,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.87", + "syn 2.0.89", ] [[package]] @@ -1231,7 +1236,7 @@ checksum = "8034092389675178f570469e6c3b0465d3d30b4505c294a6550db47f3c17ad18" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.89", ] [[package]] @@ -1254,7 +1259,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.87", + "syn 2.0.89", ] [[package]] @@ -1283,7 +1288,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.89", ] [[package]] @@ -1326,9 +1331,9 @@ checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" [[package]] name = "encoding_rs" -version = "0.8.34" +version = "0.8.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" dependencies = [ "cfg-if", ] @@ -1362,7 +1367,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.89", ] [[package]] @@ -1396,12 +1401,12 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -1462,15 +1467,15 @@ checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" [[package]] name = "fastrand" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" +checksum = "486f806e73c5707928240ddc295403b1b93c96a02038563881c4a2fd84b81ac4" [[package]] name = "fdeflate" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8090f921a24b04994d9929e204f50b498a33ea6ba559ffaa05e04f7ee7fb5ab" +checksum = "07c6f4c64c1d33a3111c4466f7365ebdcc37c5bd1ea0d62aae2e3d722aacbedb" dependencies = [ "simd-adler32", ] @@ -1701,7 +1706,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.89", ] [[package]] @@ -1841,9 +1846,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.0" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" [[package]] name = "hashlink" @@ -2019,9 +2024,9 @@ dependencies = [ [[package]] name = "hyper" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbbff0a806a4728c99295b254c8838933b5b082d75e3cb70c8dab21fdfbcfa9a" +checksum = "97818827ef4f364230e16705d4706e2897df2bb60617d6ca15d598025a3c481f" dependencies = [ "bytes", "futures-channel", @@ -2044,7 +2049,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73b7d8abf35697b81a825e386fc151e0d503e8cb5fcb93cc8669c376dfd6f278" dependencies = [ "hex", - "hyper 1.5.0", + "hyper 1.5.1", "hyper-util", "pin-project-lite", "tokio", @@ -2060,7 +2065,7 @@ checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" dependencies = [ "futures-util", "http 1.1.0", - "hyper 1.5.0", + "hyper 1.5.1", "hyper-util", "rustls", "rustls-native-certs 0.8.1", @@ -2072,16 +2077,16 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41296eb09f183ac68eec06e03cdbea2e759633d4067b2f6552fc2e009bcad08b" +checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" dependencies = [ "bytes", "futures-channel", "futures-util", "http 1.1.0", "http-body 1.0.1", - "hyper 1.5.0", + "hyper 1.5.1", "pin-project-lite", "socket2", "tokio", @@ -2097,7 +2102,7 @@ checksum = "986c5ce3b994526b3cd75578e62554abd09f0899d6206de48b3e96ab34ccc8c7" dependencies = [ "hex", "http-body-util", - "hyper 1.5.0", + "hyper 1.5.1", "hyper-util", "pin-project-lite", "tokio", @@ -2242,7 +2247,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.89", ] [[package]] @@ -2302,7 +2307,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "equivalent", - "hashbrown 0.15.0", + "hashbrown 0.15.2", "rayon", "serde", ] @@ -2397,9 +2402,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.11" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" [[package]] name = "jobserver" @@ -2434,7 +2439,7 @@ dependencies = [ "jsonptr", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -2528,9 +2533,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.161" +version = "0.2.166" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" +checksum = "c2ccc108bbc0b1331bd061864e7cd823c0cab660bbe6970e66e2c0614decde36" [[package]] name = "libdeflate-sys" @@ -2562,9 +2567,9 @@ dependencies = [ [[package]] name = "libm" -version = "0.2.8" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" +checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" [[package]] name = "libredox" @@ -2602,9 +2607,9 @@ checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" [[package]] name = "litemap" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704" +checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" [[package]] name = "local-channel" @@ -2696,7 +2701,7 @@ dependencies = [ "static-files", "subst", "testcontainers-modules", - "thiserror", + "thiserror 1.0.69", "tilejson", "tokio", "tokio-postgres-rustls", @@ -2741,7 +2746,7 @@ dependencies = [ "sqlite-compressions", "sqlite-hashes", "sqlx", - "thiserror", + "thiserror 1.0.69", "tilejson", "tokio", "xxhash-rust", @@ -2841,12 +2846,6 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "mirai-annotations" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9be0862c1b3f26a88803c4a49de6889c10e608b3ee9344e6ef5b45fb37ad3d1" - [[package]] name = "moka" version = "0.12.8" @@ -2866,7 +2865,7 @@ dependencies = [ "rustc_version", "smallvec", "tagptr", - "thiserror", + "thiserror 1.0.69", "triomphe", "uuid", ] @@ -3128,7 +3127,7 @@ dependencies = [ "regex", "regex-syntax 0.7.5", "structmeta 0.2.0", - "syn 2.0.87", + "syn 2.0.89", ] [[package]] @@ -3142,7 +3141,7 @@ dependencies = [ "regex", "regex-syntax 0.8.5", "structmeta 0.3.0", - "syn 2.0.87", + "syn 2.0.89", ] [[package]] @@ -3178,7 +3177,7 @@ dependencies = [ "protobuf-codegen", "protoc-bin-vendored", "sdf_glyph_renderer", - "thiserror", + "thiserror 1.0.69", "tokio", ] @@ -3223,29 +3222,29 @@ checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" [[package]] name = "pin-project" -version = "1.1.6" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf123a161dde1e524adf36f90bc5d8d3462824a9c43553ad07a8183161189ec" +checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.6" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4502d8515ca9f32f1fb543d987f63d95a14934883db45bdb48060b6b69257f8" +checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.89", ] [[package]] name = "pin-project-lite" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" +checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" [[package]] name = "pin-utils" @@ -3321,7 +3320,7 @@ dependencies = [ "reqwest", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", "tilejson", "tokio", "varint-rs", @@ -3423,7 +3422,7 @@ dependencies = [ "smallvec", "symbolic-demangle", "tempfile", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -3447,12 +3446,12 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.23" +version = "0.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "904afd36257cdb6ce0bee88b7981847bd7b955e5e216bb32f466b302923ad446" +checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" dependencies = [ "proc-macro2", - "syn 2.0.87", + "syn 2.0.89", ] [[package]] @@ -3466,9 +3465,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.88" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c3a7fc5db1e57d5a779a352c8cdb57b29aa4c40cc69c3a68a7fedc815fbf2f9" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" dependencies = [ "unicode-ident", ] @@ -3481,7 +3480,7 @@ checksum = "a3a7c64d9bf75b1b8d981124c14c179074e8caa7dfe7b6a12e6222ddcd0c8f72" dependencies = [ "once_cell", "protobuf-support", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -3496,7 +3495,7 @@ dependencies = [ "protobuf-parse", "regex", "tempfile", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -3511,7 +3510,7 @@ dependencies = [ "protobuf", "protobuf-support", "tempfile", - "thiserror", + "thiserror 1.0.69", "which", ] @@ -3521,7 +3520,7 @@ version = "3.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b088fd20b938a875ea00843b6faf48579462630015c3788d397ad6a786663252" dependencies = [ - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -3607,9 +3606,9 @@ dependencies = [ [[package]] name = "quinn" -version = "0.11.5" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c7c5fdde3cdae7203427dc4f0a68fe0ed09833edc525a03456b153b79828684" +checksum = "62e96808277ec6f97351a2380e6c25114bc9e67037775464979f3037c92d05ef" dependencies = [ "bytes", "pin-project-lite", @@ -3618,34 +3617,38 @@ dependencies = [ "rustc-hash 2.0.0", "rustls", "socket2", - "thiserror", + "thiserror 2.0.3", "tokio", "tracing", ] [[package]] name = "quinn-proto" -version = "0.11.8" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fadfaed2cd7f389d0161bb73eeb07b7b78f8691047a6f3e73caaeae55310a4a6" +checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d" dependencies = [ "bytes", + "getrandom", "rand", "ring", "rustc-hash 2.0.0", "rustls", + "rustls-pki-types", "slab", - "thiserror", + "thiserror 2.0.3", "tinyvec", "tracing", + "web-time", ] [[package]] name = "quinn-udp" -version = "0.5.5" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fe68c2e9e1a1234e218683dbdf9f9dfcb094113c5ac2b938dfcb9bab4c4140b" +checksum = "7d5a626c6807713b15cac82a6acaccd6043c9a5408c24baae07611fec3f243da" dependencies = [ + "cfg_aliases", "libc", "once_cell", "socket2", @@ -3765,9 +3768,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", @@ -3800,9 +3803,9 @@ checksum = "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2" [[package]] name = "reqwest" -version = "0.12.8" +version = "0.12.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f713147fbe92361e52392c73b8c9e48c04c6625bce969ef54dc901e58e042a7b" +checksum = "a77c62af46e79de0a562e1a9849205ffcb7fc1238876e9bd743357570e04046f" dependencies = [ "base64 0.22.1", "bytes", @@ -3811,7 +3814,7 @@ dependencies = [ "http 1.1.0", "http-body 1.0.1", "http-body-util", - "hyper 1.5.0", + "hyper 1.5.1", "hyper-rustls", "hyper-util", "ipnet", @@ -3904,9 +3907,9 @@ checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97" [[package]] name = "rsa" -version = "0.9.6" +version = "0.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc" +checksum = "47c75d7c5c6b673e58bf54d8544a9f432e3a925b0e80f7cd3602ab5c50c55519" dependencies = [ "const-oid", "digest", @@ -3948,7 +3951,7 @@ dependencies = [ "regex", "relative-path", "rustc_version", - "syn 2.0.87", + "syn 2.0.89", "unicode-ident", ] @@ -3995,9 +3998,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.37" +version = "0.38.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" +checksum = "d7f649912bc1495e167a6edee79151c84b1bad49748cb4f1f1167f459f6224f6" dependencies = [ "bitflags 2.6.0", "errno", @@ -4061,6 +4064,9 @@ name = "rustls-pki-types" version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" +dependencies = [ + "web-time", +] [[package]] name = "rustls-webpki" @@ -4107,9 +4113,9 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.26" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01227be5826fa0690321a2ba6c5cd57a19cf3f6a09e76973b58e61de6ab9d1c1" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" dependencies = [ "windows-sys 0.59.0", ] @@ -4127,7 +4133,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5ef220f6a4fff0c984e9fb3ab12cb5c86960b5bb6ec3b30dd7173e3bf603d94f" dependencies = [ "freetype-rs", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -4158,9 +4164,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.12.0" +version = "2.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea4a292869320c0272d7bc55a5a6aafaff59b4f63404a003887b679a2e05b4b6" +checksum = "fa39c7303dc58b5543c94d22c1766b0d31f2ee58306363ea622b10bbc075eaa2" dependencies = [ "core-foundation-sys", "libc", @@ -4189,7 +4195,7 @@ checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.89", ] [[package]] @@ -4212,7 +4218,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.89", ] [[package]] @@ -4275,7 +4281,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.89", ] [[package]] @@ -4401,9 +4407,9 @@ checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "socket2" -version = "0.5.7" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" dependencies = [ "libc", "windows-sys 0.52.0", @@ -4442,7 +4448,7 @@ dependencies = [ "sdf_glyph_renderer", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -4523,7 +4529,7 @@ dependencies = [ "sha2", "smallvec", "sqlformat", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-stream", "tracing", @@ -4605,7 +4611,7 @@ dependencies = [ "smallvec", "sqlx-core", "stringprep", - "thiserror", + "thiserror 1.0.69", "tracing", "whoami", ] @@ -4643,7 +4649,7 @@ dependencies = [ "smallvec", "sqlx-core", "stringprep", - "thiserror", + "thiserror 1.0.69", "tracing", "whoami", ] @@ -4729,7 +4735,7 @@ dependencies = [ "proc-macro2", "quote", "structmeta-derive 0.2.0", - "syn 2.0.87", + "syn 2.0.89", ] [[package]] @@ -4741,7 +4747,7 @@ dependencies = [ "proc-macro2", "quote", "structmeta-derive 0.3.0", - "syn 2.0.87", + "syn 2.0.89", ] [[package]] @@ -4752,7 +4758,7 @@ checksum = "a60bcaff7397072dca0017d1db428e30d5002e00b6847703e2e42005c95fbe00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.89", ] [[package]] @@ -4763,7 +4769,7 @@ checksum = "152a0b65a590ff6c3da95cabe2353ee04e6167c896b28e3b14478c2636c922fc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.89", ] [[package]] @@ -4796,9 +4802,9 @@ dependencies = [ [[package]] name = "symbolic-common" -version = "12.12.0" +version = "12.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "366f1b4c6baf6cfefc234bbd4899535fca0b06c74443039a73f6dfb2fad88d77" +checksum = "e5ba5365997a4e375660bed52f5b42766475d5bc8ceb1bb13fea09c469ea0f49" dependencies = [ "debugid", "memmap2 0.9.5", @@ -4808,9 +4814,9 @@ dependencies = [ [[package]] name = "symbolic-demangle" -version = "12.12.0" +version = "12.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aba05ba5b9962ea5617baf556293720a8b2d0a282aa14ee4bf10e22efc7da8c8" +checksum = "beff338b2788519120f38c59ff4bb15174f52a183e547bac3d6072c2c0aa48aa" dependencies = [ "cpp_demangle", "rustc-demangle", @@ -4830,9 +4836,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.87" +version = "2.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" +checksum = "44d46482f1c1c87acd84dea20c1bf5ebff4c757009ed6bf19cfd36fb10e92c4e" dependencies = [ "proc-macro2", "quote", @@ -4841,9 +4847,9 @@ dependencies = [ [[package]] name = "sync_wrapper" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" dependencies = [ "futures-core", ] @@ -4856,7 +4862,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.89", ] [[package]] @@ -4873,9 +4879,9 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tempfile" -version = "3.13.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" +checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" dependencies = [ "cfg-if", "fastrand", @@ -4905,7 +4911,7 @@ dependencies = [ "serde", "serde_json", "serde_with", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-stream", "tokio-tar", @@ -4928,7 +4934,16 @@ version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "thiserror-impl", + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c006c85c7651b3cf2ada4584faa36773bd07bac24acfb39f3c431b36d7e667aa" +dependencies = [ + "thiserror-impl 2.0.3", ] [[package]] @@ -4939,7 +4954,18 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.89", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f077553d607adc1caf65430528a576c757a71ed73944b66ebb58ef2bbd243568" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.89", ] [[package]] @@ -4951,7 +4977,7 @@ dependencies = [ "serde", "serde_json", "serde_tuple", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -5064,7 +5090,7 @@ checksum = "8d9ef545650e79f30233c0003bcc2504d7efac6dad25fca40744de773fe2049c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.89", ] [[package]] @@ -5093,7 +5119,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.89", ] [[package]] @@ -5242,9 +5268,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.40" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ "log", "pin-project-lite", @@ -5254,20 +5280,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.27" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.89", ] [[package]] name = "tracing-core" -version = "0.1.32" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" dependencies = [ "once_cell", ] @@ -5322,9 +5348,9 @@ checksum = "cc2520efa644f8268dce4dcd3050eaa7fc044fca03961e9998ac7e2e92b77cf1" [[package]] name = "unicode-ident" -version = "1.0.13" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" [[package]] name = "unicode-normalization" @@ -5560,7 +5586,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.89", "wasm-bindgen-shared", ] @@ -5594,7 +5620,7 @@ checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.89", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -5615,6 +5641,16 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + [[package]] name = "weezl" version = "0.1.8" @@ -5941,9 +5977,9 @@ checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" [[package]] name = "yoke" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" dependencies = [ "serde", "stable_deref_trait", @@ -5953,13 +5989,13 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.89", "synstructure", ] @@ -5981,27 +6017,27 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.89", ] [[package]] name = "zerofrom" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55" +checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5" +checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.89", "synstructure", ] @@ -6022,7 +6058,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.89", ] [[package]] @@ -6044,7 +6080,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.89", ] [[package]] diff --git a/martin/src/args/environment.rs b/martin/src/args/environment.rs index a370fcbb5..94c07b585 100644 --- a/martin/src/args/environment.rs +++ b/martin/src/args/environment.rs @@ -38,7 +38,7 @@ pub trait Env<'a>: VariableMap<'a> { #[derive(Default)] pub struct OsEnv(RefCell>); -impl<'a> Env<'a> for OsEnv { +impl Env<'_> for OsEnv { fn var_os(&self, key: &str) -> Option { #[allow(unused_qualifications)] std::env::var_os(key) diff --git a/martin/src/utils/test_utils.rs b/martin/src/utils/test_utils.rs index 0722294ba..84e9ca80b 100644 --- a/martin/src/utils/test_utils.rs +++ b/martin/src/utils/test_utils.rs @@ -29,7 +29,7 @@ impl<'a> VariableMap<'a> for FauxEnv { } } -impl<'a> Env<'a> for FauxEnv { +impl Env<'_> for FauxEnv { fn var_os(&self, key: &str) -> Option { self.0.get(key).map(Into::into) } From 7d2229bca42a20ce20626cd1a30752c879aa432d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 4 Dec 2024 02:31:37 +0000 Subject: [PATCH 185/215] chore(deps): Bump anyhow from 1.0.93 to 1.0.94 (#1602) Bumps [anyhow](https://github.com/dtolnay/anyhow) from 1.0.93 to 1.0.94.
Release notes

Sourced from anyhow's releases.

1.0.94

  • Documentation improvements
Commits
  • 8ceb5e9 Release 1.0.94
  • b9009ab Merge pull request #399 from dtolnay/okvalue
  • 863791a Align naming between Ok function argument and its documentation
  • 2081692 Merge pull request #398 from zertosh/ok_doc_format
  • cc2cecb Fix anyhow::Ok rustdoc code formatting
  • 8852dc3 Prevent upload-artifact from causing CI failure
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=anyhow&package-manager=cargo&previous-version=1.0.93&new-version=1.0.94)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 310b27dde..30af791d8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -343,9 +343,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.93" +version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775" +checksum = "c1fd03a028ef38ba2276dce7e33fcd6369c158a1bca17946c4b1b701891c1ff7" [[package]] name = "approx" From 971e4aac9f57327e293b17a5ad55e401fe100b02 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 4 Dec 2024 02:35:36 +0000 Subject: [PATCH 186/215] chore(deps): Bump clap from 4.5.21 to 4.5.22 (#1603) Bumps [clap](https://github.com/clap-rs/clap) from 4.5.21 to 4.5.22.
Release notes

Sourced from clap's releases.

v4.5.22

[4.5.22] - 2024-12-03

Fixes

  • (assert) Catch bugs with arguments requiring themself
Changelog

Sourced from clap's changelog.

[4.5.22] - 2024-12-03

Fixes

  • (assert) Catch bugs with arguments requiring themself
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=clap&package-manager=cargo&previous-version=4.5.21&new-version=4.5.22)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 30af791d8..81e2e2bf6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -828,9 +828,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.21" +version = "4.5.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb3b4b9e5a7c7514dfa52869339ee98b3156b0bfb4e8a77c4ff4babb64b1604f" +checksum = "69371e34337c4c984bbe322360c2547210bf632eb2814bbe78a6e87a2935bd2b" dependencies = [ "clap_builder", "clap_derive", @@ -838,9 +838,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.21" +version = "4.5.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b17a95aa67cc7b5ebd32aa5370189aa0d79069ef1c64ce893bd30fb24bff20ec" +checksum = "6e24c1b4099818523236a8ca881d2b45db98dadfb4625cf6608c12069fcbbde1" dependencies = [ "anstream", "anstyle", @@ -1406,7 +1406,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -2562,7 +2562,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" dependencies = [ "cfg-if", - "windows-targets 0.52.6", + "windows-targets 0.48.5", ] [[package]] @@ -3653,7 +3653,7 @@ dependencies = [ "once_cell", "socket2", "tracing", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -4887,7 +4887,7 @@ dependencies = [ "fastrand", "once_cell", "rustix", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -5702,7 +5702,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.48.0", ] [[package]] From 29ce92456edc44b5d2c71b2ce75c6d46a0babeae Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 6 Dec 2024 02:27:53 +0000 Subject: [PATCH 187/215] chore(deps): Bump clap from 4.5.22 to 4.5.23 (#1606) Bumps [clap](https://github.com/clap-rs/clap) from 4.5.22 to 4.5.23.
Release notes

Sourced from clap's releases.

v4.5.23

[4.5.23] - 2024-12-05

Fixes

  • (parser) When check allow_negative_numbers, allow E again
Changelog

Sourced from clap's changelog.

[4.5.23] - 2024-12-05

Fixes

  • (parser) When check allow_negative_numbers, allow E again
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=clap&package-manager=cargo&previous-version=4.5.22&new-version=4.5.23)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 81e2e2bf6..465098fa3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -828,9 +828,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.22" +version = "4.5.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69371e34337c4c984bbe322360c2547210bf632eb2814bbe78a6e87a2935bd2b" +checksum = "3135e7ec2ef7b10c6ed8950f0f792ed96ee093fa088608f1c76e569722700c84" dependencies = [ "clap_builder", "clap_derive", @@ -838,9 +838,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.22" +version = "4.5.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e24c1b4099818523236a8ca881d2b45db98dadfb4625cf6608c12069fcbbde1" +checksum = "30582fc632330df2bd26877bde0c1f4470d57c582bbc070376afcd04d8cb4838" dependencies = [ "anstream", "anstyle", @@ -862,9 +862,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afb84c814227b90d6895e01398aee0d8033c00e7466aca416fb6a8e0eb19d8a7" +checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" [[package]] name = "clap_mangen" From 30e04427bcc7bfe94a08e2fe89a3009391413df6 Mon Sep 17 00:00:00 2001 From: Frank Elsinga Date: Tue, 10 Dec 2024 23:40:53 +0100 Subject: [PATCH 188/215] chore(deps): bump from `macos-14` to `macos-latest` (#1587) not related to the actual macos CI failour, but we might want to bump the secondary macos test up to `-latest` On the related note: I could not get to the bottom to the actual `macos-13` issue. Would it be possible to just drop it and replace it with `macos-latest`? --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8a6799f33..38c8147b7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -247,7 +247,7 @@ jobs: matrix: include: - target: aarch64-apple-darwin - os: macos-14 # M1 CPU + os: macos-latest # M-series CPU - target: debian-x86_64 os: ubuntu-latest - target: x86_64-apple-darwin From 9331f1c4b9e3aaa1f424d83df3e2c94f8e8c4bfa Mon Sep 17 00:00:00 2001 From: Frank Elsinga Date: Wed, 11 Dec 2024 01:19:54 +0100 Subject: [PATCH 189/215] chore(tests): update `thiserror` to v2 (#1581) This mainly follows https://github.com/dtolnay/thiserror/releases/tag/2.0.0 and should be fairly straightforeward --- Cargo.lock | 17 ++++++++++++++--- Cargo.toml | 2 +- martin/src/file_config.rs | 8 ++++---- martin/src/fonts/mod.rs | 6 +++--- martin/src/pg/errors.rs | 10 +++++----- martin/src/sprites/mod.rs | 16 ++++++++-------- martin/src/utils/error.rs | 6 +++--- mbtiles/src/errors.rs | 8 ++++---- 8 files changed, 42 insertions(+), 31 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 465098fa3..6fdad7e1b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2562,7 +2562,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" dependencies = [ "cfg-if", - "windows-targets 0.48.5", + "windows-targets 0.52.6", ] [[package]] @@ -2701,7 +2701,7 @@ dependencies = [ "static-files", "subst", "testcontainers-modules", - "thiserror 1.0.69", + "thiserror 2.0.3", "tilejson", "tokio", "tokio-postgres-rustls", @@ -2746,7 +2746,7 @@ dependencies = [ "sqlite-compressions", "sqlite-hashes", "sqlx", - "thiserror 1.0.69", + "thiserror 2.0.3", "tilejson", "tokio", "xxhash-rust", @@ -4968,6 +4968,17 @@ dependencies = [ "syn 2.0.89", ] +[[package]] +name = "thiserror-impl" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f077553d607adc1caf65430528a576c757a71ed73944b66ebb58ef2bbd243568" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "tilejson" version = "0.4.1" diff --git a/Cargo.toml b/Cargo.toml index 85eb687e9..96451cdc3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -84,7 +84,7 @@ sqlx = { version = "0.7", features = ["sqlite", "runtime-tokio"] } static-files = "0.2" subst = { version = "0.3", features = ["yaml"] } testcontainers-modules = { version = "0.11.4", features = ["postgres"] } -thiserror = "1" +thiserror = "2" tile-grid = "0.6" tilejson = "0.4" tokio = { version = "1", features = ["macros"] } diff --git a/martin/src/file_config.rs b/martin/src/file_config.rs index 695ef9d01..e222017cc 100644 --- a/martin/src/file_config.rs +++ b/martin/src/file_config.rs @@ -21,19 +21,19 @@ pub type FileResult = Result; #[derive(thiserror::Error, Debug)] pub enum FileError { - #[error("IO error {0}: {}", .1.display())] + #[error("IO error {0}: {1}")] IoError(std::io::Error, PathBuf), - #[error("Source path is not a file: {}", .0.display())] + #[error("Source path is not a file: {0}")] InvalidFilePath(PathBuf), #[error("Error {0} while parsing URL {1}")] InvalidSourceUrl(url::ParseError, String), - #[error("Source {0} uses bad file {}", .1.display())] + #[error("Source {0} uses bad file {1}")] InvalidSourceFilePath(String, PathBuf), - #[error(r"Unable to parse metadata in file {}: {0}", .1.display())] + #[error(r"Unable to parse metadata in file {1}: {0}")] InvalidMetadata(String, PathBuf), #[error(r"Unable to parse metadata in file {1}: {0}")] diff --git a/martin/src/fonts/mod.rs b/martin/src/fonts/mod.rs index fb04a60c1..7ab657844 100644 --- a/martin/src/fonts/mod.rs +++ b/martin/src/fonts/mod.rs @@ -52,13 +52,13 @@ pub enum FontError { #[error(transparent)] FreeType(#[from] pbf_font_tools::freetype::Error), - #[error("IO error accessing {}: {0}", .1.display())] + #[error("IO error accessing {1}: {0}")] IoError(std::io::Error, PathBuf), - #[error("Invalid font file {}", .0.display())] + #[error("Invalid font file {0}")] InvalidFontFilePath(PathBuf), - #[error("No font files found in {}", .0.display())] + #[error("No font files found in {0}")] NoFontFilesFound(PathBuf), #[error("Font {0} is missing a family name")] diff --git a/martin/src/pg/errors.rs b/martin/src/pg/errors.rs index d4220274f..9df1e38bc 100644 --- a/martin/src/pg/errors.rs +++ b/martin/src/pg/errors.rs @@ -16,16 +16,16 @@ pub enum PgError { #[error("Cannot load platform root certificates: {0:?}")] CannotLoadRoots(Vec), - #[error("Cannot open certificate file {}: {0}", .1.display())] + #[error("Cannot open certificate file {1}: {0}")] CannotOpenCert(#[source] io::Error, PathBuf), - #[error("Cannot parse certificate file {}: {0}", .1.display())] + #[error("Cannot parse certificate file {1}: {0}")] CannotParseCert(#[source] io::Error, PathBuf), - #[error("Unable to parse PEM RSA key file {}", .0.display())] + #[error("Unable to parse PEM RSA key file {0}")] InvalidPrivateKey(PathBuf), - #[error("Unable to use client certificate pair {} / {}: {0}", .1.display(), .2.display())] + #[error("Unable to use client certificate pair {1} / {2}: {0}")] CannotUseClientKey(#[source] rustls::Error, PathBuf, PathBuf), #[error(transparent)] @@ -67,7 +67,7 @@ pub enum PgError { #[error(r#"Unable to get tile {2:#} from {1}: {0}"#)] GetTileError(#[source] TokioPgError, String, TileCoord), - #[error(r#"Unable to get tile {2:#} with {:?} params from {1}: {0}"#, query_to_json(.3.as_ref()))] + #[error(r#"Unable to get tile {2:#} with {json_query:?} params from {1}: {0}"#, json_query=query_to_json(.3.as_ref()))] GetTileWithQueryError(#[source] TokioPgError, String, TileCoord, Option), #[error("Configuration error: {0}")] diff --git a/martin/src/sprites/mod.rs b/martin/src/sprites/mod.rs index 033f9631f..7817518b6 100644 --- a/martin/src/sprites/mod.rs +++ b/martin/src/sprites/mod.rs @@ -23,31 +23,31 @@ pub enum SpriteError { #[error("Sprite {0} not found")] SpriteNotFound(String), - #[error("IO error {0}: {}", .1.display())] + #[error("IO error {0}: {1}")] IoError(std::io::Error, PathBuf), - #[error("Sprite path is not a file: {}", .0.display())] + #[error("Sprite path is not a file: {0}")] InvalidFilePath(PathBuf), - #[error("Sprite {0} uses bad file {}", .1.display())] + #[error("Sprite {0} uses bad file {1}")] InvalidSpriteFilePath(String, PathBuf), - #[error("No sprite files found in {}", .0.display())] + #[error("No sprite files found in {0}")] NoSpriteFilesFound(PathBuf), - #[error("Sprite {} could not be loaded", .0.display())] + #[error("Sprite {0} could not be loaded")] UnableToReadSprite(PathBuf), - #[error("{0} in file {}", .1.display())] + #[error("{0} in file {1}")] SpriteProcessingError(SpreetError, PathBuf), - #[error("{0} in file {}", .1.display())] + #[error("{0} in file {1}")] SpriteParsingError(ResvgError, PathBuf), #[error("Unable to generate spritesheet")] UnableToGenerateSpritesheet, - #[error("Unable to create a sprite from file {}", .0.display())] + #[error("Unable to create a sprite from file {0}")] SpriteInstError(PathBuf), } diff --git a/martin/src/utils/error.rs b/martin/src/utils/error.rs index d59eef77c..b061daaa1 100644 --- a/martin/src/utils/error.rs +++ b/martin/src/utils/error.rs @@ -37,13 +37,13 @@ pub enum MartinError { #[error("Base path must be a valid URL path, and must begin with a '/' symbol, but is '{0}'")] BasePathError(String), - #[error("Unable to load config file {}: {0}", .1.display())] + #[error("Unable to load config file {1}: {0}")] ConfigLoadError(io::Error, PathBuf), - #[error("Unable to parse config file {}: {0}", .1.display())] + #[error("Unable to parse config file {1}: {0}")] ConfigParseError(subst::yaml::Error, PathBuf), - #[error("Unable to write config file {}: {0}", .1.display())] + #[error("Unable to write config file {1}: {0}")] ConfigWriteError(io::Error, PathBuf), #[error("No tile sources found. Set sources by giving a database connection string on command line, env variable, or a config file.")] diff --git a/mbtiles/src/errors.rs b/mbtiles/src/errors.rs index 07b30fe38..768357f81 100644 --- a/mbtiles/src/errors.rs +++ b/mbtiles/src/errors.rs @@ -7,10 +7,10 @@ use crate::{MbtType, AGG_TILES_HASH, AGG_TILES_HASH_AFTER_APPLY, AGG_TILES_HASH_ #[derive(thiserror::Error, Debug)] pub enum MbtError { - #[error("The source and destination MBTiles files are the same: {}", .0.display())] + #[error("The source and destination MBTiles files are the same: {0}")] SameSourceAndDestination(PathBuf), - #[error("The diff file and source or destination MBTiles files are the same: {}", .0.display())] + #[error("The diff file and source or destination MBTiles files are the same: {0}")] SameDiffAndSourceOrDestination(PathBuf), #[error(transparent)] @@ -22,7 +22,7 @@ pub enum MbtError { #[error(transparent)] JsonSerdeError(#[from] serde_json::Error), - #[error("MBTile filepath contains unsupported characters: {}", .0.display())] + #[error("MBTile filepath contains unsupported characters: {0}")] UnsupportedCharsInFilepath(PathBuf), #[error("Inconsistent tile formats detected: {0} vs {1}")] @@ -72,7 +72,7 @@ pub enum MbtError { #[error("The MBTiles file {0} has data of type {1}, but the desired type was set to {2}")] MismatchedTargetType(PathBuf, MbtType, MbtType), - #[error("Unless --on-duplicate (override|ignore|abort) is set, writing tiles to an existing non-empty MBTiles file is disabled. Either set --on-duplicate flag, or delete {}", .0.display())] + #[error("Unless --on-duplicate (override|ignore|abort) is set, writing tiles to an existing non-empty MBTiles file is disabled. Either set --on-duplicate flag, or delete {0}")] DestinationFileExists(PathBuf), #[error("Invalid zoom value {0}={1}, expecting an integer between 0..{MAX_ZOOM}")] From 71e6e68a598755a72a9e219eee686b2d5613e481 Mon Sep 17 00:00:00 2001 From: Frank Elsinga Date: Wed, 11 Dec 2024 02:28:29 +0100 Subject: [PATCH 190/215] docs: fix security policy linking and add citations (#1600) Github currently does not recognise the security policy => lets rename said file to something that I know works. ![image](https://github.com/user-attachments/assets/2d4180a6-3f68-455c-8ce0-6088c4ac25f9) This PR also adds a citation badge, which might be nice (we can drop said commit if you don't like it) --- CITATION.cff | 23 +++++++++++++++++++++++ SECURITY.md | 4 ++++ SECURITY_POLICY.txt | 2 -- 3 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 CITATION.cff create mode 100644 SECURITY.md delete mode 100644 SECURITY_POLICY.txt diff --git a/CITATION.cff b/CITATION.cff new file mode 100644 index 000000000..65e82744e --- /dev/null +++ b/CITATION.cff @@ -0,0 +1,23 @@ + +# Parser settings. +cff-version: 1.2.0 +message: Please cite this crate using these information. + +# Version information. +date-released: 2024-11-29 +version: 4.5.21 + +# Project information. +abstract: Vector Tiles from Large Databases on the Fly +authors: + - alias: nyurik + family-names: Astrakhan + given-names: Yuri + - name: The maplibre Community +license: + - MIT + - Apache-2.0 +repository-artifact: https://martin.maplibre.org +repository-code: https://github.com/maplibre/martin +title: Martin +url: https://martin.maplibre.org diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 000000000..0d0285fb5 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,4 @@ +# Security Policy + +For an up-to-date policy refer to + diff --git a/SECURITY_POLICY.txt b/SECURITY_POLICY.txt deleted file mode 100644 index f7e43c586..000000000 --- a/SECURITY_POLICY.txt +++ /dev/null @@ -1,2 +0,0 @@ -For an up-to-date policy refer to -https://github.com/maplibre/maplibre/blob/main/SECURITY_POLICY.txt From 9a36d442b6135faa5a7b7f48da2a804e9c297783 Mon Sep 17 00:00:00 2001 From: Frank Elsinga Date: Fri, 13 Dec 2024 14:31:07 +0100 Subject: [PATCH 191/215] fix build issue due to a broken lockfile (#1609) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sorry for this PR. During merging https://github.com/maplibre/martin/pull/1581/#issuecomment-2533334497, I made a mistake in githubs UI and the lockfile did not get updated properly. This rectifies the issue. Sorry for the additional effort required 😓 This PR also reverts https://github.com/maplibre/martin/pull/1599#discussion_r1862777989 --- Cargo.lock | 29 +++++++++-------------------- martin/src/pg/utils.rs | 1 + 2 files changed, 10 insertions(+), 20 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6fdad7e1b..222c2624e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2701,7 +2701,7 @@ dependencies = [ "static-files", "subst", "testcontainers-modules", - "thiserror 2.0.3", + "thiserror 2.0.6", "tilejson", "tokio", "tokio-postgres-rustls", @@ -2746,7 +2746,7 @@ dependencies = [ "sqlite-compressions", "sqlite-hashes", "sqlx", - "thiserror 2.0.3", + "thiserror 2.0.6", "tilejson", "tokio", "xxhash-rust", @@ -3617,7 +3617,7 @@ dependencies = [ "rustc-hash 2.0.0", "rustls", "socket2", - "thiserror 2.0.3", + "thiserror 2.0.6", "tokio", "tracing", ] @@ -3636,7 +3636,7 @@ dependencies = [ "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.3", + "thiserror 2.0.6", "tinyvec", "tracing", "web-time", @@ -4939,11 +4939,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.3" +version = "2.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c006c85c7651b3cf2ada4584faa36773bd07bac24acfb39f3c431b36d7e667aa" +checksum = "8fec2a1820ebd077e2b90c4df007bebf344cd394098a13c563957d0afc83ea47" dependencies = [ - "thiserror-impl 2.0.3", + "thiserror-impl 2.0.6", ] [[package]] @@ -4959,26 +4959,15 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.3" +version = "2.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f077553d607adc1caf65430528a576c757a71ed73944b66ebb58ef2bbd243568" +checksum = "d65750cab40f4ff1929fb1ba509e9914eb756131cef4210da8d5d700d26f6312" dependencies = [ "proc-macro2", "quote", "syn 2.0.89", ] -[[package]] -name = "thiserror-impl" -version = "2.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f077553d607adc1caf65430528a576c757a71ed73944b66ebb58ef2bbd243568" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.87", -] - [[package]] name = "tilejson" version = "0.4.1" diff --git a/martin/src/pg/utils.rs b/martin/src/pg/utils.rs index 8f8a12fb1..fa73eb3df 100755 --- a/martin/src/pg/utils.rs +++ b/martin/src/pg/utils.rs @@ -13,6 +13,7 @@ use tokio::time::timeout; use crate::source::UrlQuery; #[cfg(test)] +#[expect(clippy::ref_option)] pub fn sorted_opt_set( value: &Option>, serializer: S, From 6b3da490d12b65053806352fe8e9583ff93ff0d2 Mon Sep 17 00:00:00 2001 From: Frank Elsinga Date: Fri, 13 Dec 2024 21:02:27 +0100 Subject: [PATCH 192/215] unified the types to be based on `TileInfoSource` (#1611) This PR pulls the changes to `Box` vs `TileInfoSource` from - #1585 --- martin/src/file_config.rs | 6 +++--- martin/src/mbtiles/mod.rs | 8 ++++---- martin/src/pg/pg_source.rs | 4 ++-- martin/src/pmtiles/mod.rs | 8 ++++---- martin/src/source.rs | 6 +++--- martin/src/srv/server.rs | 4 ++-- 6 files changed, 18 insertions(+), 18 deletions(-) diff --git a/martin/src/file_config.rs b/martin/src/file_config.rs index e222017cc..c9d9f052b 100644 --- a/martin/src/file_config.rs +++ b/martin/src/file_config.rs @@ -12,7 +12,7 @@ use crate::config::{copy_unrecognized_config, UnrecognizedValues}; use crate::file_config::FileError::{ InvalidFilePath, InvalidSourceFilePath, InvalidSourceUrl, IoError, }; -use crate::source::{Source, TileInfoSources}; +use crate::source::{TileInfoSource, TileInfoSources}; use crate::utils::{IdResolver, OptMainCache, OptOneMany}; use crate::MartinResult; use crate::OptOneMany::{Many, One}; @@ -70,13 +70,13 @@ pub trait SourceConfigExtras: ConfigExtras { &self, id: String, path: PathBuf, - ) -> impl std::future::Future>> + Send; + ) -> impl std::future::Future> + Send; fn new_sources_url( &self, id: String, url: Url, - ) -> impl std::future::Future>> + Send; + ) -> impl std::future::Future> + Send; } #[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)] diff --git a/martin/src/mbtiles/mod.rs b/martin/src/mbtiles/mod.rs index 2488098a0..31e6768d8 100644 --- a/martin/src/mbtiles/mod.rs +++ b/martin/src/mbtiles/mod.rs @@ -14,7 +14,7 @@ use url::Url; use crate::config::UnrecognizedValues; use crate::file_config::FileError::{AcquireConnError, InvalidMetadata, IoError}; use crate::file_config::{ConfigExtras, FileResult, SourceConfigExtras}; -use crate::source::{TileData, UrlQuery}; +use crate::source::{TileData, TileInfoSource, UrlQuery}; use crate::{MartinResult, Source}; #[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)] @@ -30,14 +30,14 @@ impl ConfigExtras for MbtConfig { } impl SourceConfigExtras for MbtConfig { - async fn new_sources(&self, id: String, path: PathBuf) -> FileResult> { + async fn new_sources(&self, id: String, path: PathBuf) -> FileResult { Ok(Box::new(MbtSource::new(id, path).await?)) } // TODO: Remove #[allow] after switching to Rust/Clippy v1.78+ in CI // See https://github.com/rust-lang/rust-clippy/pull/12323 #[allow(clippy::no_effect_underscore_binding)] - async fn new_sources_url(&self, _id: String, _url: Url) -> FileResult> { + async fn new_sources_url(&self, _id: String, _url: Url) -> FileResult { unreachable!() } } @@ -96,7 +96,7 @@ impl Source for MbtSource { self.tile_info } - fn clone_source(&self) -> Box { + fn clone_source(&self) -> TileInfoSource { Box::new(self.clone()) } diff --git a/martin/src/pg/pg_source.rs b/martin/src/pg/pg_source.rs index 8f1b34712..bfc989788 100644 --- a/martin/src/pg/pg_source.rs +++ b/martin/src/pg/pg_source.rs @@ -9,7 +9,7 @@ use tilejson::TileJSON; use crate::pg::pool::PgPool; use crate::pg::utils::query_to_json; use crate::pg::PgError::{GetTileError, GetTileWithQueryError, PrepareQueryError}; -use crate::source::{Source, TileData, UrlQuery}; +use crate::source::{Source, TileData, TileInfoSource, UrlQuery}; use crate::MartinResult; #[derive(Clone, Debug)] @@ -46,7 +46,7 @@ impl Source for PgSource { TileInfo::new(Mvt, Uncompressed) } - fn clone_source(&self) -> Box { + fn clone_source(&self) -> TileInfoSource { Box::new(self.clone()) } diff --git a/martin/src/pmtiles/mod.rs b/martin/src/pmtiles/mod.rs index c24b823b7..159b33b32 100644 --- a/martin/src/pmtiles/mod.rs +++ b/martin/src/pmtiles/mod.rs @@ -20,7 +20,7 @@ use url::Url; use crate::config::UnrecognizedValues; use crate::file_config::FileError::{InvalidMetadata, InvalidUrlMetadata, IoError}; use crate::file_config::{ConfigExtras, FileError, FileResult, SourceConfigExtras}; -use crate::source::UrlQuery; +use crate::source::{TileInfoSource, UrlQuery}; use crate::utils::cache::get_cached_value; use crate::utils::{CacheKey, CacheValue, OptMainCache}; use crate::{MartinResult, Source, TileData}; @@ -134,13 +134,13 @@ impl SourceConfigExtras for PmtConfig { true } - async fn new_sources(&self, id: String, path: PathBuf) -> FileResult> { + async fn new_sources(&self, id: String, path: PathBuf) -> FileResult { Ok(Box::new( PmtFileSource::new(self.new_cached_source(), id, path).await?, )) } - async fn new_sources_url(&self, id: String, url: Url) -> FileResult> { + async fn new_sources_url(&self, id: String, url: Url) -> FileResult { Ok(Box::new( PmtHttpSource::new( self.client.clone().unwrap(), @@ -250,7 +250,7 @@ macro_rules! impl_pmtiles_source { self.tile_info } - fn clone_source(&self) -> Box { + fn clone_source(&self) -> TileInfoSource { Box::new(self.clone()) } diff --git a/martin/src/source.rs b/martin/src/source.rs index 879fa4592..d95f2fd51 100644 --- a/martin/src/source.rs +++ b/martin/src/source.rs @@ -18,7 +18,7 @@ pub type TileInfoSource = Box; pub type TileInfoSources = Vec; #[derive(Default, Clone)] -pub struct TileSources(HashMap>); +pub struct TileSources(HashMap); pub type TileCatalog = BTreeMap; impl TileSources { @@ -107,7 +107,7 @@ pub trait Source: Send + Debug { fn get_tile_info(&self) -> TileInfo; - fn clone_source(&self) -> Box; + fn clone_source(&self) -> TileInfoSource; fn support_url_query(&self) -> bool { false @@ -139,7 +139,7 @@ pub trait Source: Send + Debug { } } -impl Clone for Box { +impl Clone for TileInfoSource { fn clone(&self) -> Self { self.clone_source() } diff --git a/martin/src/srv/server.rs b/martin/src/srv/server.rs index 75af0e6b2..a33d39a4f 100755 --- a/martin/src/srv/server.rs +++ b/martin/src/srv/server.rs @@ -201,7 +201,7 @@ pub mod tests { use tilejson::TileJSON; use super::*; - use crate::source::{Source, TileData}; + use crate::source::{Source, TileData, TileInfoSource}; use crate::UrlQuery; #[derive(Debug, Clone)] @@ -225,7 +225,7 @@ pub mod tests { TileInfo::new(Format::Mvt, Encoding::Uncompressed) } - fn clone_source(&self) -> Box { + fn clone_source(&self) -> TileInfoSource { unimplemented!() } From 12e51675cd25f3f93b855abd2e40b7d2b16c89ee Mon Sep 17 00:00:00 2001 From: Frank Elsinga Date: Fri, 13 Dec 2024 22:51:35 +0100 Subject: [PATCH 193/215] chore(tests): re-blessed all tests (#1582) insta currently produces this (quite annoying) warning: ![image](https://github.com/user-attachments/assets/253af8dd-c3f0-47e9-9812-8df377c8af47) => this PR re-blesses all files to get rid of it --- martin/src/bin/martin-cp.rs | 35 ++---- martin/src/pg/builder.rs | 152 +++++++++++------------- martin/tests/mb_server_test.rs | 10 +- martin/tests/pg_function_source_test.rs | 10 +- martin/tests/pg_server_test.rs | 26 ++-- martin/tests/pg_table_source_test.rs | 16 +-- martin/tests/pmt_server_test.rs | 10 +- mbtiles/src/summary.rs | 10 +- 8 files changed, 112 insertions(+), 157 deletions(-) diff --git a/martin/src/bin/martin-cp.rs b/martin/src/bin/martin-cp.rs index 7fe50d156..897bc72ad 100644 --- a/martin/src/bin/martin-cp.rs +++ b/martin/src/bin/martin-cp.rs @@ -458,46 +458,31 @@ mod tests { let bbox_mi = Bounds::from_str("-86.6271,41.6811,-82.3095,45.8058").unwrap(); let bbox_usa = Bounds::from_str("-124.8489,24.3963,-66.8854,49.3843").unwrap(); - assert_yaml_snapshot!(compute_tile_ranges(&args(&[world], &[0])), @r###" - --- - - "0: (0,0) - (0,0)" - "###); + assert_yaml_snapshot!(compute_tile_ranges(&args(&[world], &[0])), @r#"- "0: (0,0) - (0,0)""#); - assert_yaml_snapshot!(compute_tile_ranges(&args(&[world], &[3,7])), @r###" - --- + assert_yaml_snapshot!(compute_tile_ranges(&args(&[world], &[3,7])), @r#" - "3: (0,0) - (7,7)" - "7: (0,0) - (127,127)" - "###); + "#); - assert_yaml_snapshot!(compute_tile_ranges(&arg_minmax(&[world], 2, 4)), @r###" - --- + assert_yaml_snapshot!(compute_tile_ranges(&arg_minmax(&[world], 2, 4)), @r#" - "2: (0,0) - (3,3)" - "3: (0,0) - (7,7)" - "4: (0,0) - (15,15)" - "###); + "#); - assert_yaml_snapshot!(compute_tile_ranges(&args(&[world], &[14])), @r###" - --- - - "14: (0,0) - (16383,16383)" - "###); + assert_yaml_snapshot!(compute_tile_ranges(&args(&[world], &[14])), @r#"- "14: (0,0) - (16383,16383)""#); - assert_yaml_snapshot!(compute_tile_ranges(&args(&[bbox_usa], &[14])), @r###" - --- - - "14: (2509,5599) - (5147,7046)" - "###); + assert_yaml_snapshot!(compute_tile_ranges(&args(&[bbox_usa], &[14])), @r#"- "14: (2509,5599) - (5147,7046)""#); - assert_yaml_snapshot!(compute_tile_ranges(&args(&[bbox_usa, bbox_mi, bbox_ca], &[14])), @r###" - --- - - "14: (2509,5599) - (5147,7046)" - "###); + assert_yaml_snapshot!(compute_tile_ranges(&args(&[bbox_usa, bbox_mi, bbox_ca], &[14])), @r#"- "14: (2509,5599) - (5147,7046)""#); - assert_yaml_snapshot!(compute_tile_ranges(&args(&[bbox_ca_south, bbox_mi, bbox_ca], &[14])), @r###" - --- + assert_yaml_snapshot!(compute_tile_ranges(&args(&[bbox_ca_south, bbox_mi, bbox_ca], &[14])), @r#" - "14: (2791,6499) - (2997,6624)" - "14: (4249,5841) - (4446,6101)" - "14: (2526,6081) - (2790,6624)" - "14: (2791,6081) - (2997,6498)" - "###); + "#); } fn args(bbox: &[Bounds], zooms: &[u8]) -> CopyArgs { diff --git a/martin/src/pg/builder.rs b/martin/src/pg/builder.rs index 4b88f2f93..cf81abc4b 100644 --- a/martin/src/pg/builder.rs +++ b/martin/src/pg/builder.rs @@ -496,95 +496,86 @@ mod tests { #[allow(clippy::too_many_lines)] fn test_auto_publish_no_auto() { let cfg = auto("{}"); - assert_yaml_snapshot!(cfg, @r###" - --- - auto_table: - source_id_format: "{table}" - auto_funcs: - source_id_format: "{function}" - "###); + assert_yaml_snapshot!(cfg, @r#" + auto_table: + source_id_format: "{table}" + auto_funcs: + source_id_format: "{function}" + "#); let cfg = auto("tables: {}"); - assert_yaml_snapshot!(cfg, @r###" - --- - auto_table: ~ - auto_funcs: ~ - "###); + assert_yaml_snapshot!(cfg, @r" + auto_table: ~ + auto_funcs: ~ + "); let cfg = auto("functions: {}"); - assert_yaml_snapshot!(cfg, @r###" - --- - auto_table: ~ - auto_funcs: ~ - "###); + assert_yaml_snapshot!(cfg, @r" + auto_table: ~ + auto_funcs: ~ + "); let cfg = auto("auto_publish: true"); - assert_yaml_snapshot!(cfg, @r###" - --- - auto_table: - source_id_format: "{table}" - auto_funcs: - source_id_format: "{function}" - "###); + assert_yaml_snapshot!(cfg, @r#" + auto_table: + source_id_format: "{table}" + auto_funcs: + source_id_format: "{function}" + "#); let cfg = auto("auto_publish: false"); - assert_yaml_snapshot!(cfg, @r###" - --- - auto_table: ~ - auto_funcs: ~ - "###); + assert_yaml_snapshot!(cfg, @r" + auto_table: ~ + auto_funcs: ~ + "); let cfg = auto(indoc! {" auto_publish: from_schemas: public tables: true"}); - assert_yaml_snapshot!(cfg, @r###" - --- - auto_table: - schemas: - - public - source_id_format: "{table}" - auto_funcs: ~ - "###); + assert_yaml_snapshot!(cfg, @r#" + auto_table: + schemas: + - public + source_id_format: "{table}" + auto_funcs: ~ + "#); let cfg = auto(indoc! {" auto_publish: from_schemas: public functions: true"}); - assert_yaml_snapshot!(cfg, @r###" - --- - auto_table: ~ - auto_funcs: - schemas: - - public - source_id_format: "{function}" - "###); + assert_yaml_snapshot!(cfg, @r#" + auto_table: ~ + auto_funcs: + schemas: + - public + source_id_format: "{function}" + "#); let cfg = auto(indoc! {" auto_publish: from_schemas: public tables: false"}); - assert_yaml_snapshot!(cfg, @r###" - --- - auto_table: ~ - auto_funcs: - schemas: - - public - source_id_format: "{function}" - "###); + assert_yaml_snapshot!(cfg, @r#" + auto_table: ~ + auto_funcs: + schemas: + - public + source_id_format: "{function}" + "#); let cfg = auto(indoc! {" auto_publish: from_schemas: public functions: false"}); - assert_yaml_snapshot!(cfg, @r###" - --- - auto_table: - schemas: - - public - source_id_format: "{table}" - auto_funcs: ~ - "###); + assert_yaml_snapshot!(cfg, @r#" + auto_table: + schemas: + - public + source_id_format: "{table}" + auto_funcs: ~ + "#); let cfg = auto(indoc! {" auto_publish: @@ -592,15 +583,14 @@ mod tests { tables: from_schemas: osm id_format: 'foo_{schema}.{table}_bar'"}); - assert_yaml_snapshot!(cfg, @r###" - --- - auto_table: - schemas: - - osm - - public - source_id_format: "foo_{schema}.{table}_bar" - auto_funcs: ~ - "###); + assert_yaml_snapshot!(cfg, @r#" + auto_table: + schemas: + - osm + - public + source_id_format: "foo_{schema}.{table}_bar" + auto_funcs: ~ + "#); let cfg = auto(indoc! {" auto_publish: @@ -608,15 +598,14 @@ mod tests { tables: from_schemas: osm source_id_format: '{schema}.{table}'"}); - assert_yaml_snapshot!(cfg, @r###" - --- + assert_yaml_snapshot!(cfg, @r#" auto_table: schemas: - osm - public source_id_format: "{schema}.{table}" auto_funcs: ~ - "###); + "#); let cfg = auto(indoc! {" auto_publish: @@ -624,14 +613,13 @@ mod tests { from_schemas: - osm - public"}); - assert_yaml_snapshot!(cfg, @r###" - --- - auto_table: - schemas: - - osm - - public - source_id_format: "{table}" - auto_funcs: ~ - "###); + assert_yaml_snapshot!(cfg, @r#" + auto_table: + schemas: + - osm + - public + source_id_format: "{table}" + auto_funcs: ~ + "#); } } diff --git a/martin/tests/mb_server_test.rs b/martin/tests/mb_server_test.rs index 327a88fe4..19f053f4d 100644 --- a/martin/tests/mb_server_test.rs +++ b/martin/tests/mb_server_test.rs @@ -53,8 +53,7 @@ async fn mbt_get_catalog() { let response = call_service(&app, req).await; let response = assert_response(response).await; let body: serde_json::Value = read_body_json(response).await; - assert_yaml_snapshot!(body, @r###" - --- + assert_yaml_snapshot!(body, @r" fonts: {} sprites: {} tiles: @@ -73,7 +72,7 @@ async fn mbt_get_catalog() { m_webp: content_type: image/webp name: ne2sr - "###); + "); } #[actix_rt::test] @@ -85,8 +84,7 @@ async fn mbt_get_catalog_gzip() { let response = assert_response(response).await; let body = decode_gzip(&read_body(response).await).unwrap(); let body: serde_json::Value = serde_json::from_slice(&body).unwrap(); - assert_yaml_snapshot!(body, @r###" - --- + assert_yaml_snapshot!(body, @r" fonts: {} sprites: {} tiles: @@ -105,7 +103,7 @@ async fn mbt_get_catalog_gzip() { m_webp: content_type: image/webp name: ne2sr - "###); + "); } #[actix_rt::test] diff --git a/martin/tests/pg_function_source_test.rs b/martin/tests/pg_function_source_test.rs index f10af4829..cf7d81718 100644 --- a/martin/tests/pg_function_source_test.rs +++ b/martin/tests/pg_function_source_test.rs @@ -17,14 +17,13 @@ fn init() { async fn function_source_tilejson() { let mock = mock_sources(mock_pgcfg("connection_string: $DATABASE_URL")).await; let tj = source(&mock, "function_zxy_query").get_tilejson(); - assert_yaml_snapshot!(tj, @r###" - --- + assert_yaml_snapshot!(tj, @r" tilejson: 3.0.0 tiles: [] name: function_zxy_query foo: bar: foo - "###); + "); } #[actix_rt::test] @@ -55,10 +54,9 @@ async fn function_source_schemas() { from_schemas: MixedCase "}); let sources = mock_sources(cfg).await.0.tiles; - assert_yaml_snapshot!(sources.get_catalog(), @r###" - --- + assert_yaml_snapshot!(sources.get_catalog(), @r" function_Mixed_Name: content_type: application/x-protobuf description: a function source with MixedCase name - "###); + "); } diff --git a/martin/tests/pg_server_test.rs b/martin/tests/pg_server_test.rs index 7fa96d2cf..34ca2dc0d 100644 --- a/martin/tests/pg_server_test.rs +++ b/martin/tests/pg_server_test.rs @@ -53,7 +53,6 @@ postgres: let body = read_body(response).await; let body: serde_json::Value = serde_json::from_slice(&body).unwrap(); assert_yaml_snapshot!(body, @r#" - --- fonts: {} sprites: {} tiles: @@ -188,8 +187,7 @@ postgres: .insert_header(("x-rewrite-url", "/tiles/table_source?token=martin")) .to_request(); let result: TileJSON = call_and_read_body_json(&app, req).await; - assert_yaml_snapshot!(result, @r###" - --- + assert_yaml_snapshot!(result, @r#" tilejson: 3.0.0 tiles: - "http://localhost:8080/tiles/table_source/{z}/{x}/{y}?token=martin" @@ -205,7 +203,7 @@ postgres: name: table_source foo: bar: foo - "###); + "#); } #[actix_rt::test] @@ -1025,8 +1023,7 @@ tables: assert_eq!(src.id_column, None); assert!(matches!(&src.properties, Some(v) if v.len() == 1)); let tj = source(&mock, "no_id").get_tilejson(); - assert_yaml_snapshot!(tj, @r###" - --- + assert_yaml_snapshot!(tj, @r" tilejson: 3.0.0 tiles: [] vector_layers: @@ -1041,10 +1038,9 @@ tables: - 90 description: a description from comment on table name: no_id - "###); + "); - assert_yaml_snapshot!(table(&mock, "id_only"), @r###" - --- + assert_yaml_snapshot!(table(&mock, "id_only"), @r" schema: MixedCase table: MixPoints srid: 4326 @@ -1058,10 +1054,9 @@ tables: geometry_type: POINT properties: TABLE: text - "###); + "); - assert_yaml_snapshot!(table(&mock, "id_and_prop"), @r###" - --- + assert_yaml_snapshot!(table(&mock, "id_and_prop"), @r" schema: MixedCase table: MixPoints srid: 4326 @@ -1076,10 +1071,9 @@ tables: properties: TABLE: text giD: int4 - "###); + "); - assert_yaml_snapshot!(table(&mock, "prop_only"), @r###" - --- + assert_yaml_snapshot!(table(&mock, "prop_only"), @r" schema: MixedCase table: MixPoints srid: 4326 @@ -1093,7 +1087,7 @@ tables: properties: TABLE: text giD: int4 - "###); + "); // -------------------------------------------- diff --git a/martin/tests/pg_table_source_test.rs b/martin/tests/pg_table_source_test.rs index 9628d58eb..7b1cbd6b4 100644 --- a/martin/tests/pg_table_source_test.rs +++ b/martin/tests/pg_table_source_test.rs @@ -16,7 +16,6 @@ fn init() { async fn table_source() { let mock = mock_sources(mock_pgcfg("connection_string: $DATABASE_URL")).await; assert_yaml_snapshot!(mock.0.tiles.get_catalog(), @r#" - --- "-function.withweired---_-characters": content_type: application/x-protobuf description: a function source with special characters @@ -91,8 +90,7 @@ async fn table_source() { "#); let source = table(&mock, "table_source"); - assert_yaml_snapshot!(source, @r###" - --- + assert_yaml_snapshot!(source, @r" schema: public table: table_source srid: 4326 @@ -105,15 +103,14 @@ async fn table_source() { geometry_type: GEOMETRY properties: gid: int4 - "###); + "); } #[actix_rt::test] async fn tables_tilejson() { let mock = mock_sources(mock_pgcfg("connection_string: $DATABASE_URL")).await; let tj = source(&mock, "table_source").get_tilejson(); - assert_yaml_snapshot!(tj, @r###" - --- + assert_yaml_snapshot!(tj, @r" tilejson: 3.0.0 tiles: [] vector_layers: @@ -128,7 +125,7 @@ async fn tables_tilejson() { name: table_source foo: bar: foo - "###); + "); } #[actix_rt::test] @@ -184,10 +181,9 @@ async fn table_source_schemas() { functions: false "}); let sources = mock_sources(cfg).await.0; - assert_yaml_snapshot!(sources.tiles.get_catalog(), @r###" - --- + assert_yaml_snapshot!(sources.tiles.get_catalog(), @r" MixPoints: content_type: application/x-protobuf description: a description from comment on table - "###); + "); } diff --git a/martin/tests/pmt_server_test.rs b/martin/tests/pmt_server_test.rs index 63e8f775c..a7a26bbd6 100644 --- a/martin/tests/pmt_server_test.rs +++ b/martin/tests/pmt_server_test.rs @@ -51,14 +51,13 @@ async fn pmt_get_catalog() { let response = call_service(&app, req).await; let response = assert_response(response).await; let body: serde_json::Value = read_body_json(response).await; - assert_yaml_snapshot!(body, @r###" - --- + assert_yaml_snapshot!(body, @r" fonts: {} sprites: {} tiles: stamen_toner__raster_CC-BY-ODbL_z3: content_type: image/png - "###); + "); } #[actix_rt::test] @@ -70,14 +69,13 @@ async fn pmt_get_catalog_gzip() { let response = assert_response(response).await; let body = decode_gzip(&read_body(response).await).unwrap(); let body: serde_json::Value = serde_json::from_slice(&body).unwrap(); - assert_yaml_snapshot!(body, @r###" - --- + assert_yaml_snapshot!(body, @r" fonts: {} sprites: {} tiles: p_png: content_type: image/png - "###); + "); } #[actix_rt::test] diff --git a/mbtiles/src/summary.rs b/mbtiles/src/summary.rs index 095a194a7..c63082c7e 100644 --- a/mbtiles/src/summary.rs +++ b/mbtiles/src/summary.rs @@ -202,8 +202,7 @@ mod tests { init_mbtiles_schema(&mut conn, MbtType::Flat).await.unwrap(); let res = mbt.summary(&mut conn).await?; - assert_yaml_snapshot!(res, @r###" - --- + assert_yaml_snapshot!(res, @r" file_size: ~ mbt_type: Flat page_size: 512 @@ -216,7 +215,7 @@ mod tests { min_zoom: ~ max_zoom: ~ zoom_info: [] - "###); + "); Ok(()) } @@ -228,8 +227,7 @@ mod tests { let res = mbt.summary(&mut conn).await?; - assert_yaml_snapshot!(res, @r###" - --- + assert_yaml_snapshot!(res, @r" file_size: 49152 mbt_type: Flat page_size: 4096 @@ -316,7 +314,7 @@ mod tests { - -40.97989806962015 - 180.00000000000003 - 61.60639637138628 - "###); + "); Ok(()) } From 25f6dd8fed7ffcc112fceff1e97d8448bb562bec Mon Sep 17 00:00:00 2001 From: Frank Elsinga Date: Sun, 15 Dec 2024 16:19:17 +0100 Subject: [PATCH 194/215] chore: snapshots on sorted test output (#1615) This PR splits out the test reproducibility fix from #1585 Currently, these fields not being sorted does not pose an issue, but with #1585, it would at least be differnt => we likely should not rely upon this in our CI --- martin/tests/pg_table_source_test.rs | 2 + tests/expected/auto/catalog_auto.json | 102 +++++++++--------- tests/expected/auto/cmp.json | 30 +++--- tests/expected/auto/fnc.json | 10 +- tests/expected/auto/fnc_b.json | 6 +- tests/expected/auto/fnc_comment.json | 10 +- tests/expected/auto/fnc_token.json | 6 +- tests/expected/auto/mb_jpg.json | 8 +- tests/expected/auto/mb_mvt.json | 34 +++--- tests/expected/auto/mb_png.json | 8 +- tests/expected/auto/pmt.json | 10 +- tests/expected/auto/points3857_srid.json | 22 ++-- tests/expected/auto/table_source.json | 26 ++--- tests/expected/auto/tbl_comment.json | 22 ++-- tests/expected/auto_mini/catalog_auto.json | 6 +- tests/expected/configured/catalog_cfg.json | 60 +++++------ tests/expected/configured/cmp.json | 34 +++--- .../expected/configured/fnc_comment_cfg.json | 10 +- tests/expected/configured/sdf_spr_cmp.json | 16 +-- tests/expected/configured/sdf_spr_cmp_2.json | 16 +-- tests/expected/configured/sdf_spr_mysrc.json | 4 +- tests/expected/configured/sdf_spr_src1.json | 12 +-- tests/expected/configured/sdf_spr_src1_.json | 12 +-- .../expected/configured/tbl_comment_cfg.json | 22 ++-- tests/test.sh | 2 +- 25 files changed, 246 insertions(+), 244 deletions(-) diff --git a/martin/tests/pg_table_source_test.rs b/martin/tests/pg_table_source_test.rs index 7b1cbd6b4..817dcc017 100644 --- a/martin/tests/pg_table_source_test.rs +++ b/martin/tests/pg_table_source_test.rs @@ -15,6 +15,7 @@ fn init() { #[actix_rt::test] async fn table_source() { let mock = mock_sources(mock_pgcfg("connection_string: $DATABASE_URL")).await; + insta::with_settings!({sort_maps => true}, { assert_yaml_snapshot!(mock.0.tiles.get_catalog(), @r#" "-function.withweired---_-characters": content_type: application/x-protobuf @@ -88,6 +89,7 @@ async fn table_source() { content_type: application/x-protobuf description: public.table_source_multiple_geom.geom2 "#); + }); let source = table(&mock, "table_source"); assert_yaml_snapshot!(source, @r" diff --git a/tests/expected/auto/catalog_auto.json b/tests/expected/auto/catalog_auto.json index bd4b5b683..eb755495d 100644 --- a/tests/expected/auto/catalog_auto.json +++ b/tests/expected/auto/catalog_auto.json @@ -1,4 +1,29 @@ { + "fonts": { + "Overpass Mono Light": { + "end": 64258, + "family": "Overpass Mono", + "glyphs": 931, + "start": 0, + "style": "Light" + }, + "Overpass Mono Regular": { + "end": 64258, + "family": "Overpass Mono", + "glyphs": 931, + "start": 0, + "style": "Regular" + } + }, + "sprites": { + "src1": { + "images": [ + "another_bicycle", + "bear", + "sub/circle" + ] + } + }, "tiles": { "-function.withweired---_-characters": { "content_type": "application/x-protobuf", @@ -69,28 +94,28 @@ }, "geography-class-jpg": { "content_type": "image/jpeg", - "name": "Geography Class", - "description": "One of the example maps that comes with TileMill - a bright & colorful world map that blends retro and high-tech with its folded paper texture and interactive flag tooltips. " + "description": "One of the example maps that comes with TileMill - a bright & colorful world map that blends retro and high-tech with its folded paper texture and interactive flag tooltips. ", + "name": "Geography Class" }, "geography-class-jpg-diff": { "content_type": "image/jpeg", - "name": "Geography Class", - "description": "One of the example maps that comes with TileMill - a bright & colorful world map that blends retro and high-tech with its folded paper texture and interactive flag tooltips. " + "description": "One of the example maps that comes with TileMill - a bright & colorful world map that blends retro and high-tech with its folded paper texture and interactive flag tooltips. ", + "name": "Geography Class" }, "geography-class-jpg-modified": { "content_type": "image/jpeg", - "name": "Geography Class", - "description": "A modified version of one of the example maps that comes with TileMill - a bright & colorful world map that blends retro and high-tech with its folded paper texture and interactive flag tooltips." + "description": "A modified version of one of the example maps that comes with TileMill - a bright & colorful world map that blends retro and high-tech with its folded paper texture and interactive flag tooltips.", + "name": "Geography Class" }, "geography-class-png": { "content_type": "image/png", - "name": "Geography Class", - "description": "One of the example maps that comes with TileMill - a bright & colorful world map that blends retro and high-tech with its folded paper texture and interactive flag tooltips. " + "description": "One of the example maps that comes with TileMill - a bright & colorful world map that blends retro and high-tech with its folded paper texture and interactive flag tooltips. ", + "name": "Geography Class" }, "geography-class-png-no-bounds": { "content_type": "image/png", - "name": "Geography Class", - "description": "One of the example maps that comes with TileMill - a bright & colorful world map that blends retro and high-tech with its folded paper texture and interactive flag tooltips. " + "description": "One of the example maps that comes with TileMill - a bright & colorful world map that blends retro and high-tech with its folded paper texture and interactive flag tooltips. ", + "name": "Geography Class" }, "json": { "content_type": "application/json", @@ -105,9 +130,9 @@ "description": "public.points1.geom" }, "points1_vw": { + "attribution": "some attribution from SQL comment", "content_type": "application/x-protobuf", - "description": "description from SQL comment", - "attribution": "some attribution from SQL comment" + "description": "description from SQL comment" }, "points2": { "content_type": "application/x-protobuf", @@ -141,8 +166,8 @@ }, "uncompressed_mvt": { "content_type": "application/x-protobuf", - "name": "Major cities from Natural Earth data", - "description": "Major cities from Natural Earth data" + "description": "Major cities from Natural Earth data", + "name": "Major cities from Natural Earth data" }, "webp": { "content_type": "image/webp", @@ -153,53 +178,28 @@ "name": "ne2sr" }, "world_cities": { - "content_type": "application/x-protobuf", "content_encoding": "gzip", - "name": "Major cities from Natural Earth data", - "description": "Major cities from Natural Earth data" + "content_type": "application/x-protobuf", + "description": "Major cities from Natural Earth data", + "name": "Major cities from Natural Earth data" }, "world_cities_diff": { - "content_type": "application/x-protobuf", "content_encoding": "gzip", - "name": "Major cities from Natural Earth data", - "description": "Major cities from Natural Earth data" + "content_type": "application/x-protobuf", + "description": "Major cities from Natural Earth data", + "name": "Major cities from Natural Earth data" }, "world_cities_modified": { - "content_type": "application/x-protobuf", "content_encoding": "gzip", - "name": "Major cities from Natural Earth data", - "description": "A modified version of major cities from Natural Earth data" + "content_type": "application/x-protobuf", + "description": "A modified version of major cities from Natural Earth data", + "name": "Major cities from Natural Earth data" }, "zoomed_world_cities": { - "content_type": "application/x-protobuf", "content_encoding": "gzip", - "name": "Major cities from Natural Earth data", - "description": "Major cities from Natural Earth data" - } - }, - "sprites": { - "src1": { - "images": [ - "another_bicycle", - "bear", - "sub/circle" - ] - } - }, - "fonts": { - "Overpass Mono Light": { - "family": "Overpass Mono", - "style": "Light", - "glyphs": 931, - "start": 0, - "end": 64258 - }, - "Overpass Mono Regular": { - "family": "Overpass Mono", - "style": "Regular", - "glyphs": 931, - "start": 0, - "end": 64258 + "content_type": "application/x-protobuf", + "description": "Major cities from Natural Earth data", + "name": "Major cities from Natural Earth data" } } } diff --git a/tests/expected/auto/cmp.json b/tests/expected/auto/cmp.json index 161878bc1..ce6fc2a45 100644 --- a/tests/expected/auto/cmp.json +++ b/tests/expected/auto/cmp.json @@ -1,34 +1,34 @@ { + "bounds": [ + -179.27313970132585, + -80.46177157848345, + 179.11187181086706, + 84.93092095128937 + ], + "description": "public.points1.geom\npublic.points2.geom", + "name": "table_source,points1,points2", "tilejson": "3.0.0", "tiles": [ "http://localhost:3111/table_source,points1,points2/{z}/{x}/{y}" ], "vector_layers": [ { - "id": "table_source", "fields": { "gid": "int4" - } + }, + "id": "table_source" }, { - "id": "points1", "fields": { "gid": "int4" - } + }, + "id": "points1" }, { - "id": "points2", "fields": { "gid": "int4" - } + }, + "id": "points2" } - ], - "bounds": [ - -179.27313970132585, - -80.46177157848345, - 179.11187181086706, - 84.93092095128937 - ], - "description": "public.points1.geom\npublic.points2.geom", - "name": "table_source,points1,points2" + ] } diff --git a/tests/expected/auto/fnc.json b/tests/expected/auto/fnc.json index 22c0c850e..79f898d7a 100644 --- a/tests/expected/auto/fnc.json +++ b/tests/expected/auto/fnc.json @@ -1,10 +1,10 @@ { + "foo": { + "bar": "foo" + }, + "name": "function_zxy_query", "tilejson": "3.0.0", "tiles": [ "http://localhost:3111/function_zxy_query/{z}/{x}/{y}" - ], - "name": "function_zxy_query", - "foo": { - "bar": "foo" - } + ] } diff --git a/tests/expected/auto/fnc_b.json b/tests/expected/auto/fnc_b.json index 4d5d88df3..ca3176bc3 100644 --- a/tests/expected/auto/fnc_b.json +++ b/tests/expected/auto/fnc_b.json @@ -1,8 +1,8 @@ { + "description": "public.function_zxy_query_jsonb", + "name": "function_zxy_query_jsonb", "tilejson": "3.0.0", "tiles": [ "http://localhost:3111/function_zxy_query_jsonb/{z}/{x}/{y}" - ], - "description": "public.function_zxy_query_jsonb", - "name": "function_zxy_query_jsonb" + ] } diff --git a/tests/expected/auto/fnc_comment.json b/tests/expected/auto/fnc_comment.json index b5b81d778..49954049f 100644 --- a/tests/expected/auto/fnc_comment.json +++ b/tests/expected/auto/fnc_comment.json @@ -1,17 +1,17 @@ { + "description": "a function source with MixedCase name", + "name": "function_Mixed_Name", "tilejson": "3.0.0", "tiles": [ "http://localhost:3111/function_Mixed_Name/{z}/{x}/{y}" ], "vector_layers": [ { - "id": "MixedCase.function_Mixed_Name", "fields": { "Geom": "", "TABLE": "" - } + }, + "id": "MixedCase.function_Mixed_Name" } - ], - "description": "a function source with MixedCase name", - "name": "function_Mixed_Name" + ] } diff --git a/tests/expected/auto/fnc_token.json b/tests/expected/auto/fnc_token.json index 000e73e33..07b8b048a 100644 --- a/tests/expected/auto/fnc_token.json +++ b/tests/expected/auto/fnc_token.json @@ -1,8 +1,8 @@ { + "description": "public.function_zxy_query_test", + "name": "function_zxy_query_test", "tilejson": "3.0.0", "tiles": [ "http://localhost:3111/function_zxy_query_test/{z}/{x}/{y}" - ], - "description": "public.function_zxy_query_test", - "name": "function_zxy_query_test" + ] } diff --git a/tests/expected/auto/mb_jpg.json b/tests/expected/auto/mb_jpg.json index 0ea277215..eeb17251d 100644 --- a/tests/expected/auto/mb_jpg.json +++ b/tests/expected/auto/mb_jpg.json @@ -1,8 +1,4 @@ { - "tilejson": "3.0.0", - "tiles": [ - "http://localhost:3111/geography-class-jpg/{z}/{x}/{y}" - ], "bounds": [ -180, -85.0511, @@ -15,5 +11,9 @@ "minzoom": 0, "name": "Geography Class", "template": "{{#__location__}}{{/__location__}}{{#__teaser__}}
\n\n
\n{{admin}}\n\n
{{/__teaser__}}{{#__full__}}{{/__full__}}", + "tilejson": "3.0.0", + "tiles": [ + "http://localhost:3111/geography-class-jpg/{z}/{x}/{y}" + ], "version": "1.0.0" } diff --git a/tests/expected/auto/mb_mvt.json b/tests/expected/auto/mb_mvt.json index 57afef88e..aaf51368b 100644 --- a/tests/expected/auto/mb_mvt.json +++ b/tests/expected/auto/mb_mvt.json @@ -1,19 +1,4 @@ { - "tilejson": "3.0.0", - "tiles": [ - "http://localhost:3111/world_cities/{z}/{x}/{y}" - ], - "vector_layers": [ - { - "id": "cities", - "fields": { - "name": "String" - }, - "description": "", - "maxzoom": 6, - "minzoom": 0 - } - ], "bounds": [ -123.12359, -37.818085, @@ -26,9 +11,24 @@ 6 ], "description": "Major cities from Natural Earth data", + "format": "pbf", "maxzoom": 6, "minzoom": 0, "name": "Major cities from Natural Earth data", - "version": "2", - "format": "pbf" + "tilejson": "3.0.0", + "tiles": [ + "http://localhost:3111/world_cities/{z}/{x}/{y}" + ], + "vector_layers": [ + { + "description": "", + "fields": { + "name": "String" + }, + "id": "cities", + "maxzoom": 6, + "minzoom": 0 + } + ], + "version": "2" } diff --git a/tests/expected/auto/mb_png.json b/tests/expected/auto/mb_png.json index 55c42294b..e4592e986 100644 --- a/tests/expected/auto/mb_png.json +++ b/tests/expected/auto/mb_png.json @@ -1,8 +1,4 @@ { - "tilejson": "3.0.0", - "tiles": [ - "http://localhost:3111/geography-class-png/{z}/{x}/{y}" - ], "bounds": [ -180, -85.0511, @@ -20,5 +16,9 @@ "minzoom": 0, "name": "Geography Class", "template": "{{#__location__}}{{/__location__}}{{#__teaser__}}
\n\n
\n{{admin}}\n\n
{{/__teaser__}}{{#__full__}}{{/__full__}}", + "tilejson": "3.0.0", + "tiles": [ + "http://localhost:3111/geography-class-png/{z}/{x}/{y}" + ], "version": "1.0.0" } diff --git a/tests/expected/auto/pmt.json b/tests/expected/auto/pmt.json index 96f570c07..9bece7414 100644 --- a/tests/expected/auto/pmt.json +++ b/tests/expected/auto/pmt.json @@ -1,8 +1,4 @@ { - "tilejson": "3.0.0", - "tiles": [ - "http://localhost:3111/stamen_toner__raster_CC-BY-ODbL_z3/{z}/{x}/{y}" - ], "bounds": [ -180, -85, @@ -15,5 +11,9 @@ 0 ], "maxzoom": 3, - "minzoom": 0 + "minzoom": 0, + "tilejson": "3.0.0", + "tiles": [ + "http://localhost:3111/stamen_toner__raster_CC-BY-ODbL_z3/{z}/{x}/{y}" + ] } diff --git a/tests/expected/auto/points3857_srid.json b/tests/expected/auto/points3857_srid.json index 4b90db678..dea3bf085 100644 --- a/tests/expected/auto/points3857_srid.json +++ b/tests/expected/auto/points3857_srid.json @@ -1,22 +1,22 @@ { + "bounds": [ + -161.40590777554058, + -81.50727021609012, + 172.51549126768532, + 84.2440187164111 + ], + "description": "public.points3857.geom", + "name": "points3857", "tilejson": "3.0.0", "tiles": [ "http://localhost:3111/points3857/{z}/{x}/{y}" ], "vector_layers": [ { - "id": "points3857", "fields": { "gid": "int4" - } + }, + "id": "points3857" } - ], - "bounds": [ - -161.40590777554058, - -81.50727021609012, - 172.51549126768532, - 84.2440187164111 - ], - "description": "public.points3857.geom", - "name": "points3857" + ] } diff --git a/tests/expected/auto/table_source.json b/tests/expected/auto/table_source.json index 609c974b5..c885281d1 100644 --- a/tests/expected/auto/table_source.json +++ b/tests/expected/auto/table_source.json @@ -1,24 +1,24 @@ { + "bounds": [ + -2, + -1, + 142.84131509869133, + 45 + ], + "foo": { + "bar": "foo" + }, + "name": "table_source", "tilejson": "3.0.0", "tiles": [ "http://localhost:3111/table_source/{z}/{x}/{y}" ], "vector_layers": [ { - "id": "table_source", "fields": { "gid": "int4" - } + }, + "id": "table_source" } - ], - "bounds": [ - -2, - -1, - 142.84131509869133, - 45 - ], - "name": "table_source", - "foo": { - "bar": "foo" - } + ] } diff --git a/tests/expected/auto/tbl_comment.json b/tests/expected/auto/tbl_comment.json index 167c242dc..702e0d310 100644 --- a/tests/expected/auto/tbl_comment.json +++ b/tests/expected/auto/tbl_comment.json @@ -1,23 +1,23 @@ { + "bounds": [ + -170.94984639004662, + -84.20025580733805, + 167.70892858284475, + 74.23573284753762 + ], + "description": "a description from comment on table", + "name": "MixPoints", "tilejson": "3.0.0", "tiles": [ "http://localhost:3111/MixPoints/{z}/{x}/{y}" ], "vector_layers": [ { - "id": "MixPoints", "fields": { "Gid": "int4", "TABLE": "text" - } + }, + "id": "MixPoints" } - ], - "bounds": [ - -170.94984639004662, - -84.20025580733805, - 167.70892858284475, - 74.23573284753762 - ], - "description": "a description from comment on table", - "name": "MixPoints" + ] } diff --git a/tests/expected/auto_mini/catalog_auto.json b/tests/expected/auto_mini/catalog_auto.json index 74459629b..3ee8c46e9 100644 --- a/tests/expected/auto_mini/catalog_auto.json +++ b/tests/expected/auto_mini/catalog_auto.json @@ -1,10 +1,10 @@ { + "fonts": {}, + "sprites": {}, "tiles": { "webp2": { "content_type": "image/webp", "name": "ne2sr" } - }, - "sprites": {}, - "fonts": {} + } } diff --git a/tests/expected/configured/catalog_cfg.json b/tests/expected/configured/catalog_cfg.json index 06bdba891..6c271d96e 100644 --- a/tests/expected/configured/catalog_cfg.json +++ b/tests/expected/configured/catalog_cfg.json @@ -1,4 +1,34 @@ { + "fonts": { + "Overpass Mono Light": { + "end": 64258, + "family": "Overpass Mono", + "glyphs": 931, + "start": 0, + "style": "Light" + }, + "Overpass Mono Regular": { + "end": 64258, + "family": "Overpass Mono", + "glyphs": 931, + "start": 0, + "style": "Regular" + } + }, + "sprites": { + "mysrc": { + "images": [ + "bicycle" + ] + }, + "src1": { + "images": [ + "another_bicycle", + "bear", + "sub/circle" + ] + } + }, "tiles": { "MixPoints": { "content_type": "application/x-protobuf", @@ -49,35 +79,5 @@ "content_type": "image/webp", "name": "ne2sr" } - }, - "sprites": { - "mysrc": { - "images": [ - "bicycle" - ] - }, - "src1": { - "images": [ - "another_bicycle", - "bear", - "sub/circle" - ] - } - }, - "fonts": { - "Overpass Mono Light": { - "family": "Overpass Mono", - "style": "Light", - "glyphs": 931, - "start": 0, - "end": 64258 - }, - "Overpass Mono Regular": { - "family": "Overpass Mono", - "style": "Regular", - "glyphs": 931, - "start": 0, - "end": 64258 - } } } diff --git a/tests/expected/configured/cmp.json b/tests/expected/configured/cmp.json index 7112ee6ab..d0d392550 100644 --- a/tests/expected/configured/cmp.json +++ b/tests/expected/configured/cmp.json @@ -1,36 +1,36 @@ { + "bounds": [ + -180, + -90, + 180, + 90 + ], + "description": "public.points1.geom\npublic.points2.geom", + "maxzoom": 30, + "minzoom": 0, + "name": "table_source,points1,points2", "tilejson": "3.0.0", "tiles": [ "http://localhost:3111/table_source,points1,points2/{z}/{x}/{y}" ], "vector_layers": [ { - "id": "table_source", "fields": { "gid": "int4" - } + }, + "id": "table_source" }, { - "id": "abc", "fields": { "gid": "int4" - } + }, + "id": "abc" }, { - "id": "points2", "fields": { "gid": "int4" - } + }, + "id": "points2" } - ], - "bounds": [ - -180, - -90, - 180, - 90 - ], - "description": "public.points1.geom\npublic.points2.geom", - "maxzoom": 30, - "minzoom": 0, - "name": "table_source,points1,points2" + ] } diff --git a/tests/expected/configured/fnc_comment_cfg.json b/tests/expected/configured/fnc_comment_cfg.json index 0a16d32c4..ac7f5bc81 100644 --- a/tests/expected/configured/fnc_comment_cfg.json +++ b/tests/expected/configured/fnc_comment_cfg.json @@ -1,17 +1,17 @@ { + "description": "a function source with MixedCase name", + "name": "fnc_Mixed_Name", "tilejson": "3.0.0", "tiles": [ "http://localhost:3111/fnc_Mixed_Name/{z}/{x}/{y}" ], "vector_layers": [ { - "id": "MixedCase.function_Mixed_Name", "fields": { "Geom": "", "TABLE": "" - } + }, + "id": "MixedCase.function_Mixed_Name" } - ], - "description": "a function source with MixedCase name", - "name": "fnc_Mixed_Name" + ] } diff --git a/tests/expected/configured/sdf_spr_cmp.json b/tests/expected/configured/sdf_spr_cmp.json index 7a179b175..7856aec13 100644 --- a/tests/expected/configured/sdf_spr_cmp.json +++ b/tests/expected/configured/sdf_spr_cmp.json @@ -2,33 +2,33 @@ "another_bicycle": { "height": 21, "pixelRatio": 1, + "sdf": true, "width": 21, "x": 26, - "y": 22, - "sdf": true + "y": 22 }, "bear": { "height": 22, "pixelRatio": 1, + "sdf": true, "width": 22, "x": 26, - "y": 0, - "sdf": true + "y": 0 }, "bicycle": { "height": 21, "pixelRatio": 1, + "sdf": true, "width": 21, "x": 0, - "y": 26, - "sdf": true + "y": 26 }, "sub/circle": { "height": 26, "pixelRatio": 1, + "sdf": true, "width": 26, "x": 0, - "y": 0, - "sdf": true + "y": 0 } } diff --git a/tests/expected/configured/sdf_spr_cmp_2.json b/tests/expected/configured/sdf_spr_cmp_2.json index 7da6e3238..515f781bf 100644 --- a/tests/expected/configured/sdf_spr_cmp_2.json +++ b/tests/expected/configured/sdf_spr_cmp_2.json @@ -2,33 +2,33 @@ "another_bicycle": { "height": 36, "pixelRatio": 2, + "sdf": true, "width": 36, "x": 84, - "y": 0, - "sdf": true + "y": 0 }, "bear": { "height": 38, "pixelRatio": 2, + "sdf": true, "width": 38, "x": 46, - "y": 0, - "sdf": true + "y": 0 }, "bicycle": { "height": 36, "pixelRatio": 2, + "sdf": true, "width": 36, "x": 84, - "y": 36, - "sdf": true + "y": 36 }, "sub/circle": { "height": 46, "pixelRatio": 2, + "sdf": true, "width": 46, "x": 0, - "y": 0, - "sdf": true + "y": 0 } } diff --git a/tests/expected/configured/sdf_spr_mysrc.json b/tests/expected/configured/sdf_spr_mysrc.json index 03636083d..764acb6f8 100644 --- a/tests/expected/configured/sdf_spr_mysrc.json +++ b/tests/expected/configured/sdf_spr_mysrc.json @@ -2,9 +2,9 @@ "bicycle": { "height": 36, "pixelRatio": 2, + "sdf": true, "width": 36, "x": 0, - "y": 0, - "sdf": true + "y": 0 } } diff --git a/tests/expected/configured/sdf_spr_src1.json b/tests/expected/configured/sdf_spr_src1.json index d90ee2d88..b5835752c 100644 --- a/tests/expected/configured/sdf_spr_src1.json +++ b/tests/expected/configured/sdf_spr_src1.json @@ -2,25 +2,25 @@ "another_bicycle": { "height": 21, "pixelRatio": 1, + "sdf": true, "width": 21, "x": 26, - "y": 22, - "sdf": true + "y": 22 }, "bear": { "height": 22, "pixelRatio": 1, + "sdf": true, "width": 22, "x": 26, - "y": 0, - "sdf": true + "y": 0 }, "sub/circle": { "height": 26, "pixelRatio": 1, + "sdf": true, "width": 26, "x": 0, - "y": 0, - "sdf": true + "y": 0 } } diff --git a/tests/expected/configured/sdf_spr_src1_.json b/tests/expected/configured/sdf_spr_src1_.json index 9b7683ec8..f32b2be21 100644 --- a/tests/expected/configured/sdf_spr_src1_.json +++ b/tests/expected/configured/sdf_spr_src1_.json @@ -2,25 +2,25 @@ "another_bicycle": { "height": 36, "pixelRatio": 2, + "sdf": true, "width": 36, "x": 84, - "y": 0, - "sdf": true + "y": 0 }, "bear": { "height": 38, "pixelRatio": 2, + "sdf": true, "width": 38, "x": 46, - "y": 0, - "sdf": true + "y": 0 }, "sub/circle": { "height": 46, "pixelRatio": 2, + "sdf": true, "width": 46, "x": 0, - "y": 0, - "sdf": true + "y": 0 } } diff --git a/tests/expected/configured/tbl_comment_cfg.json b/tests/expected/configured/tbl_comment_cfg.json index 167c242dc..702e0d310 100644 --- a/tests/expected/configured/tbl_comment_cfg.json +++ b/tests/expected/configured/tbl_comment_cfg.json @@ -1,23 +1,23 @@ { + "bounds": [ + -170.94984639004662, + -84.20025580733805, + 167.70892858284475, + 74.23573284753762 + ], + "description": "a description from comment on table", + "name": "MixPoints", "tilejson": "3.0.0", "tiles": [ "http://localhost:3111/MixPoints/{z}/{x}/{y}" ], "vector_layers": [ { - "id": "MixPoints", "fields": { "Gid": "int4", "TABLE": "text" - } + }, + "id": "MixPoints" } - ], - "bounds": [ - -170.94984639004662, - -84.20025580733805, - 167.70892858284475, - 74.23573284753762 - ], - "description": "a description from comment on table", - "name": "MixPoints" + ] } diff --git a/tests/test.sh b/tests/test.sh index e82074f6e..2bf4812bd 100755 --- a/tests/test.sh +++ b/tests/test.sh @@ -83,7 +83,7 @@ test_jsn() { echo "Testing $(basename "$FILENAME") from $URL" # jq before 1.6 had a different float->int behavior, so trying to make it consistent in all - $CURL "$URL" | jq -e 'walk(if type == "number" then .+0.0 else . end)' > "$FILENAME" + $CURL "$URL" | jq --sort-keys -e 'walk(if type == "number" then .+0.0 else . end)' > "$FILENAME" } test_pbf() { From 8a0850d5d13c9078bc71a9015240283ead0dbf43 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Dec 2024 03:25:52 +0000 Subject: [PATCH 195/215] chore(deps): Bump thiserror from 2.0.6 to 2.0.7 (#1617) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [thiserror](https://github.com/dtolnay/thiserror) from 2.0.6 to 2.0.7.
Release notes

Sourced from thiserror's releases.

2.0.7

  • Work around conflict with #[deny(clippy::allow_attributes)] (#397, thanks @​zertosh)
Commits
  • 9c0f2d2 Release 2.0.7
  • 2deec96 Merge pull request 397 from zertosh/from_allow_expect
  • 100d916 Avoid associating #[from] with lint allow
  • 485c2b7 Reword spurious errors comment
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=thiserror&package-manager=cargo&previous-version=2.0.6&new-version=2.0.7)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 222c2624e..112ed23bf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2701,7 +2701,7 @@ dependencies = [ "static-files", "subst", "testcontainers-modules", - "thiserror 2.0.6", + "thiserror 2.0.7", "tilejson", "tokio", "tokio-postgres-rustls", @@ -2746,7 +2746,7 @@ dependencies = [ "sqlite-compressions", "sqlite-hashes", "sqlx", - "thiserror 2.0.6", + "thiserror 2.0.7", "tilejson", "tokio", "xxhash-rust", @@ -3617,7 +3617,7 @@ dependencies = [ "rustc-hash 2.0.0", "rustls", "socket2", - "thiserror 2.0.6", + "thiserror 2.0.7", "tokio", "tracing", ] @@ -3636,7 +3636,7 @@ dependencies = [ "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.6", + "thiserror 2.0.7", "tinyvec", "tracing", "web-time", @@ -4939,11 +4939,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.6" +version = "2.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fec2a1820ebd077e2b90c4df007bebf344cd394098a13c563957d0afc83ea47" +checksum = "93605438cbd668185516ab499d589afb7ee1859ea3d5fc8f6b0755e1c7443767" dependencies = [ - "thiserror-impl 2.0.6", + "thiserror-impl 2.0.7", ] [[package]] @@ -4959,9 +4959,9 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.6" +version = "2.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d65750cab40f4ff1929fb1ba509e9914eb756131cef4210da8d5d700d26f6312" +checksum = "e1d8749b4531af2117677a5fcd12b1348a3fe2b81e36e61ffeac5c4aa3273e36" dependencies = [ "proc-macro2", "quote", From e98ca0026431a4d09e8389491651d9409e1fb27d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Dec 2024 03:28:15 +0000 Subject: [PATCH 196/215] chore(deps): Bump serde from 1.0.215 to 1.0.216 (#1620) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [serde](https://github.com/serde-rs/serde) from 1.0.215 to 1.0.216.
Release notes

Sourced from serde's releases.

v1.0.216

  • Mark all generated impls with #[automatically_derived] to exclude from code coverage (#2866, #2868, thanks @​tdittr)
Commits
  • ad8dd41 Release 1.0.216
  • f91d2ed Merge pull request #2868 from dtolnay/automaticallyderived
  • 9497463 Mark all generated trait impls as #[automatically_derived]
  • 46e9ecf Merge pull request #2866 from tdittr/mark-visitors-as-generated
  • e9c399c Mark generated impl de::Visitor blocks as #[automatically_derived]
  • b9dbfcb Switch out fnv in favor of foldhash in test
  • c270e27 Use BuildHasher instead of Hasher in collection macros
  • 0307f60 Resolve question_mark clippy lint in build script
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=serde&package-manager=cargo&previous-version=1.0.215&new-version=1.0.216)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 112ed23bf..1020d15e9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4180,18 +4180,18 @@ checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] name = "serde" -version = "1.0.215" +version = "1.0.216" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f" +checksum = "0b9781016e935a97e8beecf0c933758c97a5520d32930e460142b4cd80c6338e" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.215" +version = "1.0.216" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" +checksum = "46f859dbbf73865c6627ed570e78961cd3ac92407a2d117204c49232485da55e" dependencies = [ "proc-macro2", "quote", From 1f38f1c1ad7cb657f128068d4572a221b5178e6b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Dec 2024 03:30:16 +0000 Subject: [PATCH 197/215] chore(deps): Bump semver from 1.0.23 to 1.0.24 (#1621) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [semver](https://github.com/dtolnay/semver) from 1.0.23 to 1.0.24.
Release notes

Sourced from semver's releases.

1.0.24

  • Optimize Ord impls for semver::Prerelease and semver::BuildMetadata (#328, thanks @​Eh2406)
Commits
  • 6f4069d Release 1.0.24
  • d03aba3 Touch up PR 328
  • 238757d Merge pull request #328 from Eh2406/master
  • 75856ef faster Ord when Eq
  • 89504eb Prevent upload-artifact step from causing CI failure
  • d1b17a9 Upload CI Cargo.lock for reproducing failures
  • 4ea60ae Resolve doc_lazy_continuation clippy lint
  • f96f9d8 Merge pull request #319 from dtolnay/docsrs
  • fc5c98d Rely on docs.rs to define --cfg=docsrs by default
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=semver&package-manager=cargo&previous-version=1.0.23&new-version=1.0.24)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1020d15e9..d9f58a1ce 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4174,9 +4174,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.23" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +checksum = "3cb6eb87a131f756572d7fb904f6e7b68633f09cca868c5df1c4b8d1a694bbba" [[package]] name = "serde" From 5db41266589f828f2f23297fd7c3e5941a4591b8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Dec 2024 03:47:48 +0000 Subject: [PATCH 198/215] chore(deps): Bump subst from 0.3.5 to 0.3.7 (#1619) Bumps [subst](https://github.com/fizyr/subst) from 0.3.5 to 0.3.7.
Changelog

Sourced from subst's changelog.

Version 0.3.7 - 2024-12-13

  • [fix][minor] Fix violation of aliasing rules in TemplateBuf and ByteTemplateBuf.

Version 0.3.6 - 2024-12-13

  • [fix][minor] Fix unsound Clone and Drop implementation of TemplateBuf and ByteTemplateBuf.
Commits
  • ba5fd8d Bump version to 0.3.7.
  • f973c98 Update CHANGELOG.
  • 6f823fa Replace manual transmute with transmute_lifetime().
  • 200c432 Merge pull request #28 from sebschrader/feature/fix-self-referential-ub
  • 0b7314c Merge branch 'main' into feature/fix-self-referential-ub
  • 07bccd5 Revert "Ensure references remain valid after source is moved"
  • 2ba38d8 Merge pull request #30 from fizyr/no-aliasing
  • 28b2e9f Store the wrapped template of TemplateBuf in MaybeUninit.
  • 1aadd38 Add more test for possible undefined behaviour in TemplateBuf.
  • 7d0a5fe Run miri in CI.
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=subst&package-manager=cargo&previous-version=0.3.5&new-version=0.3.7)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d9f58a1ce..0e7cabb44 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4774,9 +4774,9 @@ dependencies = [ [[package]] name = "subst" -version = "0.3.5" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a3c1ba4fd019bc866333a61fe205fc9b686e3cf5971dd8dfc116657d933031c" +checksum = "33e7942675ea19db01ef8cf15a1e6443007208e6c74568bd64162da26d40160d" dependencies = [ "memchr", "serde", From ae2119439375251094f9a41ba0216850c166739e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Dec 2024 03:51:53 +0000 Subject: [PATCH 199/215] chore(deps): Bump rustls from 0.23.19 to 0.23.20 (#1618) Bumps [rustls](https://github.com/rustls/rustls) from 0.23.19 to 0.23.20.
Commits
  • b4628c7 rustls-post-quantum: revert version to 0.2.0
  • 24d08f3 rustls-post-quantum: adjust head doc
  • 179592f verifybench.rs: nightly fmt
  • ef3fc21 nit: remove trailing space from doc comments
  • 00a3ddb fix rustls-provider-example hpke no-std support
  • 2f74c3d server: remove ClientHello constructor
  • 3ba5167 ci: adjust ech-client daily tests
  • f5aeb39 examples: use inner hostname in HTTPS DNS query
  • e232bca openssl-tests: install openssl from source
  • 43cbebb unbuffered: add regression tests for fragmented handshakes
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=rustls&package-manager=cargo&previous-version=0.23.19&new-version=0.23.20)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 12 ++++++------ Cargo.toml | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0e7cabb44..2f38839a8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1406,7 +1406,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -3653,7 +3653,7 @@ dependencies = [ "once_cell", "socket2", "tracing", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -4011,9 +4011,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.19" +version = "0.23.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "934b404430bb06b3fae2cba809eb45a1ab1aecd64491213d7c3301b88393f8d1" +checksum = "5065c3f250cbd332cd894be57c40fa52387247659b14a2d6041d121547903b1b" dependencies = [ "aws-lc-rs", "log", @@ -4887,7 +4887,7 @@ dependencies = [ "fastrand", "once_cell", "rustix", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -5702,7 +5702,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 96451cdc3..7ebad416a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -66,7 +66,7 @@ pprof = { version = "0.13", features = ["flamegraph", "criterion"] } pretty_assertions = "1" regex = "1" rstest = "0.23" -rustls = "0.23.19" +rustls = "0.23.20" # ring feature does not require NASM windows executable, but works slower #rustls = { version = "0.23", default-features = false, features = ["logging", "std", "tls12", "ring"] } rustls-native-certs = "0.8" From 85a0338ccd775a36e9b1577da04cdf224de592db Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Dec 2024 09:31:55 +0000 Subject: [PATCH 200/215] chore(deps): Bump tokio from 1.41.1 to 1.42.0 (#1604) Bumps [tokio](https://github.com/tokio-rs/tokio) from 1.41.1 to 1.42.0.
Release notes

Sourced from tokio's releases.

Tokio v1.42.0

1.42.0 (Dec 3rd, 2024)

Added

  • io: add AsyncFd::{try_io, try_io_mut} (#6967)

Fixed

  • io: avoid ptr->ref->ptr roundtrip in RegistrationSet (#6929)
  • runtime: do not defer yield_now inside block_in_place (#6999)

Changes

  • io: simplify io readiness logic (#6966)

Documented

  • net: fix docs for tokio::net::unix::{pid_t, gid_t, uid_t} (#6791)
  • time: fix a typo in Instant docs (#6982)

#6791: tokio-rs/tokio#6791 #6929: tokio-rs/tokio#6929 #6966: tokio-rs/tokio#6966 #6967: tokio-rs/tokio#6967 #6982: tokio-rs/tokio#6982 #6999: tokio-rs/tokio#6999

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=tokio&package-manager=cargo&previous-version=1.41.1&new-version=1.42.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2f38839a8..36d408f67 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2562,7 +2562,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" dependencies = [ "cfg-if", - "windows-targets 0.52.6", + "windows-targets 0.48.5", ] [[package]] @@ -5095,9 +5095,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.41.1" +version = "1.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cfb5bee7a6a52939ca9224d6ac897bb669134078daa8735560897f69de4d33" +checksum = "5cec9b21b0450273377fc97bd4c33a8acffc8c996c987a7c5b319a0083707551" dependencies = [ "backtrace", "bytes", From 4678a69a9c1cd6d06923fa9ec06987bd5b5db1d5 Mon Sep 17 00:00:00 2001 From: verma nakul Date: Mon, 16 Dec 2024 15:07:32 +0530 Subject: [PATCH 201/215] feat: Updating Group dependency for GitHub Actions and Cargo (#1623) ### What does this PR do? Updating the `.github/dependabot.yml` file to group dependency updates for: - GitHub Actions: All updates will now be grouped under a single PR using the `all-actions` group. - Cargo: Updates will be batched into a single PR using the `all-cargo` group. ### Which issue does this PR Fixes? - Fixes #1622 --------- Co-authored-by: Lucas Co-authored-by: Frank Elsinga --- .github/dependabot.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index ce9e973a2..8212356a9 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -5,9 +5,27 @@ updates: directory: "/" schedule: interval: "daily" + groups: + all-actions-version-updates: + applies-to: version-updates + patterns: + - "*" + all-actions-security-updates: + applies-to: security-updates + patterns: + - "*" - package-ecosystem: cargo directory: "/" schedule: interval: daily time: "02:00" open-pull-requests-limit: 10 + groups: + all-cargo-version-updates: + applies-to: version-updates + patterns: + - "*" + all-cargo-security-updates: + applies-to: security-updates + patterns: + - "*" From 099a6c862f6ff8a0b61b8fa9a931d29a33018be5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 19 Dec 2024 02:48:43 +0000 Subject: [PATCH 202/215] chore(deps): Bump the all-cargo-version-updates group with 2 updates (#1624) Bumps the all-cargo-version-updates group with 2 updates: [deadpool-postgres](https://github.com/bikeshedder/deadpool) and [thiserror](https://github.com/dtolnay/thiserror). Updates `deadpool-postgres` from 0.14.0 to 0.14.1
Commits
  • b438af3 Release deadpool-postgres 0.14.1
  • 2aed3a4 Add missing re-export of LoadBalanceHosts
  • ac5d03d Allow configuring Redis connections via AsyncConnectionConfig
  • eadd120 replaced private sentinel_connection_info field with public node_connection_i...
  • 9862d3f Update Cargo.toml
  • ecdaea2 Fix links in CHANGELOG
  • 3881487 Release deadpool-sqlite 0.9.0
  • ed5b13b Release deadpool-redis 0.18.0
  • 3f7dcbe Update itertools to version 0.13.0
  • 8556502 Update Redis to 0.27.
  • Additional commits viewable in compare view

Updates `thiserror` from 2.0.7 to 2.0.8
Release notes

Sourced from thiserror's releases.

2.0.8

  • Improve support for macro-generated derive(Error) call sites (#399)
Commits

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 36d408f67..a95fb2e18 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1185,9 +1185,9 @@ dependencies = [ [[package]] name = "deadpool-postgres" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ab8a4ea925ce79678034870834602a2980f4b88c09e97feb266496dbb4493d2" +checksum = "3d697d376cbfa018c23eb4caab1fd1883dd9c906a8c034e8d9a3cb06a7e0bef9" dependencies = [ "async-trait", "deadpool", @@ -2701,7 +2701,7 @@ dependencies = [ "static-files", "subst", "testcontainers-modules", - "thiserror 2.0.7", + "thiserror 2.0.8", "tilejson", "tokio", "tokio-postgres-rustls", @@ -2746,7 +2746,7 @@ dependencies = [ "sqlite-compressions", "sqlite-hashes", "sqlx", - "thiserror 2.0.7", + "thiserror 2.0.8", "tilejson", "tokio", "xxhash-rust", @@ -3617,7 +3617,7 @@ dependencies = [ "rustc-hash 2.0.0", "rustls", "socket2", - "thiserror 2.0.7", + "thiserror 2.0.8", "tokio", "tracing", ] @@ -3636,7 +3636,7 @@ dependencies = [ "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.7", + "thiserror 2.0.8", "tinyvec", "tracing", "web-time", @@ -4939,11 +4939,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.7" +version = "2.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93605438cbd668185516ab499d589afb7ee1859ea3d5fc8f6b0755e1c7443767" +checksum = "08f5383f3e0071702bf93ab5ee99b52d26936be9dedd9413067cbdcddcb6141a" dependencies = [ - "thiserror-impl 2.0.7", + "thiserror-impl 2.0.8", ] [[package]] @@ -4959,9 +4959,9 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.7" +version = "2.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d8749b4531af2117677a5fcd12b1348a3fe2b81e36e61ffeac5c4aa3273e36" +checksum = "f2f357fcec90b3caef6623a099691be676d033b40a058ac95d2a6ade6fa0c943" dependencies = [ "proc-macro2", "quote", From 321b7f06bcf9eac6c7ea74c5a1e24343443aeed6 Mon Sep 17 00:00:00 2001 From: Frank Elsinga Date: Fri, 20 Dec 2024 00:36:21 +0100 Subject: [PATCH 203/215] temporary disable macos-13 testcase (#1626) --- .github/workflows/ci.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 38c8147b7..1f0926877 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -318,8 +318,9 @@ jobs: fail-fast: true matrix: include: - - target: x86_64-apple-darwin - os: macos-13 + # temporary disabled due to an issue with homebrew which is difficult to debug + # - target: x86_64-apple-darwin + # os: macos-13 - target: x86_64-pc-windows-msvc os: windows-latest ext: '.exe' From 40fe091c4469d582c8ae28cd420d88ce4ac313ff Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 20 Dec 2024 02:47:56 +0000 Subject: [PATCH 204/215] chore(deps): Bump xxhash-rust from 0.8.12 to 0.8.13 in the all-cargo-version-updates group (#1628) Bumps the all-cargo-version-updates group with 1 update: [xxhash-rust](https://github.com/DoumanAsh/xxhash-rust). Updates `xxhash-rust` from 0.8.12 to 0.8.13
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=xxhash-rust&package-manager=cargo&previous-version=0.8.12&new-version=0.8.13)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a95fb2e18..3dd8eb7f7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5965,9 +5965,9 @@ checksum = "ec7a2a501ed189703dba8b08142f057e887dfc4b2cc4db2d343ac6376ba3e0b9" [[package]] name = "xxhash-rust" -version = "0.8.12" +version = "0.8.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a5cbf750400958819fb6178eaa83bee5cd9c29a26a40cc241df8c70fdd46984" +checksum = "a08fd76779ae1883bbf1e46c2c46a75a0c4e37c445e68a24b01479d438f26ae6" [[package]] name = "yansi" From be642b4a6019d54494fd9134a5da3a3a018e6d96 Mon Sep 17 00:00:00 2001 From: Sam Santi Date: Sat, 21 Dec 2024 22:24:03 -0500 Subject: [PATCH 205/215] Add support for geography columns (#1627) Fixes #1503 --- martin/src/pg/query_tables.rs | 6 +-- .../src/pg/scripts/query_available_tables.sql | 43 +++++++++++++++-- martin/tests/pg_server_test.rs | 2 + martin/tests/pg_table_source_test.rs | 18 ++++++++ tests/expected/auto/catalog_auto.json | 3 ++ tests/expected/auto/save_config.yaml | 13 ++++++ .../martin-cp/flat-with-hash_save_config.yaml | 13 ++++++ .../expected/martin-cp/flat_save_config.yaml | 13 ++++++ .../martin-cp/normalized_save_config.yaml | 13 ++++++ tests/fixtures/tables/table_source_geog.sql | 46 +++++++++++++++++++ tests/test.sh | 2 + 11 files changed, 164 insertions(+), 8 deletions(-) create mode 100644 tests/fixtures/tables/table_source_geog.sql diff --git a/martin/src/pg/query_tables.rs b/martin/src/pg/query_tables.rs index 9aea4d575..6879f4800 100644 --- a/martin/src/pg/query_tables.rs +++ b/martin/src/pg/query_tables.rs @@ -192,7 +192,7 @@ SELECT FROM ( SELECT ST_AsMVTGeom( - ST_Transform(ST_CurveToLine({geometry_column}), 3857), + ST_Transform(ST_CurveToLine({geometry_column}::geometry), 3857), ST_TileEnvelope($1::integer, $2::integer, $3::integer), {extent}, {buffer}, {clip_geom} ) AS geom @@ -223,11 +223,11 @@ async fn calc_bounds( .await? .query_one(&format!( r#" -WITH real_bounds AS (SELECT ST_SetSRID(ST_Extent({geometry_column}), {srid}) AS rb FROM {schema}.{table}) +WITH real_bounds AS (SELECT ST_SetSRID(ST_Extent({geometry_column}::geometry), {srid}) AS rb FROM {schema}.{table}) SELECT ST_Transform( CASE WHEN (SELECT ST_GeometryType(rb) FROM real_bounds LIMIT 1) = 'ST_Point' - THEN ST_SetSRID(ST_Extent(ST_Expand({geometry_column}, 1)), {srid}) + THEN ST_SetSRID(ST_Extent(ST_Expand({geometry_column}::geometry, 1)), {srid}) ELSE (SELECT * FROM real_bounds) END, 4326 diff --git a/martin/src/pg/scripts/query_available_tables.sql b/martin/src/pg/scripts/query_available_tables.sql index 783a0d30e..cbef43c9b 100755 --- a/martin/src/pg/scripts/query_available_tables.sql +++ b/martin/src/pg/scripts/query_available_tables.sql @@ -28,7 +28,8 @@ WITH JOIN pg_opclass op ON op.oid = ix.indclass[0] AND op.opcname IN ('gist_geometry_ops_2d', 'spgist_geometry_ops_2d', - 'brin_geometry_inclusion_ops_2d') + 'brin_geometry_inclusion_ops_2d', + 'gist_geography_ops') GROUP BY 1, 2, 3), -- annotated_geometry_columns AS ( @@ -38,6 +39,7 @@ WITH f_geometry_column AS geom, srid, type, + -- 'geometry' AS column_type COALESCE(class.relkind = 'v', false) AS is_view, bool_or(sic.column_name is not null) as geom_idx FROM geometry_columns @@ -50,6 +52,33 @@ WITH geometry_columns.f_table_name = sic.table_name AND geometry_columns.f_geometry_column = sic.column_name GROUP BY 1, 2, 3, 4, 5, 6), + -- + annotated_geography_columns AS ( + -- list of geography columns with additional metadata + SELECT f_table_schema AS schema, + f_table_name AS name, + f_geography_column AS geom, + srid, + type, + -- 'geography' AS column_type + COALESCE(class.relkind = 'v', false) AS is_view, + bool_or(sic.column_name is not null) as geom_idx + FROM geography_columns + JOIN pg_catalog.pg_class AS class + ON class.relname = geography_columns.f_table_name + JOIN pg_catalog.pg_namespace AS ns + ON ns.nspname = geography_columns.f_table_schema + LEFT JOIN spatially_indexed_columns AS sic ON + geography_columns.f_table_schema = sic.table_schema AND + geography_columns.f_table_name = sic.table_name AND + geography_columns.f_geography_column = sic.column_name + GROUP BY 1, 2, 3, 4, 5, 6), + -- + annotated_geo_columns AS ( + SELECT * FROM annotated_geometry_columns + UNION SELECT * FROM annotated_geography_columns + ), + -- descriptions AS ( -- comments on table/views SELECT @@ -69,12 +98,16 @@ SELECT schema, is_view, geom_idx, COALESCE( - jsonb_object_agg(columns.column_name, columns.type_name) - FILTER (WHERE columns.column_name IS NOT NULL AND columns.type_name != 'geometry'), - '{}'::jsonb + jsonb_object_agg(columns.column_name, columns.type_name) + FILTER ( + WHERE columns.column_name IS NOT NULL + AND columns.type_name != 'geometry' + AND columns.type_name != 'geography' + ), + '{}'::jsonb ) as properties, dc.description -FROM annotated_geometry_columns AS gc +FROM annotated_geo_columns AS gc LEFT JOIN columns ON gc.schema = columns.table_schema AND gc.name = columns.table_name AND diff --git a/martin/tests/pg_server_test.rs b/martin/tests/pg_server_test.rs index 34ca2dc0d..d826f8ff2 100644 --- a/martin/tests/pg_server_test.rs +++ b/martin/tests/pg_server_test.rs @@ -121,6 +121,8 @@ postgres: description: public.points3857.geom table_source: content_type: application/x-protobuf + table_source_geog: + content_type: application/x-protobuf table_source_multiple_geom: content_type: application/x-protobuf description: public.table_source_multiple_geom.geom1 diff --git a/martin/tests/pg_table_source_test.rs b/martin/tests/pg_table_source_test.rs index 817dcc017..5db4b01c2 100644 --- a/martin/tests/pg_table_source_test.rs +++ b/martin/tests/pg_table_source_test.rs @@ -82,6 +82,8 @@ async fn table_source() { description: public.points3857.geom table_source: content_type: application/x-protobuf + table_source_geog: + content_type: application/x-protobuf table_source_multiple_geom: content_type: application/x-protobuf description: public.table_source_multiple_geom.geom1 @@ -106,6 +108,22 @@ async fn table_source() { properties: gid: int4 "); + + let source2 = table(&mock, "table_source_geog"); + assert_yaml_snapshot!(source2, @r" + schema: public + table: table_source_geog + srid: 4326 + geometry_column: geog + bounds: + - -2 + - 0 + - 142.84131509869133 + - 45 + geometry_type: Geometry + properties: + gid: int4 + "); } #[actix_rt::test] diff --git a/tests/expected/auto/catalog_auto.json b/tests/expected/auto/catalog_auto.json index eb755495d..45a230f73 100644 --- a/tests/expected/auto/catalog_auto.json +++ b/tests/expected/auto/catalog_auto.json @@ -156,6 +156,9 @@ "table_source": { "content_type": "application/x-protobuf" }, + "table_source_geog": { + "content_type": "application/x-protobuf" + }, "table_source_multiple_geom": { "content_type": "application/x-protobuf", "description": "public.table_source_multiple_geom.geom1" diff --git a/tests/expected/auto/save_config.yaml b/tests/expected/auto/save_config.yaml index a6fc8d64c..f578a9aab 100644 --- a/tests/expected/auto/save_config.yaml +++ b/tests/expected/auto/save_config.yaml @@ -146,6 +146,19 @@ postgres: geometry_type: GEOMETRY properties: gid: int4 + table_source_geog: + schema: public + table: table_source_geog + srid: 4326 + geometry_column: geog + bounds: + - -2.0 + - 0.0 + - 142.84131509869133 + - 45.0 + geometry_type: Geometry + properties: + gid: int4 table_source_multiple_geom: schema: public table: table_source_multiple_geom diff --git a/tests/expected/martin-cp/flat-with-hash_save_config.yaml b/tests/expected/martin-cp/flat-with-hash_save_config.yaml index e3b1109ea..ea1fb2bf0 100644 --- a/tests/expected/martin-cp/flat-with-hash_save_config.yaml +++ b/tests/expected/martin-cp/flat-with-hash_save_config.yaml @@ -145,6 +145,19 @@ postgres: geometry_type: GEOMETRY properties: gid: int4 + table_source_geog: + schema: public + table: table_source_geog + srid: 4326 + geometry_column: geog + bounds: + - -2.0 + - 0.0 + - 142.84131509869133 + - 45.0 + geometry_type: Geometry + properties: + gid: int4 table_source_multiple_geom: schema: public table: table_source_multiple_geom diff --git a/tests/expected/martin-cp/flat_save_config.yaml b/tests/expected/martin-cp/flat_save_config.yaml index e3b1109ea..ea1fb2bf0 100644 --- a/tests/expected/martin-cp/flat_save_config.yaml +++ b/tests/expected/martin-cp/flat_save_config.yaml @@ -145,6 +145,19 @@ postgres: geometry_type: GEOMETRY properties: gid: int4 + table_source_geog: + schema: public + table: table_source_geog + srid: 4326 + geometry_column: geog + bounds: + - -2.0 + - 0.0 + - 142.84131509869133 + - 45.0 + geometry_type: Geometry + properties: + gid: int4 table_source_multiple_geom: schema: public table: table_source_multiple_geom diff --git a/tests/expected/martin-cp/normalized_save_config.yaml b/tests/expected/martin-cp/normalized_save_config.yaml index e3b1109ea..ea1fb2bf0 100644 --- a/tests/expected/martin-cp/normalized_save_config.yaml +++ b/tests/expected/martin-cp/normalized_save_config.yaml @@ -145,6 +145,19 @@ postgres: geometry_type: GEOMETRY properties: gid: int4 + table_source_geog: + schema: public + table: table_source_geog + srid: 4326 + geometry_column: geog + bounds: + - -2.0 + - 0.0 + - 142.84131509869133 + - 45.0 + geometry_type: Geometry + properties: + gid: int4 table_source_multiple_geom: schema: public table: table_source_multiple_geom diff --git a/tests/fixtures/tables/table_source_geog.sql b/tests/fixtures/tables/table_source_geog.sql new file mode 100644 index 000000000..aacef52bb --- /dev/null +++ b/tests/fixtures/tables/table_source_geog.sql @@ -0,0 +1,46 @@ +DROP TABLE IF EXISTS table_source_geog; +CREATE TABLE table_source_geog(gid serial PRIMARY KEY, geog geography(GEOMETRY, 4326)); + +INSERT INTO table_source_geog(geog) values ('SRID=4326;POINT(0 0)'::geography); +INSERT INTO table_source_geog(geog) values ('SRID=4326;POINT(-2 2)'::geography); +INSERT INTO table_source_geog(geog) values ('SRID=4326;LINESTRING(0 0, 1 1)'::geography); +INSERT INTO table_source_geog(geog) values ('SRID=4326;LINESTRING(2 2, 3 3)'::geography); + +INSERT INTO table_source_geog(geog) values ('SRID=4326;POINT(30 10)'::geography); +INSERT INTO table_source_geog(geog) values ('SRID=4326;LINESTRING(30 10, 10 30, 40 40)'::geography); +INSERT INTO table_source_geog(geog) values ('SRID=4326;POLYGON((30 10, 40 40, 20 40, 10 20, 30 10))'::geography); +INSERT INTO table_source_geog(geog) values ('SRID=4326;POLYGON((35 10, 45 45, 15 40, 10 20, 35 10),(20 30, 35 35, 30 20, 20 30))'::geography); +INSERT INTO table_source_geog(geog) values ('SRID=4326;MULTIPOINT((10 40), (40 30), (20 20), (30 10))'::geography); +INSERT INTO table_source_geog(geog) values ('SRID=4326;MULTIPOINT(10 40, 40 30, 20 20, 30 10)'::geography); +INSERT INTO table_source_geog(geog) values ('SRID=4326;MULTILINESTRING((10 10, 20 20, 10 40),(40 40, 30 30, 40 20, 30 10))'::geography); +INSERT INTO table_source_geog(geog) values ('SRID=4326;MULTIPOLYGON(((30 20, 45 40, 10 40, 30 20)),((15 5, 40 10, 10 20, 5 10, 15 5)))'::geography); +INSERT INTO table_source_geog(geog) values ('SRID=4326;MULTIPOLYGON(((40 40, 20 45, 45 30, 40 40)),((20 35, 10 30, 10 10, 30 5, 45 20, 20 35),(30 20, 20 15, 20 25, 30 20)))'::geography); +INSERT INTO table_source_geog(geog) values ('SRID=4326;GEOMETRYCOLLECTION(POINT(4 6),LINESTRING(4 6,7 10))'::geography); + +-- Curves are not supported in geography columns +-- INSERT INTO table_source_geog(geog) values ('SRID=4326;CIRCULARSTRING(1 5, 6 2, 7 3)'::geography); +-- INSERT INTO table_source_geog(geog) values ('SRID=4326;COMPOUNDCURVE(CIRCULARSTRING(0 0,1 1,1 0),(1 0,0 1))'::geography); +-- INSERT INTO table_source_geog(geog) values ('SRID=4326;CURVEPOLYGON(CIRCULARSTRING(-2 0,-1 -1,0 0,1 -1,2 0,0 2,-2 0),(-1 0,0 0.5,1 0,0 1,-1 0))'::geography); +-- INSERT INTO table_source_geog(geog) values ('SRID=4326;MULTICURVE((5 5,3 5,3 3,0 3),CIRCULARSTRING(0 0,2 1,2 2))'::geography); + +INSERT INTO table_source_geog(geog) values ('SRID=4326;POINT(142.84124343269863 11.927545216212339)'::geography); +INSERT INTO table_source_geog(geog) values ('SRID=4326;POINT(142.84022627741408 11.926919775099435)'::geography); +INSERT INTO table_source_geog(geog) values ('SRID=4326;POINT(142.84116724279622 11.926986082398354)'::geography); +INSERT INTO table_source_geog(geog) values ('SRID=4326;POINT(142.84129834730146 11.926483025982757)'::geography); +INSERT INTO table_source_geog(geog) values ('SRID=4326;POINT(142.84086326293937 11.92741281580712)'::geography); +INSERT INTO table_source_geog(geog) values ('SRID=4326;POINT(142.84083973422645 11.927188724740008)'::geography); +INSERT INTO table_source_geog(geog) values ('SRID=4326;POINT(142.8407405154705 11.92659842381238)'::geography); +INSERT INTO table_source_geog(geog) values ('SRID=4326;POINT(142.84029057105903 11.92711170365923)'::geography); +INSERT INTO table_source_geog(geog) values ('SRID=4326;POINT(142.8403402985401 11.927568375227375)'::geography); +INSERT INTO table_source_geog(geog) values ('SRID=4326;POINT(142.84131509869133 11.92781306544329)'::geography); + +-- DO NOT CREATE INDEX ON GEOGRAPHY COLUMN -- this table is used in a test case + +DO $do$ BEGIN + EXECUTE 'COMMENT ON TABLE table_source_geog IS $tj$' || $$ + { + "description": null, + "foo": {"bar": "foo"} + } + $$::json || '$tj$'; +END $do$; diff --git a/tests/test.sh b/tests/test.sh index 2bf4812bd..ca94d434f 100755 --- a/tests/test.sh +++ b/tests/test.sh @@ -291,6 +291,7 @@ test_jsn fnc_comment function_Mixed_Name kill_process "$MARTIN_PROC_ID" Martin test_log_has_str "$LOG_FILE" 'WARN martin::pg::query_tables] Table public.table_source has no spatial index on column geom' +test_log_has_str "$LOG_FILE" 'WARN martin::pg::query_tables] Table public.table_source_geog has no spatial index on column geog' test_log_has_str "$LOG_FILE" 'WARN martin::fonts] Ignoring duplicate font Overpass Mono Regular from tests' validate_log "$LOG_FILE" remove_line "${TEST_OUT_DIR}/save_config.yaml" " connection_string: " @@ -387,6 +388,7 @@ test_jsn fnc_comment_cfg fnc_Mixed_Name kill_process "$MARTIN_PROC_ID" Martin test_log_has_str "$LOG_FILE" 'WARN martin::pg::query_tables] Table public.table_source has no spatial index on column geom' +test_log_has_str "$LOG_FILE" 'WARN martin::pg::query_tables] Table public.table_source_geog has no spatial index on column geog' test_log_has_str "$LOG_FILE" 'WARN martin::fonts] Ignoring duplicate font Overpass Mono Regular from tests' validate_log "$LOG_FILE" remove_line "${TEST_OUT_DIR}/save_config.yaml" " connection_string: " From 09535cf917708d2d8e60099c516f6ff45f9efdd8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Dec 2024 02:51:12 +0000 Subject: [PATCH 206/215] chore(deps): Bump the all-cargo-version-updates group with 4 updates (#1629) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps the all-cargo-version-updates group with 4 updates: [anyhow](https://github.com/dtolnay/anyhow), [env_logger](https://github.com/rust-cli/env_logger), [serde_json](https://github.com/serde-rs/json) and [thiserror](https://github.com/dtolnay/thiserror). Updates `anyhow` from 1.0.94 to 1.0.95
Release notes

Sourced from anyhow's releases.

1.0.95

Commits
  • 48be1ca Release 1.0.95
  • a03d6d6 Merge pull request #402 from dtolnay/fromboxed
  • 52e4abb Add Error::from_boxed with documentation about bidirectional ?
  • ffecefc Merge pull request #401 from dtolnay/construct
  • 671f700 Add construct_ prefix to name of private construct functions
  • See full diff in compare view

Updates `env_logger` from 0.11.5 to 0.11.6
Release notes

Sourced from env_logger's releases.

v0.11.6

[0.11.6] - 2024-12-20

Features

  • Opt-in file and line rendering
Changelog

Sourced from env_logger's changelog.

[0.11.6] - 2024-12-20

Features

  • Opt-in file and line rendering
Commits
  • dc1a01a chore: Release
  • 65f81b3 docs: Update changelog
  • 7742599 Merge pull request #345 from EriKWDev/main
  • 59229bc fix: Test result of everything enabled has changed
  • b0d4760 spelling + field names
  • 1bad1f5 feature: ability to display source file path and line number with default for...
  • cc97bf7 chore(deps): Update Rust Stable to v1.83 (#343)
  • 240cd21 style: Make clippy happy
  • da7ff82 chore: Update from _rust template
  • ab1d854 chore(deps): Update Rust crate snapbox to v0.6.20 (#342)
  • Additional commits viewable in compare view

Updates `serde_json` from 1.0.133 to 1.0.134
Release notes

Sourced from serde_json's releases.

v1.0.134

  • Add RawValue associated constants for literal null, true, false (#1221, thanks @​bheylin)
Commits
  • b2a1415 Release 1.0.134
  • 9875785 Tweak wording of NULL/TRUE/FALSE documentation
  • 4aa05b9 Merge pull request #1222 from dtolnay/rawvalueassoc
  • f42c7c7 Move RawValue associated constants into same impl block as public functions
  • 96576ba Merge pull request #1221 from bheylin/add-const-raw-values-for-null-and-bools
  • 4db66fb Add 'static lifetime to const's
  • 9c9aa1f Add literal 'null', 'true' and 'false' consts to RawValue struct.
  • See full diff in compare view

Updates `thiserror` from 2.0.8 to 2.0.9
Release notes

Sourced from thiserror's releases.

2.0.9

  • Work around missing_inline_in_public_items clippy restriction being triggered in macro-generated code (#404)
Commits

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3dd8eb7f7..bb0ca8248 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -343,9 +343,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.94" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1fd03a028ef38ba2276dce7e33fcd6369c158a1bca17946c4b1b701891c1ff7" +checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" [[package]] name = "approx" @@ -1382,9 +1382,9 @@ dependencies = [ [[package]] name = "env_logger" -version = "0.11.5" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13fa619b91fb2381732789fc5de83b45675e882f66623b7d8cb4f643017018d" +checksum = "dcaee3d8e3cfc3fd92428d477bc97fc29ec8716d180c0d74c643bb26166660e0" dependencies = [ "anstream", "anstyle", @@ -1406,7 +1406,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -2701,7 +2701,7 @@ dependencies = [ "static-files", "subst", "testcontainers-modules", - "thiserror 2.0.8", + "thiserror 2.0.9", "tilejson", "tokio", "tokio-postgres-rustls", @@ -2746,7 +2746,7 @@ dependencies = [ "sqlite-compressions", "sqlite-hashes", "sqlx", - "thiserror 2.0.8", + "thiserror 2.0.9", "tilejson", "tokio", "xxhash-rust", @@ -3617,7 +3617,7 @@ dependencies = [ "rustc-hash 2.0.0", "rustls", "socket2", - "thiserror 2.0.8", + "thiserror 2.0.9", "tokio", "tracing", ] @@ -3636,7 +3636,7 @@ dependencies = [ "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.8", + "thiserror 2.0.9", "tinyvec", "tracing", "web-time", @@ -3653,7 +3653,7 @@ dependencies = [ "once_cell", "socket2", "tracing", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -4200,9 +4200,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.133" +version = "1.0.134" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" +checksum = "d00f4175c42ee48b15416f6193a959ba3a0d67fc699a0db9ad12df9f83991c7d" dependencies = [ "itoa", "memchr", @@ -4887,7 +4887,7 @@ dependencies = [ "fastrand", "once_cell", "rustix", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -4939,11 +4939,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.8" +version = "2.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f5383f3e0071702bf93ab5ee99b52d26936be9dedd9413067cbdcddcb6141a" +checksum = "f072643fd0190df67a8bab670c20ef5d8737177d6ac6b2e9a236cb096206b2cc" dependencies = [ - "thiserror-impl 2.0.8", + "thiserror-impl 2.0.9", ] [[package]] @@ -4959,9 +4959,9 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.8" +version = "2.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f357fcec90b3caef6623a099691be676d033b40a058ac95d2a6ade6fa0c943" +checksum = "7b50fa271071aae2e6ee85f842e2e28ba8cd2c5fb67f11fcb1fd70b276f9e7d4" dependencies = [ "proc-macro2", "quote", @@ -5702,7 +5702,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.48.0", ] [[package]] From 1ed46b5c7863259963256dcc745157b0e30df99c Mon Sep 17 00:00:00 2001 From: Lucas Date: Mon, 23 Dec 2024 16:38:56 +0800 Subject: [PATCH 207/215] Add basic cog support (#1590) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Try to fix #875 . Still a draft and a lot to discuss and finish. - [ ] Remote file on like S3. We will make it in next PRs. Let's make this PR just a basic start. - [x] Made the padded part transparent - [x] Made the [gdal nodata](https://gdal.org/en/stable/drivers/raster/gtiff.html#nodata-value) transparent - [x] Add tests - [x] Add doc - [x] Support rgb/rgba u8 tif tiled image. We will do others in next PRs and leave this PR simple. ## Color types and bits per smaple |colory type|bits per sample|supported|status| |----|----|----|----| |rgb/rgba|8|✅|| |rgb/rgba|16/32...|🛠️|working on, will be added in next PRs| |gray|8/16/32...|🛠️|working on, will be added in next PRs| ## Comporession The crate we used support these methods. | Compression Format | tiff crate(This PR based on this) | GDAL creation optinos | |--------------------|------------------|----------------| | None | ✓ | ✓ | | LZW | ✓ | ✓ (gdal default) | | JPEG | | ✓ | | Deflate | ✓ | ✓ | | ZSTD | | ✓ | | WEBP | | ✓ | | LERC | | ✓ | | LERC_DEFLATE | | ✓ | | LERC_ZSTD | | ✓ | | LZMA | | ✓ | | PackBits | ✓ | Not sure but couldn't find this on gdal doc | ## Some terms and ref links [7.1.2 Tiles in COG spec](https://docs.ogc.org/is/21-026/21-026.html#_tiles) [Tiff 6.0 spec page 67](https%3A%2F%2Fwww.itu.int%2Fitudoc%2Fitu-t%2Fcom16%2Ftiff-fx%2Fdocs%2Ftiff6.pdf) [Chapter 4 of COG spec](https://docs.ogc.org/is/21-026/21-026.html#_terms_and_definitions) ## Tile and padding > In the context for a TIFF file, Tiling is a strategy for dividing the content in the TIFF file differently than using the classical Strips. Tiles, as defined in the TIFF version 6.0 specification, can be mapped to the ones defined in the OGC Two Dimensional Tile Matrix Set Standard (2D-TMS). For example in 2D-TMS, the TIFF 6.0 forces all tiles to be of the same size. This is possible with the introduction of the concept of padding: if necessary extra blank rows or columns are added to the right-most and bottom-most tile to make them the same shape as other tiles. However, the naming of the TIFF tags used version 6.0 and the property names used in the 2D-TMS differ. The following table provides a mapping between the two standards. | OGC 2D-TMS | TIFF v. 6.0 | Definition | |---------------|--------------|-------------------------------------------------| | TileWidth | TileWidth | The tile width in pixels. The number of columns in each tile | | TileHeight | TileLength | The tile height in pixels. The number of rows in each tile | | MatrixWidth | TilesAcross | Number of tiles in the width direction | | MatrixHeight | TilesDown | Number of tiles in the height direction --------- Co-authored-by: Yuri Astrakhan --- Cargo.lock | 423 +++++++++--------- Cargo.toml | 2 + docs/src/SUMMARY.md | 1 + docs/src/config-file.md | 12 + docs/src/sources-cog-files.md | 104 +++++ martin/Cargo.toml | 7 +- martin/src/args/root.rs | 5 + martin/src/cog/errors.rs | 51 +++ martin/src/cog/mod.rs | 377 ++++++++++++++++ martin/src/config.rs | 17 + martin/src/file_config.rs | 4 + martin/src/lib.rs | 2 + martin/src/utils/error.rs | 4 + tests/config.yaml | 7 + tests/expected/auto/catalog_auto.json | 9 + tests/expected/auto/rgb_u8.json | 8 + tests/expected/auto/rgb_u8_0_0_0.png | Bin 0 -> 3342 bytes tests/expected/auto/rgb_u8_0_0_0.png.txt | 1 + tests/expected/auto/rgb_u8_3_0_0.png | Bin 0 -> 27589 bytes tests/expected/auto/rgb_u8_3_0_0.png.txt | 1 + tests/expected/auto/rgb_u8_3_1_1.png | Bin 0 -> 3093 bytes tests/expected/auto/rgb_u8_3_1_1.png.txt | 1 + tests/expected/auto/rgba_u8.json | 8 + tests/expected/auto/rgba_u8_0_0_0.png | Bin 0 -> 3342 bytes tests/expected/auto/rgba_u8_0_0_0.png.txt | 1 + tests/expected/auto/rgba_u8_3_0_0.png | Bin 0 -> 27589 bytes tests/expected/auto/rgba_u8_3_0_0.png.txt | 1 + tests/expected/auto/rgba_u8_3_1_1.png | Bin 0 -> 3093 bytes tests/expected/auto/rgba_u8_3_1_1.png.txt | 1 + tests/expected/auto/rgba_u8_nodata.json | 8 + tests/expected/auto/rgba_u8_nodata_0_0_0.png | Bin 0 -> 9823 bytes .../auto/rgba_u8_nodata_0_0_0.png.txt | 1 + tests/expected/auto/rgba_u8_nodata_1_0_0.png | Bin 0 -> 17810 bytes .../auto/rgba_u8_nodata_1_0_0.png.txt | 1 + tests/expected/auto/save_config.yaml | 11 + tests/expected/auto_mini/save_config.yaml | 1 + tests/expected/configured/catalog_cfg.json | 9 + tests/expected/configured/save_config.yaml | 5 + .../martin-cp/flat-with-hash_save_config.yaml | 4 + .../expected/martin-cp/flat_save_config.yaml | 4 + .../martin-cp/normalized_save_config.yaml | 4 + tests/fixtures/cog/rgb_u8.tif | Bin 0 -> 62935 bytes tests/fixtures/cog/rgba_u8.tif | Bin 0 -> 70638 bytes tests/fixtures/cog/rgba_u8_nodata.tif | Bin 0 -> 65816 bytes tests/test.sh | 17 +- 45 files changed, 894 insertions(+), 218 deletions(-) create mode 100644 docs/src/sources-cog-files.md create mode 100644 martin/src/cog/errors.rs create mode 100644 martin/src/cog/mod.rs create mode 100644 tests/expected/auto/rgb_u8.json create mode 100644 tests/expected/auto/rgb_u8_0_0_0.png create mode 100644 tests/expected/auto/rgb_u8_0_0_0.png.txt create mode 100644 tests/expected/auto/rgb_u8_3_0_0.png create mode 100644 tests/expected/auto/rgb_u8_3_0_0.png.txt create mode 100644 tests/expected/auto/rgb_u8_3_1_1.png create mode 100644 tests/expected/auto/rgb_u8_3_1_1.png.txt create mode 100644 tests/expected/auto/rgba_u8.json create mode 100644 tests/expected/auto/rgba_u8_0_0_0.png create mode 100644 tests/expected/auto/rgba_u8_0_0_0.png.txt create mode 100644 tests/expected/auto/rgba_u8_3_0_0.png create mode 100644 tests/expected/auto/rgba_u8_3_0_0.png.txt create mode 100644 tests/expected/auto/rgba_u8_3_1_1.png create mode 100644 tests/expected/auto/rgba_u8_3_1_1.png.txt create mode 100644 tests/expected/auto/rgba_u8_nodata.json create mode 100644 tests/expected/auto/rgba_u8_nodata_0_0_0.png create mode 100644 tests/expected/auto/rgba_u8_nodata_0_0_0.png.txt create mode 100644 tests/expected/auto/rgba_u8_nodata_1_0_0.png create mode 100644 tests/expected/auto/rgba_u8_nodata_1_0_0.png.txt create mode 100644 tests/fixtures/cog/rgb_u8.tif create mode 100644 tests/fixtures/cog/rgba_u8.tif create mode 100644 tests/fixtures/cog/rgba_u8_nodata.tif diff --git a/Cargo.lock b/Cargo.lock index bb0ca8248..3871abf25 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -80,7 +80,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -198,7 +198,7 @@ dependencies = [ "actix-router", "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -267,9 +267,9 @@ dependencies = [ [[package]] name = "allocator-api2" -version = "0.2.20" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45862d1c77f2228b9e10bc609d5bc203d86ebc9b87ad8d5d5167a6c9abf739d9" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "android-tzdata" @@ -411,7 +411,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -422,7 +422,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -442,9 +442,9 @@ checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "aws-lc-rs" -version = "1.11.1" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f47bb8cc16b669d267eeccf585aea077d0882f4777b1c1f740217885d6e6e5a3" +checksum = "f409eb70b561706bf8abba8ca9c112729c481595893fd06a2dd9af8ed8441148" dependencies = [ "aws-lc-sys", "paste", @@ -453,9 +453,9 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.23.1" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2101df3813227bbaaaa0b04cd61c534c7954b22bd68d399b440be937dc63ff7" +checksum = "8478a5c29ead3f3be14aff8a202ad965cf7da6856860041bfca271becf8ba48b" dependencies = [ "bindgen", "cc", @@ -524,7 +524,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.89", + "syn 2.0.91", "which", ] @@ -592,9 +592,9 @@ dependencies = [ "futures-util", "hex", "home", - "http 1.1.0", + "http 1.2.0", "http-body-util", - "hyper 1.5.1", + "hyper 1.5.2", "hyper-named-pipe", "hyper-rustls", "hyper-util", @@ -696,9 +696,9 @@ checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytemuck" -version = "1.20.0" +version = "1.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b37c88a63ffd85d15b406896cc343916d7cf57838a847b3a6f2ca5d39a5695a" +checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3" [[package]] name = "byteorder" @@ -735,9 +735,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.2.1" +version = "1.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd9de9f2205d5ef3fd67e685b0df337994ddd4495e2a28d185500d0e1edfea47" +checksum = "c31a0499c1dc64f458ad13872de75c0eb7e3fdb0e67964610c914b034fc5956e" dependencies = [ "jobserver", "libc", @@ -777,9 +777,9 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.38" +version = "0.4.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" dependencies = [ "android-tzdata", "iana-time-zone", @@ -857,7 +857,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -866,16 +866,6 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" -[[package]] -name = "clap_mangen" -version = "0.2.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbae9cbfdc5d4fa8711c09bd7b83f644cb48281ac35bf97af3e47b0675864bdf" -dependencies = [ - "clap", - "roff", -] - [[package]] name = "cmake" version = "0.1.52" @@ -908,14 +898,14 @@ dependencies = [ [[package]] name = "console" -version = "0.15.8" +version = "0.15.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" +checksum = "ea3c6ecd8059b57859df5c69830340ed3c41d30e3da0c1cbed90a96ac853041b" dependencies = [ "encode_unicode", - "lazy_static", "libc", - "windows-sys 0.52.0", + "once_cell", + "windows-sys 0.59.0", ] [[package]] @@ -1058,18 +1048,18 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.13" +version = "0.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" +checksum = "06ba6d68e24814cb8de6bb986db8222d3a027d15872cabc0d18817bc3c0e4471" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-deque" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" dependencies = [ "crossbeam-epoch", "crossbeam-utils", @@ -1086,18 +1076,18 @@ dependencies = [ [[package]] name = "crossbeam-queue" -version = "0.3.11" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" +checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.20" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crunch" @@ -1128,7 +1118,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" dependencies = [ "quote", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -1152,7 +1142,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -1163,7 +1153,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -1236,7 +1226,7 @@ checksum = "8034092389675178f570469e6c3b0465d3d30b4505c294a6550db47f3c17ad18" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -1259,7 +1249,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -1288,7 +1278,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -1325,9 +1315,9 @@ dependencies = [ [[package]] name = "encode_unicode" -version = "0.3.6" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" [[package]] name = "encoding_rs" @@ -1367,14 +1357,14 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] name = "env_filter" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f2c92ceda6ceec50f43169f9ee8424fe2db276791afde7b2cd8bc084cb376ab" +checksum = "186e05a59d4c50738528153b83b0b0194d3a29507dfec16eccd4b342903397d0" dependencies = [ "log", "regex", @@ -1406,7 +1396,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -1439,9 +1429,9 @@ dependencies = [ [[package]] name = "event-listener-strategy" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" +checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2" dependencies = [ "event-listener 5.3.1", "pin-project-lite", @@ -1467,15 +1457,15 @@ checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" [[package]] name = "fastrand" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "486f806e73c5707928240ddc295403b1b93c96a02038563881c4a2fd84b81ac4" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "fdeflate" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07c6f4c64c1d33a3111c4466f7365ebdcc37c5bd1ea0d62aae2e3d722aacbedb" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" dependencies = [ "simd-adler32", ] @@ -1706,7 +1696,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -1811,7 +1801,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.6.0", + "indexmap 2.7.0", "slab", "tokio", "tokio-util", @@ -1918,11 +1908,11 @@ dependencies = [ [[package]] name = "home" -version = "0.5.9" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -1938,9 +1928,9 @@ dependencies = [ [[package]] name = "http" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" dependencies = [ "bytes", "fnv", @@ -1965,7 +1955,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http 1.1.0", + "http 1.2.0", ] [[package]] @@ -1976,7 +1966,7 @@ checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" dependencies = [ "bytes", "futures-util", - "http 1.1.0", + "http 1.2.0", "http-body 1.0.1", "pin-project-lite", ] @@ -2001,9 +1991,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.31" +version = "0.14.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c08302e8fa335b151b788c775ff56e7a03ae64ff85c548ee820fecb70356e85" +checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" dependencies = [ "bytes", "futures-channel", @@ -2024,14 +2014,14 @@ dependencies = [ [[package]] name = "hyper" -version = "1.5.1" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97818827ef4f364230e16705d4706e2897df2bb60617d6ca15d598025a3c481f" +checksum = "256fb8d4bd6413123cc9d91832d78325c48ff41677595be797d90f42969beae0" dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.1.0", + "http 1.2.0", "http-body 1.0.1", "httparse", "httpdate", @@ -2049,7 +2039,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73b7d8abf35697b81a825e386fc151e0d503e8cb5fcb93cc8669c376dfd6f278" dependencies = [ "hex", - "hyper 1.5.1", + "hyper 1.5.2", "hyper-util", "pin-project-lite", "tokio", @@ -2059,13 +2049,13 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.3" +version = "0.27.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" +checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" dependencies = [ "futures-util", - "http 1.1.0", - "hyper 1.5.1", + "http 1.2.0", + "hyper 1.5.2", "hyper-util", "rustls", "rustls-native-certs 0.8.1", @@ -2084,9 +2074,9 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.1.0", + "http 1.2.0", "http-body 1.0.1", - "hyper 1.5.1", + "hyper 1.5.2", "pin-project-lite", "socket2", "tokio", @@ -2102,7 +2092,7 @@ checksum = "986c5ce3b994526b3cd75578e62554abd09f0899d6206de48b3e96ab34ccc8c7" dependencies = [ "hex", "http-body-util", - "hyper 1.5.1", + "hyper 1.5.2", "hyper-util", "pin-project-lite", "tokio", @@ -2247,7 +2237,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -2302,9 +2292,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" dependencies = [ "equivalent", "hashbrown 0.15.2", @@ -2325,7 +2315,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "232929e1d75fe899576a3d5c7416ad0d88dbfbb3c3d6aa00873a7408a50ddb88" dependencies = [ "ahash", - "indexmap 2.6.0", + "indexmap 2.7.0", "is-terminal", "itoa", "log", @@ -2423,10 +2413,11 @@ checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" [[package]] name = "js-sys" -version = "0.3.72" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" dependencies = [ + "once_cell", "wasm-bindgen", ] @@ -2488,7 +2479,7 @@ dependencies = [ "bytes", "futures", "http 0.2.12", - "hyper 0.14.31", + "hyper 0.14.32", "lambda_runtime_api_client", "serde", "serde_json", @@ -2505,7 +2496,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7210012be904051520f0dc502140ba599bae3042b65b3737b87727f1aa88a7d6" dependencies = [ "http 0.2.12", - "hyper 0.14.31", + "hyper 0.14.32", "tokio", "tower-service", ] @@ -2533,36 +2524,36 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.166" +version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2ccc108bbc0b1331bd061864e7cd823c0cab660bbe6970e66e2c0614decde36" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" [[package]] name = "libdeflate-sys" -version = "1.22.0" +version = "1.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f4ae7b48098016dc3bc64a35605668f0af4425ec1a4a175ce2d0c1129067932" +checksum = "413b667c8a795fcbe6287a75a8ce92b1dae928172c716fe95044cb2ec7877941" dependencies = [ "cc", ] [[package]] name = "libdeflater" -version = "1.22.0" +version = "1.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567ff5eb948d34d3f93d8da568e72db0f5a12c89efb6c3913e4d6b142cc7ec34" +checksum = "d78376c917eec0550b9c56c858de50e1b7ebf303116487562e624e63ce51453a" dependencies = [ "libdeflate-sys", ] [[package]] name = "libloading" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" +checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" dependencies = [ "cfg-if", - "windows-targets 0.48.5", + "windows-targets 0.52.6", ] [[package]] @@ -2579,7 +2570,7 @@ checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ "bitflags 2.6.0", "libc", - "redox_syscall 0.5.7", + "redox_syscall 0.5.8", ] [[package]] @@ -2683,6 +2674,7 @@ dependencies = [ "num_cpus", "pbf_font_tools", "pmtiles", + "png", "postgis", "postgres", "postgres-protocol", @@ -2702,6 +2694,7 @@ dependencies = [ "subst", "testcontainers-modules", "thiserror 2.0.9", + "tiff", "tilejson", "tokio", "tokio-postgres-rustls", @@ -2825,9 +2818,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.8.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +checksum = "4ffbe83022cedc1d264172192511ae958937694cd57ce297164951b8b3568394" dependencies = [ "adler2", "simd-adler32", @@ -2835,11 +2828,10 @@ dependencies = [ [[package]] name = "mio" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ - "hermit-abi 0.3.9", "libc", "log", "wasi", @@ -3018,9 +3010,9 @@ dependencies = [ [[package]] name = "object" -version = "0.36.5" +version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ "memchr", ] @@ -3045,22 +3037,19 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "oxipng" -version = "9.1.2" +version = "9.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec25597808aff9f632f018f0fe8985c6f670598ac5241d220a9f2d32ff46812e" +checksum = "aa3202b10a7ffac89508bb091fe420048c47926b37c5ff84d78dc8af7044fa86" dependencies = [ "bitvec", - "clap", - "clap_mangen", "crossbeam-channel", "filetime", - "indexmap 2.6.0", + "indexmap 2.7.0", "libdeflater", "log", "rayon", "rgb", - "rustc-hash 1.1.0", - "rustc_version", + "rustc-hash 2.1.0", "zopfli", ] @@ -3088,7 +3077,7 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.7", + "redox_syscall 0.5.8", "smallvec", "windows-targets 0.52.6", ] @@ -3127,7 +3116,7 @@ dependencies = [ "regex", "regex-syntax 0.7.5", "structmeta 0.2.0", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -3141,7 +3130,7 @@ dependencies = [ "regex", "regex-syntax 0.8.5", "structmeta 0.3.0", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -3237,7 +3226,7 @@ checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -3328,9 +3317,9 @@ dependencies = [ [[package]] name = "png" -version = "0.17.14" +version = "0.17.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52f9d46a34a05a6a57566bc2bfae066ef07585a6e3fa30fbbdff5936380623f0" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" dependencies = [ "bitflags 1.3.2", "crc32fast", @@ -3451,7 +3440,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" dependencies = [ "proc-macro2", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -3505,7 +3494,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "322330e133eab455718444b4e033ebfac7c6528972c784fcde28d2cc783c6257" dependencies = [ "anyhow", - "indexmap 2.6.0", + "indexmap 2.7.0", "log", "protobuf", "protobuf-support", @@ -3582,9 +3571,9 @@ checksum = "7dc55d7dec32ecaf61e0bd90b3d2392d721a28b95cfd23c3e176eccefbeab2f2" [[package]] name = "quanta" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5167a477619228a0b284fac2674e3c388cba90631d7b7de620e6f1fcd08da5" +checksum = "773ce68d0bb9bc7ef20be3536ffe94e223e1f365bd374108b2659fac0c65cfe6" dependencies = [ "crossbeam-utils", "libc", @@ -3614,7 +3603,7 @@ dependencies = [ "pin-project-lite", "quinn-proto", "quinn-udp", - "rustc-hash 2.0.0", + "rustc-hash 2.1.0", "rustls", "socket2", "thiserror 2.0.9", @@ -3632,7 +3621,7 @@ dependencies = [ "getrandom", "rand", "ring", - "rustc-hash 2.0.0", + "rustc-hash 2.1.0", "rustls", "rustls-pki-types", "slab", @@ -3644,16 +3633,16 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.7" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d5a626c6807713b15cac82a6acaccd6043c9a5408c24baae07611fec3f243da" +checksum = "1c40286217b4ba3a71d644d752e6a0b71f13f1b6a2c5311acfcbe0c2418ed904" dependencies = [ "cfg_aliases", "libc", "once_cell", "socket2", "tracing", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -3747,9 +3736,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.7" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" +checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" dependencies = [ "bitflags 2.6.0", ] @@ -3811,10 +3800,10 @@ dependencies = [ "bytes", "futures-core", "futures-util", - "http 1.1.0", + "http 1.2.0", "http-body 1.0.1", "http-body-util", - "hyper 1.5.1", + "hyper 1.5.2", "hyper-rustls", "hyper-util", "ipnet", @@ -3884,12 +3873,6 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "roff" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88f8660c1ff60292143c98d08fc6e2f654d722db50410e3f3797d40baaf9d8f3" - [[package]] name = "roxmltree" version = "0.18.1" @@ -3951,7 +3934,7 @@ dependencies = [ "regex", "relative-path", "rustc_version", - "syn 2.0.89", + "syn 2.0.91", "unicode-ident", ] @@ -3983,9 +3966,9 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustc-hash" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" +checksum = "c7fb8039b3032c191086b10f11f319a6e99e1e82889c5cc6046f515c9db1d497" [[package]] name = "rustc_version" @@ -3998,15 +3981,15 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.41" +version = "0.38.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7f649912bc1495e167a6edee79151c84b1bad49748cb4f1f1167f459f6224f6" +checksum = "f93dc38ecbab2eb790ff964bb77fa94faf256fd3e73285fd7ba0903b76bedb85" dependencies = [ "bitflags 2.6.0", "errno", "libc", "linux-raw-sys", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -4047,7 +4030,7 @@ dependencies = [ "openssl-probe", "rustls-pki-types", "schannel", - "security-framework 3.0.1", + "security-framework 3.1.0", ] [[package]] @@ -4061,9 +4044,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.10.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" +checksum = "d2bf47e6ff922db3825eb750c4e2ff784c6ff8fb9e13046ef6a1d1c5401b0b37" dependencies = [ "web-time", ] @@ -4151,9 +4134,9 @@ dependencies = [ [[package]] name = "security-framework" -version = "3.0.1" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1415a607e92bec364ea2cf9264646dcce0f91e6d65281bd6f2819cca3bf39c8" +checksum = "81d3f8c9bfcc3cbb6b0179eb57042d75b1582bdc65c3cb95f3fa999509c03cbc" dependencies = [ "bitflags 2.6.0", "core-foundation 0.10.0", @@ -4164,9 +4147,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.12.1" +version = "2.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa39c7303dc58b5543c94d22c1766b0d31f2ee58306363ea622b10bbc075eaa2" +checksum = "1863fd3768cd83c56a7f60faa4dc0d403f1b6df0a38c3c25f44b7894e45370d5" dependencies = [ "core-foundation-sys", "libc", @@ -4195,7 +4178,7 @@ checksum = "46f859dbbf73865c6627ed570e78961cd3ac92407a2d117204c49232485da55e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -4218,7 +4201,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -4264,7 +4247,7 @@ dependencies = [ "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.6.0", + "indexmap 2.7.0", "serde", "serde_derive", "serde_json", @@ -4281,7 +4264,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -4290,7 +4273,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.6.0", + "indexmap 2.7.0", "itoa", "ryu", "serde", @@ -4518,7 +4501,7 @@ dependencies = [ "futures-util", "hashlink", "hex", - "indexmap 2.6.0", + "indexmap 2.7.0", "log", "memchr", "once_cell", @@ -4735,7 +4718,7 @@ dependencies = [ "proc-macro2", "quote", "structmeta-derive 0.2.0", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -4747,7 +4730,7 @@ dependencies = [ "proc-macro2", "quote", "structmeta-derive 0.3.0", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -4758,7 +4741,7 @@ checksum = "a60bcaff7397072dca0017d1db428e30d5002e00b6847703e2e42005c95fbe00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -4769,7 +4752,7 @@ checksum = "152a0b65a590ff6c3da95cabe2353ee04e6167c896b28e3b14478c2636c922fc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -4802,9 +4785,9 @@ dependencies = [ [[package]] name = "symbolic-common" -version = "12.12.3" +version = "12.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5ba5365997a4e375660bed52f5b42766475d5bc8ceb1bb13fea09c469ea0f49" +checksum = "cd33e73f154e36ec223c18013f7064a2c120f1162fc086ac9933542def186b00" dependencies = [ "debugid", "memmap2 0.9.5", @@ -4814,9 +4797,9 @@ dependencies = [ [[package]] name = "symbolic-demangle" -version = "12.12.3" +version = "12.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "beff338b2788519120f38c59ff4bb15174f52a183e547bac3d6072c2c0aa48aa" +checksum = "89e51191290147f071777e37fe111800bb82a9059f9c95b19d2dd41bfeddf477" dependencies = [ "cpp_demangle", "rustc-demangle", @@ -4836,9 +4819,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.89" +version = "2.0.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d46482f1c1c87acd84dea20c1bf5ebff4c757009ed6bf19cfd36fb10e92c4e" +checksum = "d53cbcb5a243bd33b7858b1d7f4aca2153490815872d86d955d6ea29f743c035" dependencies = [ "proc-macro2", "quote", @@ -4862,7 +4845,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -4887,7 +4870,7 @@ dependencies = [ "fastrand", "once_cell", "rustix", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -4954,7 +4937,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -4965,7 +4948,18 @@ checksum = "7b50fa271071aae2e6ee85f842e2e28ba8cd2c5fb67f11fcb1fd70b276f9e7d4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.91", +] + +[[package]] +name = "tiff" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" +dependencies = [ + "flate2", + "jpeg-decoder", + "weezl", ] [[package]] @@ -4982,9 +4976,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.36" +version = "0.3.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" dependencies = [ "deranged", "itoa", @@ -5003,9 +4997,9 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" dependencies = [ "num-conv", "time-core", @@ -5059,9 +5053,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" dependencies = [ "tinyvec_macros", ] @@ -5090,7 +5084,7 @@ checksum = "8d9ef545650e79f30233c0003bcc2504d7efac6dad25fca40744de773fe2049c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -5119,7 +5113,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -5165,20 +5159,19 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.0" +version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" +checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" dependencies = [ "rustls", - "rustls-pki-types", "tokio", ] [[package]] name = "tokio-stream" -version = "0.1.16" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f4e6ce100d0eb49a2734f8c0812bcd324cf357d21810932c5df6b96ef2b86f1" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" dependencies = [ "futures-core", "pin-project-lite", @@ -5202,9 +5195,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.12" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" +checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" dependencies = [ "bytes", "futures-core", @@ -5234,7 +5227,7 @@ version = "0.22.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ - "indexmap 2.6.0", + "indexmap 2.7.0", "toml_datetime", "winnow", ] @@ -5286,7 +5279,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -5330,9 +5323,9 @@ checksum = "7e51b68083f157f853b6379db119d1c1be0e6e4dec98101079dec41f6f5cf6df" [[package]] name = "unicode-bidi" -version = "0.3.17" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-bidi-mirroring" @@ -5566,9 +5559,9 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" +checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" dependencies = [ "cfg-if", "once_cell", @@ -5577,36 +5570,36 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" +checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.91", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.45" +version = "0.4.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" +checksum = "38176d9b44ea84e9184eff0bc34cc167ed044f816accfe5922e54d84cf48eca2" dependencies = [ "cfg-if", "js-sys", + "once_cell", "wasm-bindgen", "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" +checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -5614,28 +5607,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" +checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.91", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" +checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" [[package]] name = "web-sys" -version = "0.3.72" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" +checksum = "04dd7223427d52553d3702c004d3b2fe07c148165faa56313cb00211e31c12bc" dependencies = [ "js-sys", "wasm-bindgen", @@ -5675,7 +5668,7 @@ version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "372d5b87f58ec45c384ba03563b03544dc5fadc3983e434b286913f5b4a9bb6d" dependencies = [ - "redox_syscall 0.5.7", + "redox_syscall 0.5.8", "wasite", "web-sys", ] @@ -5702,7 +5695,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] @@ -5995,7 +5988,7 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.91", "synstructure", ] @@ -6017,7 +6010,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -6037,7 +6030,7 @@ checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.91", "synstructure", ] @@ -6058,7 +6051,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -6080,7 +6073,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 7ebad416a..1d5da5fb3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -59,6 +59,7 @@ moka = { version = "0.12", features = ["future"] } num_cpus = "1" pbf_font_tools = { version = "2.5.1", features = ["freetype"] } pmtiles = { version = "0.11", features = ["http-async", "mmap-async-tokio", "tilejson", "reqwest-rustls-tls-native-roots"] } +png = "0.17.14" postgis = "0.9" postgres = { version = "0.19", features = ["with-time-0_3", "with-uuid-1", "with-serde_json-1"] } postgres-protocol = "0.6" @@ -85,6 +86,7 @@ static-files = "0.2" subst = { version = "0.3", features = ["yaml"] } testcontainers-modules = { version = "0.11.4", features = ["postgres"] } thiserror = "2" +tiff = "0.9.1" tile-grid = "0.6" tilejson = "0.4" tokio = { version = "1", features = ["macros"] } diff --git a/docs/src/SUMMARY.md b/docs/src/SUMMARY.md index d7e9e525f..f644ffb93 100644 --- a/docs/src/SUMMARY.md +++ b/docs/src/SUMMARY.md @@ -20,6 +20,7 @@ - [PostgreSQL Table Sources](sources-pg-tables.md) - [PostgreSQL Function Sources](sources-pg-functions.md) - [MBTiles and PMTiles File Sources](sources-files.md) + - [Cloud Optimized GeoTIFF File Sources](sources-cog-files.md) - [Composite Sources](sources-composite.md) - [Sprite Sources](sources-sprites.md) - [Font Sources](sources-fonts.md) diff --git a/docs/src/config-file.md b/docs/src/config-file.md index 11d7a5402..0749063e3 100644 --- a/docs/src/config-file.md +++ b/docs/src/config-file.md @@ -199,6 +199,18 @@ mbtiles: # named source matching source name to a single file mb-src1: /path/to/mbtiles1.mbtiles +# Cloud Optimized GeoTIFF File Sources +cog: + paths: + # scan this whole dir, matching all *.tif files + - /dir-path + # specific TIFF file will be published as a cog source + - /path/to/cogfile.tif + sources: + # named source matching source name to a single file + cog-src1: /path/to/cog1.tif + cog-src2: /path/to/cog2.tif + # Sprite configuration sprites: paths: diff --git a/docs/src/sources-cog-files.md b/docs/src/sources-cog-files.md new file mode 100644 index 000000000..70ee4b9f7 --- /dev/null +++ b/docs/src/sources-cog-files.md @@ -0,0 +1,104 @@ +# Cloud Optimized GeoTIFF File Sources + +Martin can also serve raster sources like local [COG(Cloud Optimized GeoTIFF)](https://cogeo.org/) files. For cog on remote like S3 and other improvements, you could track them on [issue 875](https://github.com/maplibre/martin/issues/875), we are working on and welcome any assistance. + +## Supported colortype and bits per sample + +| colory type | bits per sample | supported | status | +| ----------- | --------------- | --------- | ---------- | +| rgb/rgba | 8 | ✅ | | +| rgb/rgba | 16/32... | 🛠️ | working on | +| gray | 8/16/32... | 🛠️ | working on | + +## Supported compression + +* None +* LZW +* Deflate +* PackBits + +## Run Martin with CLI to serve cog files + +```bash +# Configured with a directory containing TIFF files. +martin /with/tiff/dir1 /with/tiff/dir2 +# Configured with dedicated TIFF file. +martin /path/to/target1.tif /path/to/target1.tif +# Configured with a combination of directories and dedicated TIFF files. +martin /with/tiff/files /path/to/target.tif +``` + +## Run Martin with configuration file + +```yml +keep_alive: 75 + +# The socket address to bind [default: 0.0.0.0:3000] +listen_addresses: '0.0.0.0:3000' + +# Number of web server workers +worker_processes: 8 + +# Amount of memory (in MB) to use for caching tiles [default: 512, 0 to disable] +cache_size_mb: 8 + +# Database configuration. This can also be a list of PG configs. + +cog: + paths: + # scan this whole dir, matching all *.tif files + - /dir-path + # specific TIFF file will be published as a cog source + - /path/to/target1.tif + - /path/to/target2.tif + sources: + # named source matching source name to a single file + cog-src1: /path/to/cog1.tif + cog-src2: /path/to/cog2.tif +``` + +## About COG + +[COG](https://cogeo.org/) is just Cloud Optimized GeoTIFF file. + +TIFF is an image file format. TIFF tags are something like key-value pairs inside to describe the metadata about a TIFF file, ike `ImageWidth`, `ImageLength`, etc. + +GeoTIFF is a valid TIFF file with a set of TIFF tags to describe the 'Cartographic' information associated with it. + +COG is a valid GeoTIFF file with some requirements for efficient reading. That is, all COG files are valid GeoTIFF files, but not all GeoTIFF files are valid COG files. For quick access to tiles in TIFF files, Martin relies on the requirements/recommendations(like the [requirement about Reduced-Resolution Subfiles](https://docs.ogc.org/is/21-026/21-026.html#_requirement_reduced_resolution_subfiles) and [the content dividing strategy](https://docs.ogc.org/is/21-026/21-026.html#_tiles)) so we use the term `COG` over `GeoTIFF` in our documentation and configuration files. + +You may want to visit these specs: + +* [TIFF 6.0](https://www.itu.int/itudoc/itu-t/com16/tiff-fx/docs/tiff6.pdf) +* [GeoTIFF](https://docs.ogc.org/is/19-008r4/19-008r4.html) +* [Cloud Optimized GeoTIFF](https://docs.ogc.org/is/21-026/21-026.html) + +### COG generation with GDAL + +You could generate cog with `gdal_translate` or `gdalwarp`. See more details in [gdal doc](https://gdal.org/en/latest/drivers/raster/cog.html). + +```bash +# gdal-bin installation +# sudo apt update +# sudo apt install gdal-bin + +# gdalwarp +gdalwarp src1.tif src2.tif out.tif -of COG + +# or gdal_translate +gdal_translate input.tif output_cog.tif -of COG +``` + +### The mapping from ZXY to tiff chunk + +* A single TIFF file could contains many sub-file about same spatial area, each has different resolution +* A sub file is organized with many tiles + +So basically there's a mapping from zxy to tile of sub-file of TIFF. + +| zxy | mapping to | +| ---------- | --------------------------- | +| Zoom level | which sub-file in TIFF file | +| X and Y | which tile in subfile | + +Clients could read only the header part of COG to figure out the mapping from zxy to the chunk number and the subfile number. Martin get tile to frontend by this mapping. diff --git a/martin/Cargo.toml b/martin/Cargo.toml index 28dc1c4d8..d756837e8 100644 --- a/martin/Cargo.toml +++ b/martin/Cargo.toml @@ -59,12 +59,13 @@ name = "bench" harness = false [features] -default = ["webui", "fonts", "lambda", "mbtiles", "pmtiles", "postgres", "sprites"] +default = ["webui", "fonts", "lambda", "mbtiles", "pmtiles", "cog", "postgres", "sprites"] webui = ["dep:actix-web-static-files", "dep:static-files"] fonts = ["dep:bit-set", "dep:pbf_font_tools"] lambda = ["dep:lambda-web"] mbtiles = ["dep:mbtiles"] pmtiles = ["dep:pmtiles"] +cog = ["dep:tiff", "dep:png"] postgres = ["dep:deadpool-postgres", "dep:json-patch", "dep:postgis", "dep:postgres", "dep:postgres-protocol", "dep:semver", "dep:tokio-postgres-rustls"] sprites = ["dep:spreet", "tokio/fs"] bless-tests = [] @@ -93,6 +94,7 @@ moka.workspace = true num_cpus.workspace = true pbf_font_tools = { workspace = true, optional = true } pmtiles = { workspace = true, optional = true } +png= { workspace = true, optional = true } postgis = { workspace = true, optional = true } postgres = { workspace = true, optional = true } postgres-protocol = { workspace = true, optional = true } @@ -101,14 +103,15 @@ rustls-native-certs.workspace = true rustls-pemfile.workspace = true rustls.workspace = true semver = { workspace = true, optional = true } -serde.workspace = true serde_json.workspace = true serde_with.workspace = true serde_yaml.workspace = true +serde.workspace = true spreet = { workspace = true, optional = true } static-files = { workspace = true, optional = true } subst.workspace = true thiserror.workspace = true +tiff= { workspace = true, optional = true } tilejson.workspace = true tokio = { workspace = true, features = ["io-std"] } tokio-postgres-rustls = { workspace = true, optional = true } diff --git a/martin/src/args/root.rs b/martin/src/args/root.rs index 7bcda8103..040d1e05f 100644 --- a/martin/src/args/root.rs +++ b/martin/src/args/root.rs @@ -107,6 +107,11 @@ impl Args { config.mbtiles = parse_file_args(&mut cli_strings, "mbtiles", false); } + #[cfg(feature = "cog")] + if !cli_strings.is_empty() { + config.cog = parse_file_args(&mut cli_strings, "tif", false); + } + #[cfg(feature = "sprites")] if !self.extras.sprite.is_empty() { config.sprites = FileConfigEnum::new(self.extras.sprite); diff --git a/martin/src/cog/errors.rs b/martin/src/cog/errors.rs new file mode 100644 index 000000000..c78529b78 --- /dev/null +++ b/martin/src/cog/errors.rs @@ -0,0 +1,51 @@ +use std::path::PathBuf; + +use png::EncodingError; +use tiff::TiffError; + +#[derive(thiserror::Error, Debug)] +pub enum CogError { + #[error("Couldn't decode {1} as tiff file: {0}")] + InvalidTiffFile(TiffError, PathBuf), + + #[error("Requested zoom level {0} from file {1} is out of range. Possible zoom levels are {2} to {3}")] + ZoomOutOfRange(u8, PathBuf, u8, u8), + + #[error("Couldn't find any image in the tiff file: {0}")] + NoImagesFound(PathBuf), + + #[error("Couldn't seek to ifd number {1} (0 based indexing) in tiff file {2}: {0}")] + IfdSeekFailed(TiffError, usize, PathBuf), + + #[error("Too many images in the tiff file: {0}")] + TooManyImages(PathBuf), + + #[error("Couldn't find tags {1:?} at ifd {2} of tiff file {3}: {0}")] + TagsNotFound(TiffError, Vec, usize, PathBuf), + + #[error( + "Unsupported planar configuration {2} at IFD {1} in TIFF file {0}. Only planar configuration 1 is supported." + )] + PlanarConfigurationNotSupported(PathBuf, usize, u16), + + #[error("Failed to read {1}th chunk(0 based index) at ifd {2} from tiff file {3}: {0}")] + ReadChunkFailed(TiffError, u32, usize, PathBuf), + + #[error("Failed to write header of png file at {0}: {1}")] + WritePngHeaderFailed(PathBuf, EncodingError), + + #[error("Failed to write pixel bytes to png file at {0}: {1}")] + WriteToPngFailed(PathBuf, EncodingError), + + #[error("The color type {0:?} and its bit depth of the tiff file {1} is not supported yet")] + NotSupportedColorTypeAndBitDepth(tiff::ColorType, PathBuf), + + #[error("Couldn't parse the {0} value in gdal metadata(tiff tag 42112) from {1}")] + ParseSTATISTICSValueFailed(String, PathBuf), + + #[error("The gdal metadata(tiff tag 42112) from {1} is not valid: {0}")] + InvalidGdalMetaData(String, PathBuf), + + #[error("Striped tiff file is not supported, the tiff file is {0}")] + NotSupportedChunkType(PathBuf), +} diff --git a/martin/src/cog/mod.rs b/martin/src/cog/mod.rs new file mode 100644 index 000000000..b3794303b --- /dev/null +++ b/martin/src/cog/mod.rs @@ -0,0 +1,377 @@ +mod errors; + +pub use errors::CogError; + +use std::collections::HashMap; +use std::fs::File; +use std::path::Path; +use std::vec; +use std::{fmt::Debug, path::PathBuf}; + +use std::io::BufWriter; +use tiff::decoder::{ChunkType, Decoder, DecodingResult}; +use tiff::tags::Tag::{self, GdalNodata}; + +use async_trait::async_trait; +use martin_tile_utils::{Format, TileCoord, TileInfo}; +use serde::{Deserialize, Serialize}; +use tilejson::{tilejson, TileJSON}; +use url::Url; + +use crate::file_config::FileError; +use crate::{ + config::UnrecognizedValues, + file_config::{ConfigExtras, FileResult, SourceConfigExtras}, + MartinResult, Source, TileData, UrlQuery, +}; + +#[derive(Clone, Debug)] +pub struct CogSource { + id: String, + path: PathBuf, + meta: Meta, + tilejson: TileJSON, + tileinfo: TileInfo, +} + +#[derive(Clone, Debug)] +struct Meta { + min_zoom: u8, + max_zoom: u8, + zoom_and_ifd: HashMap, + zoom_and_tile_across_down: HashMap, + nodata: Option, +} + +#[async_trait] +impl Source for CogSource { + fn get_id(&self) -> &str { + &self.id + } + + fn get_tilejson(&self) -> &TileJSON { + &self.tilejson + } + + fn get_tile_info(&self) -> TileInfo { + self.tileinfo + } + + fn clone_source(&self) -> Box { + Box::new(self.clone()) + } + + #[allow(clippy::cast_sign_loss)] + #[allow(clippy::cast_possible_truncation)] + #[allow(clippy::too_many_lines)] + async fn get_tile( + &self, + xyz: TileCoord, + _url_query: Option<&UrlQuery>, + ) -> MartinResult { + let tif_file = + File::open(&self.path).map_err(|e| FileError::IoError(e, self.path.clone()))?; + let mut decoder = + Decoder::new(tif_file).map_err(|e| CogError::InvalidTiffFile(e, self.path.clone()))?; + decoder = decoder.with_limits(tiff::decoder::Limits::unlimited()); + + let ifd = self.meta.zoom_and_ifd.get(&(xyz.z)).ok_or_else(|| { + CogError::ZoomOutOfRange( + xyz.z, + self.path.clone(), + self.meta.min_zoom, + self.meta.max_zoom, + ) + })?; + + decoder + .seek_to_image(*ifd) + .map_err(|e| CogError::IfdSeekFailed(e, *ifd, self.path.clone()))?; + + let tiles_across = self + .meta + .zoom_and_tile_across_down + .get(&(xyz.z)) + .ok_or_else(|| { + CogError::ZoomOutOfRange( + xyz.z, + self.path.clone(), + self.meta.min_zoom, + self.meta.max_zoom, + ) + })? + .0; + let tile_idx = xyz.y * tiles_across + xyz.x; + let decode_result = decoder + .read_chunk(tile_idx) + .map_err(|e| CogError::ReadChunkFailed(e, tile_idx, *ifd, self.path.clone()))?; + let color_type = decoder + .colortype() + .map_err(|e| CogError::InvalidTiffFile(e, self.path.clone()))?; + + let tile_width = decoder.chunk_dimensions().0; + let tile_height = decoder.chunk_dimensions().1; + let (data_width, data_height) = decoder.chunk_data_dimensions(tile_idx); + + //do more research on the not u8 case, is this the right way to do it? + let png_file_bytes = match (decode_result, color_type) { + (DecodingResult::U8(vec), tiff::ColorType::RGB(_)) => rgb_to_png( + vec, + (tile_width, tile_height), + (data_width, data_height), + 3, + self.meta.nodata.map(|v| v as u8), + &self.path, + ), + (DecodingResult::U8(vec), tiff::ColorType::RGBA(_)) => rgb_to_png( + vec, + (tile_width, tile_height), + (data_width, data_height), + 4, + self.meta.nodata.map(|v| v as u8), + &self.path, + ), + (_, _) => Err(CogError::NotSupportedColorTypeAndBitDepth( + color_type, + self.path.clone(), + )), + // do others in next PRs, a lot of disscussion would be needed + }?; + Ok(png_file_bytes) + } +} + +fn rgb_to_png( + vec: Vec, + (tile_width, tile_height): (u32, u32), + (data_width, data_height): (u32, u32), + chunk_components_count: u32, + nodata: Option, + path: &Path, +) -> Result, CogError> { + let is_padded = data_width != tile_width; + let need_add_alpha = chunk_components_count != 4; + + let pixels = if nodata.is_some() || need_add_alpha || is_padded { + let mut result_vec = vec![0; (tile_width * tile_height * 4) as usize]; + for row in 0..data_height { + 'outer: for col in 0..data_width { + let idx_chunk = + row * data_width * chunk_components_count + col * chunk_components_count; + let idx_result = row * tile_width * 4 + col * 4; + for component_idx in 0..chunk_components_count { + if nodata.eq(&Some(vec[(idx_chunk + component_idx) as usize])) { + //This pixel is nodata, just make it transparent and skip it then + let alpha_idx = (idx_result + 3) as usize; + result_vec[alpha_idx] = 0; + continue 'outer; + } + result_vec[(idx_result + component_idx) as usize] = + vec[(idx_chunk + component_idx) as usize]; + } + if need_add_alpha { + let alpha_idx = (idx_result + 3) as usize; + result_vec[alpha_idx] = 255; + } + } + } + result_vec + } else { + vec + }; + let mut result_file_buffer = Vec::new(); + { + let mut encoder = png::Encoder::new( + BufWriter::new(&mut result_file_buffer), + tile_width, + tile_height, + ); + encoder.set_color(png::ColorType::Rgba); + encoder.set_depth(png::BitDepth::Eight); + let mut writer = encoder + .write_header() + .map_err(|e| CogError::WritePngHeaderFailed(path.to_path_buf(), e))?; + writer + .write_image_data(&pixels) + .map_err(|e| CogError::WriteToPngFailed(path.to_path_buf(), e))?; + } + Ok(result_file_buffer) +} + +#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)] +pub struct CogConfig { + #[serde(flatten)] + pub unrecognized: UnrecognizedValues, +} + +impl ConfigExtras for CogConfig { + fn get_unrecognized(&self) -> &UnrecognizedValues { + &self.unrecognized + } +} + +impl SourceConfigExtras for CogConfig { + async fn new_sources(&self, id: String, path: PathBuf) -> FileResult> { + let tileinfo = TileInfo::new(Format::Png, martin_tile_utils::Encoding::Uncompressed); + let meta = get_meta(&path)?; + let tilejson = tilejson! { + tiles: vec![], + minzoom: meta.min_zoom, + maxzoom: meta.max_zoom + }; + Ok(Box::new(CogSource { + id, + path, + meta, + tilejson, + tileinfo, + })) + } + + #[allow(clippy::no_effect_underscore_binding)] + async fn new_sources_url(&self, _id: String, _url: Url) -> FileResult> { + unreachable!() + } + + fn parse_urls() -> bool { + false + } +} + +fn get_meta(path: &PathBuf) -> Result { + let tif_file = File::open(path).map_err(|e| FileError::IoError(e, path.clone()))?; + let mut decoder = Decoder::new(tif_file) + .map_err(|e| CogError::InvalidTiffFile(e, path.clone()))? + .with_limits(tiff::decoder::Limits::unlimited()); + + let chunk_type = decoder.get_chunk_type(); + + if chunk_type != ChunkType::Tile { + Err(CogError::NotSupportedChunkType(path.clone()))?; + } + + let color_type = decoder + .colortype() + .map_err(|e| CogError::InvalidTiffFile(e, path.clone()))?; + + if !matches!( + color_type, + tiff::ColorType::RGB(8) | tiff::ColorType::RGBA(8) + ) { + Err(CogError::NotSupportedColorTypeAndBitDepth( + color_type, + path.clone(), + ))?; + } + + decoder + .get_tag_unsigned(Tag::PlanarConfiguration) + .map_err(|e| { + CogError::TagsNotFound(e, vec![Tag::PlanarConfiguration.to_u16()], 0, path.clone()) + }) + .and_then(|config| { + if config == 1 { + Ok(()) + } else { + Err(CogError::PlanarConfigurationNotSupported( + path.clone(), + 0, + config, + )) + } + })?; + + let tag = decoder.get_tag_ascii_string(GdalNodata); + let nodata: Option = if let Ok(nodata_tag) = tag { + nodata_tag.parse().ok() + } else { + None + }; + let images_ifd = get_images_ifd(&mut decoder); + + let mut zoom_and_ifd: HashMap = HashMap::new(); + let mut zoom_and_tile_across_down: HashMap = HashMap::new(); + + for image_ifd in &images_ifd { + decoder + .seek_to_image(*image_ifd) + .map_err(|e| CogError::IfdSeekFailed(e, *image_ifd, path.clone()))?; + + let zoom = u8::try_from(images_ifd.len() - (image_ifd + 1)) + .map_err(|_| CogError::TooManyImages(path.clone()))?; + + let (tiles_across, tiles_down) = get_grid_dims(&mut decoder, path, *image_ifd)?; + + zoom_and_ifd.insert(zoom, *image_ifd); + zoom_and_tile_across_down.insert(zoom, (tiles_across, tiles_down)); + } + + let min_zoom = zoom_and_ifd + .keys() + .min() + .ok_or_else(|| CogError::NoImagesFound(path.clone()))?; + + let max_zoom = zoom_and_ifd + .keys() + .max() + .ok_or_else(|| CogError::NoImagesFound(path.clone()))?; + Ok(Meta { + min_zoom: *min_zoom, + max_zoom: *max_zoom, + zoom_and_ifd, + zoom_and_tile_across_down, + nodata, + }) +} + +fn get_grid_dims( + decoder: &mut Decoder, + path: &Path, + image_ifd: usize, +) -> Result<(u32, u32), FileError> { + let (tile_width, tile_height) = (decoder.chunk_dimensions().0, decoder.chunk_dimensions().1); + let (image_width, image_length) = get_image_dims(decoder, path, image_ifd)?; + let tiles_across = image_width.div_ceil(tile_width); + let tiles_down = image_length.div_ceil(tile_height); + + Ok((tiles_across, tiles_down)) +} + +fn get_image_dims( + decoder: &mut Decoder, + path: &Path, + image_ifd: usize, +) -> Result<(u32, u32), FileError> { + let (image_width, image_length) = decoder.dimensions().map_err(|e| { + CogError::TagsNotFound( + e, + vec![Tag::ImageWidth.to_u16(), Tag::ImageLength.to_u16()], + image_ifd, + path.to_path_buf(), + ) + })?; + + Ok((image_width, image_length)) +} + +fn get_images_ifd(decoder: &mut Decoder) -> Vec { + let mut res = vec![]; + let mut ifd_idx = 0; + loop { + let is_image = decoder + .get_tag_u32(Tag::NewSubfileType) + .map_or_else(|_| true, |v| v & 4 != 4); + if is_image { + //todo We should not ignore mask in the next PRs + res.push(ifd_idx); + } + + ifd_idx += 1; + + let next_res = decoder.seek_to_image(ifd_idx); + if next_res.is_err() { + break; + } + } + res +} diff --git a/martin/src/config.rs b/martin/src/config.rs index eff279dc8..4e9ca02f8 100644 --- a/martin/src/config.rs +++ b/martin/src/config.rs @@ -54,6 +54,10 @@ pub struct Config { #[serde(default, skip_serializing_if = "FileConfigEnum::is_none")] pub mbtiles: FileConfigEnum, + #[cfg(feature = "cog")] + #[serde(default, skip_serializing_if = "FileConfigEnum::is_none")] + pub cog: FileConfigEnum, + #[cfg(feature = "sprites")] #[serde(default, skip_serializing_if = "FileConfigEnum::is_none")] pub sprites: FileConfigEnum, @@ -86,6 +90,9 @@ impl Config { #[cfg(feature = "mbtiles")] res.extend(self.mbtiles.finalize("mbtiles.")?); + #[cfg(feature = "cog")] + res.extend(self.cog.finalize("cog.")?); + #[cfg(feature = "sprites")] res.extend(self.sprites.finalize("sprites.")?); @@ -103,6 +110,9 @@ impl Config { #[cfg(feature = "mbtiles")] let is_empty = is_empty && self.mbtiles.is_empty(); + #[cfg(feature = "cog")] + let is_empty = is_empty && self.cog.is_empty(); + #[cfg(feature = "sprites")] let is_empty = is_empty && self.sprites.is_empty(); @@ -179,6 +189,13 @@ impl Config { sources.push(Box::pin(val)); } + #[cfg(feature = "cog")] + if !self.cog.is_empty() { + let cfg = &mut self.cog; + let val = crate::file_config::resolve_files(cfg, idr, cache.clone(), "tif"); + sources.push(Box::pin(val)); + } + Ok(TileSources::new(try_join_all(sources).await?)) } diff --git a/martin/src/file_config.rs b/martin/src/file_config.rs index c9d9f052b..1196c84fe 100644 --- a/martin/src/file_config.rs +++ b/martin/src/file_config.rs @@ -45,6 +45,10 @@ pub enum FileError { #[cfg(feature = "pmtiles")] #[error(r#"PMTiles error {0} processing {1}"#)] PmtError(pmtiles::PmtError, String), + + #[cfg(feature = "cog")] + #[error(transparent)] + CogError(#[from] crate::cog::CogError), } pub trait ConfigExtras: Clone + Debug + Default + PartialEq + Send { diff --git a/martin/src/lib.rs b/martin/src/lib.rs index 59548426a..bddd5fab1 100644 --- a/martin/src/lib.rs +++ b/martin/src/lib.rs @@ -14,6 +14,8 @@ pub use utils::{ }; pub mod args; +#[cfg(feature = "cog")] +pub mod cog; pub mod file_config; #[cfg(feature = "fonts")] pub mod fonts; diff --git a/martin/src/utils/error.rs b/martin/src/utils/error.rs index b061daaa1..155f3e628 100644 --- a/martin/src/utils/error.rs +++ b/martin/src/utils/error.rs @@ -64,6 +64,10 @@ pub enum MartinError { #[error(transparent)] MbtilesError(#[from] mbtiles::MbtError), + #[cfg(feature = "cog")] + #[error(transparent)] + CogError(#[from] crate::cog::CogError), + #[error(transparent)] FileError(#[from] crate::file_config::FileError), diff --git a/tests/config.yaml b/tests/config.yaml index 70b08a05c..d963453da 100644 --- a/tests/config.yaml +++ b/tests/config.yaml @@ -180,6 +180,13 @@ sprites: sources: mysrc: tests/fixtures/sprites/src2 +cog: + paths: + - tests/fixtures/cog/rgba_u8_nodata.tif + sources: + cog-src1: tests/fixtures/cog/rgba_u8.tif + cog-src2: tests/fixtures/cog/rgb_u8.tif + fonts: - tests/fixtures/fonts/overpass-mono-regular.ttf - tests/fixtures/fonts diff --git a/tests/expected/auto/catalog_auto.json b/tests/expected/auto/catalog_auto.json index 45a230f73..a4efa942b 100644 --- a/tests/expected/auto/catalog_auto.json +++ b/tests/expected/auto/catalog_auto.json @@ -150,6 +150,15 @@ "content_type": "application/x-protobuf", "description": "public.points_empty_srid.geom" }, + "rgb_u8": { + "content_type": "image/png" + }, + "rgba_u8": { + "content_type": "image/png" + }, + "rgba_u8_nodata": { + "content_type": "image/png" + }, "stamen_toner__raster_CC-BY-ODbL_z3": { "content_type": "image/png" }, diff --git a/tests/expected/auto/rgb_u8.json b/tests/expected/auto/rgb_u8.json new file mode 100644 index 000000000..a159d60c5 --- /dev/null +++ b/tests/expected/auto/rgb_u8.json @@ -0,0 +1,8 @@ +{ + "maxzoom": 3, + "minzoom": 0, + "tilejson": "3.0.0", + "tiles": [ + "http://localhost:3111/rgb_u8/{z}/{x}/{y}" + ] +} diff --git a/tests/expected/auto/rgb_u8_0_0_0.png b/tests/expected/auto/rgb_u8_0_0_0.png new file mode 100644 index 0000000000000000000000000000000000000000..5955c79d758f2e419ebe343a87333a2e87f54968 GIT binary patch literal 3342 zcmeHKi#ODH6dz04Mv6+U!Pw*xIuUCqcBecVj~HzjX=+qXVX||GCM-WIG2@Y5V#zCK zv8oEn?E98DBmuk#88&NAVZ(8loYwyC@Tfz2Gg z!~V|}rxst51SCDeO0sB@>B5OCY>`qVq1WmwViOzx`Z92}*;A@3Dje6NjBFjLsDvTM zE$2Wp>ehuhJ0VHDT(vQ2Df8-lP#pC(=Mo5iIcJ15VAa0?Ce`1?q^@t*GSVrY?ASAF zPSh7=8Ze)$RGxrMVr0QwJnhh&mT#So+3q>^+glGJe*&LsxuAzNmbdc8z7*=ix%}}y zi^T{BaTaSdGk%oLS$LK`j(5cT zxuFW(zdiIcY!WLM^*lWm7uhmJ6SW@E_d27VK6#((;^dqfzsriH_NHkYC~1@xaip%H zN+U0>ryon#f%<3mYJvck_btoC47&uSzLRj7oL^xhJ@#H*VD$ByIZS;~4c7=8r3NtQ zz)entk)Eh(v(BK;%-MivgnP3jikaAjZ2c%6%?b_Y@6Mx7N04-AVQD5#?~-S#H7s$Hitv;kF)$OIsKJx=j1?X1?o5MZNz^5ZNKf8_JO z+gc=ql_s$mTYS514s|UlsC!)E990XJNI!q!M`u*&bb-wXY;_dVYSY6RC+-sAnzl9d zoxn`q0OIsp+a}{8B60rYhup&?`?ioV=o^CykrA!8>k@B#@Q zpP=jC0dVpjKc-{7hSSx!S#Gzi5#twT3Vwj|b6bX>+dNNp3=@RONV!k~y^oxq@iFeJ z5b*_w_<@)EuqDuuqt2(a@rwtTR(=}5Tv36_0F4UH?^y0=1%61NwyEC`R$GtTD}y5n ze%x0LF7c<3X!fVv4LYkQrpa~5M;hfp7gS1>1+`0*Y2*pjs$453m_{O^Y1lk474d~g zbN8LSwQa7$P=l-p5&{3)Au%;7`Jk9G`#F8{pkHo&Z3aw`g`pJtPd({8rz7Gb*lY{X zSKRi`LaoT!XsP4?dn8D9(HT25AR)cGjBPGA1lbDWP05=;nS!*}r5ASqn*%(M-fsmb z8^G*n*#yaihx)tIns&No04mbhpj@kz3C<$L7Tz=m21rv7Gm_TAM7fdt$+cQvz;Qp! zMqrC9_NtCCfpGN9Ag3MpA~+Jg@5$vnW8*n!0Fkj{2{%dOlWl?X|DpL%fSbroVJ&fy z{IO^vXJn~?Yy|+?>iLS+J%p%s4yG>=^dsXF`!ol^Y}t_1ARU$NMv}B?rCZ8ey8NUo zLrc2Yq&dWvkS#0un$%yJA&{0A(2nZf`7 literal 0 HcmV?d00001 diff --git a/tests/expected/auto/rgb_u8_0_0_0.png.txt b/tests/expected/auto/rgb_u8_0_0_0.png.txt new file mode 100644 index 000000000..6afcdcb84 --- /dev/null +++ b/tests/expected/auto/rgb_u8_0_0_0.png.txt @@ -0,0 +1 @@ +tests/output/auto/rgb_u8_0_0_0.png: PNG image data, 256 x 256, 8-bit/color RGBA, non-interlaced diff --git a/tests/expected/auto/rgb_u8_3_0_0.png b/tests/expected/auto/rgb_u8_3_0_0.png new file mode 100644 index 0000000000000000000000000000000000000000..e2d2016c69c65f9c3f68adadc1abd26bfb6f55fb GIT binary patch literal 27589 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�G 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 literal 0 HcmV?d00001 diff --git a/tests/expected/auto/rgb_u8_3_0_0.png.txt b/tests/expected/auto/rgb_u8_3_0_0.png.txt new file mode 100644 index 000000000..c45d2efc0 --- /dev/null +++ b/tests/expected/auto/rgb_u8_3_0_0.png.txt @@ -0,0 +1 @@ +tests/output/auto/rgb_u8_3_0_0.png: PNG image data, 256 x 256, 8-bit/color RGBA, non-interlaced diff --git a/tests/expected/auto/rgb_u8_3_1_1.png b/tests/expected/auto/rgb_u8_3_1_1.png new file mode 100644 index 0000000000000000000000000000000000000000..d423a66959c222021c142619f98087886d461eee GIT binary patch literal 3093 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|GzJFlJDx6%Ar*{o4=^uKiJW%q z8d5|H@w$*MBc5z8V_-x4xzB z%lmnGK+#qI`!DqWyLoEn?E98DBmuk#88&NAVZ(8loYwyC@Tfz2Gg z!~V|}rxst51SCDeO0sB@>B5OCY>`qVq1WmwViOzx`Z92}*;A@3Dje6NjBFjLsDvTM zE$2Wp>ehuhJ0VHDT(vQ2Df8-lP#pC(=Mo5iIcJ15VAa0?Ce`1?q^@t*GSVrY?ASAF zPSh7=8Ze)$RGxrMVr0QwJnhh&mT#So+3q>^+glGJe*&LsxuAzNmbdc8z7*=ix%}}y zi^T{BaTaSdGk%oLS$LK`j(5cT zxuFW(zdiIcY!WLM^*lWm7uhmJ6SW@E_d27VK6#((;^dqfzsriH_NHkYC~1@xaip%H zN+U0>ryon#f%<3mYJvck_btoC47&uSzLRj7oL^xhJ@#H*VD$ByIZS;~4c7=8r3NtQ zz)entk)Eh(v(BK;%-MivgnP3jikaAjZ2c%6%?b_Y@6Mx7N04-AVQD5#?~-S#H7s$Hitv;kF)$OIsKJx=j1?X1?o5MZNz^5ZNKf8_JO z+gc=ql_s$mTYS514s|UlsC!)E990XJNI!q!M`u*&bb-wXY;_dVYSY6RC+-sAnzl9d zoxn`q0OIsp+a}{8B60rYhup&?`?ioV=o^CykrA!8>k@B#@Q zpP=jC0dVpjKc-{7hSSx!S#Gzi5#twT3Vwj|b6bX>+dNNp3=@RONV!k~y^oxq@iFeJ z5b*_w_<@)EuqDuuqt2(a@rwtTR(=}5Tv36_0F4UH?^y0=1%61NwyEC`R$GtTD}y5n ze%x0LF7c<3X!fVv4LYkQrpa~5M;hfp7gS1>1+`0*Y2*pjs$453m_{O^Y1lk474d~g zbN8LSwQa7$P=l-p5&{3)Au%;7`Jk9G`#F8{pkHo&Z3aw`g`pJtPd({8rz7Gb*lY{X zSKRi`LaoT!XsP4?dn8D9(HT25AR)cGjBPGA1lbDWP05=;nS!*}r5ASqn*%(M-fsmb z8^G*n*#yaihx)tIns&No04mbhpj@kz3C<$L7Tz=m21rv7Gm_TAM7fdt$+cQvz;Qp! zMqrC9_NtCCfpGN9Ag3MpA~+Jg@5$vnW8*n!0Fkj{2{%dOlWl?X|DpL%fSbroVJ&fy z{IO^vXJn~?Yy|+?>iLS+J%p%s4yG>=^dsXF`!ol^Y}t_1ARU$NMv}B?rCZ8ey8NUo zLrc2Yq&dWvkS#0un$%yJA&{0A(2nZf`7 literal 0 HcmV?d00001 diff --git a/tests/expected/auto/rgba_u8_0_0_0.png.txt b/tests/expected/auto/rgba_u8_0_0_0.png.txt new file mode 100644 index 000000000..4e6e2586e --- /dev/null +++ b/tests/expected/auto/rgba_u8_0_0_0.png.txt @@ -0,0 +1 @@ +tests/output/auto/rgba_u8_0_0_0.png: PNG image data, 256 x 256, 8-bit/color RGBA, non-interlaced diff --git a/tests/expected/auto/rgba_u8_3_0_0.png b/tests/expected/auto/rgba_u8_3_0_0.png new file mode 100644 index 0000000000000000000000000000000000000000..e2d2016c69c65f9c3f68adadc1abd26bfb6f55fb GIT binary patch literal 27589 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�G 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 literal 0 HcmV?d00001 diff --git a/tests/expected/auto/rgba_u8_3_0_0.png.txt b/tests/expected/auto/rgba_u8_3_0_0.png.txt new file mode 100644 index 000000000..11598f0b5 --- /dev/null +++ b/tests/expected/auto/rgba_u8_3_0_0.png.txt @@ -0,0 +1 @@ +tests/output/auto/rgba_u8_3_0_0.png: PNG image data, 256 x 256, 8-bit/color RGBA, non-interlaced diff --git a/tests/expected/auto/rgba_u8_3_1_1.png b/tests/expected/auto/rgba_u8_3_1_1.png new file mode 100644 index 0000000000000000000000000000000000000000..d423a66959c222021c142619f98087886d461eee GIT binary patch literal 3093 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 Ldv+9TKb-U*9$dg` literal 0 HcmV?d00001 diff --git a/tests/expected/auto/rgba_u8_nodata_0_0_0.png.txt b/tests/expected/auto/rgba_u8_nodata_0_0_0.png.txt new file mode 100644 index 000000000..59fb8ac9c --- /dev/null +++ b/tests/expected/auto/rgba_u8_nodata_0_0_0.png.txt @@ -0,0 +1 @@ +tests/output/auto/rgba_u8_nodata_0_0_0.png: PNG image data, 512 x 512, 8-bit/color RGBA, non-interlaced diff --git a/tests/expected/auto/rgba_u8_nodata_1_0_0.png b/tests/expected/auto/rgba_u8_nodata_1_0_0.png new file mode 100644 index 0000000000000000000000000000000000000000..ce49adb240f605b844dbc2722674a85c272eac20 GIT binary patch literal 17810 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 L?8?}A>gxXiK7}oq=|sY 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 literal 0 HcmV?d00001 diff --git a/tests/fixtures/cog/rgba_u8_nodata.tif b/tests/fixtures/cog/rgba_u8_nodata.tif new file mode 100644 index 0000000000000000000000000000000000000000..f5a5aaf41027bd749332165ac3b4fa87da8d1302 GIT binary patch literal 65816 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 echo "***** Test server response for COG(Cloud Optimized GeoTiff) source *****" +test_jsn rgb_u8 rgb_u8 +test_png rgb_u8_0_0_0 rgb_u8/0/0/0 +test_png rgb_u8_3_0_0 rgb_u8/3/0/0 +test_png rgb_u8_3_1_1 rgb_u8/3/1/1 + +test_jsn rgba_u8 rgba_u8 +test_png rgba_u8_0_0_0 rgba_u8/0/0/0 +test_png rgba_u8_3_0_0 rgba_u8/3/0/0 +test_png rgba_u8_3_1_1 rgba_u8/3/1/1 + +test_jsn rgba_u8_nodata rgba_u8_nodata +test_png rgba_u8_nodata_0_0_0 rgba_u8_nodata/0/0/0 +test_png rgba_u8_nodata_1_0_0 rgba_u8_nodata/1/0/0 + >&2 echo "***** Test server response for table source with empty SRID *****" test_pbf points_empty_srid_0_0_0 points_empty_srid/0/0/0 From 7b4c38976feae9c7504263ec663e4f0722bad8f5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 24 Dec 2024 02:47:29 +0000 Subject: [PATCH 208/215] chore(deps): Bump xxhash-rust from 0.8.13 to 0.8.14 in the all-cargo-version-updates group (#1631) Bumps the all-cargo-version-updates group with 1 update: [xxhash-rust](https://github.com/DoumanAsh/xxhash-rust). Updates `xxhash-rust` from 0.8.13 to 0.8.14

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=xxhash-rust&package-manager=cargo&previous-version=0.8.13&new-version=0.8.14)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3871abf25..60ec2b45b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5958,9 +5958,9 @@ checksum = "ec7a2a501ed189703dba8b08142f057e887dfc4b2cc4db2d343ac6376ba3e0b9" [[package]] name = "xxhash-rust" -version = "0.8.13" +version = "0.8.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a08fd76779ae1883bbf1e46c2c46a75a0c4e37c445e68a24b01479d438f26ae6" +checksum = "d7d48f1b18be023c95e7b75f481cac649d74be7c507ff4a407c55cfb957f7934" [[package]] name = "yansi" From 780236d9520c456317ffd9325d10ac6602749537 Mon Sep 17 00:00:00 2001 From: Yuri Astrakhan Date: Thu, 26 Dec 2024 00:50:47 -0500 Subject: [PATCH 209/215] bump all dependencies (#1634) --- Cargo.lock | 62 ++++++++++++++++++++++++++++++++++++++++-------------- Cargo.toml | 2 +- 2 files changed, 47 insertions(+), 17 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 60ec2b45b..e332c26a4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -250,6 +250,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "aligned-vec" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e0966165eaf052580bd70eb1b32cb3d6245774c0104d1b2793e9650bf83b52a" +dependencies = [ + "equator", +] + [[package]] name = "alloc-no-stdlib" version = "2.0.4" @@ -1383,6 +1392,26 @@ dependencies = [ "log", ] +[[package]] +name = "equator" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c35da53b5a021d2484a7cc49b2ac7f2d840f8236a286f84202369bd338d761ea" +dependencies = [ + "equator-macro", +] + +[[package]] +name = "equator-macro" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bf679796c0322556351f287a51b49e48f7c4986e727b5dd78c972d30e2e16cc" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", +] + [[package]] name = "equivalent" version = "1.0.1" @@ -2275,9 +2304,9 @@ checksum = "029d73f573d8e8d63e6d5020011d3255b28c3ba85d6cf870a07184ed23de9284" [[package]] name = "impl-more" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aae21c3177a27788957044151cc2800043d127acaa460a47ebb9b84dfa2c6aa0" +checksum = "e8a5a9a0ff0086c7a148acb942baaabeadf9504d10400b5a05645853729b9cd2" [[package]] name = "indexmap" @@ -3394,10 +3423,11 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "pprof" -version = "0.13.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef5c97c51bd34c7e742402e216abdeb44d415fbe6ae41d56b114723e953711cb" +checksum = "ebbe2f8898beba44815fdc9e5a4ae9c929e21c5dc29b0c774a15555f7f58d6d0" dependencies = [ + "aligned-vec", "backtrace", "cfg-if", "criterion", @@ -3647,9 +3677,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.37" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" dependencies = [ "proc-macro2", ] @@ -4239,9 +4269,9 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.11.0" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e28bdad6db2b8340e449f7108f020b3b092e8583a9e3fb82713e1d4e71fe817" +checksum = "d6b6f7f2fcb69f747921f79f3926bd1e203fce4fef62c268dd3abfb6d86029aa" dependencies = [ "base64 0.22.1", "chrono", @@ -4257,9 +4287,9 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.11.0" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d846214a9854ef724f3da161b426242d8de7c1fc7de2f89bb1efcb154dca79d" +checksum = "8d00caa5193a3c8362ac2b73be6b9e768aa5a4b2f721d8f4b339600c3cb51f8e" dependencies = [ "darling", "proc-macro2", @@ -4446,9 +4476,9 @@ dependencies = [ [[package]] name = "sqlite-compressions" -version = "0.2.16" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5a4d4aaf917cb6dc0758159f2ade412b62587dd85da48671d48702c607f0d5b" +checksum = "c7ca97110bcaff4d68d1495578f6822d6227b53e2113c1f1c17c89ba0556b988" dependencies = [ "bsdiff", "flate2", @@ -4457,9 +4487,9 @@ dependencies = [ [[package]] name = "sqlite-hashes" -version = "0.7.6" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b780e3dfa3f6de81934a7d5e60bfbf6c797faf97dc152a24a913c044a93f8b25" +checksum = "c03cb5a95dca257c912e3fa49258150ed95facccb20edbff2cf6e1a74335beff" dependencies = [ "digest", "hex", @@ -5317,9 +5347,9 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "unicase" -version = "2.8.0" +version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e51b68083f157f853b6379db119d1c1be0e6e4dec98101079dec41f6f5cf6df" +checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" [[package]] name = "unicode-bidi" diff --git a/Cargo.toml b/Cargo.toml index 1d5da5fb3..84705d2b0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -63,7 +63,7 @@ png = "0.17.14" postgis = "0.9" postgres = { version = "0.19", features = ["with-time-0_3", "with-uuid-1", "with-serde_json-1"] } postgres-protocol = "0.6" -pprof = { version = "0.13", features = ["flamegraph", "criterion"] } +pprof = { version = "0.14", features = ["flamegraph", "criterion"] } pretty_assertions = "1" regex = "1" rstest = "0.23" From 26249e217eb1d802a11e511bbaab92372ef91d69 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 26 Dec 2024 06:51:58 +0100 Subject: [PATCH 210/215] chore(deps): Bump serde_with from 3.11.0 to 3.12.0 in the all-cargo-version-updates group (#1633) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [//]: # (dependabot-start) ⚠️ **Dependabot is rebasing this PR** ⚠️ Rebasing might not happen immediately, so don't worry if this takes some time. Note: if you make any changes to this PR yourself, they will take precedence over the rebase. --- [//]: # (dependabot-end) Bumps the all-cargo-version-updates group with 1 update: [serde_with](https://github.com/jonasbb/serde_with). Updates `serde_with` from 3.11.0 to 3.12.0
Release notes

Sourced from serde_with's releases.

serde_with v3.12.0

Added

  • Add with_suffix! macro, which puts a suffix on every struct field by @​fgardt (#381/#797)

Changed

  • Reformat all Cargo.toml files by @​nyurik (#803)
  • Better handle internal arithmetic and improve error messages (#809/#810/#811)

Fixed

Commits
  • 5de3400 Bump version to 3.12 and update changelogs (#812)
  • 0d36647 Bump version to 3.12 and update changelogs
  • f4f784c Remove use of ops::Mul and ops::Neg since they can fail (#811)
  • 9c06ffa Generate better error messages when encountering unexpected i128/u128 values ...
  • 90d7312 Remove use of ops::Mul and ops::Neg since they can fail
  • e8d2e02 Generate better error messages when encountering unexpected i128/u128 values ...
  • 4c273b2 Remove some as casts (#809)
  • c910fa1 Fix/remove more as casts
  • fa14d98 Remove some as casts
  • ef112b9 Warn about as usage in time related code
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=serde_with&package-manager=cargo&previous-version=3.11.0&new-version=3.12.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index e332c26a4..cdfa2abec 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2582,7 +2582,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" dependencies = [ "cfg-if", - "windows-targets 0.52.6", + "windows-targets 0.48.5", ] [[package]] From 17edc75196e782c31b764ef1f51b25f65cb3252d Mon Sep 17 00:00:00 2001 From: Lucas Date: Sun, 29 Dec 2024 19:21:39 +0800 Subject: [PATCH 211/215] Autodiscover `*.tiff` files in addition to `*.tif` (#1635) --- docs/src/config-file.md | 5 +- docs/src/sources-cog-files.md | 12 ++--- martin/src/args/root.rs | 48 ++++++++++++++---- martin/src/config.rs | 6 +-- martin/src/file_config.rs | 40 ++++++++++----- tests/config.yaml | 2 +- tests/expected/auto/save_config.yaml | 2 +- tests/expected/configured/save_config.yaml | 2 +- ...rgba_u8_nodata.tif => rgba_u8_nodata.tiff} | Bin 9 files changed, 79 insertions(+), 38 deletions(-) rename tests/fixtures/cog/{rgba_u8_nodata.tif => rgba_u8_nodata.tiff} (100%) diff --git a/docs/src/config-file.md b/docs/src/config-file.md index 0749063e3..fe09dc476 100644 --- a/docs/src/config-file.md +++ b/docs/src/config-file.md @@ -202,10 +202,11 @@ mbtiles: # Cloud Optimized GeoTIFF File Sources cog: paths: - # scan this whole dir, matching all *.tif files + # scan this whole dir, matching all *.tif and *.tiff files - /dir-path # specific TIFF file will be published as a cog source - - /path/to/cogfile.tif + - /path/to/cogfile1.tif + - /path/to/cogfile2.tiff sources: # named source matching source name to a single file cog-src1: /path/to/cog1.tif diff --git a/docs/src/sources-cog-files.md b/docs/src/sources-cog-files.md index 70ee4b9f7..f9966ebe3 100644 --- a/docs/src/sources-cog-files.md +++ b/docs/src/sources-cog-files.md @@ -20,12 +20,12 @@ Martin can also serve raster sources like local [COG(Cloud Optimized GeoTIFF)](h ## Run Martin with CLI to serve cog files ```bash -# Configured with a directory containing TIFF files. +# Configured with a directory containing `*.tif` or `*.tiff` TIFF files. martin /with/tiff/dir1 /with/tiff/dir2 -# Configured with dedicated TIFF file. -martin /path/to/target1.tif /path/to/target1.tif +# Configured with dedicated TIFF file +martin /path/to/target1.tif /path/to/target2.tiff # Configured with a combination of directories and dedicated TIFF files. -martin /with/tiff/files /path/to/target.tif +martin /with/tiff/files /path/to/target1.tif /path/to/target2.tiff ``` ## Run Martin with configuration file @@ -46,11 +46,11 @@ cache_size_mb: 8 cog: paths: - # scan this whole dir, matching all *.tif files + # scan this whole dir, matching all *.tif and *.tiff files - /dir-path # specific TIFF file will be published as a cog source - /path/to/target1.tif - - /path/to/target2.tif + - /path/to/target2.tiff sources: # named source matching source name to a single file cog-src1: /path/to/cog1.tif diff --git a/martin/src/args/root.rs b/martin/src/args/root.rs index 040d1e05f..00f3075c6 100644 --- a/martin/src/args/root.rs +++ b/martin/src/args/root.rs @@ -99,17 +99,17 @@ impl Args { #[cfg(feature = "pmtiles")] if !cli_strings.is_empty() { - config.pmtiles = parse_file_args(&mut cli_strings, "pmtiles", true); + config.pmtiles = parse_file_args(&mut cli_strings, &["pmtiles"], true); } #[cfg(feature = "mbtiles")] if !cli_strings.is_empty() { - config.mbtiles = parse_file_args(&mut cli_strings, "mbtiles", false); + config.mbtiles = parse_file_args(&mut cli_strings, &["mbtiles"], false); } #[cfg(feature = "cog")] if !cli_strings.is_empty() { - config.cog = parse_file_args(&mut cli_strings, "tif", false); + config.cog = parse_file_args(&mut cli_strings, &["tif", "tiff"], false); } #[cfg(feature = "sprites")] @@ -125,13 +125,13 @@ impl Args { } } -#[cfg(any(feature = "pmtiles", feature = "mbtiles"))] -fn is_url(s: &str, extension: &str) -> bool { +#[cfg(any(feature = "pmtiles", feature = "mbtiles", feature = "cog"))] +fn is_url(s: &str, extension: &[&str]) -> bool { if s.starts_with("http") { if let Ok(url) = url::Url::parse(s) { if url.scheme() == "http" || url.scheme() == "https" { if let Some(ext) = url.path().rsplit('.').next() { - return ext == extension; + return extension.contains(&ext); } } } @@ -139,21 +139,26 @@ fn is_url(s: &str, extension: &str) -> bool { false } -#[cfg(any(feature = "pmtiles", feature = "mbtiles"))] +#[cfg(any(feature = "pmtiles", feature = "mbtiles", feature = "cog"))] pub fn parse_file_args( cli_strings: &mut Arguments, - extension: &str, + extensions: &[&str], allow_url: bool, ) -> FileConfigEnum { use crate::args::State::{Ignore, Share, Take}; let paths = cli_strings.process(|s| { let path = PathBuf::from(s); - if allow_url && is_url(s, extension) { + if allow_url && is_url(s, extensions) { Take(path) } else if path.is_dir() { Share(path) - } else if path.is_file() && path.extension().map_or(false, |e| e == extension) { + } else if path.is_file() + && extensions.iter().any(|&expected_ext| { + path.extension() + .is_some_and(|actual_ext| actual_ext == expected_ext) + }) + { Take(path) } else { Ignore @@ -166,6 +171,8 @@ pub fn parse_file_args( #[cfg(test)] mod tests { + use insta::assert_yaml_snapshot; + use super::*; use crate::args::PreferredEncoding; use crate::test_utils::FauxEnv; @@ -275,4 +282,25 @@ mod tests { let bad = vec!["foobar".to_string()]; assert!(matches!(err, UnrecognizableConnections(v) if v == bad)); } + + #[test] + fn cli_multiple_extensions() { + let args = Args::parse_from([ + "martin", + "../tests/fixtures/cog", + "../tests/fixtures/cog/rgba_u8_nodata.tiff", + "../tests/fixtures/cog/rgba_u8.tif", + ]); + + let env = FauxEnv::default(); + let mut config = Config::default(); + let err = args.merge_into_config(&mut config, &env); + assert!(err.is_ok()); + assert_yaml_snapshot!(config, @r#" + cog: + - "../tests/fixtures/cog/rgb_u8.tif" + - "../tests/fixtures/cog/rgba_u8_nodata.tiff" + - "../tests/fixtures/cog/rgba_u8.tif" + "#); + } } diff --git a/martin/src/config.rs b/martin/src/config.rs index 4e9ca02f8..0715e08b1 100644 --- a/martin/src/config.rs +++ b/martin/src/config.rs @@ -178,21 +178,21 @@ impl Config { #[cfg(feature = "pmtiles")] if !self.pmtiles.is_empty() { let cfg = &mut self.pmtiles; - let val = crate::file_config::resolve_files(cfg, idr, cache.clone(), "pmtiles"); + let val = crate::file_config::resolve_files(cfg, idr, cache.clone(), &["pmtiles"]); sources.push(Box::pin(val)); } #[cfg(feature = "mbtiles")] if !self.mbtiles.is_empty() { let cfg = &mut self.mbtiles; - let val = crate::file_config::resolve_files(cfg, idr, cache.clone(), "mbtiles"); + let val = crate::file_config::resolve_files(cfg, idr, cache.clone(), &["mbtiles"]); sources.push(Box::pin(val)); } #[cfg(feature = "cog")] if !self.cog.is_empty() { let cfg = &mut self.cog; - let val = crate::file_config::resolve_files(cfg, idr, cache.clone(), "tif"); + let val = crate::file_config::resolve_files(cfg, idr, cache.clone(), &["tif", "tiff"]); sources.push(Box::pin(val)); } diff --git a/martin/src/file_config.rs b/martin/src/file_config.rs index 1196c84fe..e1c54702a 100644 --- a/martin/src/file_config.rs +++ b/martin/src/file_config.rs @@ -235,7 +235,7 @@ pub async fn resolve_files( config: &mut FileConfigEnum, idr: &IdResolver, cache: OptMainCache, - extension: &str, + extension: &[&str], ) -> MartinResult { resolve_int(config, idr, cache, extension) .map_err(crate::MartinError::from) @@ -246,7 +246,7 @@ async fn resolve_int( config: &mut FileConfigEnum, idr: &IdResolver, cache: OptMainCache, - extension: &str, + extension: &[&str], ) -> FileResult { let Some(cfg) = config.extract_file_config(cache)? else { return Ok(TileInfoSources::default()); @@ -285,16 +285,20 @@ async fn resolve_int( for path in cfg.paths { if let Some(url) = parse_url(T::parse_urls(), &path)? { - let id = url - .path_segments() - .and_then(Iterator::last) - .and_then(|s| { - // Strip extension and trailing dot, or keep the original string - s.strip_suffix(extension) - .and_then(|s| s.strip_suffix('.')) - .or(Some(s)) - }) - .unwrap_or("pmt_web_source"); + let target_ext = extension.iter().find(|&e| url.to_string().ends_with(e)); + let id = if let Some(ext) = target_ext { + url.path_segments() + .and_then(Iterator::last) + .and_then(|s| { + // Strip extension and trailing dot, or keep the original string + s.strip_suffix(ext) + .and_then(|s| s.strip_suffix('.')) + .or(Some(s)) + }) + .unwrap_or("web_source") + } else { + "web_source" + }; let id = idr.resolve(id, url.to_string()); configs.insert(id.clone(), FileConfigSrc::Path(path)); @@ -337,13 +341,21 @@ async fn resolve_int( Ok(results) } -fn dir_to_paths(path: &Path, extension: &str) -> Result, FileError> { +fn dir_to_paths(path: &Path, extension: &[&str]) -> Result, FileError> { Ok(path .read_dir() .map_err(|e| IoError(e, path.to_path_buf()))? .filter_map(Result::ok) .filter(|f| { - f.path().extension().filter(|e| *e == extension).is_some() && f.path().is_file() + f.path() + .extension() + .filter(|actual_ext| { + extension + .iter() + .any(|expected_ext| expected_ext == actual_ext) + }) + .is_some() + && f.path().is_file() }) .map(|f| f.path()) .collect()) diff --git a/tests/config.yaml b/tests/config.yaml index d963453da..b7343e958 100644 --- a/tests/config.yaml +++ b/tests/config.yaml @@ -182,7 +182,7 @@ sprites: cog: paths: - - tests/fixtures/cog/rgba_u8_nodata.tif + - tests/fixtures/cog/rgba_u8_nodata.tiff sources: cog-src1: tests/fixtures/cog/rgba_u8.tif cog-src2: tests/fixtures/cog/rgb_u8.tif diff --git a/tests/expected/auto/save_config.yaml b/tests/expected/auto/save_config.yaml index 9878a45c9..dfa59a7f2 100644 --- a/tests/expected/auto/save_config.yaml +++ b/tests/expected/auto/save_config.yaml @@ -260,7 +260,7 @@ cog: sources: rgb_u8: tests/fixtures/cog/rgb_u8.tif rgba_u8: tests/fixtures/cog/rgba_u8.tif - rgba_u8_nodata: tests/fixtures/cog/rgba_u8_nodata.tif + rgba_u8_nodata: tests/fixtures/cog/rgba_u8_nodata.tiff sprites: tests/fixtures/sprites/src1 fonts: - tests/fixtures/fonts/overpass-mono-regular.ttf diff --git a/tests/expected/configured/save_config.yaml b/tests/expected/configured/save_config.yaml index e3d665f0e..fa6723f96 100644 --- a/tests/expected/configured/save_config.yaml +++ b/tests/expected/configured/save_config.yaml @@ -170,7 +170,7 @@ cog: sources: cog-src1: tests/fixtures/cog/rgba_u8.tif cog-src2: tests/fixtures/cog/rgb_u8.tif - rgba_u8_nodata: tests/fixtures/cog/rgba_u8_nodata.tif + rgba_u8_nodata: tests/fixtures/cog/rgba_u8_nodata.tiff sprites: paths: tests/fixtures/sprites/src1 sources: diff --git a/tests/fixtures/cog/rgba_u8_nodata.tif b/tests/fixtures/cog/rgba_u8_nodata.tiff similarity index 100% rename from tests/fixtures/cog/rgba_u8_nodata.tif rename to tests/fixtures/cog/rgba_u8_nodata.tiff From 02c7fbdd95557986b2052f0214ad16ed45b0ad40 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 30 Dec 2024 03:03:06 +0000 Subject: [PATCH 212/215] chore(deps): Bump the all-cargo-version-updates group with 2 updates (#1636) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps the all-cargo-version-updates group with 2 updates: [serde](https://github.com/serde-rs/serde) and [xxhash-rust](https://github.com/DoumanAsh/xxhash-rust). Updates `serde` from 1.0.216 to 1.0.217
Release notes

Sourced from serde's releases.

v1.0.217

  • Support serializing externally tagged unit variant inside flattened field (#2786, thanks @​Mingun)
Commits
  • 930401b Release 1.0.217
  • cb6eaea Fix roundtrip inconsistency:
  • b6f339c Resolve repr_packed_without_abi clippy lint in tests
  • 2a5caea Merge pull request #2872 from dtolnay/ehpersonality
  • b9f93f9 Add no-std CI on stable compiler
  • eb5cd47 Drop #[lang = "eh_personality"] from no-std test
  • 8478a3b Merge pull request #2871 from dtolnay/nostdstart
  • dbb9091 Replace #[start] with extern fn main
  • See full diff in compare view

Updates `xxhash-rust` from 0.8.14 to 0.8.15
Commits

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index cdfa2abec..2269bdbe1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4193,18 +4193,18 @@ checksum = "3cb6eb87a131f756572d7fb904f6e7b68633f09cca868c5df1c4b8d1a694bbba" [[package]] name = "serde" -version = "1.0.216" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b9781016e935a97e8beecf0c933758c97a5520d32930e460142b4cd80c6338e" +checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.216" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46f859dbbf73865c6627ed570e78961cd3ac92407a2d117204c49232485da55e" +checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ "proc-macro2", "quote", @@ -5988,9 +5988,9 @@ checksum = "ec7a2a501ed189703dba8b08142f057e887dfc4b2cc4db2d343ac6376ba3e0b9" [[package]] name = "xxhash-rust" -version = "0.8.14" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7d48f1b18be023c95e7b75f481cac649d74be7c507ff4a407c55cfb957f7934" +checksum = "fdd20c5420375476fbd4394763288da7eb0cc0b8c11deed431a91562af7335d3" [[package]] name = "yansi" From 593f6a1e65c7b733cce77f98910c61692788b359 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Jan 2025 03:04:18 +0000 Subject: [PATCH 213/215] chore(deps): Bump moka from 0.12.8 to 0.12.9 in the all-cargo-version-updates group (#1640) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps the all-cargo-version-updates group with 1 update: [moka](https://github.com/moka-rs/moka). Updates `moka` from 0.12.8 to 0.12.9
Changelog

Sourced from moka's changelog.

Version 0.12.9

Bumped the minimum supported Rust version (MSRV) to 1.70 (June 1, 2023) (#474[gh-pull-0474]).

Fixed

  • Prevent an occasional panic in an internal to_std_instant method when per-entry expiration policy is used. (#472[gh-issue-0472])
  • Documentation: Removed leftover mentions of background threads. (#464[gh-issue-0464])
    • Also added the implementation details chapter to the crate top-level documentation to explain some internal behavior of the cache.

Added

  • Added and_try_compute_if_nobody_else method to future::Cache's entry API. (#460[gh-pull-0460], by [@​xuehaonan27][gh-xuehaonan27])

Removed

  • Removed triomphe crate from the dependency by adding our own internal Arc type. (#456[gh-pull-0456])
    • Our Arc will be more memory efficient than std::sync::Arc or triomphe::Arc on 64-bit platforms as it uses a single AtomicU32 counter.
  • Removed needless traits along with async-trait usage. (#445[gh-pull-0445], by [@​Swatinem][gh-Swatinem])

Changed

  • Enable atomic64 feature only when target supports AtomicU64. (#466[gh-pull-0466], by [@​zonyitoo][gh-zonyitoo])
  • Made once_cell dependency optional (#444[gh-pull-0444]).
  • Stopped creating references unnecessarily to compare pointers by-address. (#452[gh-pull-0452], by [@​JoJoDeveloping][gh-JoJoDeveloping])
Commits
  • e7fd7f6 Merge pull request #479 from moka-rs/fix-doc-about-pending-tasks
  • cd2b3b3 Fix a typo in the README
  • c5c3658 Update the change log
  • 8284a07 Fix a Clippy warning on a doc comment
  • ecd5791 Doc: Remove leftover mentions of background threads
  • f726592 Merge pull request #456 from moka-rs/mini-arc
  • 9d78c2c Merge branch 'main' into mini-arc
  • c7b9456 Merge pull request #478 from moka-rs/fix-panic-in-to_std_instant
  • e99303d Merge pull request #477 from moka-rs/fix-panic-in-to_std_instant
  • e048825 Update the change log
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=moka&package-manager=cargo&previous-version=0.12.8&new-version=0.12.9)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 190 ++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 180 insertions(+), 10 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2269bdbe1..9baf1195f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1764,6 +1764,19 @@ dependencies = [ "slab", ] +[[package]] +name = "generator" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc6bd114ceda131d3b1d665eba35788690ad37f5916457286b32ab6fd3c438dd" +dependencies = [ + "cfg-if", + "libc", + "log", + "rustversion", + "windows", +] + [[package]] name = "generic-array" version = "0.12.4" @@ -2139,7 +2152,7 @@ dependencies = [ "iana-time-zone-haiku", "js-sys", "wasm-bindgen", - "windows-core", + "windows-core 0.52.0", ] [[package]] @@ -2670,6 +2683,19 @@ version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +[[package]] +name = "loom" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "419e0dc8046cb947daa77eb95ae174acfbddb7673b4151f56d1eed8e93fbfaca" +dependencies = [ + "cfg-if", + "generator", + "scoped-tls", + "tracing", + "tracing-subscriber", +] + [[package]] name = "martin" version = "0.15.0" @@ -2740,6 +2766,15 @@ dependencies = [ "insta", ] +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + [[package]] name = "mbtiles" version = "0.11.1" @@ -2869,25 +2904,23 @@ dependencies = [ [[package]] name = "moka" -version = "0.12.8" +version = "0.12.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32cf62eb4dd975d2dde76432fb1075c49e3ee2331cf36f1f8fd4b66550d32b6f" +checksum = "23db87a7f248211f6a7c8644a1b750541f8a4c68ae7de0f908860e44c0c201f6" dependencies = [ "async-lock", - "async-trait", "crossbeam-channel", "crossbeam-epoch", "crossbeam-utils", "event-listener 5.3.1", "futures-util", - "once_cell", + "loom", "parking_lot", "quanta", "rustc_version", "smallvec", "tagptr", "thiserror 1.0.69", - "triomphe", "uuid", ] @@ -2930,6 +2963,16 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + [[package]] name = "num" version = "0.2.1" @@ -3064,6 +3107,12 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + [[package]] name = "oxipng" version = "9.1.3" @@ -3781,10 +3830,19 @@ checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata", + "regex-automata 0.4.9", "regex-syntax 0.8.5", ] +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", +] + [[package]] name = "regex-automata" version = "0.4.9" @@ -3802,6 +3860,12 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a" +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + [[package]] name = "regex-syntax" version = "0.7.5" @@ -4093,6 +4157,12 @@ dependencies = [ "untrusted", ] +[[package]] +name = "rustversion" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c45b9784283f1b2e7fb61b42047c2fd678ef0960d4f6f1eba131594cc369d4" + [[package]] name = "rustybuzz" version = "0.10.0" @@ -4133,6 +4203,12 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + [[package]] name = "scopeguard" version = "1.2.0" @@ -4332,6 +4408,15 @@ dependencies = [ "digest", ] +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + [[package]] name = "shlex" version = "1.3.0" @@ -4981,6 +5066,16 @@ dependencies = [ "syn 2.0.91", ] +[[package]] +name = "thread_local" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +dependencies = [ + "cfg-if", + "once_cell", +] + [[package]] name = "tiff" version = "0.9.1" @@ -5319,13 +5414,37 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" dependencies = [ "once_cell", + "valuable", ] [[package]] -name = "triomphe" -version = "0.1.11" +name = "tracing-log" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "859eb650cfee7434994602c3a68b25d77ad9e68c8a6cd491616ef86661382eb3" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] [[package]] name = "try-lock" @@ -5538,6 +5657,12 @@ dependencies = [ "getrandom", ] +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + [[package]] name = "varint-rs" version = "2.2.0" @@ -5734,6 +5859,16 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" +dependencies = [ + "windows-core 0.58.0", + "windows-targets 0.52.6", +] + [[package]] name = "windows-core" version = "0.52.0" @@ -5743,6 +5878,41 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-core" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-result", + "windows-strings", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-implement" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", +] + +[[package]] +name = "windows-interface" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", +] + [[package]] name = "windows-registry" version = "0.2.0" From a70d9715d809eee419616d2e7430a279c8e7dd22 Mon Sep 17 00:00:00 2001 From: Lucas Date: Sat, 4 Jan 2025 12:39:41 +0800 Subject: [PATCH 214/215] Cleanup and bless (#1639) - [x] Add some comments - [x] Add a warn when ignoring a mask subfile - [x] Fix failed test(args/root.rs) - [x] Move some verifications to a standalone `verify_requirments` function - [x] Remove unused errors --- martin/src/args/root.rs | 4 +- martin/src/cog/errors.rs | 6 -- martin/src/cog/mod.rs | 141 ++++++++++++++++++++++----------------- 3 files changed, 83 insertions(+), 68 deletions(-) diff --git a/martin/src/args/root.rs b/martin/src/args/root.rs index 00f3075c6..57ba2cb16 100644 --- a/martin/src/args/root.rs +++ b/martin/src/args/root.rs @@ -297,8 +297,10 @@ mod tests { let err = args.merge_into_config(&mut config, &env); assert!(err.is_ok()); assert_yaml_snapshot!(config, @r#" + pmtiles: "../tests/fixtures/cog" + mbtiles: "../tests/fixtures/cog" cog: - - "../tests/fixtures/cog/rgb_u8.tif" + - "../tests/fixtures/cog" - "../tests/fixtures/cog/rgba_u8_nodata.tiff" - "../tests/fixtures/cog/rgba_u8.tif" "#); diff --git a/martin/src/cog/errors.rs b/martin/src/cog/errors.rs index c78529b78..a20fa880e 100644 --- a/martin/src/cog/errors.rs +++ b/martin/src/cog/errors.rs @@ -40,12 +40,6 @@ pub enum CogError { #[error("The color type {0:?} and its bit depth of the tiff file {1} is not supported yet")] NotSupportedColorTypeAndBitDepth(tiff::ColorType, PathBuf), - #[error("Couldn't parse the {0} value in gdal metadata(tiff tag 42112) from {1}")] - ParseSTATISTICSValueFailed(String, PathBuf), - - #[error("The gdal metadata(tiff tag 42112) from {1} is not valid: {0}")] - InvalidGdalMetaData(String, PathBuf), - #[error("Striped tiff file is not supported, the tiff file is {0}")] NotSupportedChunkType(PathBuf), } diff --git a/martin/src/cog/mod.rs b/martin/src/cog/mod.rs index b3794303b..a4d312a5e 100644 --- a/martin/src/cog/mod.rs +++ b/martin/src/cog/mod.rs @@ -1,6 +1,7 @@ mod errors; pub use errors::CogError; +use log::warn; use std::collections::HashMap; use std::fs::File; @@ -34,6 +35,25 @@ pub struct CogSource { tileinfo: TileInfo, } +impl CogSource { + pub fn new(id: String, path: PathBuf) -> FileResult { + let tileinfo = TileInfo::new(Format::Png, martin_tile_utils::Encoding::Uncompressed); + let meta = get_meta(&path)?; + let tilejson = tilejson! { + tiles: vec![], + minzoom: meta.min_zoom, + maxzoom: meta.max_zoom + }; + Ok(CogSource { + id, + path, + meta, + tilejson, + tileinfo, + }) + } +} + #[derive(Clone, Debug)] struct Meta { min_zoom: u8, @@ -109,8 +129,7 @@ impl Source for CogSource { .colortype() .map_err(|e| CogError::InvalidTiffFile(e, self.path.clone()))?; - let tile_width = decoder.chunk_dimensions().0; - let tile_height = decoder.chunk_dimensions().1; + let (tile_width, tile_height) = decoder.chunk_dimensions(); let (data_width, data_height) = decoder.chunk_data_dimensions(tile_idx); //do more research on the not u8 case, is this the right way to do it? @@ -212,20 +231,8 @@ impl ConfigExtras for CogConfig { impl SourceConfigExtras for CogConfig { async fn new_sources(&self, id: String, path: PathBuf) -> FileResult> { - let tileinfo = TileInfo::new(Format::Png, martin_tile_utils::Encoding::Uncompressed); - let meta = get_meta(&path)?; - let tilejson = tilejson! { - tiles: vec![], - minzoom: meta.min_zoom, - maxzoom: meta.max_zoom - }; - Ok(Box::new(CogSource { - id, - path, - meta, - tilejson, - tileinfo, - })) + let cog = CogSource::new(id, path)?; + Ok(Box::new(cog)) } #[allow(clippy::no_effect_underscore_binding)] @@ -237,67 +244,78 @@ impl SourceConfigExtras for CogConfig { false } } - -fn get_meta(path: &PathBuf) -> Result { - let tif_file = File::open(path).map_err(|e| FileError::IoError(e, path.clone()))?; - let mut decoder = Decoder::new(tif_file) - .map_err(|e| CogError::InvalidTiffFile(e, path.clone()))? - .with_limits(tiff::decoder::Limits::unlimited()); - +fn verify_requirments(decoder: &mut Decoder, path: &Path) -> Result<(), CogError> { let chunk_type = decoder.get_chunk_type(); - + // see the requirement 2 in https://docs.ogc.org/is/21-026/21-026.html#_tiles if chunk_type != ChunkType::Tile { - Err(CogError::NotSupportedChunkType(path.clone()))?; - } - - let color_type = decoder - .colortype() - .map_err(|e| CogError::InvalidTiffFile(e, path.clone()))?; - - if !matches!( - color_type, - tiff::ColorType::RGB(8) | tiff::ColorType::RGBA(8) - ) { - Err(CogError::NotSupportedColorTypeAndBitDepth( - color_type, - path.clone(), - ))?; + Err(CogError::NotSupportedChunkType(path.to_path_buf()))?; } + // see https://docs.ogc.org/is/21-026/21-026.html#_planar_configuration_considerations and https://www.verypdf.com/document/tiff6/pg_0038.htm + // we might support planar configuration 2 in the future decoder .get_tag_unsigned(Tag::PlanarConfiguration) .map_err(|e| { - CogError::TagsNotFound(e, vec![Tag::PlanarConfiguration.to_u16()], 0, path.clone()) + CogError::TagsNotFound( + e, + vec![Tag::PlanarConfiguration.to_u16()], + 0, + path.to_path_buf(), + ) }) .and_then(|config| { if config == 1 { Ok(()) } else { Err(CogError::PlanarConfigurationNotSupported( - path.clone(), + path.to_path_buf(), 0, config, )) } })?; - let tag = decoder.get_tag_ascii_string(GdalNodata); - let nodata: Option = if let Ok(nodata_tag) = tag { - nodata_tag.parse().ok() - } else { - None + let color_type = decoder + .colortype() + .map_err(|e| CogError::InvalidTiffFile(e, path.to_path_buf()))?; + + if !matches!( + color_type, + tiff::ColorType::RGB(8) | tiff::ColorType::RGBA(8) + ) { + Err(CogError::NotSupportedColorTypeAndBitDepth( + color_type, + path.to_path_buf(), + ))?; }; - let images_ifd = get_images_ifd(&mut decoder); + Ok(()) +} + +#[allow(clippy::cast_possible_truncation)] +fn get_meta(path: &PathBuf) -> Result { + let tif_file = File::open(path).map_err(|e| FileError::IoError(e, path.clone()))?; + let mut decoder = Decoder::new(tif_file) + .map_err(|e| CogError::InvalidTiffFile(e, path.clone()))? + .with_limits(tiff::decoder::Limits::unlimited()); + verify_requirments(&mut decoder, path)?; let mut zoom_and_ifd: HashMap = HashMap::new(); let mut zoom_and_tile_across_down: HashMap = HashMap::new(); - for image_ifd in &images_ifd { + let nodata: Option = if let Ok(no_data) = decoder.get_tag_ascii_string(GdalNodata) { + no_data.parse().ok() + } else { + None + }; + + let images_ifd = get_images_ifd(&mut decoder, path); + + for (idx, image_ifd) in images_ifd.iter().enumerate() { decoder .seek_to_image(*image_ifd) .map_err(|e| CogError::IfdSeekFailed(e, *image_ifd, path.clone()))?; - let zoom = u8::try_from(images_ifd.len() - (image_ifd + 1)) + let zoom = u8::try_from(images_ifd.len() - (idx + 1)) .map_err(|_| CogError::TooManyImages(path.clone()))?; let (tiles_across, tiles_down) = get_grid_dims(&mut decoder, path, *image_ifd)?; @@ -306,18 +324,13 @@ fn get_meta(path: &PathBuf) -> Result { zoom_and_tile_across_down.insert(zoom, (tiles_across, tiles_down)); } - let min_zoom = zoom_and_ifd - .keys() - .min() - .ok_or_else(|| CogError::NoImagesFound(path.clone()))?; + if images_ifd.is_empty() { + Err(CogError::NoImagesFound(path.clone()))?; + } - let max_zoom = zoom_and_ifd - .keys() - .max() - .ok_or_else(|| CogError::NoImagesFound(path.clone()))?; Ok(Meta { - min_zoom: *min_zoom, - max_zoom: *max_zoom, + min_zoom: 0, + max_zoom: images_ifd.len() as u8 - 1, zoom_and_ifd, zoom_and_tile_across_down, nodata, @@ -354,16 +367,22 @@ fn get_image_dims( Ok((image_width, image_length)) } -fn get_images_ifd(decoder: &mut Decoder) -> Vec { +fn get_images_ifd(decoder: &mut Decoder, path: &Path) -> Vec { let mut res = vec![]; let mut ifd_idx = 0; loop { let is_image = decoder .get_tag_u32(Tag::NewSubfileType) - .map_or_else(|_| true, |v| v & 4 != 4); + .map_or_else(|_| true, |v| v & 4 != 4); // see https://www.verypdf.com/document/tiff6/pg_0036.htm if is_image { //todo We should not ignore mask in the next PRs res.push(ifd_idx); + } else { + warn!( + "A subfile of {} is ignored in the tiff file as Martin currently does not support mask subfile in tiff. The ifd number of this subfile is {}", + path.display(), + ifd_idx + ); } ifd_idx += 1; From 009f8760547772ecca32b7190a3d90ad68114b64 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 4 Jan 2025 16:43:58 +0100 Subject: [PATCH 215/215] chore(deps): Bump DavidAnson/markdownlint-cli2-action from 18 to 19 in the all-actions-version-updates group (#1638) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps the all-actions-version-updates group with 1 update: [DavidAnson/markdownlint-cli2-action](https://github.com/davidanson/markdownlint-cli2-action). Updates `DavidAnson/markdownlint-cli2-action` from 18 to 19
Release notes

Sourced from DavidAnson/markdownlint-cli2-action's releases.

Update markdownlint version (markdownlint-cli2 v0.17.0, markdownlint v0.37.0).

No release notes provided.

Update markdownlint version (markdownlint-cli2 v0.15.0, markdownlint v0.36.1).

No release notes provided.

Update markdownlint version (markdownlint-cli2 v0.14.0, markdownlint v0.35.0).

No release notes provided.

Update markdownlint version (markdownlint-cli2 v0.13.0, markdownlint v0.34.0).

No release notes provided.

Update markdownlint version (markdownlint-cli2 v0.12.1, markdownlint v0.33.0).

Update markdownlint version (markdownlint-cli2 v0.11.0, markdownlint v0.32.1), remove deprecated "command" input.

No release notes provided.

Update markdownlint version (markdownlint-cli2 v0.10.0, markdownlint v0.31.1).

No release notes provided.

Update markdownlint version (markdownlint-cli2 v0.9.2, markdownlint v0.30.0).

No release notes provided.

Update markdownlint version (markdownlint-cli2 v0.8.1, markdownlint v0.29.0), add "config" and "fix" inputs, deprecate "command" input.

No release notes provided.

Update markdownlint version (markdownlint-cli2 v0.7.1, markdownlint v0.28.2).

No release notes provided.

Update markdownlint version (markdownlint-cli2 v0.7.0, markdownlint v0.28.1), include link to rule information in title of annotations (clickable in GitHub).

No release notes provided.

Update markdownlint version (markdownlint-cli2 v0.6.0, markdownlint v0.27.0).

No release notes provided.

Update markdownlint version (markdownlint-cli2 v0.5.1, markdownlint v0.26.2).

No release notes provided.

Update markdownlint version (markdownlint-cli2 v0.4.0, markdownlint v0.25.1)

No release notes provided.

Commits
  • a23dae2 Update to version 19.0.0.
  • 706b66a Convert to an ECMAScript module.
  • d48ef1a Freshen generated index.js file.
  • 06f25ed Bump eslint-plugin-n from 17.15.0 to 17.15.1
  • 5a210dd Bump eslint from 9.16.0 to 9.17.0
  • 015bc2c Bump @​eslint/js from 9.16.0 to 9.17.0
  • 1d35a78 Bump @​stylistic/eslint-plugin from 2.12.0 to 2.12.1
  • 5eb99dc Bump eslint-plugin-n from 17.14.0 to 17.15.0
  • b28d83f Freshen generated index.js file.
  • d556c91 Bump markdownlint-cli2 from 0.15.0 to 0.16.0
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=DavidAnson/markdownlint-cli2-action&package-manager=github_actions&previous-version=18&new-version=19)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build-deploy-docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-deploy-docs.yml b/.github/workflows/build-deploy-docs.yml index e52f8a7ed..fcf1def64 100644 --- a/.github/workflows/build-deploy-docs.yml +++ b/.github/workflows/build-deploy-docs.yml @@ -16,7 +16,7 @@ jobs: - uses: Swatinem/rust-cache@v2 - name: 'Validate .md files (use "just fmt-md" to fix)' - uses: DavidAnson/markdownlint-cli2-action@v18 + uses: DavidAnson/markdownlint-cli2-action@v19 with: config: '.github/files/config.markdownlint-cli2.jsonc'