diff --git a/.github/workflows/draft-pdf.yml b/.github/workflows/draft-pdf.yml new file mode 100644 index 0000000..e189889 --- /dev/null +++ b/.github/workflows/draft-pdf.yml @@ -0,0 +1,28 @@ +name: Draft PDF +on: + push: + paths: + - paper/** + - .github/workflows/draft-pdf.yml + +jobs: + paper: + runs-on: ubuntu-latest + name: Paper Draft + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Build draft PDF + uses: openjournals/openjournals-draft-action@master + with: + journal: joss + # This should be the path to the paper within your repo. + paper-path: paper/paper.md + - name: Upload + uses: actions/upload-artifact@v4 + with: + name: paper + # This is the output path where Pandoc will write the compiled + # PDF. Note, this should be the same directory as the input + # paper.md + path: paper/paper.pdf \ No newline at end of file diff --git a/.github/workflows/release-package.yml b/.github/workflows/release-package.yml index 9f0c923..03396ce 100644 --- a/.github/workflows/release-package.yml +++ b/.github/workflows/release-package.yml @@ -62,26 +62,26 @@ jobs: cd dist/python maturin build --release # Publish Rust package to crates.io - publish-rust: - needs: build - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - - name: Setup Rust - uses: actions-rs/toolchain@v1 - with: - toolchain: stable - - - name: Sync packages - run: ./scripts/sync_packages.sh - - - name: Publish to crates.io - run: | - cd dist/rust - cargo publish --allow-dirty - env: - CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }} + #publish-rust: + # needs: build + # runs-on: ubuntu-latest + # steps: + # - uses: actions/checkout@v4 + # + # - name: Setup Rust + # uses: actions-rs/toolchain@v1 + # with: + # toolchain: stable + # + # - name: Sync packages + # run: ./scripts/sync_packages.sh + # + # - name: Publish to crates.io + # run: | + # cd dist/rust + # cargo publish --allow-dirty + # env: + # CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }} # Publish JavaScript package to NPM and GitHub Packages publish-javascript: @@ -148,33 +148,33 @@ jobs: NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Publish Python package to PyPI - publish-python: - needs: build - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - - name: Setup Rust - uses: actions-rs/toolchain@v1 - with: - toolchain: stable - - - name: Setup Python - uses: actions/setup-python@v4 - with: - python-version: '3.8' - - - name: Install Python dependencies - run: | - python -m pip install --upgrade pip - pip install maturin build twine - - - name: Sync packages - run: ./scripts/sync_packages.sh - - - name: Build and publish Python package - run: | - cd dist/python - maturin publish - env: - MATURIN_PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }} \ No newline at end of file + #publish-python: + # needs: build + # runs-on: ubuntu-latest + # steps: + # - uses: actions/checkout@v4 + # + # - name: Setup Rust + # uses: actions-rs/toolchain@v1 + # with: + # toolchain: stable + # + # - name: Setup Python + # uses: actions/setup-python@v4 + # with: + # python-version: '3.8' + # + # - name: Install Python dependencies + # run: | + # python -m pip install --upgrade pip + # pip install maturin build twine + # + # - name: Sync packages + # run: ./scripts/sync_packages.sh + # + # - name: Build and publish Python package + # run: | + # cd dist/python + # maturin publish + # env: + # MATURIN_PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }} \ No newline at end of file diff --git a/README.md b/README.md index 517588d..6028cc4 100644 --- a/README.md +++ b/README.md @@ -1,118 +1,284 @@ -# fastgeotoolkit [![Crates.io](https://img.shields.io/crates/v/fastgeotoolkit)](https://crates.io/crates/fastgeotoolkit) [![PyPI](https://img.shields.io/pypi/v/fastgeotoolkit)](https://pypi.org/project/fastgeotoolkit/) [![npm](https://img.shields.io/npm/v/fastgeotoolkit)](https://www.npmjs.com/package/fastgeotoolkit) -[![codecov](https://codecov.io/gh/a0a7/fastgeotoolkit/branch/main/graph/badge.svg)](https://codecov.io/gh/a0a7/fastgeotoolkit) +# fastgeotoolkit [![npm](https://img.shields.io/npm/v/fastgeotoolkit)](https://www.npmjs.com/package/fastgeotoolkit) [![Docs](https://img.shields.io/badge/Documentation-skyblue?logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NDAgNjQwIj48IS0tIUZvbnQgQXdlc29tZSBGcmVlIDcuMC4wIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlL2ZyZWUgQ29weXJpZ2h0IDIwMjUgRm9udGljb25zLCBJbmMuLS0+PHBhdGggZD0iTTQ4MCA1NzZMMTkyIDU3NkMxMzkgNTc2IDk2IDUzMyA5NiA0ODBMOTYgMTYwQzk2IDEwNyAxMzkgNjQgMTkyIDY0TDQ5NiA2NEM1MjIuNSA2NCA1NDQgODUuNSA1NDQgMTEyTDU0NCA0MDBDNTQ0IDQyMC45IDUzMC42IDQzOC43IDUxMiA0NDUuM0w1MTIgNTEyQzUyOS43IDUxMiA1NDQgNTI2LjMgNTQ0IDU0NEM1NDQgNTYxLjcgNTI5LjcgNTc2IDUxMiA1NzZMNDgwIDU3NnpNMTkyIDQ0OEMxNzQuMyA0NDggMTYwIDQ2Mi4zIDE2MCA0ODBDMTYwIDQ5Ny43IDE3NC4zIDUxMiAxOTIgNTEyTDQ0OCA1MTJMNDQ4IDQ0OEwxOTIgNDQ4ek0yMjQgMjE2QzIyNCAyMjkuMyAyMzQuNyAyNDAgMjQ4IDI0MEw0MjQgMjQwQzQzNy4zIDI0MCA0NDggMjI5LjMgNDQ4IDIxNkM0NDggMjAyLjcgNDM3LjMgMTkyIDQyNCAxOTJMMjQ4IDE5MkMyMzQuNyAxOTIgMjI0IDIwMi43IDIyNCAyMTZ6TTI0OCAyODhDMjM0LjcgMjg4IDIyNCAyOTguNyAyMjQgMzEyQzIyNCAzMjUuMyAyMzQuNyAzMzYgMjQ4IDMzNkw0MjQgMzM2QzQzNy4zIDMzNiA0NDggMzI1LjMgNDQ4IDMxMkM0NDggMjk4LjcgNDM3LjMgMjg4IDQyNCAyODhMMjQ4IDI4OHoiLz48L3N2Zz4=)](https://fastgeotoolkit.pages.dev/) [![Demo](https://img.shields.io/badge/Try%20the%20demo-lightblue)](https://fastgeotoolkit-demo.pages.dev/) + + + [![Rust Tests](https://github.com/a0a7/fastgeotoolkit/actions/workflows/rust-tests.yml/badge.svg)](https://github.com/a0a7/fastgeotoolkit/actions/workflows/rust-tests.yml) [![JavaScript Tests](https://github.com/a0a7/fastgeotoolkit/actions/workflows/javascript-tests.yml/badge.svg)](https://github.com/a0a7/fastgeotoolkit/actions/workflows/javascript-tests.yml) [![CodeQL](https://github.com/a0a7/fastgeotoolkit/actions/workflows/github-code-scanning/codeql/badge.svg)](https://github.com/a0a7/fastgeotoolkit/actions/workflows/github-code-scanning/codeql) ![License](https://img.shields.io/badge/license-MIT-blue) -GPS track processor for frequency-based route heatmaps from GPX, FIT, and polyline data. +fastgeotoolkit is a library for GPS data processing and route density mapping. The core of the library is written in Rust and it's compiled to webassembly for use in the browser and node. + +> [!NOTE] +> Only Javascript/Typescript is supported at the moment. Rust and Python releases are planned. + +## What it does + +The main use case is creating route heatmaps where you want to see which paths/routes are used most frequently. You can test this functionality at [https://fastgeotoolkit-demo.pages.dev/](https://fastgeotoolkit-demo.pages.dev/), using either your own data or sample data. This is an example of what a heatmap produced using fastgeotoolkit looks like: +![https://i.ibb.co/MxpHbVdp/image.png](https://i.ibb.co/MxpHbVdp/image.png) + +However, beyond this primary usecase, this library helps you: +- Analyze GPS tracks (distance, statistics, intersections) +- Decode Google polylines +- Convert between GPS data formats + +## Documentation + +Docs are available at https://fastgeotoolkit.pages.dev/. ## Installation -| Language | Package Manager | Command | -|----------|----------------|---------| -| **Rust** | cargo | `cargo add fastgeotoolkit` | -| **Python** | pip | `pip install fastgeotoolkit` | -| **JavaScript/Node.js** | npm | `npm install fastgeotoolkit` | -| **JavaScript/Node.js** | GitHub Packages | `npm install @a0a7/fastgeotoolkit` | +```bash +npm install fastgeotoolkit +# or +pnpm i fastgeotoolkit +``` -> **Note**: The JavaScript package is available on both npm and GitHub Packages with the same functionality. +## Basic Usage -## Features -- GPX file parsing -- FIT file parsing -- Polyline decoding -- Route frequency analysis -- WebAssembly bindings +```typescript +import { processGpxFiles } from 'fastgeotoolkit'; -## Docs +// Process GPX files into a heatmap +const gpxFile1 = new Uint8Array(/* your GPX file data */); +const gpxFile2 = new Uint8Array(/* another GPX file */); -**[full docs](https://a0a7.github.io/fastgeotoolkit/)** +const result = await processGpxFiles([gpxFile1, gpxFile2]); -- [Rust API](https://docs.rs/fastgeotoolkit) -- [JS/TS API](https://a0a7.github.io/fastgeotoolkit/api/typescript) -- [Python API](https://a0a7.github.io/fastgeotoolkit/api/python) +// Result contains tracks with frequency data +console.log(`Found ${result.tracks.length} unique track segments`); +console.log(`Maximum frequency: ${result.max_frequency}`); -## Installation +result.tracks.forEach(track => { + console.log(`Track with ${track.coordinates.length} points, used ${track.frequency} times`); +}); +``` -### JavaScript/TypeScript +## Working with Polylines -```bash -# Install from npm (latest version) -npm install fastgeotoolkit +```typescript +import { decodePolyline, processPolylines } from 'fastgeotoolkit'; + +// Decode a single polyline +const coords = await decodePolyline('_p~iF~ps|U_ulLnnqC_mqNvxq`@'); +console.log(coords); // [[lat, lng], [lat, lng], ...] -# Or install from GitHub Packages -npm install @a0a7/fastgeotoolkit --registry=https://npm.pkg.github.com +// Process multiple polylines into a heatmap +const polylines = [ + '_p~iF~ps|U_ulLnnqC_mqNvxq`@', + 'another_encoded_polyline', + 'yet_another_one' +]; +const heatmap = await processPolylines(polylines); ``` -### Rust +## Track Analysis + +```typescript +import { calculateTrackStatistics, validateCoordinates } from 'fastgeotoolkit'; + +const coordinates = [[37.7749, -122.4194], [37.7849, -122.4094]]; // [lat, lng] pairs -```toml -# Add to Cargo.toml -[dependencies] -fastgeotoolkit = "0.1.0" +// Get basic statistics +const stats = await calculateTrackStatistics(coordinates); +console.log(`Distance: ${stats.distance_km.toFixed(2)} km`); +console.log(`${stats.point_count} GPS points`); +console.log(`Bounds: ${stats.bounding_box}`); // [min_lat, min_lng, max_lat, max_lng] + +// Validate coordinates +const validation = await validateCoordinates(coordinates); +console.log(`${validation.valid_count} out of ${validation.total_count} coordinates are valid`); +if (validation.issues.length > 0) { + console.log('Issues found:', validation.issues); +} ``` -### Python +## Data Conversion -```bash -pip install fastgeotoolkit +```typescript +import { coordinatesToGeojson, exportToGpx } from 'fastgeotoolkit'; + +// Convert to GeoJSON +const geojson = await coordinatesToGeojson(coordinates, { + name: 'My Route', + activity: 'cycling' +}); + +// Export multiple tracks as GPX +const tracks = [track1_coordinates, track2_coordinates]; +const gpxString = await exportToGpx(tracks, { + creator: 'My App', + name: 'Route Collection' +}); +``` + +## Real-world Example + +Here's an example of how you might use this in a web app to show route popularity: + +```typescript +import { processGpxFiles } from 'fastgeotoolkit'; + +async function createHeatmap(gpxFiles) { + // Convert files to Uint8Array + const fileBuffers = await Promise.all( + gpxFiles.map(file => file.arrayBuffer().then(buf => new Uint8Array(buf))) + ); + + // Process into heatmap + const heatmap = await processGpxFiles(fileBuffers); + + // Render on map (example with any mapping library) + heatmap.tracks.forEach(track => { + const intensity = track.frequency / heatmap.max_frequency; + const color = `hsl(${(1-intensity) * 240}, 100%, 50%)`; // blue to red + + drawLineOnMap(track.coordinates, { + color: color, + weight: Math.max(2, intensity * 8) + }); + }); +} + +// Usage +document.getElementById('file-input').addEventListener('change', async (e) => { + const files = Array.from(e.target.files); + await createHeatmap(files); +}); ``` -## Example Usage +## TypeScript Support + +The library includes full TypeScript definitions: + +```typescript +import type { + Coordinate, // [number, number] - [lat, lng] + HeatmapResult, // { tracks: HeatmapTrack[], max_frequency: number } + HeatmapTrack, // { coordinates: Coordinate[], frequency: number } + TrackStatistics, // distance, bounds, point count, etc. + ValidationResult, // validation results with issues + FileInfo // file format information +} from 'fastgeotoolkit'; +``` -### JavaScript/TypeScript +## JavaScript Utilities + +For simple operations that don't rely on WebAssembly: + +```typescript +import { utils } from 'fastgeotoolkit'; + +// Basic coordinate validation +if (utils.isValidCoordinate(37.7749, -122.4194)) { + console.log('Valid GPS coordinate'); +} + +// Calculate distance between two points +const distance = utils.haversineDistance(37.7749, -122.4194, 37.7849, -122.4094); +console.log(`Distance: ${distance.toFixed(2)} km`); + +// Get bounding box +const bounds = utils.getBoundingBox(coordinates); +console.log(`Bounds: ${bounds}`); // [min_lat, min_lng, max_lat, max_lng] +``` + +## Browser vs Node.js + +Works the same in both environments: ```javascript -import { processGpxFiles, decodePolyline } from 'fastgeotoolkit'; +// Browser +import { processGpxFiles } from 'fastgeotoolkit'; + +// Node.js +const { processGpxFiles } = require('fastgeotoolkit'); +// or with ES modules: +import { processGpxFiles } from 'fastgeotoolkit'; +``` + +## Performance Notes + +- WebAssembly provides near-native performance for GPS processing +- Large datasets (thousands of tracks) process quickly +- First function call initializes WebAssembly (adds ~100ms startup time) + +## Common Issues -// Process GPX files -const gpxFiles = [/* ArrayBuffer[] */]; -const result = await processGpxFiles(gpxFiles); +**"Cannot resolve module"** errors: Make sure your bundler supports WebAssembly. Modern bundlers (Vite, Webpack 5+, etc.) work out of the box. -// Decode polyline -const decoded = decodePolyline("_p~iF~ps|U_ulLnnqC_mqNvxq`@"); +**TypeScript errors**: Ensure you're using TypeScript 4.0+ for proper WebAssembly typing support. + +**File reading**: Remember to convert File objects to Uint8Array: +```javascript +const buffer = await file.arrayBuffer(); +const uint8Array = new Uint8Array(buffer); ``` -### Rust +## Development & Maintenance + +This project consists of Rust code compiled to WebAssembly with JavaScript/TypeScript bindings. + +### Project Structure -```rust -use heatmap_parse::{process_gpx_files, decode_polyline, process_polylines}; +- `/src/` - Rust source code +- `/dist/javascript/` - JavaScript/TypeScript bindings and NPM package +- `/dist/wasm/` - Generated WebAssembly files +- `/demo/` - Demo application (SvelteKit) +- `/docs/` - Generated documentation +> [!NOTE] +> `/dist/python` and `/dist/rust/` contain WIP releases for their respective ecosystems, but they're not in working order yet. -let files = vec![/* Vec file data */]; -let result = process_gpx_files(files); +### Compiling Rust to WebAssembly -let coords = decode_polyline("_p~iF~ps|U_ulLnnqC_mqNvxq`@"); +To compile the Rust code to WebAssembly: -let polylines = vec!["polyline1".to_string(), "polyline2".to_string()]; -let tracks = process_polylines(polylines); +```bash +# Install wasm-pack if you haven't already +cargo install wasm-pack + +# Build the WebAssembly module +wasm-pack build --target web --out-dir dist/wasm ``` -### WebAssembly +### Building the NPM Package -```javascript -import init, { process_gpx_files, decode_polyline_string } from 'fastgeotoolkit'; +To build the complete NPM package with all bindings: -await init(); +```bash +# From the root directory +npm run build + +# Or build individual components: +npm run build:wasm # Build WebAssembly +npm run build:js # Build JavaScript bindings +npm run build:docs # Build documentation +``` -const files = [/* Uint8Array buffers */]; -const result = process_gpx_files(files); +### Building Documentation -const coords = decode_polyline_string("_p~iF~ps|U_ulLnnqC_mqNvxq`@"); +The documentation is generated using TypeDoc and can be built locally: + +```bash +cd dist/javascript +npm run docs ``` -## Building +This will generate the documentation website in the `docs/` directory. + +### Testing ```bash -# Native Rust -cargo build --release +# Run Rust tests +cargo test -# js -wasm-pack build --target web +# Run JavaScript tests +cd dist/javascript +npm test ``` ## License -MIT \ No newline at end of file +MIT diff --git a/codemeta.json b/codemeta.json deleted file mode 100644 index 1661573..0000000 --- a/codemeta.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "@context": "https://doi.org/10.5063/schema/codemeta-2.0", - "type": "SoftwareSourceCode", - "applicationCategory": "GIS", - "codeRepository": "https://github.com/a0a7/fastgeotoolkit.git", - "contributor": [ - { - "id": "https://orcid.org/0009-0008-5679-3042", - "type": "Person", - "affiliation": { - "type": "Organization", - "name": "B.E.E. Student, University of Minnesota" - }, - "email": "aw@a0.ax", - "familyName": "Weimer", - "givenName": "Alexander" - }, - { - "type": "schema:Role", - "contributor": "https://orcid.org/0009-0008-5679-3042", - "schema:endDate": "9999-12-31", - "schema:roleName": "Developer", - "schema:startDate": "2025-04-11" - }, - { - "id": "_:contributor_2", - "type": "Person", - "affiliation": { - "type": "Organization", - "name": "Student, University of Minnesota" - }, - "email": "abrah844@umn.edu", - "familyName": "Abraham", - "givenName": "Justin" - } - ], - "dateCreated": "2025-04-11", - "dateModified": "2025-07-30", - "description": "High-Performance Geospatial Analysis library with Novel Segment-Based Route Density Mapping", - "keywords": [ - "Geospatial computing", - "heatmap visualization", - "Rust", - "WebAssembly" - ], - "license": "https://spdx.org/licenses/MIT", - "name": "fastGeoToolkit", - "programmingLanguage": "Rust", - "contIntegration": "https://github.com/a0a7/fastgeotoolkit/actions", - "codemeta:continuousIntegration": { - "id": "https://github.com/a0a7/fastgeotoolkit/actions" - }, - "issueTracker": "https://github.com/a0a7/fastgeotoolkit/issues" -} \ No newline at end of file diff --git a/core/Cargo.toml b/core/Cargo.toml index 0dfe83c..ad4ce7e 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -5,7 +5,7 @@ edition = "2021" description = "A fast and comprehensive geospatial toolkit for processing GPS tracks, trajectories, and coordinate data from GPX, FIT, and polyline formats" license = "MIT" repository = "https://github.com/a0a7/fastgeotoolkit" -authors = ["fastgeotoolkit contributors"] +authors = ["a0a7"] keywords = ["gps", "geospatial", "trajectory", "fast", "toolkit"] categories = ["wasm", "science", "visualization"] readme = "README.md" diff --git a/core/README.md b/core/README.md index 5950942..ea53090 100644 --- a/core/README.md +++ b/core/README.md @@ -168,7 +168,7 @@ If you use fastGeoToolkit in academic research, please cite: ```bibtex @software{fastgeotoolkit2024, title={fastGeoToolkit: A Novel High-Performance Geospatial Analysis Framework with Advanced Route Density Mapping}, - author={fastGeoToolkit Contributors}, + author={a0a7}, year={2024}, url={https://github.com/a0a7/fastgeotoolkit}, version={0.1.3} diff --git a/demo/_headers b/demo/_headers new file mode 100644 index 0000000..d4383bd --- /dev/null +++ b/demo/_headers @@ -0,0 +1,7 @@ +/_app/* + Cache-Control: public, max-age=31536000, immutable + +/*.wasm + Content-Type: application/wasm + Cache-Control: public, max-age=31536000 + Cross-Origin-Resource-Policy: cross-origin diff --git a/demo/package.json b/demo/package.json index 7081435..65baf3a 100644 --- a/demo/package.json +++ b/demo/package.json @@ -41,7 +41,7 @@ "tw-animate-css": "^1.3.5", "typescript": "^5.0.0", "vaul-svelte": "1.0.0-next.7", - "vite": "^6.2.6" + "vite": "^6.3.6" }, "pnpm": { "onlyBuiltDependencies": [ @@ -53,7 +53,7 @@ "@turf/distance": "^7.2.0", "@turf/helpers": "^7.2.0", "@turf/turf": "^7.2.0", - "fastgeotoolkit": "^0.2.0", + "fastgeotoolkit": "^0.2.3", "maplibre-gl": "^5.6.0", "svelte-loading-spinners": "^0.3.6", "svelte-maplibre": "^1.2.0" diff --git a/demo/pnpm-lock.yaml b/demo/pnpm-lock.yaml index ad5599a..ad77898 100644 --- a/demo/pnpm-lock.yaml +++ b/demo/pnpm-lock.yaml @@ -21,8 +21,8 @@ importers: specifier: ^7.2.0 version: 7.2.0 fastgeotoolkit: - specifier: ^0.1.14 - version: 0.1.14 + specifier: ^0.2.3 + version: 0.2.3 maplibre-gl: specifier: ^5.6.0 version: 5.6.0 @@ -41,16 +41,16 @@ importers: version: 0.515.0(svelte@5.34.8) '@sveltejs/adapter-cloudflare': specifier: ^7.0.0 - version: 7.0.4(@sveltejs/kit@2.22.2(@sveltejs/vite-plugin-svelte@5.1.0(svelte@5.34.8)(vite@6.3.5(jiti@2.4.2)(lightningcss@1.30.1)))(svelte@5.34.8)(vite@6.3.5(jiti@2.4.2)(lightningcss@1.30.1)))(wrangler@4.22.0(@cloudflare/workers-types@4.20250627.0)) + version: 7.0.4(@sveltejs/kit@2.22.2(@sveltejs/vite-plugin-svelte@5.1.0(svelte@5.34.8)(vite@6.3.6(jiti@2.4.2)(lightningcss@1.30.1)))(svelte@5.34.8)(vite@6.3.6(jiti@2.4.2)(lightningcss@1.30.1)))(wrangler@4.22.0(@cloudflare/workers-types@4.20250627.0)) '@sveltejs/kit': specifier: ^2.16.0 - version: 2.22.2(@sveltejs/vite-plugin-svelte@5.1.0(svelte@5.34.8)(vite@6.3.5(jiti@2.4.2)(lightningcss@1.30.1)))(svelte@5.34.8)(vite@6.3.5(jiti@2.4.2)(lightningcss@1.30.1)) + version: 2.22.2(@sveltejs/vite-plugin-svelte@5.1.0(svelte@5.34.8)(vite@6.3.6(jiti@2.4.2)(lightningcss@1.30.1)))(svelte@5.34.8)(vite@6.3.6(jiti@2.4.2)(lightningcss@1.30.1)) '@sveltejs/vite-plugin-svelte': specifier: ^5.0.0 - version: 5.1.0(svelte@5.34.8)(vite@6.3.5(jiti@2.4.2)(lightningcss@1.30.1)) + version: 5.1.0(svelte@5.34.8)(vite@6.3.6(jiti@2.4.2)(lightningcss@1.30.1)) '@tailwindcss/vite': specifier: ^4.0.0 - version: 4.1.11(vite@6.3.5(jiti@2.4.2)(lightningcss@1.30.1)) + version: 4.1.11(vite@6.3.6(jiti@2.4.2)(lightningcss@1.30.1)) '@tanstack/table-core': specifier: ^8.20.5 version: 8.21.3 @@ -65,7 +65,7 @@ importers: version: 8.6.0(svelte@5.34.8) formsnap: specifier: ^2.0.1 - version: 2.0.1(svelte@5.34.8)(sveltekit-superforms@2.27.1(@sveltejs/kit@2.22.2(@sveltejs/vite-plugin-svelte@5.1.0(svelte@5.34.8)(vite@6.3.5(jiti@2.4.2)(lightningcss@1.30.1)))(svelte@5.34.8)(vite@6.3.5(jiti@2.4.2)(lightningcss@1.30.1)))(@types/json-schema@7.0.15)(esbuild@0.25.5)(svelte@5.34.8)(typescript@5.8.3)) + version: 2.0.1(svelte@5.34.8)(sveltekit-superforms@2.27.1(@sveltejs/kit@2.22.2(@sveltejs/vite-plugin-svelte@5.1.0(svelte@5.34.8)(vite@6.3.6(jiti@2.4.2)(lightningcss@1.30.1)))(svelte@5.34.8)(vite@6.3.6(jiti@2.4.2)(lightningcss@1.30.1)))(@types/json-schema@7.0.15)(esbuild@0.25.9)(svelte@5.34.8)(typescript@5.8.3)) layerchart: specifier: 2.0.0-next.27 version: 2.0.0-next.27(svelte@5.34.8) @@ -89,13 +89,13 @@ importers: version: 5.34.8 svelte-check: specifier: ^4.0.0 - version: 4.2.2(picomatch@4.0.2)(svelte@5.34.8)(typescript@5.8.3) + version: 4.2.2(picomatch@4.0.3)(svelte@5.34.8)(typescript@5.8.3) svelte-sonner: specifier: ^1.0.5 version: 1.0.5(svelte@5.34.8) sveltekit-superforms: specifier: ^2.26.1 - version: 2.27.1(@sveltejs/kit@2.22.2(@sveltejs/vite-plugin-svelte@5.1.0(svelte@5.34.8)(vite@6.3.5(jiti@2.4.2)(lightningcss@1.30.1)))(svelte@5.34.8)(vite@6.3.5(jiti@2.4.2)(lightningcss@1.30.1)))(@types/json-schema@7.0.15)(esbuild@0.25.5)(svelte@5.34.8)(typescript@5.8.3) + version: 2.27.1(@sveltejs/kit@2.22.2(@sveltejs/vite-plugin-svelte@5.1.0(svelte@5.34.8)(vite@6.3.6(jiti@2.4.2)(lightningcss@1.30.1)))(svelte@5.34.8)(vite@6.3.6(jiti@2.4.2)(lightningcss@1.30.1)))(@types/json-schema@7.0.15)(esbuild@0.25.9)(svelte@5.34.8)(typescript@5.8.3) tailwind-merge: specifier: ^3.3.1 version: 3.3.1 @@ -115,8 +115,8 @@ importers: specifier: 1.0.0-next.7 version: 1.0.0-next.7(svelte@5.34.8) vite: - specifier: ^6.2.6 - version: 6.3.5(jiti@2.4.2)(lightningcss@1.30.1) + specifier: ^6.3.6 + version: 6.3.6(jiti@2.4.2)(lightningcss@1.30.1) packages: @@ -191,8 +191,8 @@ packages: resolution: {integrity: sha512-mepCf/e9+SKYy1d02/UkvSy6+6MoyXhVxP8lLDfA7BPE1X1d4dR0sZznmbM8/XVJ1GPM+Svnx7Xj6ZweByWUkw==} engines: {node: '>17.0.0'} - '@emnapi/runtime@1.4.3': - resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} + '@emnapi/runtime@1.5.0': + resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} '@esbuild/aix-ppc64@0.25.4': resolution: {integrity: sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==} @@ -200,8 +200,8 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.25.5': - resolution: {integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==} + '@esbuild/aix-ppc64@0.25.9': + resolution: {integrity: sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] @@ -212,8 +212,8 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.25.5': - resolution: {integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==} + '@esbuild/android-arm64@0.25.9': + resolution: {integrity: sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==} engines: {node: '>=18'} cpu: [arm64] os: [android] @@ -224,8 +224,8 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.25.5': - resolution: {integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==} + '@esbuild/android-arm@0.25.9': + resolution: {integrity: sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==} engines: {node: '>=18'} cpu: [arm] os: [android] @@ -236,8 +236,8 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.25.5': - resolution: {integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==} + '@esbuild/android-x64@0.25.9': + resolution: {integrity: sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==} engines: {node: '>=18'} cpu: [x64] os: [android] @@ -248,8 +248,8 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.25.5': - resolution: {integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==} + '@esbuild/darwin-arm64@0.25.9': + resolution: {integrity: sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] @@ -260,8 +260,8 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.25.5': - resolution: {integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==} + '@esbuild/darwin-x64@0.25.9': + resolution: {integrity: sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] @@ -272,8 +272,8 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.25.5': - resolution: {integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==} + '@esbuild/freebsd-arm64@0.25.9': + resolution: {integrity: sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] @@ -284,8 +284,8 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.5': - resolution: {integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==} + '@esbuild/freebsd-x64@0.25.9': + resolution: {integrity: sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] @@ -296,8 +296,8 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.25.5': - resolution: {integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==} + '@esbuild/linux-arm64@0.25.9': + resolution: {integrity: sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==} engines: {node: '>=18'} cpu: [arm64] os: [linux] @@ -308,8 +308,8 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.25.5': - resolution: {integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==} + '@esbuild/linux-arm@0.25.9': + resolution: {integrity: sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==} engines: {node: '>=18'} cpu: [arm] os: [linux] @@ -320,8 +320,8 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.25.5': - resolution: {integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==} + '@esbuild/linux-ia32@0.25.9': + resolution: {integrity: sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==} engines: {node: '>=18'} cpu: [ia32] os: [linux] @@ -332,8 +332,8 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.25.5': - resolution: {integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==} + '@esbuild/linux-loong64@0.25.9': + resolution: {integrity: sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==} engines: {node: '>=18'} cpu: [loong64] os: [linux] @@ -344,8 +344,8 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.25.5': - resolution: {integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==} + '@esbuild/linux-mips64el@0.25.9': + resolution: {integrity: sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] @@ -356,8 +356,8 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.25.5': - resolution: {integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==} + '@esbuild/linux-ppc64@0.25.9': + resolution: {integrity: sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] @@ -368,8 +368,8 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.25.5': - resolution: {integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==} + '@esbuild/linux-riscv64@0.25.9': + resolution: {integrity: sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] @@ -380,8 +380,8 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.25.5': - resolution: {integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==} + '@esbuild/linux-s390x@0.25.9': + resolution: {integrity: sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==} engines: {node: '>=18'} cpu: [s390x] os: [linux] @@ -392,8 +392,8 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.25.5': - resolution: {integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==} + '@esbuild/linux-x64@0.25.9': + resolution: {integrity: sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==} engines: {node: '>=18'} cpu: [x64] os: [linux] @@ -404,8 +404,8 @@ packages: cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-arm64@0.25.5': - resolution: {integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==} + '@esbuild/netbsd-arm64@0.25.9': + resolution: {integrity: sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] @@ -416,8 +416,8 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.5': - resolution: {integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==} + '@esbuild/netbsd-x64@0.25.9': + resolution: {integrity: sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] @@ -428,8 +428,8 @@ packages: cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-arm64@0.25.5': - resolution: {integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==} + '@esbuild/openbsd-arm64@0.25.9': + resolution: {integrity: sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] @@ -440,20 +440,26 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.5': - resolution: {integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==} + '@esbuild/openbsd-x64@0.25.9': + resolution: {integrity: sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] + '@esbuild/openharmony-arm64@0.25.9': + resolution: {integrity: sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + '@esbuild/sunos-x64@0.25.4': resolution: {integrity: sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.25.5': - resolution: {integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==} + '@esbuild/sunos-x64@0.25.9': + resolution: {integrity: sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==} engines: {node: '>=18'} cpu: [x64] os: [sunos] @@ -464,8 +470,8 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.25.5': - resolution: {integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==} + '@esbuild/win32-arm64@0.25.9': + resolution: {integrity: sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==} engines: {node: '>=18'} cpu: [arm64] os: [win32] @@ -476,8 +482,8 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.25.5': - resolution: {integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==} + '@esbuild/win32-ia32@0.25.9': + resolution: {integrity: sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==} engines: {node: '>=18'} cpu: [ia32] os: [win32] @@ -488,8 +494,8 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.25.5': - resolution: {integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==} + '@esbuild/win32-x64@0.25.9': + resolution: {integrity: sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -644,8 +650,8 @@ packages: resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} - '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} @@ -697,6 +703,9 @@ packages: '@mapbox/tiny-sdf@2.0.6': resolution: {integrity: sha512-qMqa27TLw+ZQz5Jk+RcwZGH7BQf5G/TrutJhspsca/3SHwmgKQ1iq+d3Jxz5oysPVYTGP6aXxCo5Lk9Er6YBAA==} + '@mapbox/tiny-sdf@2.0.7': + resolution: {integrity: sha512-25gQLQMcpivjOSA40g3gO6qgiFPDpWRoMfd+G/GoppPIeP6JDaMMkMrEJnMZhKyyS6iKwVt5YKu02vCUyJM3Ug==} + '@mapbox/unitbezier@0.0.1': resolution: {integrity: sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw==} @@ -717,103 +726,108 @@ packages: '@poppinss/macroable@1.0.5': resolution: {integrity: sha512-6u61y1HHd090MEk1Av0/1btDmm2Hh/+XoJj+HgFYRh9koUPI822ybJbwLHuqjLNCiY+o1gRykg2igEqOf/VBZw==} - '@rollup/rollup-android-arm-eabi@4.44.1': - resolution: {integrity: sha512-JAcBr1+fgqx20m7Fwe1DxPUl/hPkee6jA6Pl7n1v2EFiktAHenTaXl5aIFjUIEsfn9w3HE4gK1lEgNGMzBDs1w==} + '@rollup/rollup-android-arm-eabi@4.50.1': + resolution: {integrity: sha512-HJXwzoZN4eYTdD8bVV22DN8gsPCAj3V20NHKOs8ezfXanGpmVPR7kalUHd+Y31IJp9stdB87VKPFbsGY3H/2ag==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.44.1': - resolution: {integrity: sha512-RurZetXqTu4p+G0ChbnkwBuAtwAbIwJkycw1n6GvlGlBuS4u5qlr5opix8cBAYFJgaY05TWtM+LaoFggUmbZEQ==} + '@rollup/rollup-android-arm64@4.50.1': + resolution: {integrity: sha512-PZlsJVcjHfcH53mOImyt3bc97Ep3FJDXRpk9sMdGX0qgLmY0EIWxCag6EigerGhLVuL8lDVYNnSo8qnTElO4xw==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.44.1': - resolution: {integrity: sha512-fM/xPesi7g2M7chk37LOnmnSTHLG/v2ggWqKj3CCA1rMA4mm5KVBT1fNoswbo1JhPuNNZrVwpTvlCVggv8A2zg==} + '@rollup/rollup-darwin-arm64@4.50.1': + resolution: {integrity: sha512-xc6i2AuWh++oGi4ylOFPmzJOEeAa2lJeGUGb4MudOtgfyyjr4UPNK+eEWTPLvmPJIY/pgw6ssFIox23SyrkkJw==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.44.1': - resolution: {integrity: sha512-gDnWk57urJrkrHQ2WVx9TSVTH7lSlU7E3AFqiko+bgjlh78aJ88/3nycMax52VIVjIm3ObXnDL2H00e/xzoipw==} + '@rollup/rollup-darwin-x64@4.50.1': + resolution: {integrity: sha512-2ofU89lEpDYhdLAbRdeyz/kX3Y2lpYc6ShRnDjY35bZhd2ipuDMDi6ZTQ9NIag94K28nFMofdnKeHR7BT0CATw==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.44.1': - resolution: {integrity: sha512-wnFQmJ/zPThM5zEGcnDcCJeYJgtSLjh1d//WuHzhf6zT3Md1BvvhJnWoy+HECKu2bMxaIcfWiu3bJgx6z4g2XA==} + '@rollup/rollup-freebsd-arm64@4.50.1': + resolution: {integrity: sha512-wOsE6H2u6PxsHY/BeFHA4VGQN3KUJFZp7QJBmDYI983fgxq5Th8FDkVuERb2l9vDMs1D5XhOrhBrnqcEY6l8ZA==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.44.1': - resolution: {integrity: sha512-uBmIxoJ4493YATvU2c0upGz87f99e3wop7TJgOA/bXMFd2SvKCI7xkxY/5k50bv7J6dw1SXT4MQBQSLn8Bb/Uw==} + '@rollup/rollup-freebsd-x64@4.50.1': + resolution: {integrity: sha512-A/xeqaHTlKbQggxCqispFAcNjycpUEHP52mwMQZUNqDUJFFYtPHCXS1VAG29uMlDzIVr+i00tSFWFLivMcoIBQ==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.44.1': - resolution: {integrity: sha512-n0edDmSHlXFhrlmTK7XBuwKlG5MbS7yleS1cQ9nn4kIeW+dJH+ExqNgQ0RrFRew8Y+0V/x6C5IjsHrJmiHtkxQ==} + '@rollup/rollup-linux-arm-gnueabihf@4.50.1': + resolution: {integrity: sha512-54v4okehwl5TaSIkpp97rAHGp7t3ghinRd/vyC1iXqXMfjYUTm7TfYmCzXDoHUPTTf36L8pr0E7YsD3CfB3ZDg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.44.1': - resolution: {integrity: sha512-8WVUPy3FtAsKSpyk21kV52HCxB+me6YkbkFHATzC2Yd3yuqHwy2lbFL4alJOLXKljoRw08Zk8/xEj89cLQ/4Nw==} + '@rollup/rollup-linux-arm-musleabihf@4.50.1': + resolution: {integrity: sha512-p/LaFyajPN/0PUHjv8TNyxLiA7RwmDoVY3flXHPSzqrGcIp/c2FjwPPP5++u87DGHtw+5kSH5bCJz0mvXngYxw==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.44.1': - resolution: {integrity: sha512-yuktAOaeOgorWDeFJggjuCkMGeITfqvPgkIXhDqsfKX8J3jGyxdDZgBV/2kj/2DyPaLiX6bPdjJDTu9RB8lUPQ==} + '@rollup/rollup-linux-arm64-gnu@4.50.1': + resolution: {integrity: sha512-2AbMhFFkTo6Ptna1zO7kAXXDLi7H9fGTbVaIq2AAYO7yzcAsuTNWPHhb2aTA6GPiP+JXh85Y8CiS54iZoj4opw==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.44.1': - resolution: {integrity: sha512-W+GBM4ifET1Plw8pdVaecwUgxmiH23CfAUj32u8knq0JPFyK4weRy6H7ooxYFD19YxBulL0Ktsflg5XS7+7u9g==} + '@rollup/rollup-linux-arm64-musl@4.50.1': + resolution: {integrity: sha512-Cgef+5aZwuvesQNw9eX7g19FfKX5/pQRIyhoXLCiBOrWopjo7ycfB292TX9MDcDijiuIJlx1IzJz3IoCPfqs9w==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.44.1': - resolution: {integrity: sha512-1zqnUEMWp9WrGVuVak6jWTl4fEtrVKfZY7CvcBmUUpxAJ7WcSowPSAWIKa/0o5mBL/Ij50SIf9tuirGx63Ovew==} + '@rollup/rollup-linux-loongarch64-gnu@4.50.1': + resolution: {integrity: sha512-RPhTwWMzpYYrHrJAS7CmpdtHNKtt2Ueo+BlLBjfZEhYBhK00OsEqM08/7f+eohiF6poe0YRDDd8nAvwtE/Y62Q==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.44.1': - resolution: {integrity: sha512-Rl3JKaRu0LHIx7ExBAAnf0JcOQetQffaw34T8vLlg9b1IhzcBgaIdnvEbbsZq9uZp3uAH+JkHd20Nwn0h9zPjA==} + '@rollup/rollup-linux-ppc64-gnu@4.50.1': + resolution: {integrity: sha512-eSGMVQw9iekut62O7eBdbiccRguuDgiPMsw++BVUg+1K7WjZXHOg/YOT9SWMzPZA+w98G+Fa1VqJgHZOHHnY0Q==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.44.1': - resolution: {integrity: sha512-j5akelU3snyL6K3N/iX7otLBIl347fGwmd95U5gS/7z6T4ftK288jKq3A5lcFKcx7wwzb5rgNvAg3ZbV4BqUSw==} + '@rollup/rollup-linux-riscv64-gnu@4.50.1': + resolution: {integrity: sha512-S208ojx8a4ciIPrLgazF6AgdcNJzQE4+S9rsmOmDJkusvctii+ZvEuIC4v/xFqzbuP8yDjn73oBlNDgF6YGSXQ==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.44.1': - resolution: {integrity: sha512-ppn5llVGgrZw7yxbIm8TTvtj1EoPgYUAbfw0uDjIOzzoqlZlZrLJ/KuiE7uf5EpTpCTrNt1EdtzF0naMm0wGYg==} + '@rollup/rollup-linux-riscv64-musl@4.50.1': + resolution: {integrity: sha512-3Ag8Ls1ggqkGUvSZWYcdgFwriy2lWo+0QlYgEFra/5JGtAd6C5Hw59oojx1DeqcA2Wds2ayRgvJ4qxVTzCHgzg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.44.1': - resolution: {integrity: sha512-Hu6hEdix0oxtUma99jSP7xbvjkUM/ycke/AQQ4EC5g7jNRLLIwjcNwaUy95ZKBJJwg1ZowsclNnjYqzN4zwkAw==} + '@rollup/rollup-linux-s390x-gnu@4.50.1': + resolution: {integrity: sha512-t9YrKfaxCYe7l7ldFERE1BRg/4TATxIg+YieHQ966jwvo7ddHJxPj9cNFWLAzhkVsbBvNA4qTbPVNsZKBO4NSg==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.44.1': - resolution: {integrity: sha512-EtnsrmZGomz9WxK1bR5079zee3+7a+AdFlghyd6VbAjgRJDbTANJ9dcPIPAi76uG05micpEL+gPGmAKYTschQw==} + '@rollup/rollup-linux-x64-gnu@4.50.1': + resolution: {integrity: sha512-MCgtFB2+SVNuQmmjHf+wfI4CMxy3Tk8XjA5Z//A0AKD7QXUYFMQcns91K6dEHBvZPCnhJSyDWLApk40Iq/H3tA==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.44.1': - resolution: {integrity: sha512-iAS4p+J1az6Usn0f8xhgL4PaU878KEtutP4hqw52I4IO6AGoyOkHCxcc4bqufv1tQLdDWFx8lR9YlwxKuv3/3g==} + '@rollup/rollup-linux-x64-musl@4.50.1': + resolution: {integrity: sha512-nEvqG+0jeRmqaUMuwzlfMKwcIVffy/9KGbAGyoa26iu6eSngAYQ512bMXuqqPrlTyfqdlB9FVINs93j534UJrg==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.44.1': - resolution: {integrity: sha512-NtSJVKcXwcqozOl+FwI41OH3OApDyLk3kqTJgx8+gp6On9ZEt5mYhIsKNPGuaZr3p9T6NWPKGU/03Vw4CNU9qg==} + '@rollup/rollup-openharmony-arm64@4.50.1': + resolution: {integrity: sha512-RDsLm+phmT3MJd9SNxA9MNuEAO/J2fhW8GXk62G/B4G7sLVumNFbRwDL6v5NrESb48k+QMqdGbHgEtfU0LCpbA==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.50.1': + resolution: {integrity: sha512-hpZB/TImk2FlAFAIsoElM3tLzq57uxnGYwplg6WDyAxbYczSi8O2eQ+H2Lx74504rwKtZ3N2g4bCUkiamzS6TQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.44.1': - resolution: {integrity: sha512-JYA3qvCOLXSsnTR3oiyGws1Dm0YTuxAAeaYGVlGpUsHqloPcFjPg+X0Fj2qODGLNwQOAcCiQmHub/V007kiH5A==} + '@rollup/rollup-win32-ia32-msvc@4.50.1': + resolution: {integrity: sha512-SXjv8JlbzKM0fTJidX4eVsH+Wmnp0/WcD8gJxIZyR6Gay5Qcsmdbi9zVtnbkGPG8v2vMR1AD06lGWy5FLMcG7A==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.44.1': - resolution: {integrity: sha512-J8o22LuF0kTe7m+8PvW9wk3/bRq5+mRo5Dqo6+vXb7otCm3TPhYOJqOaQtGU9YMWQSL3krMnoOxMr0+9E6F3Ug==} + '@rollup/rollup-win32-x64-msvc@4.50.1': + resolution: {integrity: sha512-StxAO/8ts62KZVRAm4JZYq9+NqNsV7RvimNK+YM7ry//zebEH6meuugqW/P5OFUCjyQgui+9fUxT6d5NShvMvA==} cpu: [x64] os: [win32] @@ -1621,8 +1635,8 @@ packages: resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} engines: {node: '>=8'} - devalue@5.1.1: - resolution: {integrity: sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==} + devalue@5.3.2: + resolution: {integrity: sha512-UDsjUbpQn9kvm68slnrs+mfxwFkIflOhkanmyabZ8zOYk8SMEIbJ3TK+88g70hSIeytu4y18f0z/hYHMTrXIWw==} dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} @@ -1633,6 +1647,9 @@ packages: earcut@3.0.1: resolution: {integrity: sha512-0l1/0gOjESMeQyYaK5IDiPNvFeu93Z/cO0TjZh9eZ1vyCtZnA7KMZ8rQggpsJHIbGSdrqYq9OhuveadOVHCshw==} + earcut@3.0.2: + resolution: {integrity: sha512-X7hshQbLyMJ/3RPhyObLARM2sNxxmRALLKx1+NVFFnQ9gKzmCrxm9+uLIAdBcvc8FNLpctqlQ2V6AE92Ol9UDQ==} + effect@3.16.12: resolution: {integrity: sha512-N39iBk0K71F9nb442TLbTkjl24FLUzuvx2i1I2RsEAQsdAdUTuUoW0vlfUXgkMTUOnYqKnWcFfqw4hK4Pw27hg==} @@ -1664,8 +1681,8 @@ packages: engines: {node: '>=18'} hasBin: true - esbuild@0.25.5: - resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==} + esbuild@0.25.9: + resolution: {integrity: sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==} engines: {node: '>=18'} hasBin: true @@ -1689,12 +1706,13 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fastgeotoolkit@0.1.14: - resolution: {integrity: sha512-a452x1vHNFYXIJsBGtXLw6diY/BIFHaUIsnIWC2CbQxGsH7ChesQJTduUY1/ywanb2oj1gp8B2OW147gWerNLw==} + fastgeotoolkit@0.2.3: + resolution: {integrity: sha512-J3UmoHoxfPRnUlPxcFwXxuFknOTu0mLQv88ACclorcaz3D6zDveid0dPB+RB4VVfAj7IWrimK5Q0FfWIO36shQ==} engines: {node: '>=16.0.0'} - fdir@6.4.6: - resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -1735,6 +1753,9 @@ packages: gl-matrix@3.4.3: resolution: {integrity: sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==} + gl-matrix@3.4.4: + resolution: {integrity: sha512-latSnyDNt/8zYUB6VIJ6PCh2jBjJX6gnDsoCZ7LyW7GkqrD51EWwa9qCoGixj8YqBtETQK/xY7OmpTF8xz1DdQ==} + glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} @@ -1995,8 +2016,8 @@ packages: picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} pmtiles@3.2.1: @@ -2018,6 +2039,9 @@ packages: potpack@2.0.0: resolution: {integrity: sha512-Q+/tYsFU9r7xoOJ+y/ZTtdVQwTWfzjbiXBDMM/JKUux3+QPP02iUuIoeBQ+Ot6oEDlC+/PGjB/5A3K7KKb7hcw==} + potpack@2.1.0: + resolution: {integrity: sha512-pcaShQc1Shq0y+E7GqJqvZj8DTthWV1KeHGdi0Z6IAin2Oi3JnLCOfwnCo84qc+HAp52wT9nK9H7FAJp5a44GQ==} + prettier-plugin-svelte@3.4.0: resolution: {integrity: sha512-pn1ra/0mPObzqoIQn/vUTR3ZZI6UuZ0sHqMK5x2jMLGrs53h0sXhkVuDcrlssHwIMk7FYrMjHBPoUSyyEEDlBQ==} peerDependencies: @@ -2128,8 +2152,8 @@ packages: robust-predicates@3.0.2: resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} - rollup@4.44.1: - resolution: {integrity: sha512-x8H8aPvD+xbl0Do8oez5f5o8eMS3trfCghc4HhLAnCkj7Vl0d1JWGs0UF/D886zLW2rOj2QymV/JcSSsw+XDNg==} + rollup@4.50.1: + resolution: {integrity: sha512-78E9voJHwnXQMiQdiqswVLZwJIzdBKJ1GdI5Zx6XwoFKUIk09/sSrr+05QFzvYb8q6Y9pPV45zzDuYa3907TZA==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -2314,8 +2338,8 @@ packages: tiny-case@1.0.3: resolution: {integrity: sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==} - tinyglobby@0.2.14: - resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} tinyqueue@1.2.3: @@ -2403,8 +2427,8 @@ packages: peerDependencies: svelte: ^5.0.0 - vite@6.3.5: - resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} + vite@6.3.6: + resolution: {integrity: sha512-0msEVHJEScQbhkbVTb/4iHZdJ6SXp/AvxL2sjwYQFfBqleHtnCqv1J3sa9zbWz/6kW1m9Tfzn92vW+kZ1WV6QA==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: @@ -2569,7 +2593,7 @@ snapshots: '@dagrejs/graphlib@2.2.4': {} - '@emnapi/runtime@1.4.3': + '@emnapi/runtime@1.5.0': dependencies: tslib: 2.8.1 optional: true @@ -2577,151 +2601,154 @@ snapshots: '@esbuild/aix-ppc64@0.25.4': optional: true - '@esbuild/aix-ppc64@0.25.5': + '@esbuild/aix-ppc64@0.25.9': optional: true '@esbuild/android-arm64@0.25.4': optional: true - '@esbuild/android-arm64@0.25.5': + '@esbuild/android-arm64@0.25.9': optional: true '@esbuild/android-arm@0.25.4': optional: true - '@esbuild/android-arm@0.25.5': + '@esbuild/android-arm@0.25.9': optional: true '@esbuild/android-x64@0.25.4': optional: true - '@esbuild/android-x64@0.25.5': + '@esbuild/android-x64@0.25.9': optional: true '@esbuild/darwin-arm64@0.25.4': optional: true - '@esbuild/darwin-arm64@0.25.5': + '@esbuild/darwin-arm64@0.25.9': optional: true '@esbuild/darwin-x64@0.25.4': optional: true - '@esbuild/darwin-x64@0.25.5': + '@esbuild/darwin-x64@0.25.9': optional: true '@esbuild/freebsd-arm64@0.25.4': optional: true - '@esbuild/freebsd-arm64@0.25.5': + '@esbuild/freebsd-arm64@0.25.9': optional: true '@esbuild/freebsd-x64@0.25.4': optional: true - '@esbuild/freebsd-x64@0.25.5': + '@esbuild/freebsd-x64@0.25.9': optional: true '@esbuild/linux-arm64@0.25.4': optional: true - '@esbuild/linux-arm64@0.25.5': + '@esbuild/linux-arm64@0.25.9': optional: true '@esbuild/linux-arm@0.25.4': optional: true - '@esbuild/linux-arm@0.25.5': + '@esbuild/linux-arm@0.25.9': optional: true '@esbuild/linux-ia32@0.25.4': optional: true - '@esbuild/linux-ia32@0.25.5': + '@esbuild/linux-ia32@0.25.9': optional: true '@esbuild/linux-loong64@0.25.4': optional: true - '@esbuild/linux-loong64@0.25.5': + '@esbuild/linux-loong64@0.25.9': optional: true '@esbuild/linux-mips64el@0.25.4': optional: true - '@esbuild/linux-mips64el@0.25.5': + '@esbuild/linux-mips64el@0.25.9': optional: true '@esbuild/linux-ppc64@0.25.4': optional: true - '@esbuild/linux-ppc64@0.25.5': + '@esbuild/linux-ppc64@0.25.9': optional: true '@esbuild/linux-riscv64@0.25.4': optional: true - '@esbuild/linux-riscv64@0.25.5': + '@esbuild/linux-riscv64@0.25.9': optional: true '@esbuild/linux-s390x@0.25.4': optional: true - '@esbuild/linux-s390x@0.25.5': + '@esbuild/linux-s390x@0.25.9': optional: true '@esbuild/linux-x64@0.25.4': optional: true - '@esbuild/linux-x64@0.25.5': + '@esbuild/linux-x64@0.25.9': optional: true '@esbuild/netbsd-arm64@0.25.4': optional: true - '@esbuild/netbsd-arm64@0.25.5': + '@esbuild/netbsd-arm64@0.25.9': optional: true '@esbuild/netbsd-x64@0.25.4': optional: true - '@esbuild/netbsd-x64@0.25.5': + '@esbuild/netbsd-x64@0.25.9': optional: true '@esbuild/openbsd-arm64@0.25.4': optional: true - '@esbuild/openbsd-arm64@0.25.5': + '@esbuild/openbsd-arm64@0.25.9': optional: true '@esbuild/openbsd-x64@0.25.4': optional: true - '@esbuild/openbsd-x64@0.25.5': + '@esbuild/openbsd-x64@0.25.9': + optional: true + + '@esbuild/openharmony-arm64@0.25.9': optional: true '@esbuild/sunos-x64@0.25.4': optional: true - '@esbuild/sunos-x64@0.25.5': + '@esbuild/sunos-x64@0.25.9': optional: true '@esbuild/win32-arm64@0.25.4': optional: true - '@esbuild/win32-arm64@0.25.5': + '@esbuild/win32-arm64@0.25.9': optional: true '@esbuild/win32-ia32@0.25.4': optional: true - '@esbuild/win32-ia32@0.25.5': + '@esbuild/win32-ia32@0.25.9': optional: true '@esbuild/win32-x64@0.25.4': optional: true - '@esbuild/win32-x64@0.25.5': + '@esbuild/win32-x64@0.25.9': optional: true '@exodus/schemasafe@1.3.0': @@ -2740,12 +2767,12 @@ snapshots: '@floating-ui/utils@0.2.10': {} - '@gcornut/valibot-json-schema@0.42.0(esbuild@0.25.5)(typescript@5.8.3)': + '@gcornut/valibot-json-schema@0.42.0(esbuild@0.25.9)(typescript@5.8.3)': dependencies: valibot: 0.42.1(typescript@5.8.3) optionalDependencies: '@types/json-schema': 7.0.15 - esbuild-runner: 2.2.2(esbuild@0.25.5) + esbuild-runner: 2.2.2(esbuild@0.25.9) transitivePeerDependencies: - esbuild - typescript @@ -2825,7 +2852,7 @@ snapshots: '@img/sharp-wasm32@0.33.5': dependencies: - '@emnapi/runtime': 1.4.3 + '@emnapi/runtime': 1.5.0 optional: true '@img/sharp-win32-ia32@0.33.5': @@ -2845,24 +2872,24 @@ snapshots: '@jridgewell/gen-mapping@0.3.8': dependencies: '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.5 '@jridgewell/trace-mapping': 0.3.25 '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/set-array@1.2.1': {} - '@jridgewell/sourcemap-codec@1.5.0': {} + '@jridgewell/sourcemap-codec@1.5.5': {} '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.5 '@jridgewell/trace-mapping@0.3.9': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.5 '@layerstack/svelte-actions@1.0.1-next.12': dependencies: @@ -2917,6 +2944,8 @@ snapshots: '@mapbox/tiny-sdf@2.0.6': {} + '@mapbox/tiny-sdf@2.0.7': {} + '@mapbox/unitbezier@0.0.1': {} '@mapbox/vector-tile@1.3.1': @@ -2940,64 +2969,67 @@ snapshots: '@poppinss/macroable@1.0.5': optional: true - '@rollup/rollup-android-arm-eabi@4.44.1': + '@rollup/rollup-android-arm-eabi@4.50.1': + optional: true + + '@rollup/rollup-android-arm64@4.50.1': optional: true - '@rollup/rollup-android-arm64@4.44.1': + '@rollup/rollup-darwin-arm64@4.50.1': optional: true - '@rollup/rollup-darwin-arm64@4.44.1': + '@rollup/rollup-darwin-x64@4.50.1': optional: true - '@rollup/rollup-darwin-x64@4.44.1': + '@rollup/rollup-freebsd-arm64@4.50.1': optional: true - '@rollup/rollup-freebsd-arm64@4.44.1': + '@rollup/rollup-freebsd-x64@4.50.1': optional: true - '@rollup/rollup-freebsd-x64@4.44.1': + '@rollup/rollup-linux-arm-gnueabihf@4.50.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.44.1': + '@rollup/rollup-linux-arm-musleabihf@4.50.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.44.1': + '@rollup/rollup-linux-arm64-gnu@4.50.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.44.1': + '@rollup/rollup-linux-arm64-musl@4.50.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.44.1': + '@rollup/rollup-linux-loongarch64-gnu@4.50.1': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.44.1': + '@rollup/rollup-linux-ppc64-gnu@4.50.1': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.44.1': + '@rollup/rollup-linux-riscv64-gnu@4.50.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.44.1': + '@rollup/rollup-linux-riscv64-musl@4.50.1': optional: true - '@rollup/rollup-linux-riscv64-musl@4.44.1': + '@rollup/rollup-linux-s390x-gnu@4.50.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.44.1': + '@rollup/rollup-linux-x64-gnu@4.50.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.44.1': + '@rollup/rollup-linux-x64-musl@4.50.1': optional: true - '@rollup/rollup-linux-x64-musl@4.44.1': + '@rollup/rollup-openharmony-arm64@4.50.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.44.1': + '@rollup/rollup-win32-arm64-msvc@4.50.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.44.1': + '@rollup/rollup-win32-ia32-msvc@4.50.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.44.1': + '@rollup/rollup-win32-x64-msvc@4.50.1': optional: true '@sideway/address@4.1.5': @@ -3021,21 +3053,21 @@ snapshots: dependencies: acorn: 8.15.0 - '@sveltejs/adapter-cloudflare@7.0.4(@sveltejs/kit@2.22.2(@sveltejs/vite-plugin-svelte@5.1.0(svelte@5.34.8)(vite@6.3.5(jiti@2.4.2)(lightningcss@1.30.1)))(svelte@5.34.8)(vite@6.3.5(jiti@2.4.2)(lightningcss@1.30.1)))(wrangler@4.22.0(@cloudflare/workers-types@4.20250627.0))': + '@sveltejs/adapter-cloudflare@7.0.4(@sveltejs/kit@2.22.2(@sveltejs/vite-plugin-svelte@5.1.0(svelte@5.34.8)(vite@6.3.6(jiti@2.4.2)(lightningcss@1.30.1)))(svelte@5.34.8)(vite@6.3.6(jiti@2.4.2)(lightningcss@1.30.1)))(wrangler@4.22.0(@cloudflare/workers-types@4.20250627.0))': dependencies: '@cloudflare/workers-types': 4.20250627.0 - '@sveltejs/kit': 2.22.2(@sveltejs/vite-plugin-svelte@5.1.0(svelte@5.34.8)(vite@6.3.5(jiti@2.4.2)(lightningcss@1.30.1)))(svelte@5.34.8)(vite@6.3.5(jiti@2.4.2)(lightningcss@1.30.1)) + '@sveltejs/kit': 2.22.2(@sveltejs/vite-plugin-svelte@5.1.0(svelte@5.34.8)(vite@6.3.6(jiti@2.4.2)(lightningcss@1.30.1)))(svelte@5.34.8)(vite@6.3.6(jiti@2.4.2)(lightningcss@1.30.1)) worktop: 0.8.0-next.18 wrangler: 4.22.0(@cloudflare/workers-types@4.20250627.0) - '@sveltejs/kit@2.22.2(@sveltejs/vite-plugin-svelte@5.1.0(svelte@5.34.8)(vite@6.3.5(jiti@2.4.2)(lightningcss@1.30.1)))(svelte@5.34.8)(vite@6.3.5(jiti@2.4.2)(lightningcss@1.30.1))': + '@sveltejs/kit@2.22.2(@sveltejs/vite-plugin-svelte@5.1.0(svelte@5.34.8)(vite@6.3.6(jiti@2.4.2)(lightningcss@1.30.1)))(svelte@5.34.8)(vite@6.3.6(jiti@2.4.2)(lightningcss@1.30.1))': dependencies: '@sveltejs/acorn-typescript': 1.0.5(acorn@8.15.0) - '@sveltejs/vite-plugin-svelte': 5.1.0(svelte@5.34.8)(vite@6.3.5(jiti@2.4.2)(lightningcss@1.30.1)) + '@sveltejs/vite-plugin-svelte': 5.1.0(svelte@5.34.8)(vite@6.3.6(jiti@2.4.2)(lightningcss@1.30.1)) '@types/cookie': 0.6.0 acorn: 8.15.0 cookie: 0.6.0 - devalue: 5.1.1 + devalue: 5.3.2 esm-env: 1.2.2 kleur: 4.1.5 magic-string: 0.30.17 @@ -3044,28 +3076,28 @@ snapshots: set-cookie-parser: 2.7.1 sirv: 3.0.1 svelte: 5.34.8 - vite: 6.3.5(jiti@2.4.2)(lightningcss@1.30.1) - vitefu: 1.0.7(vite@6.3.5(jiti@2.4.2)(lightningcss@1.30.1)) + vite: 6.3.6(jiti@2.4.2)(lightningcss@1.30.1) + vitefu: 1.0.7(vite@6.3.6(jiti@2.4.2)(lightningcss@1.30.1)) - '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.1.0(svelte@5.34.8)(vite@6.3.5(jiti@2.4.2)(lightningcss@1.30.1)))(svelte@5.34.8)(vite@6.3.5(jiti@2.4.2)(lightningcss@1.30.1))': + '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.1.0(svelte@5.34.8)(vite@6.3.6(jiti@2.4.2)(lightningcss@1.30.1)))(svelte@5.34.8)(vite@6.3.6(jiti@2.4.2)(lightningcss@1.30.1))': dependencies: - '@sveltejs/vite-plugin-svelte': 5.1.0(svelte@5.34.8)(vite@6.3.5(jiti@2.4.2)(lightningcss@1.30.1)) + '@sveltejs/vite-plugin-svelte': 5.1.0(svelte@5.34.8)(vite@6.3.6(jiti@2.4.2)(lightningcss@1.30.1)) debug: 4.4.1 svelte: 5.34.8 - vite: 6.3.5(jiti@2.4.2)(lightningcss@1.30.1) + vite: 6.3.6(jiti@2.4.2)(lightningcss@1.30.1) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@5.1.0(svelte@5.34.8)(vite@6.3.5(jiti@2.4.2)(lightningcss@1.30.1))': + '@sveltejs/vite-plugin-svelte@5.1.0(svelte@5.34.8)(vite@6.3.6(jiti@2.4.2)(lightningcss@1.30.1))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.1.0(svelte@5.34.8)(vite@6.3.5(jiti@2.4.2)(lightningcss@1.30.1)))(svelte@5.34.8)(vite@6.3.5(jiti@2.4.2)(lightningcss@1.30.1)) + '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.1.0(svelte@5.34.8)(vite@6.3.6(jiti@2.4.2)(lightningcss@1.30.1)))(svelte@5.34.8)(vite@6.3.6(jiti@2.4.2)(lightningcss@1.30.1)) debug: 4.4.1 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.17 svelte: 5.34.8 - vite: 6.3.5(jiti@2.4.2)(lightningcss@1.30.1) - vitefu: 1.0.7(vite@6.3.5(jiti@2.4.2)(lightningcss@1.30.1)) + vite: 6.3.6(jiti@2.4.2)(lightningcss@1.30.1) + vitefu: 1.0.7(vite@6.3.6(jiti@2.4.2)(lightningcss@1.30.1)) transitivePeerDependencies: - supports-color @@ -3137,12 +3169,12 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.1.11 '@tailwindcss/oxide-win32-x64-msvc': 4.1.11 - '@tailwindcss/vite@4.1.11(vite@6.3.5(jiti@2.4.2)(lightningcss@1.30.1))': + '@tailwindcss/vite@4.1.11(vite@6.3.6(jiti@2.4.2)(lightningcss@1.30.1))': dependencies: '@tailwindcss/node': 4.1.11 '@tailwindcss/oxide': 4.1.11 tailwindcss: 4.1.11 - vite: 6.3.5(jiti@2.4.2)(lightningcss@1.30.1) + vite: 6.3.6(jiti@2.4.2)(lightningcss@1.30.1) '@tanstack/table-core@8.21.3': {} @@ -4553,7 +4585,7 @@ snapshots: detect-libc@2.0.4: {} - devalue@5.1.1: {} + devalue@5.3.2: {} dlv@1.1.3: optional: true @@ -4562,6 +4594,8 @@ snapshots: earcut@3.0.1: {} + earcut@3.0.2: {} + effect@3.16.12: dependencies: '@standard-schema/spec': 1.0.0 @@ -4585,9 +4619,9 @@ snapshots: graceful-fs: 4.2.11 tapable: 2.2.2 - esbuild-runner@2.2.2(esbuild@0.25.5): + esbuild-runner@2.2.2(esbuild@0.25.9): dependencies: - esbuild: 0.25.5 + esbuild: 0.25.9 source-map-support: 0.5.21 tslib: 2.4.0 optional: true @@ -4620,39 +4654,40 @@ snapshots: '@esbuild/win32-ia32': 0.25.4 '@esbuild/win32-x64': 0.25.4 - esbuild@0.25.5: + esbuild@0.25.9: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.5 - '@esbuild/android-arm': 0.25.5 - '@esbuild/android-arm64': 0.25.5 - '@esbuild/android-x64': 0.25.5 - '@esbuild/darwin-arm64': 0.25.5 - '@esbuild/darwin-x64': 0.25.5 - '@esbuild/freebsd-arm64': 0.25.5 - '@esbuild/freebsd-x64': 0.25.5 - '@esbuild/linux-arm': 0.25.5 - '@esbuild/linux-arm64': 0.25.5 - '@esbuild/linux-ia32': 0.25.5 - '@esbuild/linux-loong64': 0.25.5 - '@esbuild/linux-mips64el': 0.25.5 - '@esbuild/linux-ppc64': 0.25.5 - '@esbuild/linux-riscv64': 0.25.5 - '@esbuild/linux-s390x': 0.25.5 - '@esbuild/linux-x64': 0.25.5 - '@esbuild/netbsd-arm64': 0.25.5 - '@esbuild/netbsd-x64': 0.25.5 - '@esbuild/openbsd-arm64': 0.25.5 - '@esbuild/openbsd-x64': 0.25.5 - '@esbuild/sunos-x64': 0.25.5 - '@esbuild/win32-arm64': 0.25.5 - '@esbuild/win32-ia32': 0.25.5 - '@esbuild/win32-x64': 0.25.5 + '@esbuild/aix-ppc64': 0.25.9 + '@esbuild/android-arm': 0.25.9 + '@esbuild/android-arm64': 0.25.9 + '@esbuild/android-x64': 0.25.9 + '@esbuild/darwin-arm64': 0.25.9 + '@esbuild/darwin-x64': 0.25.9 + '@esbuild/freebsd-arm64': 0.25.9 + '@esbuild/freebsd-x64': 0.25.9 + '@esbuild/linux-arm': 0.25.9 + '@esbuild/linux-arm64': 0.25.9 + '@esbuild/linux-ia32': 0.25.9 + '@esbuild/linux-loong64': 0.25.9 + '@esbuild/linux-mips64el': 0.25.9 + '@esbuild/linux-ppc64': 0.25.9 + '@esbuild/linux-riscv64': 0.25.9 + '@esbuild/linux-s390x': 0.25.9 + '@esbuild/linux-x64': 0.25.9 + '@esbuild/netbsd-arm64': 0.25.9 + '@esbuild/netbsd-x64': 0.25.9 + '@esbuild/openbsd-arm64': 0.25.9 + '@esbuild/openbsd-x64': 0.25.9 + '@esbuild/openharmony-arm64': 0.25.9 + '@esbuild/sunos-x64': 0.25.9 + '@esbuild/win32-arm64': 0.25.9 + '@esbuild/win32-ia32': 0.25.9 + '@esbuild/win32-x64': 0.25.9 esm-env@1.2.2: {} esrap@1.4.9: dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.5 exit-hook@2.2.1: {} @@ -4665,19 +4700,19 @@ snapshots: fast-deep-equal@3.1.3: {} - fastgeotoolkit@0.1.14: {} + fastgeotoolkit@0.2.3: {} - fdir@6.4.6(picomatch@4.0.2): + fdir@6.5.0(picomatch@4.0.3): optionalDependencies: - picomatch: 4.0.2 + picomatch: 4.0.3 fflate@0.8.2: {} - formsnap@2.0.1(svelte@5.34.8)(sveltekit-superforms@2.27.1(@sveltejs/kit@2.22.2(@sveltejs/vite-plugin-svelte@5.1.0(svelte@5.34.8)(vite@6.3.5(jiti@2.4.2)(lightningcss@1.30.1)))(svelte@5.34.8)(vite@6.3.5(jiti@2.4.2)(lightningcss@1.30.1)))(@types/json-schema@7.0.15)(esbuild@0.25.5)(svelte@5.34.8)(typescript@5.8.3)): + formsnap@2.0.1(svelte@5.34.8)(sveltekit-superforms@2.27.1(@sveltejs/kit@2.22.2(@sveltejs/vite-plugin-svelte@5.1.0(svelte@5.34.8)(vite@6.3.6(jiti@2.4.2)(lightningcss@1.30.1)))(svelte@5.34.8)(vite@6.3.6(jiti@2.4.2)(lightningcss@1.30.1)))(@types/json-schema@7.0.15)(esbuild@0.25.9)(svelte@5.34.8)(typescript@5.8.3)): dependencies: svelte: 5.34.8 svelte-toolbelt: 0.5.0(svelte@5.34.8) - sveltekit-superforms: 2.27.1(@sveltejs/kit@2.22.2(@sveltejs/vite-plugin-svelte@5.1.0(svelte@5.34.8)(vite@6.3.5(jiti@2.4.2)(lightningcss@1.30.1)))(svelte@5.34.8)(vite@6.3.5(jiti@2.4.2)(lightningcss@1.30.1)))(@types/json-schema@7.0.15)(esbuild@0.25.5)(svelte@5.34.8)(typescript@5.8.3) + sveltekit-superforms: 2.27.1(@sveltejs/kit@2.22.2(@sveltejs/vite-plugin-svelte@5.1.0(svelte@5.34.8)(vite@6.3.6(jiti@2.4.2)(lightningcss@1.30.1)))(svelte@5.34.8)(vite@6.3.6(jiti@2.4.2)(lightningcss@1.30.1)))(@types/json-schema@7.0.15)(esbuild@0.25.9)(svelte@5.34.8)(typescript@5.8.3) fsevents@2.3.3: optional: true @@ -4701,6 +4736,8 @@ snapshots: gl-matrix@3.4.3: {} + gl-matrix@3.4.4: {} + glob-to-regexp@0.4.1: {} global-prefix@4.0.0: @@ -4849,14 +4886,14 @@ snapshots: magic-string@0.30.17: dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.5 mapbox-gl@3.13.0: dependencies: '@mapbox/jsonlint-lines-primitives': 2.0.2 '@mapbox/mapbox-gl-supported': 3.0.0 '@mapbox/point-geometry': 0.1.0 - '@mapbox/tiny-sdf': 2.0.6 + '@mapbox/tiny-sdf': 2.0.7 '@mapbox/unitbezier': 0.0.1 '@mapbox/vector-tile': 1.3.1 '@mapbox/whoots-js': 3.1.0 @@ -4868,15 +4905,15 @@ snapshots: '@types/supercluster': 7.1.3 cheap-ruler: 4.0.0 csscolorparser: 1.0.3 - earcut: 3.0.1 + earcut: 3.0.2 geojson-vt: 4.0.2 - gl-matrix: 3.4.3 + gl-matrix: 3.4.4 grid-index: 1.1.0 kdbush: 4.0.2 martinez-polygon-clipping: 0.7.4 murmurhash-js: 1.0.0 pbf: 3.3.0 - potpack: 2.0.0 + potpack: 2.1.0 quickselect: 3.0.0 serialize-to-js: 3.1.2 supercluster: 8.0.1 @@ -4998,7 +5035,7 @@ snapshots: picocolors@1.1.1: {} - picomatch@4.0.2: {} + picomatch@4.0.3: {} pmtiles@3.2.1: dependencies: @@ -5024,6 +5061,8 @@ snapshots: potpack@2.0.0: {} + potpack@2.1.0: {} + prettier-plugin-svelte@3.4.0(prettier@3.6.2)(svelte@5.34.8): dependencies: prettier: 3.6.2 @@ -5073,30 +5112,31 @@ snapshots: robust-predicates@3.0.2: {} - rollup@4.44.1: + rollup@4.50.1: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.44.1 - '@rollup/rollup-android-arm64': 4.44.1 - '@rollup/rollup-darwin-arm64': 4.44.1 - '@rollup/rollup-darwin-x64': 4.44.1 - '@rollup/rollup-freebsd-arm64': 4.44.1 - '@rollup/rollup-freebsd-x64': 4.44.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.44.1 - '@rollup/rollup-linux-arm-musleabihf': 4.44.1 - '@rollup/rollup-linux-arm64-gnu': 4.44.1 - '@rollup/rollup-linux-arm64-musl': 4.44.1 - '@rollup/rollup-linux-loongarch64-gnu': 4.44.1 - '@rollup/rollup-linux-powerpc64le-gnu': 4.44.1 - '@rollup/rollup-linux-riscv64-gnu': 4.44.1 - '@rollup/rollup-linux-riscv64-musl': 4.44.1 - '@rollup/rollup-linux-s390x-gnu': 4.44.1 - '@rollup/rollup-linux-x64-gnu': 4.44.1 - '@rollup/rollup-linux-x64-musl': 4.44.1 - '@rollup/rollup-win32-arm64-msvc': 4.44.1 - '@rollup/rollup-win32-ia32-msvc': 4.44.1 - '@rollup/rollup-win32-x64-msvc': 4.44.1 + '@rollup/rollup-android-arm-eabi': 4.50.1 + '@rollup/rollup-android-arm64': 4.50.1 + '@rollup/rollup-darwin-arm64': 4.50.1 + '@rollup/rollup-darwin-x64': 4.50.1 + '@rollup/rollup-freebsd-arm64': 4.50.1 + '@rollup/rollup-freebsd-x64': 4.50.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.50.1 + '@rollup/rollup-linux-arm-musleabihf': 4.50.1 + '@rollup/rollup-linux-arm64-gnu': 4.50.1 + '@rollup/rollup-linux-arm64-musl': 4.50.1 + '@rollup/rollup-linux-loongarch64-gnu': 4.50.1 + '@rollup/rollup-linux-ppc64-gnu': 4.50.1 + '@rollup/rollup-linux-riscv64-gnu': 4.50.1 + '@rollup/rollup-linux-riscv64-musl': 4.50.1 + '@rollup/rollup-linux-s390x-gnu': 4.50.1 + '@rollup/rollup-linux-x64-gnu': 4.50.1 + '@rollup/rollup-linux-x64-musl': 4.50.1 + '@rollup/rollup-openharmony-arm64': 4.50.1 + '@rollup/rollup-win32-arm64-msvc': 4.50.1 + '@rollup/rollup-win32-ia32-msvc': 4.50.1 + '@rollup/rollup-win32-x64-msvc': 4.50.1 fsevents: 2.3.3 runed@0.23.4(svelte@5.34.8): @@ -5203,11 +5243,11 @@ snapshots: superstruct@2.0.2: optional: true - svelte-check@4.2.2(picomatch@4.0.2)(svelte@5.34.8)(typescript@5.8.3): + svelte-check@4.2.2(picomatch@4.0.3)(svelte@5.34.8)(typescript@5.8.3): dependencies: '@jridgewell/trace-mapping': 0.3.25 chokidar: 4.0.3 - fdir: 6.4.6(picomatch@4.0.2) + fdir: 6.5.0(picomatch@4.0.3) picocolors: 1.1.1 sade: 1.8.1 svelte: 5.34.8 @@ -5254,7 +5294,7 @@ snapshots: svelte@5.34.8: dependencies: '@ampproject/remapping': 2.3.0 - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.5 '@sveltejs/acorn-typescript': 1.0.5(acorn@8.15.0) '@types/estree': 1.0.8 acorn: 8.15.0 @@ -5268,16 +5308,16 @@ snapshots: magic-string: 0.30.17 zimmerframe: 1.1.2 - sveltekit-superforms@2.27.1(@sveltejs/kit@2.22.2(@sveltejs/vite-plugin-svelte@5.1.0(svelte@5.34.8)(vite@6.3.5(jiti@2.4.2)(lightningcss@1.30.1)))(svelte@5.34.8)(vite@6.3.5(jiti@2.4.2)(lightningcss@1.30.1)))(@types/json-schema@7.0.15)(esbuild@0.25.5)(svelte@5.34.8)(typescript@5.8.3): + sveltekit-superforms@2.27.1(@sveltejs/kit@2.22.2(@sveltejs/vite-plugin-svelte@5.1.0(svelte@5.34.8)(vite@6.3.6(jiti@2.4.2)(lightningcss@1.30.1)))(svelte@5.34.8)(vite@6.3.6(jiti@2.4.2)(lightningcss@1.30.1)))(@types/json-schema@7.0.15)(esbuild@0.25.9)(svelte@5.34.8)(typescript@5.8.3): dependencies: - '@sveltejs/kit': 2.22.2(@sveltejs/vite-plugin-svelte@5.1.0(svelte@5.34.8)(vite@6.3.5(jiti@2.4.2)(lightningcss@1.30.1)))(svelte@5.34.8)(vite@6.3.5(jiti@2.4.2)(lightningcss@1.30.1)) - devalue: 5.1.1 + '@sveltejs/kit': 2.22.2(@sveltejs/vite-plugin-svelte@5.1.0(svelte@5.34.8)(vite@6.3.6(jiti@2.4.2)(lightningcss@1.30.1)))(svelte@5.34.8)(vite@6.3.6(jiti@2.4.2)(lightningcss@1.30.1)) + devalue: 5.3.2 memoize-weak: 1.0.2 svelte: 5.34.8 ts-deepmerge: 7.0.3 optionalDependencies: '@exodus/schemasafe': 1.3.0 - '@gcornut/valibot-json-schema': 0.42.0(esbuild@0.25.5)(typescript@5.8.3) + '@gcornut/valibot-json-schema': 0.42.0(esbuild@0.25.9)(typescript@5.8.3) '@sinclair/typebox': 0.34.37 '@typeschema/class-validator': 0.3.0(@types/json-schema@7.0.15)(class-validator@0.14.2) '@vinejs/vine': 3.0.1 @@ -5327,10 +5367,10 @@ snapshots: tiny-case@1.0.3: optional: true - tinyglobby@0.2.14: + tinyglobby@0.2.15: dependencies: - fdir: 6.4.6(picomatch@4.0.2) - picomatch: 4.0.2 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 tinyqueue@1.2.3: {} @@ -5401,22 +5441,22 @@ snapshots: svelte: 5.34.8 svelte-toolbelt: 0.7.1(svelte@5.34.8) - vite@6.3.5(jiti@2.4.2)(lightningcss@1.30.1): + vite@6.3.6(jiti@2.4.2)(lightningcss@1.30.1): dependencies: - esbuild: 0.25.5 - fdir: 6.4.6(picomatch@4.0.2) - picomatch: 4.0.2 + esbuild: 0.25.9 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.44.1 - tinyglobby: 0.2.14 + rollup: 4.50.1 + tinyglobby: 0.2.15 optionalDependencies: fsevents: 2.3.3 jiti: 2.4.2 lightningcss: 1.30.1 - vitefu@1.0.7(vite@6.3.5(jiti@2.4.2)(lightningcss@1.30.1)): + vitefu@1.0.7(vite@6.3.6(jiti@2.4.2)(lightningcss@1.30.1)): optionalDependencies: - vite: 6.3.5(jiti@2.4.2)(lightningcss@1.30.1) + vite: 6.3.6(jiti@2.4.2)(lightningcss@1.30.1) vt-pbf@3.1.3: dependencies: diff --git a/demo/src/app.html b/demo/src/app.html index 77a5ff5..6986738 100644 --- a/demo/src/app.html +++ b/demo/src/app.html @@ -2,7 +2,7 @@ - + %sveltekit.head% diff --git a/demo/src/lib/ridewithgps.ts b/demo/src/lib/ridewithgps.ts index 1043086..e7b778c 100644 --- a/demo/src/lib/ridewithgps.ts +++ b/demo/src/lib/ridewithgps.ts @@ -138,7 +138,8 @@ export class RideWithGPSService { const data = await response.json(); const trips: RWGPSTrip[] = data.results || []; - if (trips.length === 0) { + // Handle case where API returns null/undefined instead of empty array + if (!trips || !Array.isArray(trips) || trips.length === 0) { break; // No more trips } @@ -217,6 +218,12 @@ export class RideWithGPSService { async getPolylinesFromTrips(trips: RWGPSTrip[], onProgress?: (processed: number, total: number) => void): Promise { const polylines: string[] = []; + // Safety check for null/undefined trips array + if (!trips || !Array.isArray(trips)) { + console.warn('getPolylinesFromTrips: trips is not a valid array'); + return polylines; + } + console.log('Sample trip data structure:', trips.length > 0 ? trips[0] : 'No trips'); for (let i = 0; i < trips.length; i++) { diff --git a/demo/src/lib/strava.ts b/demo/src/lib/strava.ts index 2d54717..82b71bd 100644 --- a/demo/src/lib/strava.ts +++ b/demo/src/lib/strava.ts @@ -136,7 +136,8 @@ export class StravaService { const activities: StravaActivity[] = await response.json(); - if (activities.length === 0) { + // Handle case where API returns null/undefined instead of empty array + if (!activities || !Array.isArray(activities) || activities.length === 0) { break; // No more activities } @@ -197,6 +198,12 @@ export class StravaService { getPolylinesFromActivities(activities: StravaActivity[]): string[] { const polylines: string[] = []; + // Safety check for null/undefined activities array + if (!activities || !Array.isArray(activities)) { + console.warn('getPolylinesFromActivities: activities is not a valid array'); + return polylines; + } + for (const activity of activities) { // Prefer detailed polyline over summary polyline const polyline = activity.map?.polyline || activity.map?.summary_polyline; diff --git a/demo/src/routes/+page.svelte b/demo/src/routes/+page.svelte index 808292d..5476cd6 100644 --- a/demo/src/routes/+page.svelte +++ b/demo/src/routes/+page.svelte @@ -31,7 +31,7 @@ onAdd(map: null) { this._map = map; this._container = document.createElement('div'); - this._container.className = 'maplibregl-ctrl maplibregl-ctrl-group ruler-control'; + this._container.className = 'maplibregl-ctfrl maplibregl-ctrl-group ruler-control'; this._button = document.createElement('button'); this._button.className = 'ruler-control-button'; @@ -462,7 +462,11 @@ const result = await processGpxFiles(jsArray); console.log('Sample data processing result:', result); - if (result && result.tracks && result.tracks.length > 0) { + if (!result) { + throw new Error('WASM function returned null/undefined result'); + } + + if (result && result.tracks && Array.isArray(result.tracks) && result.tracks.length > 0) { const heatmapResult = result as { tracks: any[], max_frequency: number }; // Use the shared rendering function @@ -570,6 +574,10 @@ if (cached && cacheAge < cacheExpiry) { activities = JSON.parse(cached); + // Safety check for parsed data + if (!activities || !Array.isArray(activities)) { + activities = []; + } stravaActivityCount = activities.length; stravaImportProgress = 50; console.log(`Using cached ${activities.length} activities from localStorage`); @@ -577,23 +585,32 @@ } // Fetch fresh data if no valid cache - if (activities.length === 0) { + if (!activities || activities.length === 0) { activities = await stravaService.fetchAllActivities((count: number) => { stravaActivityCount = count; stravaImportProgress = Math.min(50, count); // First 50% for fetching }); - // Cache the activities in localStorage + // Safety check for fetched data + if (!activities || !Array.isArray(activities)) { + activities = []; + } + + // Cache the activities in localStorage with safe storage if (browser && activities.length > 0) { - localStorage.setItem('strava_activities', JSON.stringify(activities)); - localStorage.setItem('strava_activities_timestamp', Date.now().toString()); - console.log(`Cached ${activities.length} activities to localStorage`); + const success = safeLocalStorageSetItem('strava_activities', JSON.stringify(activities)); + if (success) { + safeLocalStorageSetItem('strava_activities_timestamp', Date.now().toString()); + console.log(`Cached ${activities.length} activities to localStorage`); + } else { + console.warn('Failed to cache activities - localStorage quota exceeded or unavailable'); + } } } console.log(`Processing ${activities.length} activities from Strava`); - if (activities.length === 0) { + if (!activities || activities.length === 0) { error = 'No activities found in your Strava account'; return; } @@ -601,6 +618,13 @@ // Extract polylines from activities const polylines = stravaService.getPolylinesFromActivities(activities); + console.log('DEBUG: Extracted polylines:', { + count: polylines.length, + firstPolyline: polylines[0]?.substring(0, 100) + '...', + polylineTypes: polylines.slice(0, 3).map(p => typeof p), + polyllineLengths: polylines.slice(0, 3).map(p => p?.length) + }); + if (polylines.length === 0) { error = 'No GPS data found in your Strava activities'; return; @@ -618,9 +642,42 @@ jsArray.push(polyline); } - const result = processPolylines(jsArray); + console.log('DEBUG: About to call processPolylines with:', { + arrayLength: jsArray.length, + firstPolylineSample: jsArray[0]?.substring(0, 50) + '...', + arrayType: Array.isArray(jsArray), + functionType: typeof processPolylines + }); + + const result = await processPolylines(jsArray); + + console.log('DEBUG: processPolylines returned:', { + result: result, + resultType: typeof result, + isNull: result === null, + isUndefined: result === undefined, + resultKeys: result ? Object.keys(result) : 'N/A', + stringified: JSON.stringify(result)?.substring(0, 200) + '...' + }); + + if (!result) { + throw new Error('WASM function returned null/undefined result'); + } + const heatmapResult = result as { tracks: any[], max_frequency: number }; + console.log('DEBUG: heatmapResult after casting:', { + hasTracks: 'tracks' in heatmapResult, + tracksType: typeof heatmapResult.tracks, + tracksIsArray: Array.isArray(heatmapResult.tracks), + tracksLength: heatmapResult.tracks?.length, + maxFrequency: heatmapResult.max_frequency + }); + + if (!heatmapResult.tracks || !Array.isArray(heatmapResult.tracks)) { + throw new Error(`WASM function returned invalid tracks data. Got: ${JSON.stringify(heatmapResult)}`); + } + console.log('WASM returned', heatmapResult.tracks.length, 'tracks with max frequency:', heatmapResult.max_frequency); stravaImportProgress = 90; @@ -632,7 +689,13 @@ console.log('Strava import completed successfully'); } catch (err) { - error = `Error importing Strava activities: ${err}`; + // Handle localStorage quota errors more gracefully + if (err instanceof DOMException && err.name === 'QuotaExceededError') { + console.warn('localStorage quota exceeded during Strava import'); + error = 'Import completed but could not cache data (storage full). Try clearing browser storage.'; + } else { + error = `Error importing Strava activities: ${err}`; + } console.error(err); } finally { isImportingStrava = false; @@ -680,6 +743,10 @@ if (cached && cacheAge < cacheExpiry) { trips = JSON.parse(cached); + // Safety check for parsed data + if (!trips || !Array.isArray(trips)) { + trips = []; + } rwgpsTripCount = trips.length; rwgpsImportProgress = 50; console.log(`Using cached ${trips.length} trips from localStorage`); @@ -693,11 +760,15 @@ rwgpsImportProgress = Math.min(50, count); // First 50% for fetching }); - // Cache the trips in localStorage + // Cache the trips in localStorage with safe storage if (browser && trips.length > 0) { - localStorage.setItem('rwgps_trips', JSON.stringify(trips)); - localStorage.setItem('rwgps_trips_timestamp', Date.now().toString()); - console.log(`Cached ${trips.length} trips to localStorage`); + const success = safeLocalStorageSetItem('rwgps_trips', JSON.stringify(trips)); + if (success) { + safeLocalStorageSetItem('rwgps_trips_timestamp', Date.now().toString()); + console.log(`Cached ${trips.length} trips to localStorage`); + } else { + console.warn('Failed to cache trips - localStorage quota exceeded or unavailable'); + } } } @@ -735,9 +806,18 @@ jsArray.push(polyline); } - const result = processPolylines(jsArray); + const result = await processPolylines(jsArray); + + if (!result) { + throw new Error('WASM function returned null/undefined result'); + } + const heatmapResult = result as { tracks: any[], max_frequency: number }; + if (!heatmapResult.tracks || !Array.isArray(heatmapResult.tracks)) { + throw new Error('WASM function returned invalid tracks data'); + } + console.log('WASM returned', heatmapResult.tracks.length, 'tracks with max frequency:', heatmapResult.max_frequency); rwgpsImportProgress = 90; @@ -749,7 +829,13 @@ console.log('RideWithGPS import completed successfully'); } catch (err) { - error = `Error importing RideWithGPS trips: ${err}`; + // Handle localStorage quota errors more gracefully + if (err instanceof DOMException && err.name === 'QuotaExceededError') { + console.warn('localStorage quota exceeded during RideWithGPS import'); + error = 'Import completed but could not cache data (storage full). Try clearing browser storage.'; + } else { + error = `Error importing RideWithGPS trips: ${err}`; + } console.error(err); } finally { isImportingRWGPS = false; @@ -891,7 +977,7 @@ } }); - console.log('Strava-style multi-layer heatmap added successfully'); + console.log('heatmap added successfully'); // Fit map to show all tracks if (heatmapResult.tracks.length > 0) { @@ -1424,17 +1510,58 @@ // Initialize WASM module dynamically in browser only if (browser) { try { + console.log('Attempting to load fastgeotoolkit...'); + // Import the published fastgeotoolkit npm package const fastGeoToolkit = await import('fastgeotoolkit'); + console.log('fastgeotoolkit module loaded:', fastGeoToolkit); - // Just assign the functions - they will automatically handle WASM loading + // Use the package's built-in WASM initialization if available + if (typeof fastGeoToolkit.initWithWasm === 'function') { + console.log('Using built-in WASM initialization...'); + await fastGeoToolkit.initWithWasm(); + } else if (typeof fastGeoToolkit.ensureWasmInitialized === 'function') { + console.log('Using ensureWasmInitialized...'); + await fastGeoToolkit.ensureWasmInitialized(); + } + + // Assign the functions - they should now work with WASM loaded processGpxFiles = fastGeoToolkit.processGpxFiles; processPolylines = fastGeoToolkit.processPolylines; console.log('WASM initialized successfully from fastgeotoolkit npm package'); } catch (err) { console.error('Failed to load fastgeotoolkit npm package:', err); - error = `Failed to load fastgeotoolkit module: ${err}`; + console.error('Full error details:', err); + + // If the automatic WASM loading fails, try to load from a CDN as fallback + try { + console.log('Trying CDN fallback...'); + const cdnModule = await import('https://unpkg.com/fastgeotoolkit@latest/dist/index.esm.js'); + + if (typeof cdnModule.initWithWasm === 'function') { + await cdnModule.initWithWasm(); + } + + processGpxFiles = cdnModule.processGpxFiles; + processPolylines = cdnModule.processPolylines; + + console.log('Successfully loaded from CDN fallback'); + } catch (cdnErr) { + console.error('CDN fallback also failed:', cdnErr); + error = `Failed to load fastgeotoolkit module: ${err}. CDN fallback also failed: ${cdnErr}`; + + // Provide more specific error information + if (err instanceof Error) { + if (err.message.includes('WASM')) { + error = 'WASM module failed to load. This may be due to Content Security Policy or bundling issues.'; + } else if (err.message.includes('Failed to fetch')) { + error = 'Network error loading the module. Please check your internet connection.'; + } else if (err.message.includes('Failed to resolve module specifier')) { + error = 'Module resolution error. The fastgeotoolkit package may not be properly bundled for this environment.'; + } + } + } } } @@ -1627,6 +1754,66 @@ } } } + + // Safe localStorage operations + function safeLocalStorageSetItem(key: string, value: string): boolean { + if (!browser || typeof localStorage === 'undefined') { + return false; + } + + try { + // Clear potentially large items before setting new data + const keysToCheck = ['strava_activities', 'rwgps_trips']; + if (keysToCheck.includes(key)) { + // Clear old data first to free up space + keysToCheck.forEach(k => { + if (k !== key) { + localStorage.removeItem(k); + localStorage.removeItem(k + '_timestamp'); + } + }); + } + + localStorage.setItem(key, value); + return true; + } catch (error) { + if (error instanceof DOMException && error.name === 'QuotaExceededError') { + console.warn('localStorage quota exceeded, clearing cache and retrying...'); + // Clear all cached data and try again + try { + localStorage.removeItem('strava_activities'); + localStorage.removeItem('strava_activities_timestamp'); + localStorage.removeItem('rwgps_trips'); + localStorage.removeItem('rwgps_trips_timestamp'); + localStorage.setItem(key, value); + return true; + } catch (retryError) { + console.warn('localStorage still failed after clearing cache:', retryError); + return false; + } + } else { + console.warn('localStorage error:', error); + return false; + } + } + } + + // Clear all cached data + function clearLocalStorageCache() { + if (!browser || typeof localStorage === 'undefined') { + return; + } + + try { + localStorage.removeItem('strava_activities'); + localStorage.removeItem('strava_activities_timestamp'); + localStorage.removeItem('rwgps_trips'); + localStorage.removeItem('rwgps_trips_timestamp'); + console.log('Cleared all cached activity/trip data'); + } catch (error) { + console.warn('Error clearing localStorage cache:', error); + } + }