diff --git a/.deepsource.toml b/.deepsource.toml index db512b7e..881e924a 100644 --- a/.deepsource.toml +++ b/.deepsource.toml @@ -1,5 +1,14 @@ version = 1 +# Playwright specs, helpers, and the local e2e static server are test +# infrastructure — not production browser code — so exclude them from the +# JavaScript analyzer (which is configured for the React app). +exclude_patterns = [ + "e2e/**", + "scripts/serve-e2e.mjs", + "playwright.config.ts", +] + [[analyzers]] name = "javascript" enabled = true diff --git a/.github/workflows/deploy-to-firebase.yml b/.github/workflows/deploy-to-firebase.yml index b56ecc4d..d622b870 100644 --- a/.github/workflows/deploy-to-firebase.yml +++ b/.github/workflows/deploy-to-firebase.yml @@ -36,7 +36,9 @@ jobs: cache: pnpm - name: Install dependencies - run: pnpm install --frozen-lockfile --ignore-scripts + # Dependency build scripts are gated by allowBuilds in pnpm-workspace.yaml. + # The git-hosted dicom-microscopy-viewer needs its prepare script to build dist/. + run: pnpm install --frozen-lockfile - name: Build run: REACT_APP_CONFIG=preview PUBLIC_URL=/ pnpm run build diff --git a/.github/workflows/deploy-to-github-pages.yml b/.github/workflows/deploy-to-github-pages.yml index 15faaf03..6b55ba99 100644 --- a/.github/workflows/deploy-to-github-pages.yml +++ b/.github/workflows/deploy-to-github-pages.yml @@ -35,7 +35,9 @@ jobs: cache: pnpm - name: Install dependencies - run: pnpm install --frozen-lockfile --ignore-scripts + # Dependency build scripts are gated by allowBuilds in pnpm-workspace.yaml. + # The git-hosted dicom-microscopy-viewer needs its prepare script to build dist/. + run: pnpm install --frozen-lockfile - name: Build run: pnpm run predeploy diff --git a/.github/workflows/e2e-visual.yml b/.github/workflows/e2e-visual.yml new file mode 100644 index 00000000..714fe67a --- /dev/null +++ b/.github/workflows/e2e-visual.yml @@ -0,0 +1,62 @@ +name: slim/e2e-visual-regression + +# Visual-regression tests for the deck.gl bulk-annotation renderer. +# +# Runs inside the pinned Playwright container so the (SwiftShader) browser +# environment is byte-for-byte identical to the committed Linux baselines under +# e2e/__screenshots__/. See e2e/README.md. +# +# The default target study is fetched from the public IDC proxy, so runs depend +# on that external service; retries (configured in playwright.config.ts) absorb +# cold-start slowness. This check is intentionally not required for merge — +# promote it in branch protection once data is hosted locally for hermetic runs. + +on: + pull_request: + branches: [master] + workflow_dispatch: + +permissions: + contents: read + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: ${{ github.event_name == 'pull_request' }} + +jobs: + visual: + name: "Bulk annotation visual regression" + runs-on: ubuntu-latest + timeout-minutes: 45 + container: + # Keep this tag in sync with the @playwright/test version in package.json. + image: mcr.microsoft.com/playwright:v1.62.1-jammy + steps: + - name: Checkout repository + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + + - name: Setup pnpm + uses: pnpm/action-setup@0ebf47130e4866e96fce0953f49152a61190b271 # v6.0.9 + + - name: Install dependencies + # Dependency build scripts are gated by allowBuilds in pnpm-workspace.yaml. + # The git-hosted dicom-microscopy-viewer needs its prepare script to build dist/. + run: pnpm install --frozen-lockfile + + - name: Build (e2e config) + run: pnpm run build:e2e + + - name: Run visual-regression tests + # Playwright starts the static server (serve:e2e) itself via the + # webServer config and compares against the committed baselines. + run: pnpm run test:e2e + + - name: Upload Playwright report + if: ${{ !cancelled() }} + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: playwright-report + path: | + playwright-report/ + test-results/ + retention-days: 14 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 48a08c93..8ed7bc66 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -35,7 +35,9 @@ jobs: cache: pnpm - name: Install dependencies - run: pnpm install --frozen-lockfile --ignore-scripts + # Dependency build scripts are gated by allowBuilds in pnpm-workspace.yaml. + # The git-hosted dicom-microscopy-viewer needs its prepare script to build dist/. + run: pnpm install --frozen-lockfile - name: Build run: pnpm run build diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml index b9793645..bec9480e 100644 --- a/.github/workflows/unit-tests.yml +++ b/.github/workflows/unit-tests.yml @@ -32,7 +32,9 @@ jobs: cache: pnpm - name: Install dependencies - run: pnpm install --frozen-lockfile --ignore-scripts + # Dependency build scripts are gated by allowBuilds in pnpm-workspace.yaml. + # The git-hosted dicom-microscopy-viewer needs its prepare script to build dist/. + run: pnpm install --frozen-lockfile - name: Lint run: pnpm run lint diff --git a/.gitignore b/.gitignore index 7f77de64..44b418ce 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ /node_modules /.pnp .pnp.js +/.pnpm-store # testing /coverage @@ -18,6 +19,13 @@ public/config/* !public/config/demo.js !public/config/local.js !public/config/preview.js +!public/config/e2e.js + +# Playwright +/test-results +/playwright-report +/blob-report +/playwright/.cache # misc .DS_Store diff --git a/.sonarcloud.properties b/.sonarcloud.properties new file mode 100644 index 00000000..d97df17f --- /dev/null +++ b/.sonarcloud.properties @@ -0,0 +1,13 @@ +# SonarCloud automatic-analysis configuration. +# +# Workflow files are excluded because rule githubactions:S6505 flags +# "pnpm install" without --ignore-scripts. While dicom-microscopy-viewer is +# pinned to a git commit, its prepare script must run at install time to +# build dist/. Lifecycle scripts remain gated per-package by the allowBuilds +# allowlist in pnpm-workspace.yaml, which is stricter than a blanket +# --ignore-scripts. Remove this exclusion once dmv is pinned to a published +# npm release again (npm tarballs ship prebuilt dist/). +# e2e/ and scripts/serve-e2e.mjs are test infrastructure (Playwright + a local +# static server), not production code. Excluding them keeps the quality gate +# focused on the shipped app. +sonar.exclusions=.github/workflows/*.yml,e2e/**,scripts/serve-e2e.mjs,playwright.config.ts diff --git a/e2e/README.md b/e2e/README.md new file mode 100644 index 00000000..d2c3ba00 --- /dev/null +++ b/e2e/README.md @@ -0,0 +1,81 @@ +# End-to-end / visual-regression tests + +Playwright tests that drive the real app in a real (WebGL-capable) browser and +compare the deck.gl bulk-annotation overlay against committed screenshot +baselines, so rendering regressions are caught automatically. + +## What is covered + +- `bulk-annotations.spec.ts` + - A large (~396k-polygon) annotation group loads and paints without + exhausting the JS heap (the OpenLayers Feature pipeline this replaced OOM'd + on groups this size). + - The annotation overlay matches a committed screenshot baseline (clipped to + the map viewport so the memory footer / sidebar never affect the diff). + - Hiding a group frees the overlay. + +## Data source + +By default the app is built with `public/config/e2e.js`, which points at the +**public NCI Imaging Data Commons proxy** — no local DICOM server required. The +default study is `TCGA-02-0001` (a glioblastoma WSI with a large "Nuclei" +POLYGON group). + +Override the target without editing code: + +- `E2E_STUDY_UID` — study to open +- `E2E_SERIES_UID` — SM series to open (pinned so the suite doesn't depend + on slim's default study→series redirect; this study has four slides) +- `E2E_GROUP_NAME` — annotation group name to toggle (default `Nuclei`) +- `E2E_BASE_URL` — point at an already-running server instead of letting + Playwright serve the build (e.g. a local dcm4chee-backed deployment) + +### Fully local / hermetic data (optional) + +For a network-independent run you can host the study yourself (e.g. a local +`dcm4chee` via the +[imaging-data-commons-skill](https://github.com/ImagingDataCommons/imaging-data-commons-skill) +to fetch the study, then upload to your DICOMweb server), copy +`public/config/e2e.js` to point `url` at it, and run the suite normally. This +avoids proxy rate limits but is heavier to set up and is not used in CI. + +## Running locally + +```bash +# 1. Build once with the e2e config and serve it (or use the dev server: +# PORT=3977 REACT_APP_CONFIG=e2e pnpm start). +pnpm run build:e2e && pnpm run serve:e2e # terminal A +# 2. Run the tests (reuses the running server). +pnpm run test:e2e # terminal B +``` + +`serve:e2e` is a tiny dependency-free SPA static server +(`scripts/serve-e2e.mjs`) that listens on port **3977** (chosen so it never +collides with other common `:3000` dev servers). Playwright can also start it +itself via the `webServer` config when nothing is listening on that port. + +## Screenshot baselines + +WebGL output is made deterministic across machines by forcing ANGLE + +SwiftShader (software rendering). SwiftShader still differs between operating +systems, so **baselines are per-OS** and the ones committed here are **Linux**, +matching CI. + +Regenerate them with the pinned Playwright container (browser runs in the +container; the app is served from the host): + +```bash +pnpm run build:e2e && pnpm run serve:e2e # terminal A +pnpm run test:e2e:update:docker # terminal B +# review the diff under e2e/__screenshots__/ and commit +``` + +Generating baselines with a plain `pnpm run test:e2e:update` on macOS/Windows +produces host-OS snapshots that will **not** match CI — always use the Docker +script for committed baselines. + +## CI + +`.github/workflows/e2e-visual.yml` runs this suite inside the same pinned +Playwright container, so the browser environment is byte-for-byte identical to +the local baseline-generation path above. diff --git a/e2e/__screenshots__/bulk-annotations.spec.ts/nuclei-whole-slide-linux.png b/e2e/__screenshots__/bulk-annotations.spec.ts/nuclei-whole-slide-linux.png new file mode 100644 index 00000000..950eef85 Binary files /dev/null and b/e2e/__screenshots__/bulk-annotations.spec.ts/nuclei-whole-slide-linux.png differ diff --git a/e2e/bulk-annotations.spec.ts b/e2e/bulk-annotations.spec.ts new file mode 100644 index 00000000..d6e7522b --- /dev/null +++ b/e2e/bulk-annotations.spec.ts @@ -0,0 +1,83 @@ +import { expect, test } from '@playwright/test' + +import { + GROUP_NAME, + SERIES_UID, + STUDY_UID, + deckDrawnPixelCount, + expandAnnotationGroups, + mapClip, + setGroupVisibility, + prepareAnnotationScreenshot, + usedHeapMB, + waitForAnnotationsCleared, + waitForAnnotationsDrawn, + waitForAnnotationsStable, + waitForSlide, +} from './helpers' + +/** + * Visual-regression + smoke coverage for the deck.gl bulk-annotation renderer. + * + * The default target is a ~396k-polygon "Nuclei" group (see helpers.ts). The + * suite asserts three things that matter for the renderer: + * 1. A large group loads and paints without exhausting the JS heap (the OL + * Feature pipeline this replaced OOM'd on groups this size). + * 2. The annotation overlay matches a committed screenshot baseline. + * 3. Hiding the group frees the overlay. + * + * Screenshots are clipped to the map viewport so the volatile memory footer + * and sidebar text never enter the comparison. + */ +test.describe('bulk annotations (deck.gl overlay)', () => { + test.beforeEach(async ({ page }) => { + await page.goto(`/studies/${STUDY_UID}/series/${SERIES_UID}`) + await waitForSlide(page) + await expandAnnotationGroups(page) + }) + + test('renders a large annotation group without exhausting memory', async ({ + page, + }) => { + const heapBefore = await usedHeapMB(page) + + await setGroupVisibility(page, GROUP_NAME, true) + + const drawnPixels = await waitForAnnotationsDrawn(page) + expect(drawnPixels).toBeGreaterThan(500) + + // Wait for progressive streaming to finish so the whole-slide overlay + // (the deterministic screenshot target) reflects the complete group. + await waitForAnnotationsStable(page) + + const heapAfter = await usedHeapMB(page) + if (heapBefore >= 0 && heapAfter >= 0) { + // Guardrail against a regression to the old multi-GB / OOM behavior. + // ~396k polygons decode to a few hundred MB; 1500 MB leaves headroom + // without letting a runaway leak pass. + expect(heapAfter).toBeLessThan(1500) + } + + // The whole-slide fit is fully deterministic (image dimensions + viewport). + // Hide the WSI tile layers / chrome so the screenshot compares only the + // deck.gl overlay — WSI tile decoding is non-deterministic across runs. + await page + .waitForLoadState('networkidle', { timeout: 60_000 }) + .catch(() => undefined) + await prepareAnnotationScreenshot(page) + await expect(page).toHaveScreenshot('nuclei-whole-slide.png', { + clip: await mapClip(page), + timeout: 120_000, + }) + }) + + test('hides an annotation group on toggle-off', async ({ page }) => { + await setGroupVisibility(page, GROUP_NAME, true) + await waitForAnnotationsDrawn(page) + + await setGroupVisibility(page, GROUP_NAME, false) + + await waitForAnnotationsCleared(page) + expect(await deckDrawnPixelCount(page)).toBeLessThan(500) + }) +}) diff --git a/e2e/helpers.ts b/e2e/helpers.ts new file mode 100644 index 00000000..dc02821a --- /dev/null +++ b/e2e/helpers.ts @@ -0,0 +1,307 @@ +import { type Page, expect } from '@playwright/test' + +/** + * Default target: the TCGA-02-0001 glioblastoma study on the public IDC proxy. + * Slim auto-selects slide DX1, whose referenced SM series is overlaid by a + * single POLYGON "Nuclei" annotation group of ~396k annotations — a good + * stress test for the deck.gl LOD / spatial-tiling path. + */ +export const STUDY_UID = + process.env.E2E_STUDY_UID ?? '2.25.68803095896966276583382138924964839274' + +/** + * SM series for slide DX1. Pinning this (instead of relying on slim's default + * study→series redirect) keeps the visual baseline pointed at one slide — + * this study has four, each with its own ~hundreds-of-thousands Nuclei group. + */ +export const SERIES_UID = + process.env.E2E_SERIES_UID ?? + '1.3.6.1.4.1.5962.99.1.1163866303.1057408148.1637546438847.2.0' + +/** Name of the annotation group to exercise. */ +export const GROUP_NAME = process.env.E2E_GROUP_NAME ?? 'Nuclei' + +/** Non-transparent deck-canvas pixels that count as "annotations drawn". */ +const DRAWN_PIXEL_THRESHOLD = 500 + +/** Ignore network-idle timeouts; WSI tile streaming rarely goes truly idle. */ +function ignoreNetworkIdleTimeout(): undefined { + return undefined +} + +/** + * Read the deck.gl overlay canvas (the large WebGL2 canvas inside the OL map) + * and count non-transparent pixels. Returns -1 when the canvas is not found. + * + * A fresh getContext() returns the existing context, so this reflects the live + * overlay rather than a new blank buffer. + */ +export async function deckDrawnPixelCount(page: Page): Promise { + return await page.evaluate(() => { + const canvases = Array.from(document.querySelectorAll('canvas')) + const deck = canvases.find((canvas) => { + try { + return canvas.getContext('webgl2') != null && canvas.width > 200 + } catch { + return false + } + }) + if (deck == null) { + return -1 + } + const gl = deck.getContext('webgl2') + if (gl == null) { + return -1 + } + const { width, height } = deck + const pixels = new Uint8Array(width * height * 4) + gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, pixels) + let nonTransparent = 0 + for (let i = 3; i < pixels.length; i += 4) { + if (pixels[i] !== 0) { + nonTransparent++ + } + } + return nonTransparent + }) +} + +/** Current JS heap usage in MB (Chromium only), or -1 when unavailable. */ +export async function usedHeapMB(page: Page): Promise { + return await page.evaluate(() => { + const mem = ( + performance as unknown as { memory?: { usedJSHeapSize: number } } + ).memory + return mem != null + ? Number((mem.usedJSHeapSize / 1048576).toFixed(1)) + : -1 + }) +} + +/** Bounding box of the largest OpenLayers viewport (the main volume viewer). */ +export async function mapClip(page: Page): Promise<{ + x: number + y: number + width: number + height: number +}> { + const box = await page.evaluate(() => { + const viewports = Array.from(document.querySelectorAll('.ol-viewport')) + let best: DOMRect | null = null + for (const viewport of viewports) { + const rect = viewport.getBoundingClientRect() + if (best == null || rect.width * rect.height > best.width * best.height) { + best = rect + } + } + return best == null + ? null + : { x: best.x, y: best.y, width: best.width, height: best.height } + }) + if (box == null) { + throw new Error('Could not locate the OpenLayers map viewport') + } + return { + x: Math.round(box.x), + y: Math.round(box.y), + width: Math.round(box.width), + height: Math.round(box.height), + } +} + +/** + * Wait until the main slide viewer has mounted and image tiles have settled. + * A whole-slide image streams tiles continuously, so we bound the network-idle + * wait and always add a fixed settle rather than relying on true idle. + */ +export async function waitForSlide(page: Page): Promise { + await page.waitForSelector('.ol-viewport canvas', { timeout: 180_000 }) + // The left metadata panel (which holds the Annotation Groups accordion) + // renders once the slide's instances have been fetched. + await page + .getByRole('menuitem', { name: 'Annotation Groups' }) + .waitFor({ timeout: 180_000 }) + await page + .waitForLoadState('networkidle', { timeout: 30_000 }) + .catch(ignoreNetworkIdleTimeout) + await page.waitForTimeout(2000) +} + +/** Expand the "Annotation Groups" accordion so its switches render. */ +export async function expandAnnotationGroups(page: Page): Promise { + await page.getByRole('menuitem', { name: 'Annotation Groups' }).click() + await page.getByRole('switch').first().waitFor({ timeout: 15_000 }) + await page.waitForTimeout(500) +} + +/** + * Report whether the named group's visibility switch is checked, or null when + * the switch cannot be found. The switch lives in the same list container as + * the group's menuitem, so the in-page lookup walks up from the menuitem until + * it finds one. (The lookup is duplicated in setGroupVisibility because + * functions cannot be shared across the browser boundary.) + */ +async function groupSwitchChecked( + page: Page, + groupName: string, +): Promise { + return await page.evaluate((name) => { + const items = Array.from(document.querySelectorAll('[role="menuitem"]')) + const item = items.find((el) => (el.textContent ?? '').includes(name)) + let container: Element | null | undefined = item + for (let depth = 0; depth < 6 && container != null; depth++) { + const sw = container.querySelector('button[role="switch"]') + if (sw != null) { + return sw.getAttribute('aria-checked') === 'true' + } + container = container.parentElement + } + return null + }, groupName) +} + +/** + * Set the visibility of the annotation group with the given name and wait for + * the switch state to reflect it (aria-checked updates asynchronously after + * React re-renders). + * + * The switch can sit beneath the sticky footer, so it is toggled through the + * DOM (a real user would scroll first; the click still exercises the app's + * handler). + */ +export async function setGroupVisibility( + page: Page, + groupName: string, + visible: boolean, +): Promise { + const result = await page.evaluate( + ({ groupName: name, visible: wantVisible }) => { + const items = Array.from(document.querySelectorAll('[role="menuitem"]')) + const item = items.find((el) => (el.textContent ?? '').includes(name)) + let sw: HTMLButtonElement | null = null + let container: Element | null | undefined = item + for (let depth = 0; depth < 6 && container != null; depth++) { + sw = container.querySelector('button[role="switch"]') + if (sw != null) { + break + } + container = container.parentElement + } + if (sw == null) { + return 'switch-not-found' + } + const checked = sw.getAttribute('aria-checked') === 'true' + if (checked !== wantVisible) { + sw.click() + } + return 'ok' + }, + { groupName, visible }, + ) + if (result !== 'ok') { + throw new Error( + `Visibility switch for annotation group "${groupName}" not found`, + ) + } + await expect + .poll(async () => await groupSwitchChecked(page, groupName), { + timeout: 15_000, + }) + .toBe(visible) +} + +/** Poll until the deck overlay has drawn content (annotations visible). */ +export async function waitForAnnotationsDrawn(page: Page): Promise { + let count = 0 + await expect + .poll( + async () => { + count = await deckDrawnPixelCount(page) + return count + }, + { timeout: 180_000, intervals: [1000, 2000, 3000, 5000] }, + ) + .toBeGreaterThan(DRAWN_PIXEL_THRESHOLD) + return count +} + +/** + * Wait until annotation loading has settled by polling the drawn-pixel count + * until it stops changing across consecutive samples. + * + * This matters for deterministic screenshots: a group streams in progressively + * and the whole-slide overlay only reflects the complete group once streaming + * finishes. Waiting for a stable count first makes the screenshot identical + * every run. + */ +export async function waitForAnnotationsStable(page: Page): Promise { + let previous = -1 + let stableSamples = 0 + const requiredStableSamples = 3 + await expect + .poll( + async () => { + const count = await deckDrawnPixelCount(page) + // Tolerate tiny sampling jitter (< 0.5%) as "unchanged". + const changed = + previous < 0 || Math.abs(count - previous) > previous * 0.005 + 50 + stableSamples = changed ? 0 : stableSamples + 1 + previous = count + return stableSamples + }, + { timeout: 180_000, intervals: [2000] }, + ) + .toBeGreaterThanOrEqual(requiredStableSamples) +} + +/** Poll until the deck overlay is effectively empty (annotations hidden). */ +export async function waitForAnnotationsCleared(page: Page): Promise { + await expect + .poll(async () => await deckDrawnPixelCount(page), { + timeout: 60_000, + intervals: [500, 1000, 2000], + }) + .toBeLessThan(DRAWN_PIXEL_THRESHOLD) +} + +/** + * Hide everything that is not the deck.gl annotation overlay so screenshots + * compare only the annotation rendering (and not flaky WSI tile decoding, + * the overview map, or the scale bar). + * + * Mutates the live page; call immediately before toHaveScreenshot. + */ +export async function prepareAnnotationScreenshot(page: Page): Promise { + await page.evaluate(() => { + for (const canvas of document.querySelectorAll('canvas')) { + try { + if (canvas.getContext('webgl2') == null) { + ;(canvas as HTMLElement).style.visibility = 'hidden' + } + } catch { + ;(canvas as HTMLElement).style.visibility = 'hidden' + } + } + for (const selector of [ + '.ol-overviewmap', + '.ol-scale-line', + '.ol-zoom', + '.ol-attribution', + ]) { + document.querySelectorAll(selector).forEach((el) => { + ;(el as HTMLElement).style.visibility = 'hidden' + }) + } + // Slim's custom scale / overview chrome is not always an OL control. + document.querySelectorAll('body *').forEach((el) => { + const text = (el.textContent ?? '').trim() + if (/^\d+(\.\d+)?\s*(µm|mm|cm)$/.test(text)) { + ;(el as HTMLElement).style.visibility = 'hidden' + const parent = el.parentElement + if (parent != null) { + parent.style.visibility = 'hidden' + } + } + }) + }) +} diff --git a/e2e/update-snapshots-docker.sh b/e2e/update-snapshots-docker.sh new file mode 100755 index 00000000..af1a22db --- /dev/null +++ b/e2e/update-snapshots-docker.sh @@ -0,0 +1,40 @@ +#!/usr/bin/env bash +# +# Regenerate the Linux screenshot baselines that CI compares against, using the +# pinned Playwright container so the browser environment matches CI exactly. +# +# The app itself is served from the host (static output is OS-independent); only +# the browser runs inside the container. Start the server first, e.g.: +# +# pnpm run build:e2e && pnpm run serve:e2e # in another terminal +# # or, for iterating on specs: +# REACT_APP_CONFIG=e2e pnpm start +# +# then run: +# +# pnpm run test:e2e:update:docker +# +set -euo pipefail + +# Keep in sync with the @playwright/test version in package.json. +PLAYWRIGHT_VERSION="$(node -p "require('@playwright/test/package.json').version")" +IMAGE="mcr.microsoft.com/playwright:v${PLAYWRIGHT_VERSION}-jammy" + +# The container reaches the host dev/preview server via host.docker.internal. +BASE_URL="${E2E_BASE_URL:-http://host.docker.internal:3977}" + +REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)" + +echo "Using ${IMAGE}" +echo "Target app: ${BASE_URL} (must already be served from the host)" + +docker run --rm \ + --add-host=host.docker.internal:host-gateway \ + -e CI=1 \ + -e "E2E_BASE_URL=${BASE_URL}" \ + -v "${REPO_ROOT}:/work" \ + -w /work \ + "${IMAGE}" \ + npx playwright test --update-snapshots + +echo "Baselines updated under e2e/__screenshots__/. Review and commit them." diff --git a/package.json b/package.json index 52a39784..217a6f9f 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,11 @@ "fmt": "biome format --write .", "format": "biome format --write .", "test": "craco test --watchAll=false", + "build:e2e": "REACT_APP_CONFIG=e2e PUBLIC_URL=/ ./scripts/set-git-env.sh craco build", + "serve:e2e": "node scripts/serve-e2e.mjs", + "test:e2e": "playwright test", + "test:e2e:update": "playwright test --update-snapshots", + "test:e2e:update:docker": "./e2e/update-snapshots-docker.sh", "predeploy": "REACT_APP_CONFIG=demo PUBLIC_URL='https://imagingdatacommons.github.io/slim/' ./scripts/set-git-env.sh craco build", "deploy": "gh-pages -d build", "clean": "rm -rf ./build ./node_modules", @@ -41,7 +46,7 @@ "classnames": "^2.2.6", "dcmjs": "^0.35.0", "detect-browser": "^5.2.1", - "dicom-microscopy-viewer": "^0.48.22", + "dicom-microscopy-viewer": "github:ImagingDataCommons/dicom-microscopy-viewer#1b39614eae92e92578d14977f66ced60243e51bc", "dicomweb-client": "0.10.3", "oidc-client": "^1.11.5", "ol": "^10.7.0", @@ -59,6 +64,7 @@ "@babel/preset-typescript": "^7.17.12", "@biomejs/biome": "2.4.16", "@craco/craco": "^6.4.0", + "@playwright/test": "^1.62.1", "@semantic-release/changelog": "^6.0.3", "@semantic-release/commit-analyzer": "^12.0.0", "@semantic-release/git": "^10.0.1", diff --git a/playwright.config.ts b/playwright.config.ts new file mode 100644 index 00000000..ebdf27cd --- /dev/null +++ b/playwright.config.ts @@ -0,0 +1,107 @@ +import { defineConfig, devices } from '@playwright/test' + +/** + * Playwright config for slim end-to-end / visual-regression tests. + * + * These tests drive the real app in a real browser (WebGL required for the + * deck.gl bulk-annotation overlay) and compare screenshots against committed + * baselines to catch rendering regressions. + * + * Data source: by default the app is configured (public/config/e2e.js) to talk + * to the public NCI Imaging Data Commons proxy, so no local DICOM server is + * needed. Override the target study/series with E2E_* env vars (see the spec). + * + * WebGL determinism: Chromium is launched with ANGLE + SwiftShader (software + * rendering) so the exact same pixels are produced on any machine. Because + * SwiftShader output still differs between operating systems, screenshot + * baselines are stored per-platform and MUST be generated on the same OS as CI + * (Linux). Use `pnpm test:e2e:update:docker` to (re)generate Linux baselines + * locally via the pinned Playwright container. See e2e/README.md. + */ + +const isCI = Boolean(process.env.CI) + +/** + * When E2E_BASE_URL is set we assume the caller manages the server (e.g. a + * Linux container pointed at the host, or CI serving a prebuilt bundle), so + * Playwright should not spawn its own web server. + */ +/** + * A dedicated port avoids clashes with other dev servers commonly bound to + * :3000 (note: another IPv6 listener on the same port can shadow slim when + * "localhost" resolves to ::1). + */ +const externalBaseUrl = process.env.E2E_BASE_URL +const baseURL = externalBaseUrl ?? 'http://127.0.0.1:3977' + +export default defineConfig({ + testDir: './e2e', + /** + * deck.gl rendering plus cold WSI + bulk-annotation loading over the public + * proxy is slow, especially under SwiftShader in CI; be generous. + */ + timeout: 300_000, + expect: { + timeout: 30_000, + toHaveScreenshot: { + /** + * Tolerate minor antialiasing / tile-decode differences in the WSI + * background while still catching annotation rendering regressions. + */ + // Overlay-only screenshots (WSI tiles hidden) are stable; keep this tight. + maxDiffPixelRatio: 0.01, + /** Per-pixel threshold (0-1); higher = more permissive on color. */ + threshold: 0.15, + }, + }, + /** One heavy WebGL app instance at a time keeps runs deterministic. */ + fullyParallel: false, + workers: 1, + forbidOnly: isCI, + retries: isCI ? 1 : 0, + reporter: [['list'], ['html', { open: 'never' }]], + /** Keep baselines organized and per-OS so macOS/Linux never clash. */ + snapshotPathTemplate: + '{testDir}/__screenshots__/{testFilePath}/{arg}-{platform}{ext}', + use: { + baseURL, + viewport: { width: 1600, height: 900 }, + deviceScaleFactor: 1, + trace: 'retain-on-failure', + screenshot: 'only-on-failure', + video: 'retain-on-failure', + }, + projects: [ + { + name: 'chromium', + use: { + ...devices['Desktop Chrome'], + viewport: { width: 1600, height: 900 }, + launchOptions: { + args: [ + // Force deterministic software WebGL2 (ANGLE + SwiftShader) so the + // deck.gl overlay renders identically across machines. + '--use-gl=angle', + '--use-angle=swiftshader', + '--enable-unsafe-swiftshader', + '--ignore-gpu-blocklist', + '--disable-dev-shm-usage', + ], + }, + }, + }, + ], + webServer: externalBaseUrl + ? undefined + : { + /** + * Serve a production build baked with the e2e config. Reuses an + * already-running dev server locally (e.g. `REACT_APP_CONFIG=e2e pnpm + * start`) so iterating on specs is fast. + */ + command: 'pnpm run serve:e2e', + url: baseURL, + reuseExistingServer: !isCI, + timeout: 180_000, + }, +}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 96daaa1b..c3bbce91 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -46,8 +46,8 @@ importers: specifier: ^5.2.1 version: 5.3.0 dicom-microscopy-viewer: - specifier: ^0.48.22 - version: 0.48.22 + specifier: github:ImagingDataCommons/dicom-microscopy-viewer#1b39614eae92e92578d14977f66ced60243e51bc + version: https://codeload.github.com/ImagingDataCommons/dicom-microscopy-viewer/tar.gz/1b39614eae92e92578d14977f66ced60243e51bc(@loaders.gl/core@4.4.4)(@luma.gl/core@9.1.10)(@luma.gl/engine@9.1.10(@luma.gl/core@9.1.10)(@luma.gl/shadertools@9.1.10(@luma.gl/core@9.1.10))) dicomweb-client: specifier: 0.10.3 version: 0.10.3 @@ -56,7 +56,7 @@ importers: version: 1.11.5 ol: specifier: ^10.7.0 - version: 10.9.0 + version: 10.10.0 react: specifier: ^18.2.0 version: 18.3.1 @@ -94,6 +94,9 @@ importers: '@craco/craco': specifier: ^6.4.0 version: 6.4.5(@types/node@14.18.63)(react-scripts@5.0.0(@babel/plugin-syntax-flow@7.29.7(@babel/core@7.29.7))(@babel/plugin-transform-react-jsx@7.29.7(@babel/core@7.29.7))(@types/babel__core@7.20.5)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(@types/node@14.18.63)(typescript@4.9.5))(type-fest@4.41.0)(typescript@4.9.5))(typescript@4.9.5) + '@playwright/test': + specifier: ^1.62.1 + version: 1.62.1 '@semantic-release/changelog': specifier: ^6.0.3 version: 6.0.3(semantic-release@21.1.2(typescript@4.9.5)) @@ -117,7 +120,7 @@ importers: version: 5.17.0 '@testing-library/react': specifier: ^14.0.0 - version: 14.3.1(@types/react@18.3.30)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 14.3.1(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@testing-library/user-event': specifier: ^7.1.2 version: 7.2.1(@testing-library/dom@9.3.4) @@ -129,16 +132,16 @@ importers: version: 28.1.8 '@types/lodash': specifier: ^4.17.20 - version: 4.17.24 + version: 4.17.25 '@types/node': specifier: ^14.14.9 version: 14.18.63 '@types/react': specifier: ^18.0.14 - version: 18.3.30 + version: 18.3.31 '@types/react-dom': specifier: ^18.0.5 - version: 18.3.7(@types/react@18.3.30) + version: 18.3.7(@types/react@18.3.31) '@types/react-router-dom': specifier: ^5.3.3 version: 5.3.3 @@ -153,10 +156,10 @@ importers: version: 6.12.6 copy-webpack-plugin: specifier: 9.1.0 - version: 9.1.0(webpack@5.107.2(postcss@8.5.25)) + version: 9.1.0(webpack@5.109.2(postcss@8.5.25)) craco-less: specifier: ^2.0.0 - version: 2.0.0(@craco/craco@6.4.5(@types/node@14.18.63)(react-scripts@5.0.0(@babel/plugin-syntax-flow@7.29.7(@babel/core@7.29.7))(@babel/plugin-transform-react-jsx@7.29.7(@babel/core@7.29.7))(@types/babel__core@7.20.5)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(@types/node@14.18.63)(typescript@4.9.5))(type-fest@4.41.0)(typescript@4.9.5))(typescript@4.9.5))(react-scripts@5.0.0(@babel/plugin-syntax-flow@7.29.7(@babel/core@7.29.7))(@babel/plugin-transform-react-jsx@7.29.7(@babel/core@7.29.7))(@types/babel__core@7.20.5)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(@types/node@14.18.63)(typescript@4.9.5))(type-fest@4.41.0)(typescript@4.9.5))(webpack@5.107.2(postcss@8.5.25)) + version: 2.0.0(@craco/craco@6.4.5(@types/node@14.18.63)(react-scripts@5.0.0(@babel/plugin-syntax-flow@7.29.7(@babel/core@7.29.7))(@babel/plugin-transform-react-jsx@7.29.7(@babel/core@7.29.7))(@types/babel__core@7.20.5)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(@types/node@14.18.63)(typescript@4.9.5))(type-fest@4.41.0)(typescript@4.9.5))(typescript@4.9.5))(react-scripts@5.0.0(@babel/plugin-syntax-flow@7.29.7(@babel/core@7.29.7))(@babel/plugin-transform-react-jsx@7.29.7(@babel/core@7.29.7))(@types/babel__core@7.20.5)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(@types/node@14.18.63)(typescript@4.9.5))(type-fest@4.41.0)(typescript@4.9.5))(webpack@5.109.2(postcss@8.5.25)) eslint: specifier: ^8.57.0 version: 8.57.1 @@ -183,7 +186,7 @@ importers: version: 21.1.2(typescript@4.9.5) sonarqube-scanner: specifier: ^4.3.0 - version: 4.3.6 + version: 4.4.0 typescript: specifier: ^4.7.4 version: 4.9.5 @@ -200,8 +203,8 @@ packages: '@ant-design/colors@6.0.0': resolution: {integrity: sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==} - '@ant-design/icons-svg@4.4.2': - resolution: {integrity: sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==} + '@ant-design/icons-svg@4.5.0': + resolution: {integrity: sha512-1BTUFyKPTBZ53MuTP8s0k5SFEXL7o3VHEOwLgzaoWKwnBeqIcqUtVshc4SKzhI6uACfqhJqBwBUE9FsWR3uULA==} '@ant-design/icons@4.8.3': resolution: {integrity: sha512-HGlIQZzrEbAhpJR6+IGdzfbPym94Owr6JZkJ2QCCnOkPVIWMO2xgIVcOKnl8YcpijIo39V7l2qQL5fmtw56cMw==} @@ -240,8 +243,8 @@ packages: '@babel/core': ^7.11.0 eslint: ^7.5.0 || ^8.0.0 || ^9.0.0 - '@babel/generator@7.29.7': - resolution: {integrity: sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==} + '@babel/generator@7.29.8': + resolution: {integrity: sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==} engines: {node: '>=6.9.0'} '@babel/helper-annotate-as-pure@7.29.7': @@ -331,8 +334,8 @@ packages: resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==} engines: {node: '>=6.9.0'} - '@babel/parser@7.29.7': - resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} + '@babel/parser@7.29.8': + resolution: {integrity: sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==} engines: {node: '>=6.0.0'} hasBin: true @@ -697,8 +700,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-systemjs@7.29.7': - resolution: {integrity: sha512-TM2ZcQLoG2/y4HODiStCo10DibYhWhGWAwVv+EQKmG/7GFl0N+AAmUiXOMKM+aiJ9XBJ9AHVZBvTzMnJ2sM3cQ==} + '@babel/plugin-transform-modules-systemjs@7.29.8': + resolution: {integrity: sha512-6iSnEK0zlkLKU4heofK/AdmRD4e2SHVpJMtrwnTCzhnaM98ria4rTrOXBBi45BTTYnJtO8txnPsX4fChYXkmeA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -811,8 +814,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regenerator@7.29.7': - resolution: {integrity: sha512-rNNFV0DBAJp988xW2DOntfDoYn1eR8GGF5AT5vYc+rjyfaQkM242c9tZUHHPe7KYaiJizXPWhQTzzdbXySyhBw==} + '@babel/plugin-transform-regenerator@7.29.8': + resolution: {integrity: sha512-0UpIXPtdDtMXfnV2OJAVMLpj3H/92vmkA6lpSRakmycJvj3VUy6Xs1dM8tXRugupykr5WB+LpiVl0J8LMVg2mg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -841,8 +844,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-spread@7.29.7': - resolution: {integrity: sha512-/u5K1QWada7tbYNqTjMh96718g9NTwh9tfPJMsSmVsQwGT447FskV+KcfeXkXq2GWki4EM/MuTdmBec+hOuVTQ==} + '@babel/plugin-transform-spread@7.29.8': + resolution: {integrity: sha512-4S9ksMGVWUshvgK0mKfvZky7leuG5/uoFVwMpAomJ8bMoDJiNHRVmc1EglwW/CmGVSqqWpEbXm9FmbRit22qoA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -930,12 +933,12 @@ packages: resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.29.7': - resolution: {integrity: sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==} + '@babel/traverse@7.29.8': + resolution: {integrity: sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==} engines: {node: '>=6.9.0'} - '@babel/types@7.29.7': - resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} + '@babel/types@7.29.8': + resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==} engines: {node: '>=6.9.0'} '@bcoe/v8-coverage@0.2.3': @@ -1126,8 +1129,26 @@ packages: resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==} engines: {node: '>=10'} - '@eslint-community/eslint-utils@4.9.1': - resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} + '@deck.gl/core@9.1.15': + resolution: {integrity: sha512-2Tx2aKNskDS8SZ6EB7V53exo3SVntCJJGjrAnz3KhNj4fA4BVqOH++LSpjCFhuG9m4WOWDSDq9s7w4DQnTiT+Q==} + + '@deck.gl/extensions@9.1.15': + resolution: {integrity: sha512-pH3SArgiEibHwrYwbKTknUurgpUndUFa+O97in+zRVF6KFGNZSLm1AePERh1gQjcpuQ+GwrxJ/ijmVmuH2zOow==} + peerDependencies: + '@deck.gl/core': ^9.1.0 + '@luma.gl/core': ~9.1.9 + '@luma.gl/engine': ~9.1.9 + + '@deck.gl/layers@9.1.15': + resolution: {integrity: sha512-4C8LaCXnd/cHGMGwuLu6YUqcf/4dyz82Im+C0IrY56OgJnVOKf2f75zwAKa1Uekq4XEsyPgqg9k5MWEohBzGYw==} + peerDependencies: + '@deck.gl/core': ^9.1.0 + '@loaders.gl/core': ^4.2.0 + '@luma.gl/core': ~9.1.9 + '@luma.gl/engine': ~9.1.9 + + '@eslint-community/eslint-utils@4.10.1': + resolution: {integrity: sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 @@ -1268,6 +1289,70 @@ packages: '@leichtgewicht/ip-codec@2.0.5': resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} + '@loaders.gl/core@4.4.4': + resolution: {integrity: sha512-uUZLs1N1VQXj3jC81LS7OkrWw1NRQHb0rdGUZI/FOFvirFEIR+TAKcvMO1Zz9WQj2dT9r6HhVjMDJQxU42LsoA==} + + '@loaders.gl/images@4.4.4': + resolution: {integrity: sha512-pqCfWRR7yEHCnAaWDu1aoD7NILts6mvY+B47lQXJ00Ffm4/cfx35dTZ4GUung/iqdVAbxC7fpGKwTPn3T06x4w==} + peerDependencies: + '@loaders.gl/core': ~4.4.0 + + '@loaders.gl/loader-utils@4.4.4': + resolution: {integrity: sha512-+0IizJUB6GvPQjl2xC2V1vpcMPcidZykWy27LFnIIqG1lesxfALnFmRoq9MjbOj2TPcUo7VSBxl8z55qRlX0rQ==} + + '@loaders.gl/schema-utils@4.4.4': + resolution: {integrity: sha512-/ykSrQlfn7Lx+kmQNuGzTaywLVy2RoaAZ5YiEXkP9UJ+4lYY2wP5KgUlQGwODDdzNPLFmYzd+FXeE9GEmlXIUg==} + peerDependencies: + '@loaders.gl/core': ~4.4.0 + + '@loaders.gl/schema@4.4.4': + resolution: {integrity: sha512-3spgUoN505V2OprDDzww5nhWfn8Htupcfdr+/lxswAhCbGjwM3RWzA3Zif3dW6ZxOCeSIRJ4GNON78Eiede2dw==} + + '@loaders.gl/worker-utils@4.4.4': + resolution: {integrity: sha512-UNQCwK7tHd7Qh0K7e6Flvac8qd14SoAgaN8SOjggd5ngYqwytOQiAo5uEuhRN+r7+EqdwU+qwcpRtjYByT+RqA==} + peerDependencies: + '@loaders.gl/core': ~4.4.0 + + '@luma.gl/constants@9.1.10': + resolution: {integrity: sha512-O4Nx8UbWmrHHZ7ihKB8WiscX1cz05l1KvKorYTgq+xeXwz2Beh3MkXBMnA46uuyEtimN945OEdYshZnbh80jyw==} + + '@luma.gl/core@9.1.10': + resolution: {integrity: sha512-izvT0DDjlVpchpTokXMNYJeyhgTdGuf21LHEpVa/3EtGFDAJESb3eH99Q3KfzgbqqIAwrTy+25TSStV/3r2svA==} + + '@luma.gl/engine@9.1.10': + resolution: {integrity: sha512-Og1cFpDGq8IUDI9Oaytnm08sdeitxcStsFrjiE4AejZQgx6OdHo+tE33M3WLAUzp6oQYQwl6r2USOhH4BuEiRg==} + peerDependencies: + '@luma.gl/core': ~9.1.0 + '@luma.gl/shadertools': ~9.1.0 + + '@luma.gl/shadertools@9.1.10': + resolution: {integrity: sha512-ET2Vs9Vws5zkjSC07RWBVEFQ6EDP5yTiEZBnvblkb5y4wgjLHAgM5NBJw51Xb5BRBH0aC4piwP+2SnDA29dOlg==} + peerDependencies: + '@luma.gl/core': ~9.1.0 + + '@luma.gl/webgl@9.1.10': + resolution: {integrity: sha512-mwIsNEzxt6GW/fnCqBgJAorzFPi5c//3ZukKFHso+F1mvtHhTE4NQfA/pEvj4HBg/IdYkMvkoQsMrSn5+jko3A==} + peerDependencies: + '@luma.gl/core': ~9.1.0 + + '@mapbox/tiny-sdf@2.2.0': + resolution: {integrity: sha512-LVL4wgI9YAum5V+LNVQO6QgFBPw7/MIIY4XJPNsPDMrjEwcE+JfKk1LuIl8GnF197ejVdC9QdPaxrx5gfgdGXg==} + + '@math.gl/core@4.1.0': + resolution: {integrity: sha512-FrdHBCVG3QdrworwrUSzXIaK+/9OCRLscxI2OUy6sLOHyHgBMyfnEGs99/m3KNvs+95BsnQLWklVfpKfQzfwKA==} + + '@math.gl/polygon@4.1.0': + resolution: {integrity: sha512-YA/9PzaCRHbIP5/0E9uTYrqe+jsYTQoqoDWhf6/b0Ixz8bPZBaGDEafLg3z7ffBomZLacUty9U3TlPjqMtzPjA==} + + '@math.gl/sun@4.1.0': + resolution: {integrity: sha512-i3q6OCBLSZ5wgZVhXg+X7gsjY/TUtuFW/2KBiq/U1ypLso3S4sEykoU/MGjxUv1xiiGtr+v8TeMbO1OBIh/HmA==} + + '@math.gl/types@4.1.0': + resolution: {integrity: sha512-clYZdHcmRvMzVK5fjeDkQlHUzXQSNdZ7s4xOqC3nJPgz4C/TZkUecTo9YS4PruZqtDda/ag4erndP0MIn40dGA==} + + '@math.gl/web-mercator@4.1.0': + resolution: {integrity: sha512-HZo3vO5GCMkXJThxRJ5/QYUYRr3XumfT8CzNNCwoJfinxy5NtKUd7dusNTXn7yJ40UoB8FMIwkVwNlqaiRZZAw==} + '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} @@ -1388,6 +1473,11 @@ packages: '@petamoriken/float16@3.9.3': resolution: {integrity: sha512-8awtpHXCx/bNpFt4mt2xdkgtgVvKqty8VbjHI/WWWQuEw+KLzFot3f4+LkQY9YmOtq7A5GdOnqoIC8Pdygjk2g==} + '@playwright/test@1.62.1': + resolution: {integrity: sha512-DTcUc8qii+cpHvtOwggMtBRMjKZHXYWdw8syRYu2vtzuq4Wxphqq4NfCs5Zt44L6mA8rfDfj+PHnxFc/FeK6mQ==} + engines: {node: '>=20'} + hasBin: true + '@pmmmwh/react-refresh-webpack-plugin@0.5.17': resolution: {integrity: sha512-tXDyE1/jzFsHXjhRZQ3hMl0IVhYe5qula43LDWIhVfjp9G/nT5OQY5AORVOrkEGAUltBJOfOWeETbmhm6kHhuQ==} engines: {node: '>= 10.13'} @@ -1422,10 +1512,19 @@ packages: resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==} engines: {node: '>=12.22.0'} - '@pnpm/npm-conf@3.0.2': - resolution: {integrity: sha512-h104Kh26rR8tm+a3Qkc5S4VLYint3FE48as7+/5oCEcKR2idC/pF1G6AhIXKI+eHPJa/3J9i5z0Al47IeGHPkA==} + '@pnpm/npm-conf@3.0.3': + resolution: {integrity: sha512-//0sR/cow/s4ICQaYoAobOl4aU8cjU6x/V24V7XkKotb9+O+3zySIYp146vpaobYHnxa4pZX8NkV54Z5AwbDKA==} engines: {node: '>=12'} + '@probe.gl/env@4.1.1': + resolution: {integrity: sha512-+68seNDMVsEegRB47pFA/Ws1Fjy8agcFYXxzorKToyPcD6zd+gZ5uhwoLd7TzsSw6Ydns//2KEszWn+EnNHTbA==} + + '@probe.gl/log@4.1.1': + resolution: {integrity: sha512-kcZs9BT44pL7hS1OkRGKYRXI/SN9KejUlPD+BY40DguRLzdC5tLG/28WGMyfKdn/51GT4a0p+0P8xvDn1Ez+Kg==} + + '@probe.gl/stats@4.1.1': + resolution: {integrity: sha512-4VpAyMHOqydSvPlEyHwXaE+AkIdR03nX+Qhlxsk2D/IW4OVmDZgIsvJB1cDzyEEtcfKcnaEbfXeiPgejBceT6g==} + '@rc-component/portal@1.1.2': resolution: {integrity: sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==} engines: {node: '>=8.x'} @@ -1542,8 +1641,8 @@ packages: peerDependencies: semantic-release: '>=20.1.0' - '@sinclair/typebox@0.24.51': - resolution: {integrity: sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==} + '@sinclair/typebox@0.24.52': + resolution: {integrity: sha512-DNKwjDaMLKWXvjs/zCkSzA3rBzZVv4tuLCEV8ArRyHAqCtPtbUcQj0XS4h7y/CqL9pI6VpCmcH5A6oPOBAD9+Q==} '@sindresorhus/merge-streams@2.3.0': resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} @@ -1693,15 +1792,18 @@ packages: '@types/estree@1.0.9': resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} - '@types/express-serve-static-core@4.19.8': - resolution: {integrity: sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==} + '@types/express-serve-static-core@4.19.9': + resolution: {integrity: sha512-QP2ESEe/ImWY0HDwNAnK9PvEffUyhLTnWkk7KXzHfyeWAnlrDe1fN77bXl6ia8KT3wPlmA7t9/VPRpnf4Ex9sg==} - '@types/express-serve-static-core@5.1.1': - resolution: {integrity: sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A==} + '@types/express-serve-static-core@5.1.3': + resolution: {integrity: sha512-dPfW8NFiOF4wOHc7+N/QSxlY9cfSsenewGbAz8C8U/MULPd/YZ27LvJUIlzaXie7e6Ove9YunJGgC9tbHD2cKw==} '@types/express@4.17.25': resolution: {integrity: sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==} + '@types/geojson@7946.0.16': + resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} + '@types/graceful-fs@4.1.9': resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} @@ -1735,8 +1837,8 @@ packages: '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - '@types/lodash@4.17.24': - resolution: {integrity: sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==} + '@types/lodash@4.17.25': + resolution: {integrity: sha512-+K1NIO8I+F9/wNulfVvu23QYd0Pe9/OCqRrim4NoYIf1VoEDL90Ve4ClzpyqBLc7NpGGWRvYNCKZ1BE/Jpf8dQ==} '@types/mime@1.3.5': resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} @@ -1750,9 +1852,15 @@ packages: '@types/node@14.18.63': resolution: {integrity: sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==} + '@types/node@25.9.5': + resolution: {integrity: sha512-OScDchr2fwuUmWdf4kZ9h7PcJiYDVInhJizG/biAq3cAvqwYktuy/TYGGdZNMtNTFUP7rnb0NU4TUdm82kt4Rg==} + '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + '@types/offscreencanvas@2019.7.3': + resolution: {integrity: sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==} + '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} @@ -1782,8 +1890,8 @@ packages: '@types/react-router@5.1.20': resolution: {integrity: sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==} - '@types/react@18.3.30': - resolution: {integrity: sha512-3ek6mwJL5/VBewBcY4S66cqlCtK3qi4WIq37Z0m/NHw1hjhI7274Mx1qz/+ggSzyBCOEf7eHjBN6INjPAWYfYw==} + '@types/react@18.3.31': + resolution: {integrity: sha512-vfEqpXTvwT91yhmwdfouStN2hSKwTvyRs8qpLfADyrq/kxDw0hZM7Wk9Ug1FELj8hIby+S/+kQCSRFF32nv2Qw==} '@types/resolve@1.17.1': resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} @@ -1794,8 +1902,8 @@ packages: '@types/retry@0.12.5': resolution: {integrity: sha512-3xSjTp3v03X/lSQLkczaN9UIEwJMoMCA1+Nb5HfbJEQWogdeQIyVtTvxPXDQjZ5zws8rFQfVfRdz03ARihPJgw==} - '@types/semver@7.7.1': - resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} + '@types/semver@7.8.0': + resolution: {integrity: sha512-1mAINjtQCXXeLkJ9ehXkwOcBpqtLxiVtKhpUf83DdRNdQKV0iXZpaHYqRr7nj+wvxuJzoAmAwXI+sCNMv1CzLQ==} '@types/send@0.17.6': resolution: {integrity: sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==} @@ -1900,8 +2008,8 @@ packages: resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@ungap/structured-clone@1.3.1': - resolution: {integrity: sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==} + '@ungap/structured-clone@1.3.3': + resolution: {integrity: sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==} '@webassemblyjs/ast@1.14.1': resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} @@ -1972,12 +2080,6 @@ packages: acorn-globals@6.0.0: resolution: {integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==} - acorn-import-phases@1.0.4: - resolution: {integrity: sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==} - engines: {node: '>=10.13.0'} - peerDependencies: - acorn: ^8.14.0 - acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -1996,8 +2098,8 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - acorn@8.16.0: - resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + acorn@8.18.0: + resolution: {integrity: sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==} engines: {node: '>=0.4.0'} hasBin: true @@ -2107,6 +2209,10 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} + apache-arrow@21.2.0: + resolution: {integrity: sha512-Hxe6Agq26gQOM954qpzYSllJBPJl+e16U5CkfuMUhLrNba+5nKkttIVlflaovN6oaTratqMGAO8H5u/aNhmHWQ==} + hasBin: true + arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} @@ -2209,8 +2315,8 @@ packages: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} engines: {node: '>= 4.0.0'} - autoprefixer@10.5.0: - resolution: {integrity: sha512-FMhOoZV4+qR6aTUALKX2rEqGG+oyATvwBt9IIzVR5rMa2HRWPkxf+P+PAJLD1I/H5/II+HuZcBJYEFBpq39ong==} + autoprefixer@10.5.4: + resolution: {integrity: sha512-MaU0U/za7N3r6brxD4YB/l4NSrFzLPlANv6wEuQVaIPlD3L4W9rFcQPbL/EilY9BHhHvhfcz3gInDLrEtWT4EA==} engines: {node: ^10 || ^12 || >=14} hasBin: true peerDependencies: @@ -2220,8 +2326,8 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} - axe-core@4.12.0: - resolution: {integrity: sha512-FTavr/7Ba0IptwGOPxnQvdyW2tAsdLBMTBXz7rKH6xJ2skpyxpBxyHkDdBs4lf69yRqYpkqCdfhnwS8YULGOmg==} + axe-core@4.13.0: + resolution: {integrity: sha512-UzGt8zg7Ny8djbYMhxl2zuEevVa7r2gJjYY5Lwr1xM7+XU2nd6CkIWFTVcCIbAP63vSz71NaVyyuSk9lHKcy0A==} engines: {node: '>=4'} axios@1.18.0: @@ -2317,24 +2423,20 @@ packages: bare-abort-controller: optional: true - bare-fs@4.7.2: - resolution: {integrity: sha512-aTvMFUWkBmjzKtEQMDGGDNF8bkfpD5N1b/FCwt7A3wrU4t1o/e/85Wzkluh6JlODCjqVESYCkQCdTXqZ9G7VFg==} - engines: {bare: '>=1.16.0'} + bare-fs@4.8.0: + resolution: {integrity: sha512-fM+MhCvdQhZ7NV6S95a07gPSqjIYKn6mFaXfx266wN3ajZGl/+1AzH+ubkXQ0fFZvOe2nk9VHkzdYkQE5zMV3Q==} + engines: {bare: '>=1.28.0'} peerDependencies: bare-buffer: '*' peerDependenciesMeta: bare-buffer: optional: true - bare-os@3.9.1: - resolution: {integrity: sha512-6M5XjcnsygQNPMCMPXSK379xrJFiZ/AEMNBmFEmQW8d/789VQATvriyi5r0HYTL9TkQ26rn3kgdTG3aisbrXkQ==} - engines: {bare: '>=1.14.0'} + bare-path@3.1.1: + resolution: {integrity: sha512-JprUlveX3QjApC1cTpsUOiscADftCGVWkzitbHsRqv84hzYwYHw2mbluddsq5TvI8mH/8Ov1f4BiMAdcB0oYnQ==} - bare-path@3.0.1: - resolution: {integrity: sha512-ghj2DSK/2e99a1anTVPCV4m4YIYtrbXhfM7V3D7XZLOTsybnYyaJloymGqssQc8l/or0UoDyRtNQkmkEF/ysgQ==} - - bare-stream@2.13.1: - resolution: {integrity: sha512-Vp0cnjYyrEC4whYTymQ+YZi6pBpfiICZO3cfRG8sy67ZNWe951urv1x4eW1BKNngw3U+3fPYb5JQvHbCtxH7Ow==} + bare-stream@2.13.3: + resolution: {integrity: sha512-Kc+brLqvEqGkjyfiwJmImAOqLZL7OsoLKuavx+hJjgVV3nLTOjloJyPMFxjUPerGGHrNH0fLU06jjykMLWrERQ==} peerDependencies: bare-abort-controller: '*' bare-buffer: '*' @@ -2347,14 +2449,14 @@ packages: bare-events: optional: true - bare-url@2.4.5: - resolution: {integrity: sha512-K+y9xF1tN+CdPu4qWwr0QiK1Al07eFPGYK5M2pDXcmHdMdgC/tT/bpmMe1hrmRHaidKLkXrC+cRNYf3XVDUhSQ==} + bare-url@2.4.7: + resolution: {integrity: sha512-o8CRCiJtib+ycO3mE4A5UChtGX4dDP2XxsWVu9P+Zc3H8tcmKwNVEDoDTXmwN+uuMhfKeT7/i7Y26xS8W7ohoA==} base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - baseline-browser-mapping@2.10.33: - resolution: {integrity: sha512-bA6+tcSLpz2tIEdDXZPpPTIuxBcC4+w6SieaYyfigIa4h8GlFxbA17v22Vx3JUtuZQj9SgOsnbK+aTBzyDyEuw==} + baseline-browser-mapping@2.11.12: + resolution: {integrity: sha512-r7WnVImvVCeFpf2DOXfy41aPWzeNg3H/A2X4dKmy1QL0MSyyk/e7z8ihJ3N6Nn2PsdhkVlqnEfnUE4a05P2aTA==} engines: {node: '>=6.0.0'} hasBin: true @@ -2385,8 +2487,8 @@ packages: resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - bonjour-service@1.4.0: - resolution: {integrity: sha512-fGQtj1qdR9vIKjFiWPQd52qIqwjaYqhcI40JEiDuvlZ86E7ZBPBwY9fPgHy9r2rYGIjiRfctNPYz6OQU73ww2w==} + bonjour-service@1.4.4: + resolution: {integrity: sha512-jCZcVv7eoc4QesRscwEZtSROBen+6LpKAmBIsQYQrsAeVHLyMXWX/t6eIV5KiRZYNUBl8eVqImEEMQ8L5+c/Kw==} boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} @@ -2407,8 +2509,8 @@ packages: browser-process-hrtime@1.0.0: resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} - browserslist@4.28.2: - resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==} + browserslist@4.28.7: + resolution: {integrity: sha512-JxV13hNrFxqjOc8alRbq9dK1MM79NEXYpma2B2J4wAtpWS5zIEIKqWPGCl7N4o7Uc7B7itylh7SuDujATRyyTw==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -2464,8 +2566,8 @@ packages: caniuse-api@3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} - caniuse-lite@1.0.30001793: - resolution: {integrity: sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==} + caniuse-lite@1.0.30001806: + resolution: {integrity: sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==} cardinal@2.1.1: resolution: {integrity: sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==} @@ -2697,14 +2799,15 @@ packages: peerDependencies: webpack: ^5.1.0 - core-js-compat@3.49.0: - resolution: {integrity: sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==} + core-js-compat@3.50.0: + resolution: {integrity: sha512-XGpFGbMLHwSt74YLTKho7Ib242qi6O8MSX+sRokV4oz7iKXvQWGYZthjIhjRGMxjzVkAubBO512dKGYcefmX3Q==} + engines: {node: '>=6.4.0'} - core-js-pure@3.49.0: - resolution: {integrity: sha512-XM4RFka59xATyJv/cS3O3Kml72hQXUeGRuuTmMYFxwzc9/7C8OYTaIR/Ji+Yt8DXzsFLNhat15cE/JP15HrCgw==} + core-js-pure@3.50.0: + resolution: {integrity: sha512-6GP3Pxz4IKyWjAfa747vIu/jilB5z29JWROLqH/b+pXVcpgh6tM06ZIBwSuglgVqzDYURhOK6oEzTrG0bCHitA==} - core-js@3.49.0: - resolution: {integrity: sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg==} + core-js@3.50.0: + resolution: {integrity: sha512-BRWgOLKkFeCgRudR6zrs8p9XJZcE14grzKMMssoYrk6krtuEZ7MTKPIY5RzOnqsEKIR9kst7wNzphttraT+Yqw==} core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -2749,6 +2852,7 @@ packages: crypto-js@4.2.0: resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} + deprecated: Active development of CryptoJS has been discontinued. This library is no longer maintained. crypto-random-string@2.0.0: resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} @@ -3012,8 +3116,9 @@ packages: engines: {node: '>= 4.2.1'} hasBin: true - dicom-microscopy-viewer@0.48.22: - resolution: {integrity: sha512-IkFwh9lyAjhb6HXbSvZZu0gc462CLGN6h+6iWaZASsnaskRj3Mlrq9QOgzQJ/iYZP/aoaL87UAWn8Q2ZV+sceQ==} + dicom-microscopy-viewer@https://codeload.github.com/ImagingDataCommons/dicom-microscopy-viewer/tar.gz/1b39614eae92e92578d14977f66ced60243e51bc: + resolution: {gitHosted: true, integrity: sha512-zTdOe3RFC7boUxoRSsvxT4JHNC2pHoAmaz603fPNGdQeaUv/A1izQPZkyJ8SgzKSrgBkfTGJtBHXd6a7g2kFPw==, tarball: https://codeload.github.com/ImagingDataCommons/dicom-microscopy-viewer/tar.gz/1b39614eae92e92578d14977f66ced60243e51bc} + version: 0.49.0 dicomweb-client@0.10.3: resolution: {integrity: sha512-/fHNEAYiz8j+9TNOrNJ0k+hYqirbOT85B7vM7I4VkY8DeDQb4BDUeL3RX6huDVtn6ZQlR91dI+2tejLc5c99wA==} @@ -3103,8 +3208,11 @@ packages: duplexer@0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} - earcut@3.0.2: - resolution: {integrity: sha512-X7hshQbLyMJ/3RPhyObLARM2sNxxmRALLKx1+NVFFnQ9gKzmCrxm9+uLIAdBcvc8FNLpctqlQ2V6AE92Ol9UDQ==} + earcut@2.2.4: + resolution: {integrity: sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==} + + earcut@3.2.3: + resolution: {integrity: sha512-vnS4AVwp1KHAF13i1vp1/2D5evWy3k5u/iW/B81QVsUZtV8cv2tU0b2VNFlqvh4kYwrFMDdjPCfAmfyJW9y14Q==} ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} @@ -3114,8 +3222,8 @@ packages: engines: {node: '>=0.10.0'} hasBin: true - electron-to-chromium@1.5.367: - resolution: {integrity: sha512-4Mk/mrynCNQ+atY40D3UpmhLWB6AHMbYMlIrPhHcMF6x0L7O0b052FCAsxw1LlaR++UFuNg3D/A6XCuGDa0guQ==} + electron-to-chromium@1.5.401: + resolution: {integrity: sha512-H6ViHN68nGYlChEvlIU67fn8O2/tpbWQPwck98yaJmh+08LSvHiydzDQ6oXNccLU3kNRVIRS9A4mA7CG+i6fLQ==} email-addresses@5.0.0: resolution: {integrity: sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw==} @@ -3146,8 +3254,8 @@ packages: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} - enhanced-resolve@5.22.2: - resolution: {integrity: sha512-0rxICaFZ7NQho/sHely2bvOPRP0Eu2B0NZ9zM54YvRvWMn7jfz3DmnOZDR9LlXDdDcqntAVc6Hfy4gr/tdH/Ag==} + enhanced-resolve@5.24.5: + resolution: {integrity: sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==} engines: {node: '>=10.13.0'} entities@2.2.0: @@ -3167,6 +3275,10 @@ packages: error-stack-parser@2.1.4: resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} + es-abstract-get@1.0.0: + resolution: {integrity: sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==} + engines: {node: '>= 0.4'} + es-abstract@1.24.2: resolution: {integrity: sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==} engines: {node: '>= 0.4'} @@ -3182,12 +3294,12 @@ packages: es-get-iterator@1.1.3: resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} - es-iterator-helpers@1.3.2: - resolution: {integrity: sha512-HVLACW1TppGYjJ8H6/jqH/pqOtKRw6wMlrB23xfExmFWxFquAIWCmwoLsOyN96K4a5KbmOf5At9ZUO3GZbetAw==} + es-iterator-helpers@1.4.0: + resolution: {integrity: sha512-c/A0P0oxkACDc+cKWw8evLXK83oBKgn0qPOqCYT4x9uolpCIJAcYvJC9QYKNDRPsTeGyCrQ326jrvgZWdCdK5Q==} engines: {node: '>= 0.4'} - es-module-lexer@2.1.0: - resolution: {integrity: sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==} + es-module-lexer@2.3.1: + resolution: {integrity: sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==} es-object-atoms@1.1.2: resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} @@ -3201,8 +3313,8 @@ packages: resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} engines: {node: '>= 0.4'} - es-to-primitive@1.3.0: - resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + es-to-primitive@1.3.4: + resolution: {integrity: sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw==} engines: {node: '>= 0.4'} escalade@3.2.0: @@ -3249,8 +3361,8 @@ packages: eslint-import-resolver-node@0.3.10: resolution: {integrity: sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==} - eslint-module-utils@2.13.0: - resolution: {integrity: sha512-bLohSkT6469rRs8czj0tLTD8vaeIS/whvPRJVjDr7IuoTT1k5DYDERlNycjDj/HkOlvQdYurmfZ/g3fG5bgeLQ==} + eslint-module-utils@2.14.0: + resolution: {integrity: sha512-W2WCRZ9Dqntd+2u8jJcVMV2PKulc6RdLgUUoh/yQr3uB6lo/ZOeGx11sv60/8S4QFFKNslAlWhr9u0Ef7ZW6Ig==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -3572,8 +3684,18 @@ packages: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} - flatted@3.4.2: - resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} + flatbuffers@25.9.23: + resolution: {integrity: sha512-MI1qs7Lo4Syw0EOzUl0xjs2lsoeqFku44KpngfIduHBYvzm8h2+7K8YMQh1JtVVVrUvhLpNwqVi4DERegUJhPQ==} + + flatbush@4.4.0: + resolution: {integrity: sha512-cf6G+sfy/+/FLH7Ls1URQ5GCRlXgwgqUZiEsMNrMZqb3Us3EkKmzUlKbnyoBy/4wI4oLJ+8cyCQoKJIVm92Fmg==} + + flatqueue@2.0.3: + resolution: {integrity: sha512-RZCWZNkmxzUOh8jqEcEGZCycb3B8KAfpPwg3H//cURasunYxsg1eIvE+QDSjX+ZPHTIVfINfK1aLTrVKKO0i4g==} + engines: {node: '>= 12.17.0'} + + flatted@3.4.4: + resolution: {integrity: sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==} follow-redirects@1.16.0: resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} @@ -3634,8 +3756,8 @@ packages: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} - fs-extra@11.3.5: - resolution: {integrity: sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==} + fs-extra@11.4.0: + resolution: {integrity: sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA==} engines: {node: '>=14.14'} fs-extra@8.1.0: @@ -3652,6 +3774,11 @@ packages: fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -3660,8 +3787,8 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - function.prototype.name@1.1.8: - resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + function.prototype.name@1.2.0: + resolution: {integrity: sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==} engines: {node: '>= 0.4'} functions-have-names@1.2.3: @@ -3675,8 +3802,8 @@ packages: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} - geotiff@3.0.5: - resolution: {integrity: sha512-OWcL9S9+yDZ6iAlXMt32T1iwUApJM8UiD47xbm6ZP1h33d10fqkPs14EG/ttT5EnefpZSx3G15iDFC5FxUNUwA==} + geotiff@3.1.0-beta.0: + resolution: {integrity: sha512-wbVwOaQYuN+ywly5NoMXn37nHslwkQg5EFHqMeUTtjDACrSag0EEVlFsc+2DK3Pzmmp6XzJW2RTZOamPsBM6ng==} engines: {node: '>=10.19'} get-caller-file@2.0.5: @@ -3737,9 +3864,6 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me @@ -3880,11 +4004,11 @@ packages: engines: {node: '>=12'} hasBin: true - html-webpack-plugin@5.6.7: - resolution: {integrity: sha512-md+vXtdCAe60s1k6AU3dUyMJnDxUyQAwfwPKoLisvgUF1IXjtlLsk2se54+qfL9Mdm26bbwvjJybpNx48NKRLw==} + html-webpack-plugin@5.6.8: + resolution: {integrity: sha512-MZmKQcTnhEh1SPSyMiEytIeDZDUoBZVorNHivQGXMASHf/BSGGOrKa2xQ5bGx3TCe1n109ecCt+cpww7wwWhKA==} engines: {node: '>=10.13.0'} peerDependencies: - '@rspack/core': 0.x || 1.x + '@rspack/core': 0.x || 1.x || 2.x webpack: ^5.20.0 peerDependenciesMeta: '@rspack/core': @@ -3917,8 +4041,8 @@ packages: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} - http-proxy-middleware@2.0.9: - resolution: {integrity: sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==} + http-proxy-middleware@2.0.10: + resolution: {integrity: sha512-RKzRWNPxUZqbuk3BC5mGVJbBnWgr+diEnjJexIOytFbBzDy88Fbh/YvBr3DsNrl1jYAfjWfpATEv0NO35FDuPQ==} engines: {node: '>=12.0.0'} peerDependencies: '@types/express': ^4.17.13 @@ -3984,15 +4108,10 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} - ignore@7.0.5: - resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + ignore@7.0.6: + resolution: {integrity: sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==} engines: {node: '>= 4'} - image-size@0.5.5: - resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} - engines: {node: '>=0.10.0'} - hasBin: true - image-type@4.1.0: resolution: {integrity: sha512-CFJMJ8QK8lJvRlTCEgarL4ro6hfDQKif2HjSvYCdQZESaIPV4v9imrf7BQHK+sQeTeNeMpWciR9hyC/g8ybXEg==} engines: {node: '>=6'} @@ -4061,8 +4180,8 @@ packages: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} - ipaddr.js@2.4.0: - resolution: {integrity: sha512-9VGk3HGanVE6JoZXHiCpnGy5X0jYDnN4EA4lntFPj+1vIWlFhIylq2CrrCOJH9EAhc5CYhq18F2Av2tgoAPsYQ==} + ipaddr.js@2.5.0: + resolution: {integrity: sha512-aq+t5NAc+cS6rZQQVWC2x98CPqGtKKTMDd4Gaodv0wShnItdKg/51djkGJ1hqH+Oy0ivDftCbSLCQob8zso01w==} engines: {node: '>= 10'} is-arguments@1.2.0: @@ -4116,6 +4235,10 @@ packages: engines: {node: '>=8'} hasBin: true + is-document.all@1.0.0: + resolution: {integrity: sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==} + engines: {node: '>= 0.4'} + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -4552,6 +4675,9 @@ packages: json-stringify-safe@5.0.1: resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + json-with-bigint@3.5.10: + resolution: {integrity: sha512-Vcx+JVNEBts/xfcoCS69sKrOhOk/3TVlvlT+XzUOefVKnnrbYSCKpDCm10pohsJFtsJVYnwa/cXRZ4eElzaM6w==} + json2mq@0.2.0: resolution: {integrity: sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==} @@ -4623,8 +4749,8 @@ packages: less: ^3.5.0 || ^4.0.0 webpack: ^4.0.0 || ^5.0.0 - less@4.6.4: - resolution: {integrity: sha512-OJmO5+HxZLLw0RLzkqaNHzcgEAQG7C0y3aMbwtCzIUFZsLMNNq/1IdAdHEycQ58CwUO3jPTHmoN+tE5I7FQxNg==} + less@4.8.1: + resolution: {integrity: sha512-jQ3lRIo1aUtiWVYXZ7mk4+V4BjCGswF3IxTLJ+4RUta8ZiHh8lhkig2G8dya2eCcyR1dYUvzuV46EkJN8PSwww==} engines: {node: '>=18'} hasBin: true @@ -4655,10 +4781,6 @@ packages: resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} engines: {node: '>=4'} - loader-runner@4.3.2: - resolution: {integrity: sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==} - engines: {node: '>=6.11.5'} - loader-utils@2.0.4: resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} engines: {node: '>=8.9.0'} @@ -4717,9 +4839,6 @@ packages: lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - lodash.sortby@4.7.0: - resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} - lodash.uniq@4.5.0: resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} @@ -4889,6 +5008,52 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minimizer-webpack-plugin@5.6.1: + resolution: {integrity: sha512-DoeAZz8Q1C1znwsUzej1fdoi4jCf7/+Em27ouLqfK/+3m8G+D7yDhUwrc3CNhjSzGUN1kn7Iv4sWmjflQHenpw==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@minify-html/node': '*' + '@swc/core': '*' + '@swc/css': '*' + '@swc/html': '*' + clean-css: '*' + cssnano: '*' + csso: '*' + esbuild: '*' + html-minifier-terser: '*' + lightningcss: '*' + postcss: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@minify-html/node': + optional: true + '@swc/core': + optional: true + '@swc/css': + optional: true + '@swc/html': + optional: true + clean-css: + optional: true + cssnano: + optional: true + csso: + optional: true + esbuild: + optional: true + html-minifier-terser: + optional: true + lightningcss: + optional: true + postcss: + optional: true + uglify-js: + optional: true + + mjolnir.js@3.0.1: + resolution: {integrity: sha512-/RMi8Jm3NKleOkVI8D2ai+1OVwtfRJsSVBVjbTXNm83nfsN4uORYaN3u1/hsg5CqVI+di8enTkvgDNDOywn6cQ==} + modify-values@1.0.1: resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} engines: {node: '>=0.10.0'} @@ -4909,8 +5074,8 @@ packages: mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - nanoid@3.3.16: - resolution: {integrity: sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==} + nanoid@3.3.17: + resolution: {integrity: sha512-xQLf0A3HOMlgHq0n247/LRuAOYmB7dXJ/DvAxGvsSBij45XtBSmQycu+F8ODbHwns/XyFZagyL1+J0Offw1E0g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -4923,6 +5088,11 @@ packages: ndarray@1.0.19: resolution: {integrity: sha512-B4JHA4vdyZU30ELBw3g7/p9bZupyew5a7tX1Y/gGeF2hafrPaQZhgrGQfsvgfYbgdFZjYwuEcnaobeM/WMW+HQ==} + needle@2.9.1: + resolution: {integrity: sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==} + engines: {node: '>= 4.4.x'} + hasBin: true + needle@3.5.0: resolution: {integrity: sha512-jaQyPKKk2YokHrEg+vFDYxXIHTCBgiZwSHOoVx/8V3GIBS8/VN6NdVRmg8q1ERtPkMvmOvebsgga4sAj5hls/w==} engines: {node: '>= 4.4.x'} @@ -4948,8 +5118,8 @@ packages: node-emoji@1.11.0: resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} - node-exports-info@1.6.0: - resolution: {integrity: sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==} + node-exports-info@1.6.2: + resolution: {integrity: sha512-kXs9Go0cah0qHVV2v389IXQLdLCeE1xfFtjOAF+iobu0OIoG1pje8At2vMHyaPMiPMnG/LWP50twML21eMcAag==} engines: {node: '>= 0.4'} node-forge@1.4.0: @@ -4959,8 +5129,8 @@ packages: node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - node-releases@2.0.47: - resolution: {integrity: sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og==} + node-releases@2.0.52: + resolution: {integrity: sha512-MRlTqhAfoMx/4mhEbPo3Hi02g9LJZaJkka69V6h67Cb1gjrAG0jsTE4CZX1eptNx+VCAwJmfpnDIF4P0Nh1A7A==} engines: {node: '>=18'} normalize-package-data@2.5.0: @@ -4998,8 +5168,8 @@ packages: resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} engines: {node: '>=18'} - npm@10.9.8: - resolution: {integrity: sha512-fYwb6ODSmHkqrJQQaCxY3M2lPf/mpgC7ik0HSzzIwG5CGtabRp4bNqikatvCoT42b5INQSqudVH0R7yVmC9hVg==} + npm@10.9.9: + resolution: {integrity: sha512-1g+6jLQvaIuB4zwvHL7yrXuXcWZwDsCtBX8bbWDqbvJSSr9nPiDDWTHNgwXR27iIcTTW7v3A57hDW9RYv2W4Yg==} engines: {node: ^18.17.0 || >=20.5.0} hasBin: true bundledDependencies: @@ -5154,8 +5324,8 @@ packages: numcodecs@0.3.2: resolution: {integrity: sha512-6YSPnmZgg0P87jnNhi3s+FVLOcIn3y+1CTIgUulA3IdASzK9fJM87sUFkpyA+be9GibGRaST2wCgkD+6U+fWKw==} - nwsapi@2.2.23: - resolution: {integrity: sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==} + nwsapi@2.2.24: + resolution: {integrity: sha512-7YRhZ3jS45LwmSCT4b2sVFHt/WuovaktDU07QrtOBY2PXskss5a9jfmR9jptyumwXST+rFjrmppMY1KT/yn35A==} object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} @@ -5203,8 +5373,8 @@ packages: oidc-client@1.11.5: resolution: {integrity: sha512-LcKrKC8Av0m/KD/4EFmo9Sg8fSQ+WFJWBrmtWd+tZkNn3WT/sQG3REmPANE9tzzhbjW6VkTNy4xhAXCfPApAOg==} - ol@10.9.0: - resolution: {integrity: sha512-svbbgVQUmEHaKpLQ8kRySojs59Brvgl2zYIrqG9eQNXGfsbi55rQasZIDpwpQzDL6OlzrUb0H4hQaiX9wDoGmA==} + ol@10.10.0: + resolution: {integrity: sha512-tLPKn6zl+6uWdPufYlqG/lQzuVUTVmfwahQqVr5+wZNyZecyAtIhMTyOtKpu7ooNDLY2sEjKZNXw9HL+sOjC1A==} on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} @@ -5233,8 +5403,8 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} - own-keys@1.0.1: - resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + own-keys@1.0.2: + resolution: {integrity: sha512-19YVAg7T+WTrxggPukVq7DjTv6+PJ867TmhCvBsYwmbFCsZd344rq2Ld1p0wo8f8Qrrhgp82c6FJRqdXWtSEhg==} engines: {node: '>= 0.4'} p-each-series@3.0.0: @@ -5285,8 +5455,8 @@ packages: resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - p-map@7.0.4: - resolution: {integrity: sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==} + p-map@7.0.6: + resolution: {integrity: sha512-I4Prw6ivkd6p8PiYR1tXASOAOBzIJwu0TB7fqaX0c/8c3QAehNYmX57EijyGGGBt3c/BIowGwV03RVBtXvHEVg==} engines: {node: '>=18'} p-reduce@2.1.0: @@ -5309,8 +5479,8 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} - pako@2.1.0: - resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} + pako@2.2.0: + resolution: {integrity: sha512-zJq6RP/5q+TO2OpFV3FHzlPnFjmkb7Nc99a5SNjJE+uu/PkpChs+NIZSSzbBoD+6kjiISXjfYdwj1ZRQ81dz/w==} param-case@3.0.4: resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} @@ -5394,8 +5564,8 @@ packages: resolution: {integrity: sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==} engines: {node: '>=18'} - pbf@4.0.1: - resolution: {integrity: sha512-SuLdBvS42z33m8ejRbInMapQe8n0D3vN/Xd5fmWM3tufNgRQFBpaW2YVJxQZV4iPNqb0vEFvssMEo5w9c6BTIA==} + pbf@5.1.2: + resolution: {integrity: sha512-mnvGdvOrIvJOBGUEdGkrVXjN8E/VkIJCkf2eS1DH2yv82ORUlLttmDt0rWY38yYZmVwciZwBUvHM20qxBZf40w==} hasBin: true performance-now@2.1.0: @@ -5408,8 +5578,8 @@ packages: resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} engines: {node: '>=8.6'} - picomatch@4.0.4: - resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + picomatch@4.0.5: + resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} engines: {node: '>=12'} pify@2.3.0: @@ -5444,6 +5614,16 @@ packages: resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} engines: {node: '>=8'} + playwright-core@1.62.1: + resolution: {integrity: sha512-wPYSwEBJY9GHraISXqyqtx0na0LpO3XEX7jNDhntbex7tzUS7kLnZsOlFruFJB4Hi/rhDMjXGqHewDZ68nYZVw==} + engines: {node: '>=20'} + hasBin: true + + playwright@1.62.1: + resolution: {integrity: sha512-0M+L3LAD8/nm554LOla9Ayx0j0tmFZ0FBcoQ7F1VuVHpM/XpiC8RcDzBQB8W5+hA8L22THxELzeF+2WcUzvcLg==} + engines: {node: '>=20'} + hasBin: true + possible-typed-array-names@1.1.0: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} @@ -5853,12 +6033,12 @@ packages: peerDependencies: postcss: 8.5.25 - postcss-selector-parser@6.1.2: - resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + postcss-selector-parser@6.1.4: + resolution: {integrity: sha512-bIoJLOmjCO1S9XdY/DcnR5hJxvrDir1PbGChrzXG3vw0/FOliy/fA3dmdhQ441kah4gKv+TwckGzex6wNS5cnQ==} engines: {node: '>=4'} - postcss-selector-parser@7.1.1: - resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} + postcss-selector-parser@7.1.4: + resolution: {integrity: sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==} engines: {node: '>=4'} postcss-svgo@5.1.0: @@ -5903,6 +6083,9 @@ packages: resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} engines: {node: '>=18'} + probe-image-size@7.3.0: + resolution: {integrity: sha512-7CaDeBwiAbh6ohXsvLbAZhO7wzsZAmaevfxe39qvCwRh8LyaZfDlBGGLU1CCTgrTLtCOdwBBhjOrIHaIIimHfQ==} + process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} @@ -5916,8 +6099,9 @@ packages: prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} - properties-file@4.0.0: - resolution: {integrity: sha512-VWnuWVVQIeYPdJwWfBVu6/SQExpAliGkY8Bq58pHHPJHgD4THXlJfsc+qC41+62iV4WNwQhmrxbqpEXIvIMOmw==} + properties-file@5.0.5: + resolution: {integrity: sha512-Gfi6UgMENAzww1P4hloKhLIQxqcYmUS5z+Lhm/jmFV+ushbE416NalT42oEfJbF9vd0a02B3AaLHiQGmNSQ9EA==} + engines: {node: '>=0.4.0'} proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} @@ -5971,6 +6155,10 @@ packages: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} + range-parser@1.3.0: + resolution: {integrity: sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==} + engines: {node: '>= 0.6'} + raw-body@2.5.2: resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} engines: {node: '>= 0.8'} @@ -6380,8 +6568,8 @@ packages: regjsgen@0.8.0: resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} - regjsparser@0.13.1: - resolution: {integrity: sha512-dLsljMd9sqwRkby8zhO1gSg3PnJIBFid8f4CQj/sXx+7cKx+E7u0PKhZ+U4wmhx7EfmtvnA318oVaIkAB1lRJw==} + regjsparser@0.13.2: + resolution: {integrity: sha512-NgRBy2Nx/bE+9F27nVHnqcN5HjyLmecqsqx2PJHu3/IEtADD4WuxuXIVExD5PoSDFVrl78dOonfcOe5O+5nbzQ==} hasBin: true relateurl@0.2.7: @@ -6516,8 +6704,8 @@ packages: sass-embedded: optional: true - sax@1.6.0: - resolution: {integrity: sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==} + sax@1.6.1: + resolution: {integrity: sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==} engines: {node: '>=11.0.0'} saxes@5.0.1: @@ -6632,8 +6820,8 @@ packages: resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} engines: {node: '>= 0.4'} - side-channel@1.1.0: - resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + side-channel@1.1.1: + resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==} engines: {node: '>= 0.4'} signal-exit@3.0.7: @@ -6669,8 +6857,8 @@ packages: sockjs@0.3.24: resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} - sonarqube-scanner@4.3.6: - resolution: {integrity: sha512-gRtTf11UXl5SqXrRKzXagdRh06v8n2qXAypEhmlTOFCdAUlR4TboPzYClMFFT7NCZq5jKZSyN2mk5jj01RgVVQ==} + sonarqube-scanner@4.4.0: + resolution: {integrity: sha512-j1hXSmkTCrFQbOL2BurcvLXS92uI+SetwLzwed11H0QJkFMam9nLvZM2hgg/QNelO/D902R+jJ09yLc7HhS/Yw==} engines: {node: '>= 18'} hasBin: true @@ -6698,10 +6886,9 @@ packages: resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} engines: {node: '>= 12'} - source-map@0.8.0-beta.0: - resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} - engines: {node: '>= 8'} - deprecated: The work that was done in this beta branch won't be included in future versions + source-map@0.8.0: + resolution: {integrity: sha512-d8EqvL+k/SOXCreS/SUzg2ciyHqBBLcN/yuRjFsbvVhHTE2pgei7oAhmPM7kWFbkX6OSMQfUq4KbkF3au9lhYQ==} + engines: {node: '>= 12'} sourcemap-codec@1.4.8: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} @@ -6771,8 +6958,11 @@ packages: stream-combiner2@1.1.1: resolution: {integrity: sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==} - streamx@2.26.0: - resolution: {integrity: sha512-VvNG1K72Po/xwJzxZFnZ++Tbrv4lwSptsbkFuzXCJAYZvCK5nnxsvXU6ajqkv7chyiI1Y0YXq2Jh8Iy8Y7NF/A==} + stream-parser@0.3.1: + resolution: {integrity: sha512-bJ/HgKq41nlKvlhccD5kaCr/P+Hu0wPNKPJOH7en+YrJu/9EgqUF+88w5Jb6KNcjOFMhfX4B2asfeAtIGuHObQ==} + + streamx@2.28.0: + resolution: {integrity: sha512-1Yowhzjf0ivGMrTIkY9hav5TxobO9qIVqUE41fiCGMGgc3CLlf4MY+9AHmZqBWgDTue0fY9zWjYFVyf6Diuobw==} string-convert@0.2.1: resolution: {integrity: sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==} @@ -6803,12 +6993,12 @@ packages: string.prototype.repeat@1.0.0: resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} - string.prototype.trim@1.2.10: - resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + string.prototype.trim@1.2.11: + resolution: {integrity: sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==} engines: {node: '>= 0.4'} - string.prototype.trimend@1.0.9: - resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + string.prototype.trimend@1.0.10: + resolution: {integrity: sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==} engines: {node: '>= 0.4'} string.prototype.trimstart@1.0.8: @@ -6934,8 +7124,8 @@ packages: resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} engines: {node: '>=6'} - tar-stream@3.1.8: - resolution: {integrity: sha512-U6QpVRyCGHva435KoNWy9PRoi2IFYCgtEhq9nmrPPpbRacPs9IH4aJ3gbrFC8dPcXvdSZ4XXfXT5Fshbp2MtlQ==} + tar-stream@3.2.0: + resolution: {integrity: sha512-ojzvCvVaNp6aOTFmG7jaRD0meowIAuPc3cMMhSgKiVWws1GyHbGd/xvnyuRKcKlMpt3qvxx6r0hreCNITP9hIg==} teex@1.0.1: resolution: {integrity: sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==} @@ -7003,8 +7193,8 @@ packages: uglify-js: optional: true - terser@5.48.0: - resolution: {integrity: sha512-J/9An6vs9Us6wKRriSFXBWdRZapREHqFzdNUKk0pmu804EMR6dr6winwo7e5JDxN4xahxQsuysyYFwlwj4XN/Q==} + terser@5.49.2: + resolution: {integrity: sha512-rGbJiKeQ4WDe3EXlDAIaQcwftVfv2Q8o1awFNfvXolJYKkb1AuZY1RTOmqx4LJXZENbWZA7eIsYGHuEzHsi1nQ==} engines: {node: '>=10'} hasBin: true @@ -7070,9 +7260,6 @@ packages: resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} engines: {node: '>=6'} - tr46@1.0.1: - resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} - tr46@2.1.0: resolution: {integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==} engines: {node: '>=8'} @@ -7216,6 +7403,9 @@ packages: underscore@1.13.8: resolution: {integrity: sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ==} + undici-types@7.24.6: + resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} + unicode-canonical-property-names-ecmascript@2.0.1: resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} engines: {node: '>=4'} @@ -7339,8 +7529,8 @@ packages: walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} - watchpack@2.5.1: - resolution: {integrity: sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==} + watchpack@2.5.2: + resolution: {integrity: sha512-6i/00NBjP4yGPs+caKSyRfpTF/8Torsu0MOW3mMzIbhgISFder8i7xbqgHlLMwJrdiN8ndBV3UA1/AfzPSr+jg==} engines: {node: '>=10.13.0'} wbuf@1.7.3: @@ -7349,9 +7539,6 @@ packages: web-worker@1.5.0: resolution: {integrity: sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw==} - webidl-conversions@4.0.2: - resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} - webidl-conversions@5.0.0: resolution: {integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==} engines: {node: '>=8'} @@ -7395,12 +7582,12 @@ packages: resolution: {integrity: sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==} engines: {node: '>=10.13.0'} - webpack-sources@3.5.0: - resolution: {integrity: sha512-HPuy+uuoTCaaoEoI1LQ3JN9+vrPBvEesnnX1jADHy728cHSMlq4wUc4afYqahq2B1mhQVZxCXOkNTnXltr+2vQ==} + webpack-sources@3.5.1: + resolution: {integrity: sha512-jyuiGJdtvY434z5bUZrjz67v76/ePNvFZTp9Mdz29IlH4+GPsgyGjiv0fKI+M7BdkU6ADjulUcKAd3tUK3WlEw==} engines: {node: '>=10.13.0'} - webpack@5.107.2: - resolution: {integrity: sha512-v7RhXaJbpMlV0D7hC7lb2EbnxkoeUqf9qhKr6lozx3Q48pmFrqqNRmZFUEGmi7pSwm6fCQ2H1IjvCkHqdpVdjQ==} + webpack@5.109.2: + resolution: {integrity: sha512-U9/cvLzxObKNEZ9+TtdqrHM5/9z3lgl2c+c4BzbqGxFQvQvBAq87yql5A8pQ+rrMbS496MZJeF5enVBndIy2hw==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -7417,6 +7604,9 @@ packages: resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} engines: {node: '>=0.8.0'} + wgsl_reflect@1.5.0: + resolution: {integrity: sha512-ntYNHZgzBHs+pzmVCsSiRqyye3Ey1xdKEX0Ls8PiDBKIiGFwUOef0PdBbYvUyGTGFwLKkqTZOGmPAed70mquTw==} + whatwg-encoding@1.0.5: resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation @@ -7427,9 +7617,6 @@ packages: whatwg-mimetype@2.3.0: resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} - whatwg-url@7.1.0: - resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} - whatwg-url@8.7.0: resolution: {integrity: sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==} engines: {node: '>=10'} @@ -7446,8 +7633,8 @@ packages: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} engines: {node: '>= 0.4'} - which-typed-array@1.1.21: - resolution: {integrity: sha512-zbRA8cVm6io/d5W8uIe2hblzN76/Wm3v/yiythQvr+dpBWeqhPSWIDNj4zOyHi4zKbMK6DN34Xsr9jPHJERAEw==} + which-typed-array@1.1.22: + resolution: {integrity: sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==} engines: {node: '>= 0.4'} which@1.3.1: @@ -7533,8 +7720,8 @@ packages: write-file-atomic@3.0.3: resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} - ws@7.5.11: - resolution: {integrity: sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA==} + ws@7.5.13: + resolution: {integrity: sha512-rsKI6xDBFVf4r/x8XyChGK04QR/XHroxs/jUcoWvtEZM8TPU/X/uIY9B1CsSzYws9ZJb/6bbBu7dPhFW00CAoA==} engines: {node: '>=8.3.0'} peerDependencies: bufferutil: ^4.0.1 @@ -7545,8 +7732,8 @@ packages: utf-8-validate: optional: true - ws@8.21.0: - resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==} + ws@8.21.2: + resolution: {integrity: sha512-54dMVAo4WIe6SKy3vBgN+9bJZqqQ8IMRevAkOLQALhi49qkkQDQfWdAZ8KQlXiEabw88ARXXdUrlvtbKQX+aKw==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -7592,12 +7779,12 @@ packages: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + yargs@16.2.2: + resolution: {integrity: sha512-Nt9ZJjXTv5R8MHbqby/wXQ6Gi0Bb3TcYZkR1bzuL4yB2OxWPkXknz513gEF0GoA6tn00UpbPvERW8rzCuWCA6w==} engines: {node: '>=10'} - yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + yargs@17.7.3: + resolution: {integrity: sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==} engines: {node: '>=12'} yn@3.1.1: @@ -7612,12 +7799,12 @@ packages: resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} engines: {node: '>=12.20'} - yoctocolors@2.1.2: - resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} + yoctocolors@2.2.0: + resolution: {integrity: sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg==} engines: {node: '>=18'} - zarrita@0.7.3: - resolution: {integrity: sha512-wChTQ1Ox75INoQCzKAfLWAfB70JJ4KjdW8Sz5x4ZWrFB4Dw+YZdnxHTL0xSdsrB9EmKSeK7fS1Y+I2ibhfGbkw==} + zarrita@0.7.4: + resolution: {integrity: sha512-NChufj86SceFj45z4CYjndmI98dphaG7hU8Wj0UGpMyT21o0V3HTY6zo87aSobYWts1tNFivSXzH2AR1AkaWjA==} zstddec@0.2.0: resolution: {integrity: sha512-oyPnDa1X5c13+Y7mA/FDMNJrn4S8UNBe0KCqtDmor40Re7ALrPN6npFwyYVRRh+PqozZQdeg23QtbcamZnG5rA==} @@ -7632,12 +7819,12 @@ snapshots: dependencies: '@ctrl/tinycolor': 3.6.1 - '@ant-design/icons-svg@4.4.2': {} + '@ant-design/icons-svg@4.5.0': {} '@ant-design/icons@4.8.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@ant-design/colors': 6.0.0 - '@ant-design/icons-svg': 4.4.2 + '@ant-design/icons-svg': 4.5.0 '@babel/runtime': 7.29.7 classnames: 2.5.1 lodash: 4.18.1 @@ -7671,14 +7858,14 @@ snapshots: '@babel/core@7.29.7': dependencies: '@babel/code-frame': 7.29.7 - '@babel/generator': 7.29.7 + '@babel/generator': 7.29.8 '@babel/helper-compilation-targets': 7.29.7 '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) '@babel/helpers': 7.29.7 - '@babel/parser': 7.29.7 + '@babel/parser': 7.29.8 '@babel/template': 7.29.7 - '@babel/traverse': 7.29.7 - '@babel/types': 7.29.7 + '@babel/traverse': 7.29.8 + '@babel/types': 7.29.8 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 debug: 4.4.3 @@ -7696,23 +7883,23 @@ snapshots: eslint-visitor-keys: 2.1.0 semver: 7.5.2 - '@babel/generator@7.29.7': + '@babel/generator@7.29.8': dependencies: - '@babel/parser': 7.29.7 - '@babel/types': 7.29.7 + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 '@babel/helper-annotate-as-pure@7.29.7': dependencies: - '@babel/types': 7.29.7 + '@babel/types': 7.29.8 '@babel/helper-compilation-targets@7.29.7': dependencies: '@babel/compat-data': 7.29.7 '@babel/helper-validator-option': 7.29.7 - browserslist: 4.28.2 + browserslist: 4.28.7 lru-cache: 5.1.1 semver: 7.5.2 @@ -7724,7 +7911,7 @@ snapshots: '@babel/helper-optimise-call-expression': 7.29.7 '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7) '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.8 semver: 7.5.2 transitivePeerDependencies: - supports-color @@ -7751,15 +7938,15 @@ snapshots: '@babel/helper-member-expression-to-functions@7.29.7': dependencies: - '@babel/traverse': 7.29.7 - '@babel/types': 7.29.7 + '@babel/traverse': 7.29.8 + '@babel/types': 7.29.8 transitivePeerDependencies: - supports-color '@babel/helper-module-imports@7.29.7': dependencies: - '@babel/traverse': 7.29.7 - '@babel/types': 7.29.7 + '@babel/traverse': 7.29.8 + '@babel/types': 7.29.8 transitivePeerDependencies: - supports-color @@ -7768,13 +7955,13 @@ snapshots: '@babel/core': 7.29.7 '@babel/helper-module-imports': 7.29.7 '@babel/helper-validator-identifier': 7.29.7 - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.8 transitivePeerDependencies: - supports-color '@babel/helper-optimise-call-expression@7.29.7': dependencies: - '@babel/types': 7.29.7 + '@babel/types': 7.29.8 '@babel/helper-plugin-utils@7.29.7': {} @@ -7783,7 +7970,7 @@ snapshots: '@babel/core': 7.29.7 '@babel/helper-annotate-as-pure': 7.29.7 '@babel/helper-wrap-function': 7.29.7 - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.8 transitivePeerDependencies: - supports-color @@ -7792,14 +7979,14 @@ snapshots: '@babel/core': 7.29.7 '@babel/helper-member-expression-to-functions': 7.29.7 '@babel/helper-optimise-call-expression': 7.29.7 - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.8 transitivePeerDependencies: - supports-color '@babel/helper-skip-transparent-expression-wrappers@7.29.7': dependencies: - '@babel/traverse': 7.29.7 - '@babel/types': 7.29.7 + '@babel/traverse': 7.29.8 + '@babel/types': 7.29.8 transitivePeerDependencies: - supports-color @@ -7812,25 +7999,25 @@ snapshots: '@babel/helper-wrap-function@7.29.7': dependencies: '@babel/template': 7.29.7 - '@babel/traverse': 7.29.7 - '@babel/types': 7.29.7 + '@babel/traverse': 7.29.8 + '@babel/types': 7.29.8 transitivePeerDependencies: - supports-color '@babel/helpers@7.29.7': dependencies: '@babel/template': 7.29.7 - '@babel/types': 7.29.7 + '@babel/types': 7.29.8 - '@babel/parser@7.29.7': + '@babel/parser@7.29.8': dependencies: - '@babel/types': 7.29.7 + '@babel/types': 7.29.8 '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.29.7(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.8 transitivePeerDependencies: - supports-color @@ -7865,7 +8052,7 @@ snapshots: dependencies: '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.8 transitivePeerDependencies: - supports-color @@ -8045,7 +8232,7 @@ snapshots: '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 '@babel/helper-remap-async-to-generator': 7.29.7(@babel/core@7.29.7) - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.8 transitivePeerDependencies: - supports-color @@ -8092,7 +8279,7 @@ snapshots: '@babel/helper-globals': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7) - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.8 transitivePeerDependencies: - supports-color @@ -8106,7 +8293,7 @@ snapshots: dependencies: '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.8 transitivePeerDependencies: - supports-color @@ -8169,7 +8356,7 @@ snapshots: '@babel/core': 7.29.7 '@babel/helper-compilation-targets': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.8 transitivePeerDependencies: - supports-color @@ -8209,13 +8396,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-systemjs@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-modules-systemjs@7.29.8(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) '@babel/helper-plugin-utils': 7.29.7 '@babel/helper-validator-identifier': 7.29.7 - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.8 transitivePeerDependencies: - supports-color @@ -8255,7 +8442,7 @@ snapshots: '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-parameters': 7.29.7(@babel/core@7.29.7) - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.8 transitivePeerDependencies: - supports-color @@ -8331,7 +8518,7 @@ snapshots: '@babel/helper-module-imports': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) - '@babel/types': 7.29.7 + '@babel/types': 7.29.8 transitivePeerDependencies: - supports-color @@ -8341,7 +8528,7 @@ snapshots: '@babel/helper-annotate-as-pure': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-regenerator@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-regenerator@7.29.8(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 @@ -8374,7 +8561,7 @@ snapshots: '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-spread@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-spread@7.29.8(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 @@ -8473,7 +8660,7 @@ snapshots: '@babel/plugin-transform-member-expression-literals': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-modules-amd': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-modules-systemjs': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-modules-systemjs': 7.29.8(@babel/core@7.29.7) '@babel/plugin-transform-modules-umd': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-named-capturing-groups-regex': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-new-target': 7.29.7(@babel/core@7.29.7) @@ -8487,11 +8674,11 @@ snapshots: '@babel/plugin-transform-private-methods': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-private-property-in-object': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-property-literals': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-regenerator': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-regenerator': 7.29.8(@babel/core@7.29.7) '@babel/plugin-transform-regexp-modifiers': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-reserved-words': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-shorthand-properties': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-spread': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-spread': 7.29.8(@babel/core@7.29.7) '@babel/plugin-transform-sticky-regex': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-template-literals': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-typeof-symbol': 7.29.7(@babel/core@7.29.7) @@ -8503,7 +8690,7 @@ snapshots: babel-plugin-polyfill-corejs2: 0.4.17(@babel/core@7.29.7) babel-plugin-polyfill-corejs3: 0.14.2(@babel/core@7.29.7) babel-plugin-polyfill-regenerator: 0.6.8(@babel/core@7.29.7) - core-js-compat: 3.49.0 + core-js-compat: 3.50.0 semver: 7.5.2 transitivePeerDependencies: - supports-color @@ -8512,7 +8699,7 @@ snapshots: dependencies: '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 - '@babel/types': 7.29.7 + '@babel/types': 7.29.8 esutils: 2.0.3 '@babel/preset-react@7.29.7(@babel/core@7.29.7)': @@ -8540,29 +8727,29 @@ snapshots: '@babel/runtime-corejs3@7.29.7': dependencies: - core-js-pure: 3.49.0 + core-js-pure: 3.50.0 '@babel/runtime@7.29.7': {} '@babel/template@7.29.7': dependencies: '@babel/code-frame': 7.29.7 - '@babel/parser': 7.29.7 - '@babel/types': 7.29.7 + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 - '@babel/traverse@7.29.7': + '@babel/traverse@7.29.8': dependencies: '@babel/code-frame': 7.29.7 - '@babel/generator': 7.29.7 + '@babel/generator': 7.29.8 '@babel/helper-globals': 7.29.7 - '@babel/parser': 7.29.7 + '@babel/parser': 7.29.8 '@babel/template': 7.29.7 - '@babel/types': 7.29.7 + '@babel/types': 7.29.8 debug: 4.4.3 transitivePeerDependencies: - supports-color - '@babel/types@7.29.7': + '@babel/types@7.29.8': dependencies: '@babel/helper-string-parser': 7.29.7 '@babel/helper-validator-identifier': 7.29.7 @@ -8638,9 +8825,9 @@ snapshots: '@csstools/postcss-cascade-layers@1.1.1(postcss@8.5.25)': dependencies: - '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.1.2) + '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.1.4) postcss: 8.5.25 - postcss-selector-parser: 6.1.2 + postcss-selector-parser: 6.1.4 '@csstools/postcss-color-function@1.1.1(postcss@8.5.25)': dependencies: @@ -8666,9 +8853,9 @@ snapshots: '@csstools/postcss-is-pseudo-class@2.0.7(postcss@8.5.25)': dependencies: - '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.1.2) + '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.1.4) postcss: 8.5.25 - postcss-selector-parser: 6.1.2 + postcss-selector-parser: 6.1.4 '@csstools/postcss-nested-calc@1.0.0(postcss@8.5.25)': dependencies: @@ -8710,13 +8897,57 @@ snapshots: dependencies: postcss: 8.5.25 - '@csstools/selector-specificity@2.2.0(postcss-selector-parser@6.1.2)': + '@csstools/selector-specificity@2.2.0(postcss-selector-parser@6.1.4)': dependencies: - postcss-selector-parser: 6.1.2 + postcss-selector-parser: 6.1.4 '@ctrl/tinycolor@3.6.1': {} - '@eslint-community/eslint-utils@4.9.1(eslint@8.57.1)': + '@deck.gl/core@9.1.15': + dependencies: + '@loaders.gl/core': 4.4.4 + '@loaders.gl/images': 4.4.4(@loaders.gl/core@4.4.4) + '@luma.gl/constants': 9.1.10 + '@luma.gl/core': 9.1.10 + '@luma.gl/engine': 9.1.10(@luma.gl/core@9.1.10)(@luma.gl/shadertools@9.1.10(@luma.gl/core@9.1.10)) + '@luma.gl/shadertools': 9.1.10(@luma.gl/core@9.1.10) + '@luma.gl/webgl': 9.1.10(@luma.gl/core@9.1.10) + '@math.gl/core': 4.1.0 + '@math.gl/sun': 4.1.0 + '@math.gl/types': 4.1.0 + '@math.gl/web-mercator': 4.1.0 + '@probe.gl/env': 4.1.1 + '@probe.gl/log': 4.1.1 + '@probe.gl/stats': 4.1.1 + '@types/offscreencanvas': 2019.7.3 + gl-matrix: 3.4.4 + mjolnir.js: 3.0.1 + + '@deck.gl/extensions@9.1.15(@deck.gl/core@9.1.15)(@luma.gl/core@9.1.10)(@luma.gl/engine@9.1.10(@luma.gl/core@9.1.10)(@luma.gl/shadertools@9.1.10(@luma.gl/core@9.1.10)))': + dependencies: + '@deck.gl/core': 9.1.15 + '@luma.gl/constants': 9.1.10 + '@luma.gl/core': 9.1.10 + '@luma.gl/engine': 9.1.10(@luma.gl/core@9.1.10)(@luma.gl/shadertools@9.1.10(@luma.gl/core@9.1.10)) + '@luma.gl/shadertools': 9.1.10(@luma.gl/core@9.1.10) + '@math.gl/core': 4.1.0 + + '@deck.gl/layers@9.1.15(@deck.gl/core@9.1.15)(@loaders.gl/core@4.4.4)(@luma.gl/core@9.1.10)(@luma.gl/engine@9.1.10(@luma.gl/core@9.1.10)(@luma.gl/shadertools@9.1.10(@luma.gl/core@9.1.10)))': + dependencies: + '@deck.gl/core': 9.1.15 + '@loaders.gl/core': 4.4.4 + '@loaders.gl/images': 4.4.4(@loaders.gl/core@4.4.4) + '@loaders.gl/schema': 4.4.4 + '@luma.gl/core': 9.1.10 + '@luma.gl/engine': 9.1.10(@luma.gl/core@9.1.10)(@luma.gl/shadertools@9.1.10(@luma.gl/core@9.1.10)) + '@luma.gl/shadertools': 9.1.10(@luma.gl/core@9.1.10) + '@mapbox/tiny-sdf': 2.2.0 + '@math.gl/core': 4.1.0 + '@math.gl/polygon': 4.1.0 + '@math.gl/web-mercator': 4.1.0 + earcut: 2.2.4 + + '@eslint-community/eslint-utils@4.10.1(eslint@8.57.1)': dependencies: eslint: 8.57.1 eslint-visitor-keys: 3.4.3 @@ -8876,7 +9107,7 @@ snapshots: '@jest/schemas@28.1.3': dependencies: - '@sinclair/typebox': 0.24.51 + '@sinclair/typebox': 0.24.52 '@jest/source-map@27.5.1': dependencies: @@ -8975,6 +9206,96 @@ snapshots: '@leichtgewicht/ip-codec@2.0.5': {} + '@loaders.gl/core@4.4.4': + dependencies: + '@loaders.gl/loader-utils': 4.4.4(@loaders.gl/core@4.4.4) + '@loaders.gl/schema': 4.4.4 + '@loaders.gl/schema-utils': 4.4.4(@loaders.gl/core@4.4.4) + '@loaders.gl/worker-utils': 4.4.4(@loaders.gl/core@4.4.4) + '@probe.gl/log': 4.1.1 + + '@loaders.gl/images@4.4.4(@loaders.gl/core@4.4.4)': + dependencies: + '@loaders.gl/core': 4.4.4 + '@loaders.gl/loader-utils': 4.4.4(@loaders.gl/core@4.4.4) + + '@loaders.gl/loader-utils@4.4.4(@loaders.gl/core@4.4.4)': + dependencies: + '@loaders.gl/schema': 4.4.4 + '@loaders.gl/worker-utils': 4.4.4(@loaders.gl/core@4.4.4) + '@probe.gl/log': 4.1.1 + '@probe.gl/stats': 4.1.1 + transitivePeerDependencies: + - '@loaders.gl/core' + + '@loaders.gl/schema-utils@4.4.4(@loaders.gl/core@4.4.4)': + dependencies: + '@loaders.gl/core': 4.4.4 + '@loaders.gl/schema': 4.4.4 + '@math.gl/types': 4.1.0 + '@types/geojson': 7946.0.16 + apache-arrow: 21.2.0 + + '@loaders.gl/schema@4.4.4': + dependencies: + '@types/geojson': 7946.0.16 + apache-arrow: 21.2.0 + + '@loaders.gl/worker-utils@4.4.4(@loaders.gl/core@4.4.4)': + dependencies: + '@loaders.gl/core': 4.4.4 + + '@luma.gl/constants@9.1.10': {} + + '@luma.gl/core@9.1.10': + dependencies: + '@math.gl/types': 4.1.0 + '@probe.gl/env': 4.1.1 + '@probe.gl/log': 4.1.1 + '@probe.gl/stats': 4.1.1 + '@types/offscreencanvas': 2019.7.3 + + '@luma.gl/engine@9.1.10(@luma.gl/core@9.1.10)(@luma.gl/shadertools@9.1.10(@luma.gl/core@9.1.10))': + dependencies: + '@luma.gl/core': 9.1.10 + '@luma.gl/shadertools': 9.1.10(@luma.gl/core@9.1.10) + '@math.gl/core': 4.1.0 + '@math.gl/types': 4.1.0 + '@probe.gl/log': 4.1.1 + '@probe.gl/stats': 4.1.1 + + '@luma.gl/shadertools@9.1.10(@luma.gl/core@9.1.10)': + dependencies: + '@luma.gl/core': 9.1.10 + '@math.gl/core': 4.1.0 + '@math.gl/types': 4.1.0 + wgsl_reflect: 1.5.0 + + '@luma.gl/webgl@9.1.10(@luma.gl/core@9.1.10)': + dependencies: + '@luma.gl/constants': 9.1.10 + '@luma.gl/core': 9.1.10 + '@math.gl/types': 4.1.0 + '@probe.gl/env': 4.1.1 + + '@mapbox/tiny-sdf@2.2.0': {} + + '@math.gl/core@4.1.0': + dependencies: + '@math.gl/types': 4.1.0 + + '@math.gl/polygon@4.1.0': + dependencies: + '@math.gl/core': 4.1.0 + + '@math.gl/sun@4.1.0': {} + + '@math.gl/types@4.1.0': {} + + '@math.gl/web-mercator@4.1.0': + dependencies: + '@math.gl/core': 4.1.0 + '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': dependencies: eslint-scope: 5.1.1 @@ -9118,20 +9439,24 @@ snapshots: '@petamoriken/float16@3.9.3': {} - '@pmmmwh/react-refresh-webpack-plugin@0.5.17(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@4.15.2(webpack@5.107.2(postcss@8.5.25)))(webpack@5.107.2(postcss@8.5.25))': + '@playwright/test@1.62.1': + dependencies: + playwright: 1.62.1 + + '@pmmmwh/react-refresh-webpack-plugin@0.5.17(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@4.15.2(webpack@5.109.2(postcss@8.5.25)))(webpack@5.109.2(postcss@8.5.25))': dependencies: ansi-html: 0.0.9 - core-js-pure: 3.49.0 + core-js-pure: 3.50.0 error-stack-parser: 2.1.4 html-entities: 2.6.0 loader-utils: 2.0.4 react-refresh: 0.11.0 schema-utils: 4.3.3 source-map: 0.7.6 - webpack: 5.107.2(postcss@8.5.25) + webpack: 5.109.2(postcss@8.5.25) optionalDependencies: type-fest: 4.41.0 - webpack-dev-server: 4.15.2(webpack@5.107.2(postcss@8.5.25)) + webpack-dev-server: 4.15.2(webpack@5.109.2(postcss@8.5.25)) '@pnpm/config.env-replace@1.1.0': {} @@ -9139,12 +9464,20 @@ snapshots: dependencies: graceful-fs: 4.2.10 - '@pnpm/npm-conf@3.0.2': + '@pnpm/npm-conf@3.0.3': dependencies: '@pnpm/config.env-replace': 1.1.0 '@pnpm/network.ca-file': 1.0.2 config-chain: 1.1.13 + '@probe.gl/env@4.1.1': {} + + '@probe.gl/log@4.1.1': + dependencies: + '@probe.gl/env': 4.1.1 + + '@probe.gl/stats@4.1.1': {} + '@rc-component/portal@1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.29.7 @@ -9199,7 +9532,7 @@ snapshots: dependencies: '@semantic-release/error': 3.0.0 aggregate-error: 3.1.0 - fs-extra: 11.3.5 + fs-extra: 11.4.0 lodash: 4.18.1 semantic-release: 21.1.2(typescript@4.9.5) @@ -9296,7 +9629,7 @@ snapshots: '@semantic-release/error': 4.0.0 aggregate-error: 5.0.0 execa: 8.0.1 - fs-extra: 11.3.5 + fs-extra: 11.4.0 lodash-es: 4.18.1 nerf-dart: 1.0.0 normalize-url: 8.1.1 @@ -9313,11 +9646,11 @@ snapshots: '@semantic-release/error': 4.0.0 aggregate-error: 5.0.0 execa: 9.6.1 - fs-extra: 11.3.5 + fs-extra: 11.4.0 lodash-es: 4.18.1 nerf-dart: 1.0.0 normalize-url: 8.1.1 - npm: 10.9.8 + npm: 10.9.9 rc: 1.2.8 read-pkg: 9.0.1 registry-auth-token: 5.1.1 @@ -9357,7 +9690,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@sinclair/typebox@0.24.51': {} + '@sinclair/typebox@0.24.52': {} '@sindresorhus/merge-streams@2.3.0': {} @@ -9415,7 +9748,7 @@ snapshots: '@svgr/hast-util-to-babel-ast@5.5.0': dependencies: - '@babel/types': 7.29.7 + '@babel/types': 7.29.8 '@svgr/plugin-jsx@5.5.0': dependencies: @@ -9468,11 +9801,11 @@ snapshots: lodash: 4.18.1 redent: 3.0.0 - '@testing-library/react@14.3.1(@types/react@18.3.30)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@testing-library/react@14.3.1(@types/react@18.3.31)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/runtime': 7.29.7 '@testing-library/dom': 9.3.4 - '@types/react-dom': 18.3.7(@types/react@18.3.30) + '@types/react-dom': 18.3.7(@types/react@18.3.31) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: @@ -9496,24 +9829,24 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.29.7 - '@babel/types': 7.29.7 + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.28.0 '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.29.7 + '@babel/types': 7.29.8 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.29.7 - '@babel/types': 7.29.7 + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 '@types/babel__traverse@7.28.0': dependencies: - '@babel/types': 7.29.7 + '@babel/types': 7.29.8 '@types/body-parser@1.19.6': dependencies: @@ -9526,7 +9859,7 @@ snapshots: '@types/connect-history-api-fallback@1.5.4': dependencies: - '@types/express-serve-static-core': 5.1.1 + '@types/express-serve-static-core': 5.1.3 '@types/node': 14.18.63 '@types/connect@3.4.38': @@ -9544,14 +9877,14 @@ snapshots: '@types/estree@1.0.9': {} - '@types/express-serve-static-core@4.19.8': + '@types/express-serve-static-core@4.19.9': dependencies: '@types/node': 14.18.63 '@types/qs': 6.15.1 '@types/range-parser': 1.2.7 '@types/send': 1.2.1 - '@types/express-serve-static-core@5.1.1': + '@types/express-serve-static-core@5.1.3': dependencies: '@types/node': 14.18.63 '@types/qs': 6.15.1 @@ -9561,10 +9894,12 @@ snapshots: '@types/express@4.17.25': dependencies: '@types/body-parser': 1.19.6 - '@types/express-serve-static-core': 4.19.8 + '@types/express-serve-static-core': 4.19.9 '@types/qs': 6.15.1 '@types/serve-static': 1.15.10 + '@types/geojson@7946.0.16': {} + '@types/graceful-fs@4.1.9': dependencies: '@types/node': 14.18.63 @@ -9598,7 +9933,7 @@ snapshots: '@types/json5@0.0.29': {} - '@types/lodash@4.17.24': {} + '@types/lodash@4.17.25': {} '@types/mime@1.3.5': {} @@ -9610,8 +9945,14 @@ snapshots: '@types/node@14.18.63': {} + '@types/node@25.9.5': + dependencies: + undici-types: 7.24.6 + '@types/normalize-package-data@2.4.4': {} + '@types/offscreencanvas@2019.7.3': {} + '@types/parse-json@4.0.2': {} '@types/prettier@2.7.3': {} @@ -9624,22 +9965,22 @@ snapshots: '@types/rbush@4.0.0': {} - '@types/react-dom@18.3.7(@types/react@18.3.30)': + '@types/react-dom@18.3.7(@types/react@18.3.31)': dependencies: - '@types/react': 18.3.30 + '@types/react': 18.3.31 '@types/react-router-dom@5.3.3': dependencies: '@types/history': 4.7.11 - '@types/react': 18.3.30 + '@types/react': 18.3.31 '@types/react-router': 5.1.20 '@types/react-router@5.1.20': dependencies: '@types/history': 4.7.11 - '@types/react': 18.3.30 + '@types/react': 18.3.31 - '@types/react@18.3.30': + '@types/react@18.3.31': dependencies: '@types/prop-types': 15.7.15 csstype: 3.2.3 @@ -9652,7 +9993,7 @@ snapshots: '@types/retry@0.12.5': {} - '@types/semver@7.7.1': {} + '@types/semver@7.8.0': {} '@types/send@0.17.6': dependencies: @@ -9775,9 +10116,9 @@ snapshots: '@typescript-eslint/utils@5.62.0(eslint@8.57.1)(typescript@4.9.5)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.10.1(eslint@8.57.1) '@types/json-schema': 7.0.15 - '@types/semver': 7.7.1 + '@types/semver': 7.8.0 '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) @@ -9793,7 +10134,7 @@ snapshots: '@typescript-eslint/types': 5.62.0 eslint-visitor-keys: 3.4.3 - '@ungap/structured-clone@1.3.1': {} + '@ungap/structured-clone@1.3.3': {} '@webassemblyjs/ast@1.14.1': dependencies: @@ -9897,23 +10238,19 @@ snapshots: acorn: 7.4.1 acorn-walk: 7.2.0 - acorn-import-phases@1.0.4(acorn@8.16.0): - dependencies: - acorn: 8.16.0 - - acorn-jsx@5.3.2(acorn@8.16.0): + acorn-jsx@5.3.2(acorn@8.18.0): dependencies: - acorn: 8.16.0 + acorn: 8.18.0 acorn-walk@7.2.0: {} acorn-walk@8.3.5: dependencies: - acorn: 8.16.0 + acorn: 8.18.0 acorn@7.4.1: {} - acorn@8.16.0: {} + acorn@8.18.0: {} address@1.2.2: {} @@ -10050,6 +10387,13 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.2 + apache-arrow@21.2.0: + dependencies: + '@types/node': 25.9.5 + flatbuffers: 25.9.23 + json-with-bigint: 3.5.10 + tslib: 2.8.1 + arg@4.1.3: {} arg@5.0.2: {} @@ -10165,10 +10509,10 @@ snapshots: at-least-node@1.0.0: {} - autoprefixer@10.5.0(postcss@8.5.25): + autoprefixer@10.5.4(postcss@8.5.25): dependencies: - browserslist: 4.28.2 - caniuse-lite: 1.0.30001793 + browserslist: 4.28.7 + caniuse-lite: 1.0.30001806 fraction.js: 5.3.4 picocolors: 1.1.1 postcss: 8.5.25 @@ -10178,7 +10522,7 @@ snapshots: dependencies: possible-typed-array-names: 1.1.0 - axe-core@4.12.0: {} + axe-core@4.13.0: {} axios@1.18.0: dependencies: @@ -10208,14 +10552,14 @@ snapshots: transitivePeerDependencies: - supports-color - babel-loader@8.4.1(@babel/core@7.29.7)(webpack@5.107.2(postcss@8.5.25)): + babel-loader@8.4.1(@babel/core@7.29.7)(webpack@5.109.2(postcss@8.5.25)): dependencies: '@babel/core': 7.29.7 find-cache-dir: 3.3.2 loader-utils: 2.0.4 make-dir: 3.1.0 schema-utils: 2.7.1 - webpack: 5.107.2(postcss@8.5.25) + webpack: 5.109.2(postcss@8.5.25) babel-plugin-istanbul@6.1.1: dependencies: @@ -10230,7 +10574,7 @@ snapshots: babel-plugin-jest-hoist@27.5.1: dependencies: '@babel/template': 7.29.7 - '@babel/types': 7.29.7 + '@babel/types': 7.29.8 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.28.0 @@ -10257,7 +10601,7 @@ snapshots: dependencies: '@babel/core': 7.29.7 '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.7) - core-js-compat: 3.49.0 + core-js-compat: 3.50.0 transitivePeerDependencies: - supports-color @@ -10265,7 +10609,7 @@ snapshots: dependencies: '@babel/core': 7.29.7 '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.7) - core-js-compat: 3.49.0 + core-js-compat: 3.50.0 transitivePeerDependencies: - supports-color @@ -10329,39 +10673,36 @@ snapshots: bare-events@2.9.1: {} - bare-fs@4.7.2: + bare-fs@4.8.0: dependencies: bare-events: 2.9.1 - bare-path: 3.0.1 - bare-stream: 2.13.1(bare-events@2.9.1) - bare-url: 2.4.5 + bare-path: 3.1.1 + bare-stream: 2.13.3(bare-events@2.9.1) + bare-url: 2.4.7 fast-fifo: 1.3.2 transitivePeerDependencies: - bare-abort-controller - react-native-b4a - bare-os@3.9.1: {} - - bare-path@3.0.1: - dependencies: - bare-os: 3.9.1 + bare-path@3.1.1: {} - bare-stream@2.13.1(bare-events@2.9.1): + bare-stream@2.13.3(bare-events@2.9.1): dependencies: - streamx: 2.26.0 + b4a: 1.8.1 + streamx: 2.28.0 teex: 1.0.1 optionalDependencies: bare-events: 2.9.1 transitivePeerDependencies: - react-native-b4a - bare-url@2.4.5: + bare-url@2.4.7: dependencies: - bare-path: 3.0.1 + bare-path: 3.1.1 base64-js@1.5.1: {} - baseline-browser-mapping@2.10.33: {} + baseline-browser-mapping@2.11.12: {} batch@0.6.1: {} @@ -10400,7 +10741,7 @@ snapshots: transitivePeerDependencies: - supports-color - bonjour-service@1.4.0: + bonjour-service@1.4.4: dependencies: fast-deep-equal: 3.1.3 multicast-dns: 7.2.5 @@ -10424,13 +10765,13 @@ snapshots: browser-process-hrtime@1.0.0: {} - browserslist@4.28.2: + browserslist@4.28.7: dependencies: - baseline-browser-mapping: 2.10.33 - caniuse-lite: 1.0.30001793 - electron-to-chromium: 1.5.367 - node-releases: 2.0.47 - update-browserslist-db: 1.2.3(browserslist@4.28.2) + baseline-browser-mapping: 2.11.12 + caniuse-lite: 1.0.30001806 + electron-to-chromium: 1.5.401 + node-releases: 2.0.52 + update-browserslist-db: 1.2.3(browserslist@4.28.7) bser@2.1.1: dependencies: @@ -10480,12 +10821,12 @@ snapshots: caniuse-api@3.0.0: dependencies: - browserslist: 4.28.2 - caniuse-lite: 1.0.30001793 + browserslist: 4.28.7 + caniuse-lite: 1.0.30001806 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 - caniuse-lite@1.0.30001793: {} + caniuse-lite@1.0.30001806: {} cardinal@2.1.1: dependencies: @@ -10707,7 +11048,7 @@ snapshots: dependencies: toggle-selection: 1.0.6 - copy-webpack-plugin@9.1.0(webpack@5.107.2(postcss@8.5.25)): + copy-webpack-plugin@9.1.0(webpack@5.109.2(postcss@8.5.25)): dependencies: fast-glob: 3.3.3 glob-parent: 6.0.2 @@ -10715,15 +11056,15 @@ snapshots: normalize-path: 3.0.0 schema-utils: 3.3.0 serialize-javascript: 7.0.5 - webpack: 5.107.2(postcss@8.5.25) + webpack: 5.109.2(postcss@8.5.25) - core-js-compat@3.49.0: + core-js-compat@3.50.0: dependencies: - browserslist: 4.28.2 + browserslist: 4.28.7 - core-js-pure@3.49.0: {} + core-js-pure@3.50.0: {} - core-js@3.49.0: {} + core-js@3.50.0: {} core-util-is@1.0.3: {} @@ -10762,13 +11103,14 @@ snapshots: optionalDependencies: typescript: 4.9.5 - craco-less@2.0.0(@craco/craco@6.4.5(@types/node@14.18.63)(react-scripts@5.0.0(@babel/plugin-syntax-flow@7.29.7(@babel/core@7.29.7))(@babel/plugin-transform-react-jsx@7.29.7(@babel/core@7.29.7))(@types/babel__core@7.20.5)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(@types/node@14.18.63)(typescript@4.9.5))(type-fest@4.41.0)(typescript@4.9.5))(typescript@4.9.5))(react-scripts@5.0.0(@babel/plugin-syntax-flow@7.29.7(@babel/core@7.29.7))(@babel/plugin-transform-react-jsx@7.29.7(@babel/core@7.29.7))(@types/babel__core@7.20.5)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(@types/node@14.18.63)(typescript@4.9.5))(type-fest@4.41.0)(typescript@4.9.5))(webpack@5.107.2(postcss@8.5.25)): + craco-less@2.0.0(@craco/craco@6.4.5(@types/node@14.18.63)(react-scripts@5.0.0(@babel/plugin-syntax-flow@7.29.7(@babel/core@7.29.7))(@babel/plugin-transform-react-jsx@7.29.7(@babel/core@7.29.7))(@types/babel__core@7.20.5)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(@types/node@14.18.63)(typescript@4.9.5))(type-fest@4.41.0)(typescript@4.9.5))(typescript@4.9.5))(react-scripts@5.0.0(@babel/plugin-syntax-flow@7.29.7(@babel/core@7.29.7))(@babel/plugin-transform-react-jsx@7.29.7(@babel/core@7.29.7))(@types/babel__core@7.20.5)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(@types/node@14.18.63)(typescript@4.9.5))(type-fest@4.41.0)(typescript@4.9.5))(webpack@5.109.2(postcss@8.5.25)): dependencies: '@craco/craco': 6.4.5(@types/node@14.18.63)(react-scripts@5.0.0(@babel/plugin-syntax-flow@7.29.7(@babel/core@7.29.7))(@babel/plugin-transform-react-jsx@7.29.7(@babel/core@7.29.7))(@types/babel__core@7.20.5)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(@types/node@14.18.63)(typescript@4.9.5))(type-fest@4.41.0)(typescript@4.9.5))(typescript@4.9.5) - less: 4.6.4 - less-loader: 7.3.0(less@4.6.4)(webpack@5.107.2(postcss@8.5.25)) + less: 4.8.1 + less-loader: 7.3.0(less@4.8.1)(webpack@5.109.2(postcss@8.5.25)) react-scripts: 5.0.0(@babel/plugin-syntax-flow@7.29.7(@babel/core@7.29.7))(@babel/plugin-transform-react-jsx@7.29.7(@babel/core@7.29.7))(@types/babel__core@7.20.5)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(@types/node@14.18.63)(typescript@4.9.5))(type-fest@4.41.0)(typescript@4.9.5) transitivePeerDependencies: + - supports-color - webpack create-require@1.1.1: {} @@ -10790,7 +11132,7 @@ snapshots: css-blank-pseudo@3.0.3(postcss@8.5.25): dependencies: postcss: 8.5.25 - postcss-selector-parser: 6.1.2 + postcss-selector-parser: 6.1.4 css-declaration-sorter@6.4.1(postcss@8.5.25): dependencies: @@ -10799,9 +11141,9 @@ snapshots: css-has-pseudo@3.0.4(postcss@8.5.25): dependencies: postcss: 8.5.25 - postcss-selector-parser: 6.1.2 + postcss-selector-parser: 6.1.4 - css-loader@6.11.0(webpack@5.107.2(postcss@8.5.25)): + css-loader@6.11.0(webpack@5.109.2(postcss@8.5.25)): dependencies: icss-utils: 5.1.0(postcss@8.5.25) postcss: 8.5.25 @@ -10812,9 +11154,9 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.5.2 optionalDependencies: - webpack: 5.107.2(postcss@8.5.25) + webpack: 5.109.2(postcss@8.5.25) - css-minimizer-webpack-plugin@3.4.1(webpack@5.107.2(postcss@8.5.25)): + css-minimizer-webpack-plugin@3.4.1(webpack@5.109.2(postcss@8.5.25)): dependencies: cssnano: 5.1.15(postcss@8.5.25) jest-worker: 27.5.1 @@ -10822,7 +11164,7 @@ snapshots: schema-utils: 4.3.3 serialize-javascript: 7.0.5 source-map: 0.6.1 - webpack: 5.107.2(postcss@8.5.25) + webpack: 5.109.2(postcss@8.5.25) css-prefers-color-scheme@6.0.3(postcss@8.5.25): dependencies: @@ -10949,7 +11291,7 @@ snapshots: lodash.clonedeep: 4.5.0 loglevel: 1.9.2 ndarray: 1.0.19 - pako: 2.1.0 + pako: 2.2.0 dcmjs@0.41.0: dependencies: @@ -10959,7 +11301,7 @@ snapshots: lodash.clonedeep: 4.5.0 loglevel: 1.9.2 ndarray: 1.0.19 - pako: 2.1.0 + pako: 2.2.0 debug@2.6.9: dependencies: @@ -11000,10 +11342,10 @@ snapshots: object-keys: 1.1.1 object.assign: 4.1.7 regexp.prototype.flags: 1.5.4 - side-channel: 1.1.0 + side-channel: 1.1.1 which-boxed-primitive: 1.1.1 which-collection: 1.0.2 - which-typed-array: 1.1.21 + which-typed-array: 1.1.22 deep-extend@0.6.0: {} @@ -11052,20 +11394,28 @@ snapshots: transitivePeerDependencies: - supports-color - dicom-microscopy-viewer@0.48.22: + dicom-microscopy-viewer@https://codeload.github.com/ImagingDataCommons/dicom-microscopy-viewer/tar.gz/1b39614eae92e92578d14977f66ced60243e51bc(@loaders.gl/core@4.4.4)(@luma.gl/core@9.1.10)(@luma.gl/engine@9.1.10(@luma.gl/core@9.1.10)(@luma.gl/shadertools@9.1.10(@luma.gl/core@9.1.10))): dependencies: '@cornerstonejs/codec-charls': 1.2.3 '@cornerstonejs/codec-libjpeg-turbo-8bit': 1.2.2 '@cornerstonejs/codec-openjpeg': 1.3.0 '@cornerstonejs/codec-openjph': 2.4.7 + '@deck.gl/core': 9.1.15 + '@deck.gl/extensions': 9.1.15(@deck.gl/core@9.1.15)(@luma.gl/core@9.1.10)(@luma.gl/engine@9.1.10(@luma.gl/core@9.1.10)(@luma.gl/shadertools@9.1.10(@luma.gl/core@9.1.10))) + '@deck.gl/layers': 9.1.15(@deck.gl/core@9.1.15)(@loaders.gl/core@4.4.4)(@luma.gl/core@9.1.10)(@luma.gl/engine@9.1.10(@luma.gl/core@9.1.10)(@luma.gl/shadertools@9.1.10(@luma.gl/core@9.1.10))) '@imagingdatacommons/dicomicc': 0.2.3 colormap: 2.3.2 dcmjs: 0.41.0 dicomweb-client: 0.10.3 + flatbush: 4.4.0 image-type: 4.1.0 mathjs: 11.12.0 - ol: 10.9.0 + ol: 10.10.0 uuid: 9.0.1 + transitivePeerDependencies: + - '@loaders.gl/core' + - '@luma.gl/core' + - '@luma.gl/engine' dicomweb-client@0.10.3: {} @@ -11150,7 +11500,9 @@ snapshots: duplexer@0.1.2: {} - earcut@3.0.2: {} + earcut@2.2.4: {} + + earcut@3.2.3: {} ee-first@1.1.1: {} @@ -11158,7 +11510,7 @@ snapshots: dependencies: jake: 10.9.4 - electron-to-chromium@1.5.367: {} + electron-to-chromium@1.5.401: {} email-addresses@5.0.0: {} @@ -11176,7 +11528,7 @@ snapshots: encodeurl@2.0.0: {} - enhanced-resolve@5.22.2: + enhanced-resolve@5.24.5: dependencies: graceful-fs: 4.2.11 tapable: 2.3.3 @@ -11201,6 +11553,13 @@ snapshots: dependencies: stackframe: 1.3.4 + es-abstract-get@1.0.0: + dependencies: + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + is-callable: 1.2.7 + object-inspect: 1.13.4 + es-abstract@1.24.2: dependencies: array-buffer-byte-length: 1.0.2 @@ -11215,8 +11574,8 @@ snapshots: es-errors: 1.3.0 es-object-atoms: 1.1.2 es-set-tostringtag: 2.1.0 - es-to-primitive: 1.3.0 - function.prototype.name: 1.1.8 + es-to-primitive: 1.3.4 + function.prototype.name: 1.2.0 get-intrinsic: 1.3.0 get-proto: 1.0.1 get-symbol-description: 1.1.0 @@ -11241,22 +11600,22 @@ snapshots: object-inspect: 1.13.4 object-keys: 1.1.1 object.assign: 4.1.7 - own-keys: 1.0.1 + own-keys: 1.0.2 regexp.prototype.flags: 1.5.4 safe-array-concat: 1.1.4 safe-push-apply: 1.0.0 safe-regex-test: 1.1.0 set-proto: 1.0.0 stop-iteration-iterator: 1.1.0 - string.prototype.trim: 1.2.10 - string.prototype.trimend: 1.0.9 + string.prototype.trim: 1.2.11 + string.prototype.trimend: 1.0.10 string.prototype.trimstart: 1.0.8 typed-array-buffer: 1.0.3 typed-array-byte-length: 1.0.3 typed-array-byte-offset: 1.0.4 typed-array-length: 1.0.8 unbox-primitive: 1.1.0 - which-typed-array: 1.1.21 + which-typed-array: 1.1.22 es-define-property@1.0.1: {} @@ -11274,7 +11633,7 @@ snapshots: isarray: 2.0.5 stop-iteration-iterator: 1.1.0 - es-iterator-helpers@1.3.2: + es-iterator-helpers@1.4.0: dependencies: call-bind: 1.0.9 call-bound: 1.0.4 @@ -11293,7 +11652,7 @@ snapshots: iterator.prototype: 1.1.5 math-intrinsics: 1.1.0 - es-module-lexer@2.1.0: {} + es-module-lexer@2.3.1: {} es-object-atoms@1.1.2: dependencies: @@ -11310,8 +11669,11 @@ snapshots: dependencies: hasown: 2.0.4 - es-to-primitive@1.3.0: + es-to-primitive@1.3.4: dependencies: + es-abstract-get: 1.0.0 + es-define-property: 1.0.1 + es-errors: 1.3.0 is-callable: 1.2.7 is-date-object: 1.1.0 is-symbol: 1.1.1 @@ -11373,7 +11735,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.13.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint-import-resolver-node@0.3.10)(eslint@8.57.1): + eslint-module-utils@2.14.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint-import-resolver-node@0.3.10)(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: @@ -11402,7 +11764,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.10 - eslint-module-utils: 2.13.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint-import-resolver-node@0.3.10)(eslint@8.57.1) + eslint-module-utils: 2.14.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint-import-resolver-node@0.3.10)(eslint@8.57.1) hasown: 2.0.4 is-core-module: 2.16.2 is-glob: 4.0.3 @@ -11411,7 +11773,7 @@ snapshots: object.groupby: 1.0.3 object.values: 1.2.1 semver: 7.5.2 - string.prototype.trimend: 1.0.9 + string.prototype.trimend: 1.0.10 tsconfig-paths: 3.15.0 optionalDependencies: '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@4.9.5) @@ -11437,7 +11799,7 @@ snapshots: array-includes: 3.1.9 array.prototype.flatmap: 1.3.3 ast-types-flow: 0.0.8 - axe-core: 4.12.0 + axe-core: 4.13.0 axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 @@ -11461,7 +11823,7 @@ snapshots: array.prototype.flatmap: 1.3.3 array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 - es-iterator-helpers: 1.3.2 + es-iterator-helpers: 1.4.0 eslint: 8.57.1 estraverse: 5.3.0 hasown: 2.0.4 @@ -11502,7 +11864,7 @@ snapshots: eslint-visitor-keys@3.4.3: {} - eslint-webpack-plugin@3.2.0(eslint@8.57.1)(webpack@5.107.2(postcss@8.5.25)): + eslint-webpack-plugin@3.2.0(eslint@8.57.1)(webpack@5.109.2(postcss@8.5.25)): dependencies: '@types/eslint': 8.56.12 eslint: 8.57.1 @@ -11510,18 +11872,18 @@ snapshots: micromatch: 4.0.8 normalize-path: 3.0.0 schema-utils: 4.3.3 - webpack: 5.107.2(postcss@8.5.25) + webpack: 5.109.2(postcss@8.5.25) eslint@8.57.1: dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.10.1(eslint@8.57.1) '@eslint-community/regexpp': 4.12.2 '@eslint/eslintrc': 2.1.4 '@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.3.1 + '@ungap/structured-clone': 1.3.3 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 @@ -11557,8 +11919,8 @@ snapshots: espree@9.6.1: dependencies: - acorn: 8.16.0 - acorn-jsx: 5.3.2(acorn@8.16.0) + acorn: 8.18.0 + acorn-jsx: 5.3.2(acorn@8.18.0) eslint-visitor-keys: 3.4.3 esprima@1.2.5: {} @@ -11642,7 +12004,7 @@ snapshots: pretty-ms: 9.3.0 signal-exit: 4.1.0 strip-final-newline: 4.0.0 - yoctocolors: 2.1.2 + yoctocolors: 2.2.0 exit@0.1.2: {} @@ -11729,9 +12091,9 @@ snapshots: dependencies: bser: 2.1.1 - fdir@6.5.0(picomatch@4.0.4): + fdir@6.5.0(picomatch@4.0.5): optionalDependencies: - picomatch: 4.0.4 + picomatch: 4.0.5 fflate@0.8.3: {} @@ -11752,11 +12114,11 @@ snapshots: dependencies: flat-cache: 3.2.0 - file-loader@6.2.0(webpack@5.107.2(postcss@8.5.25)): + file-loader@6.2.0(webpack@5.109.2(postcss@8.5.25)): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.107.2(postcss@8.5.25) + webpack: 5.109.2(postcss@8.5.25) file-type@10.11.0: {} @@ -11827,11 +12189,19 @@ snapshots: flat-cache@3.2.0: dependencies: - flatted: 3.4.2 + flatted: 3.4.4 keyv: 4.5.4 rimraf: 3.0.2 - flatted@3.4.2: {} + flatbuffers@25.9.23: {} + + flatbush@4.4.0: + dependencies: + flatqueue: 2.0.3 + + flatqueue@2.0.3: {} + + flatted@3.4.4: {} follow-redirects@1.16.0: {} @@ -11839,7 +12209,7 @@ snapshots: dependencies: is-callable: 1.2.7 - fork-ts-checker-webpack-plugin@6.5.3(eslint@8.57.1)(typescript@4.9.5)(webpack@5.107.2(postcss@8.5.25)): + fork-ts-checker-webpack-plugin@6.5.3(eslint@8.57.1)(typescript@4.9.5)(webpack@5.109.2(postcss@8.5.25)): dependencies: '@babel/code-frame': 7.29.7 '@types/json-schema': 7.0.15 @@ -11855,7 +12225,7 @@ snapshots: semver: 7.5.2 tapable: 1.1.3 typescript: 4.9.5 - webpack: 5.107.2(postcss@8.5.25) + webpack: 5.109.2(postcss@8.5.25) optionalDependencies: eslint: 8.57.1 @@ -11896,7 +12266,7 @@ snapshots: jsonfile: 6.2.1 universalify: 2.0.1 - fs-extra@11.3.5: + fs-extra@11.4.0: dependencies: graceful-fs: 4.2.11 jsonfile: 6.2.1 @@ -11919,19 +12289,25 @@ snapshots: fs.realpath@1.0.0: {} + fsevents@2.3.2: + optional: true + fsevents@2.3.3: optional: true function-bind@1.1.2: {} - function.prototype.name@1.1.8: + function.prototype.name@1.2.0: dependencies: call-bind: 1.0.9 call-bound: 1.0.4 - define-properties: 1.2.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 hasown: 2.0.4 is-callable: 1.2.7 + is-document.all: 1.0.0 functions-have-names@1.2.3: {} @@ -11939,11 +12315,11 @@ snapshots: gensync@1.0.0-beta.2: {} - geotiff@3.0.5: + geotiff@3.1.0-beta.0: dependencies: '@petamoriken/float16': 3.9.3 lerc: 3.0.0 - pako: 2.1.0 + pako: 2.2.0 parse-headers: 2.0.6 quick-lru: 6.1.2 web-worker: 1.5.0 @@ -12020,8 +12396,6 @@ snapshots: dependencies: is-glob: 4.0.3 - glob-to-regexp@0.4.1: {} - glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -12063,7 +12437,7 @@ snapshots: dependencies: '@sindresorhus/merge-streams': 2.3.0 fast-glob: 3.3.3 - ignore: 7.0.5 + ignore: 7.0.6 path-type: 6.0.0 slash: 5.1.0 unicorn-magic: 0.3.0 @@ -12168,9 +12542,9 @@ snapshots: he: 1.2.0 param-case: 3.0.4 relateurl: 0.2.7 - terser: 5.48.0 + terser: 5.49.2 - html-webpack-plugin@5.6.7(webpack@5.107.2(postcss@8.5.25)): + html-webpack-plugin@5.6.8(webpack@5.109.2(postcss@8.5.25)): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 @@ -12178,7 +12552,7 @@ snapshots: pretty-error: 4.0.0 tapable: 2.3.3 optionalDependencies: - webpack: 5.107.2(postcss@8.5.25) + webpack: 5.109.2(postcss@8.5.25) htmlparser2@6.1.0: dependencies: @@ -12222,7 +12596,7 @@ snapshots: transitivePeerDependencies: - supports-color - http-proxy-middleware@2.0.9(@types/express@4.17.25): + http-proxy-middleware@2.0.10(@types/express@4.17.25): dependencies: '@types/http-proxy': 1.17.17 http-proxy: 1.18.1 @@ -12286,10 +12660,7 @@ snapshots: ignore@5.3.2: {} - ignore@7.0.5: {} - - image-size@0.5.5: - optional: true + ignore@7.0.6: {} image-type@4.1.0: dependencies: @@ -12339,7 +12710,7 @@ snapshots: dependencies: es-errors: 1.3.0 hasown: 2.0.4 - side-channel: 1.1.0 + side-channel: 1.1.1 into-stream@7.0.0: dependencies: @@ -12350,7 +12721,7 @@ snapshots: ipaddr.js@1.9.1: {} - ipaddr.js@2.4.0: {} + ipaddr.js@2.5.0: {} is-arguments@1.2.0: dependencies: @@ -12407,6 +12778,10 @@ snapshots: is-docker@2.2.1: {} + is-document.all@1.0.0: + dependencies: + call-bound: 1.0.4 + is-extglob@2.1.1: {} is-finalizationregistry@1.1.1: @@ -12496,7 +12871,7 @@ snapshots: is-typed-array@1.1.15: dependencies: - which-typed-array: 1.1.21 + which-typed-array: 1.1.22 is-typedarray@1.0.0: {} @@ -12548,7 +12923,7 @@ snapshots: istanbul-lib-instrument@5.2.1: dependencies: '@babel/core': 7.29.7 - '@babel/parser': 7.29.7 + '@babel/parser': 7.29.8 '@istanbuljs/schema': 0.1.6 istanbul-lib-coverage: 3.2.2 semver: 7.5.2 @@ -12636,7 +13011,7 @@ snapshots: jest-util: 27.5.1 jest-validate: 27.5.1 prompts: 2.4.2 - yargs: 16.2.0 + yargs: 16.2.2 transitivePeerDependencies: - bufferutil - canvas @@ -12912,10 +13287,10 @@ snapshots: jest-snapshot@27.5.1: dependencies: '@babel/core': 7.29.7 - '@babel/generator': 7.29.7 + '@babel/generator': 7.29.8 '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7) - '@babel/traverse': 7.29.7 - '@babel/types': 7.29.7 + '@babel/traverse': 7.29.8 + '@babel/types': 7.29.8 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 '@types/babel__traverse': 7.28.0 @@ -13041,7 +13416,7 @@ snapshots: jsdom@16.7.0: dependencies: abab: 2.0.6 - acorn: 8.16.0 + acorn: 8.18.0 acorn-globals: 6.0.0 cssom: 0.4.4 cssstyle: 2.3.0 @@ -13054,7 +13429,7 @@ snapshots: http-proxy-agent: 4.0.1 https-proxy-agent: 5.0.1 is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.23 + nwsapi: 2.2.24 parse5: 6.0.1 saxes: 5.0.1 symbol-tree: 3.2.4 @@ -13065,7 +13440,7 @@ snapshots: whatwg-encoding: 1.0.5 whatwg-mimetype: 2.3.0 whatwg-url: 8.7.0 - ws: 7.5.11 + ws: 7.5.13 xml-name-validator: 3.0.0 transitivePeerDependencies: - bufferutil @@ -13090,6 +13465,8 @@ snapshots: json-stringify-safe@5.0.1: {} + json-with-bigint@3.5.10: {} + json2mq@0.2.0: dependencies: string-convert: 0.2.1 @@ -13152,26 +13529,28 @@ snapshots: lerp@1.0.3: {} - less-loader@7.3.0(less@4.6.4)(webpack@5.107.2(postcss@8.5.25)): + less-loader@7.3.0(less@4.8.1)(webpack@5.109.2(postcss@8.5.25)): dependencies: klona: 2.0.6 - less: 4.6.4 + less: 4.8.1 loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.107.2(postcss@8.5.25) + webpack: 5.109.2(postcss@8.5.25) - less@4.6.4: + less@4.8.1: dependencies: copy-anything: 3.0.5 parse-node-version: 1.0.1 optionalDependencies: errno: 0.1.8 graceful-fs: 4.2.11 - image-size: 0.5.5 make-dir: 3.1.0 mime: 1.6.0 needle: 3.5.0 + probe-image-size: 7.3.0 source-map: 0.6.1 + transitivePeerDependencies: + - supports-color leven@3.1.0: {} @@ -13195,8 +13574,6 @@ snapshots: pify: 3.0.0 strip-bom: 3.0.0 - loader-runner@4.3.2: {} - loader-utils@2.0.4: dependencies: big.js: 5.2.2 @@ -13247,8 +13624,6 @@ snapshots: lodash.merge@4.6.2: {} - lodash.sortby@4.7.0: {} - lodash.uniq@4.5.0: {} lodash.uniqby@4.7.0: {} @@ -13376,11 +13751,11 @@ snapshots: min-indent@1.0.1: {} - mini-css-extract-plugin@2.10.2(webpack@5.107.2(postcss@8.5.25)): + mini-css-extract-plugin@2.10.2(webpack@5.109.2(postcss@8.5.25)): dependencies: schema-utils: 4.3.3 tapable: 2.3.3 - webpack: 5.107.2(postcss@8.5.25) + webpack: 5.109.2(postcss@8.5.25) minimalistic-assert@1.0.1: {} @@ -13400,6 +13775,18 @@ snapshots: minimist@1.2.8: {} + minimizer-webpack-plugin@5.6.1(postcss@8.5.25)(webpack@5.109.2(postcss@8.5.25)): + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + jest-worker: 27.5.1 + schema-utils: 4.3.3 + terser: 5.49.2 + webpack: 5.109.2(postcss@8.5.25) + optionalDependencies: + postcss: 8.5.25 + + mjolnir.js@3.0.1: {} + modify-values@1.0.1: {} moment@2.30.1: {} @@ -13419,7 +13806,7 @@ snapshots: object-assign: 4.1.1 thenify-all: 1.6.0 - nanoid@3.3.16: {} + nanoid@3.3.17: {} natural-compare-lite@1.4.0: {} @@ -13430,10 +13817,19 @@ snapshots: iota-array: 1.0.0 is-buffer: 1.1.6 + needle@2.9.1: + dependencies: + debug: 3.2.7 + iconv-lite: 0.4.24 + sax: 1.6.1 + transitivePeerDependencies: + - supports-color + optional: true + needle@3.5.0: dependencies: iconv-lite: 0.6.3 - sax: 1.6.0 + sax: 1.6.1 optional: true negotiator@0.6.3: {} @@ -13453,7 +13849,7 @@ snapshots: dependencies: lodash: 4.18.1 - node-exports-info@1.6.0: + node-exports-info@1.6.2: dependencies: array.prototype.flatmap: 1.3.3 es-errors: 1.3.0 @@ -13464,7 +13860,7 @@ snapshots: node-int64@0.4.0: {} - node-releases@2.0.47: {} + node-releases@2.0.52: {} normalize-package-data@2.5.0: dependencies: @@ -13505,7 +13901,7 @@ snapshots: path-key: 4.0.0 unicorn-magic: 0.3.0 - npm@10.9.8: {} + npm@10.9.9: {} npm@9.9.4: {} @@ -13517,7 +13913,7 @@ snapshots: dependencies: fflate: 0.8.3 - nwsapi@2.2.23: {} + nwsapi@2.2.24: {} object-assign@4.1.1: {} @@ -13574,18 +13970,18 @@ snapshots: dependencies: acorn: 7.4.1 base64-js: 1.5.1 - core-js: 3.49.0 + core-js: 3.50.0 crypto-js: 4.2.0 serialize-javascript: 7.0.5 - ol@10.9.0: + ol@10.10.0: dependencies: '@types/rbush': 4.0.0 - earcut: 3.0.2 - geotiff: 3.0.5 - pbf: 4.0.1 + earcut: 3.2.3 + geotiff: 3.1.0-beta.0 + pbf: 5.1.2 rbush: 4.0.1 - zarrita: 0.7.3 + zarrita: 0.7.4 on-finished@2.4.1: dependencies: @@ -13620,8 +14016,9 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 - own-keys@1.0.1: + own-keys@1.0.2: dependencies: + call-bound: 1.0.4 get-intrinsic: 1.3.0 object-keys: 1.1.1 safe-push-apply: 1.0.0 @@ -13630,7 +14027,7 @@ snapshots: p-filter@4.1.0: dependencies: - p-map: 7.0.4 + p-map: 7.0.6 p-is-promise@3.0.0: {} @@ -13670,7 +14067,7 @@ snapshots: dependencies: p-limit: 4.0.0 - p-map@7.0.4: {} + p-map@7.0.6: {} p-reduce@2.1.0: {} @@ -13685,7 +14082,7 @@ snapshots: p-try@2.2.0: {} - pako@2.1.0: {} + pako@2.2.0: {} param-case@3.0.4: dependencies: @@ -13757,7 +14154,7 @@ snapshots: path-type@6.0.0: {} - pbf@4.0.1: + pbf@5.1.2: dependencies: resolve-protobuf-schema: 2.1.0 @@ -13767,7 +14164,7 @@ snapshots: picomatch@2.3.2: {} - picomatch@4.0.4: {} + picomatch@4.0.5: {} pify@2.3.0: {} @@ -13794,22 +14191,30 @@ snapshots: dependencies: find-up: 3.0.0 + playwright-core@1.62.1: {} + + playwright@1.62.1: + dependencies: + playwright-core: 1.62.1 + optionalDependencies: + fsevents: 2.3.2 + possible-typed-array-names@1.1.0: {} postcss-attribute-case-insensitive@5.0.2(postcss@8.5.25): dependencies: postcss: 8.5.25 - postcss-selector-parser: 6.1.2 + postcss-selector-parser: 6.1.4 - postcss-browser-comments@4.0.0(browserslist@4.28.2)(postcss@8.5.25): + postcss-browser-comments@4.0.0(browserslist@4.28.7)(postcss@8.5.25): dependencies: - browserslist: 4.28.2 + browserslist: 4.28.7 postcss: 8.5.25 postcss-calc@8.2.4(postcss@8.5.25): dependencies: postcss: 8.5.25 - postcss-selector-parser: 6.1.2 + postcss-selector-parser: 6.1.4 postcss-value-parser: 4.2.0 postcss-clamp@4.1.0(postcss@8.5.25): @@ -13834,7 +14239,7 @@ snapshots: postcss-colormin@5.3.1(postcss@8.5.25): dependencies: - browserslist: 4.28.2 + browserslist: 4.28.7 caniuse-api: 3.0.0 colord: 2.9.3 postcss: 8.5.25 @@ -13842,7 +14247,7 @@ snapshots: postcss-convert-values@5.1.3(postcss@8.5.25): dependencies: - browserslist: 4.28.2 + browserslist: 4.28.7 postcss: 8.5.25 postcss-value-parser: 4.2.0 @@ -13859,12 +14264,12 @@ snapshots: postcss-custom-selectors@6.0.3(postcss@8.5.25): dependencies: postcss: 8.5.25 - postcss-selector-parser: 6.1.2 + postcss-selector-parser: 6.1.4 postcss-dir-pseudo-class@6.0.5(postcss@8.5.25): dependencies: postcss: 8.5.25 - postcss-selector-parser: 6.1.2 + postcss-selector-parser: 6.1.4 postcss-discard-comments@5.1.2(postcss@8.5.25): dependencies: @@ -13900,12 +14305,12 @@ snapshots: postcss-focus-visible@6.0.4(postcss@8.5.25): dependencies: postcss: 8.5.25 - postcss-selector-parser: 6.1.2 + postcss-selector-parser: 6.1.4 postcss-focus-within@5.0.4(postcss@8.5.25): dependencies: postcss: 8.5.25 - postcss-selector-parser: 6.1.2 + postcss-selector-parser: 6.1.4 postcss-font-variant@5.0.0(postcss@8.5.25): dependencies: @@ -13949,13 +14354,13 @@ snapshots: jiti: 1.21.7 postcss: 8.5.25 - postcss-loader@6.2.1(postcss@8.5.25)(webpack@5.107.2(postcss@8.5.25)): + postcss-loader@6.2.1(postcss@8.5.25)(webpack@5.109.2(postcss@8.5.25)): dependencies: cosmiconfig: 7.1.0 klona: 2.0.6 postcss: 8.5.25 semver: 7.5.2 - webpack: 5.107.2(postcss@8.5.25) + webpack: 5.109.2(postcss@8.5.25) postcss-logical@5.0.4(postcss@8.5.25): dependencies: @@ -13973,11 +14378,11 @@ snapshots: postcss-merge-rules@5.1.4(postcss@8.5.25): dependencies: - browserslist: 4.28.2 + browserslist: 4.28.7 caniuse-api: 3.0.0 cssnano-utils: 3.1.0(postcss@8.5.25) postcss: 8.5.25 - postcss-selector-parser: 6.1.2 + postcss-selector-parser: 6.1.4 postcss-minify-font-values@5.1.0(postcss@8.5.25): dependencies: @@ -13993,7 +14398,7 @@ snapshots: postcss-minify-params@5.1.4(postcss@8.5.25): dependencies: - browserslist: 4.28.2 + browserslist: 4.28.7 cssnano-utils: 3.1.0(postcss@8.5.25) postcss: 8.5.25 postcss-value-parser: 4.2.0 @@ -14001,7 +14406,7 @@ snapshots: postcss-minify-selectors@5.2.1(postcss@8.5.25): dependencies: postcss: 8.5.25 - postcss-selector-parser: 6.1.2 + postcss-selector-parser: 6.1.4 postcss-modules-extract-imports@3.1.0(postcss@8.5.25): dependencies: @@ -14011,13 +14416,13 @@ snapshots: dependencies: icss-utils: 5.1.0(postcss@8.5.25) postcss: 8.5.25 - postcss-selector-parser: 7.1.1 + postcss-selector-parser: 7.1.4 postcss-value-parser: 4.2.0 postcss-modules-scope@3.2.1(postcss@8.5.25): dependencies: postcss: 8.5.25 - postcss-selector-parser: 7.1.1 + postcss-selector-parser: 7.1.4 postcss-modules-values@4.0.0(postcss@8.5.25): dependencies: @@ -14027,13 +14432,13 @@ snapshots: postcss-nested@6.2.0(postcss@8.5.25): dependencies: postcss: 8.5.25 - postcss-selector-parser: 6.1.2 + postcss-selector-parser: 6.1.4 postcss-nesting@10.2.0(postcss@8.5.25): dependencies: - '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.1.2) + '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.1.4) postcss: 8.5.25 - postcss-selector-parser: 6.1.2 + postcss-selector-parser: 6.1.4 postcss-normalize-charset@5.1.0(postcss@8.5.25): dependencies: @@ -14066,7 +14471,7 @@ snapshots: postcss-normalize-unicode@5.1.1(postcss@8.5.25): dependencies: - browserslist: 4.28.2 + browserslist: 4.28.7 postcss: 8.5.25 postcss-value-parser: 4.2.0 @@ -14081,12 +14486,12 @@ snapshots: postcss: 8.5.25 postcss-value-parser: 4.2.0 - postcss-normalize@10.0.1(browserslist@4.28.2)(postcss@8.5.25): + postcss-normalize@10.0.1(browserslist@4.28.7)(postcss@8.5.25): dependencies: '@csstools/normalize.css': 12.1.1 - browserslist: 4.28.2 + browserslist: 4.28.7 postcss: 8.5.25 - postcss-browser-comments: 4.0.0(browserslist@4.28.2)(postcss@8.5.25) + postcss-browser-comments: 4.0.0(browserslist@4.28.7)(postcss@8.5.25) sanitize.css: 13.0.0 postcss-opacity-percentage@1.1.3(postcss@8.5.25): @@ -14129,8 +14534,8 @@ snapshots: '@csstools/postcss-text-decoration-shorthand': 1.0.0(postcss@8.5.25) '@csstools/postcss-trigonometric-functions': 1.0.2(postcss@8.5.25) '@csstools/postcss-unset-value': 1.0.2(postcss@8.5.25) - autoprefixer: 10.5.0(postcss@8.5.25) - browserslist: 4.28.2 + autoprefixer: 10.5.4(postcss@8.5.25) + browserslist: 4.28.7 css-blank-pseudo: 3.0.3(postcss@8.5.25) css-has-pseudo: 3.0.4(postcss@8.5.25) css-prefers-color-scheme: 6.0.3(postcss@8.5.25) @@ -14169,11 +14574,11 @@ snapshots: postcss-pseudo-class-any-link@7.1.6(postcss@8.5.25): dependencies: postcss: 8.5.25 - postcss-selector-parser: 6.1.2 + postcss-selector-parser: 6.1.4 postcss-reduce-initial@5.1.2(postcss@8.5.25): dependencies: - browserslist: 4.28.2 + browserslist: 4.28.7 caniuse-api: 3.0.0 postcss: 8.5.25 @@ -14189,14 +14594,14 @@ snapshots: postcss-selector-not@6.0.1(postcss@8.5.25): dependencies: postcss: 8.5.25 - postcss-selector-parser: 6.1.2 + postcss-selector-parser: 6.1.4 - postcss-selector-parser@6.1.2: + postcss-selector-parser@6.1.4: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss-selector-parser@7.1.1: + postcss-selector-parser@7.1.4: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 @@ -14210,13 +14615,13 @@ snapshots: postcss-unique-selectors@5.1.1(postcss@8.5.25): dependencies: postcss: 8.5.25 - postcss-selector-parser: 6.1.2 + postcss-selector-parser: 6.1.4 postcss-value-parser@4.2.0: {} postcss@8.5.25: dependencies: - nanoid: 3.3.16 + nanoid: 3.3.17 picocolors: 1.1.1 source-map-js: 1.2.1 @@ -14246,6 +14651,15 @@ snapshots: dependencies: parse-ms: 4.0.0 + probe-image-size@7.3.0: + dependencies: + lodash.merge: 4.6.2 + needle: 2.9.1 + stream-parser: 0.3.1 + transitivePeerDependencies: + - supports-color + optional: true + process-nextick-args@2.0.1: {} promise@8.3.0: @@ -14263,7 +14677,7 @@ snapshots: object-assign: 4.1.1 react-is: 16.13.1 - properties-file@4.0.0: {} + properties-file@5.0.5: {} proto-list@1.2.4: {} @@ -14287,7 +14701,7 @@ snapshots: qs@6.13.0: dependencies: - side-channel: 1.1.0 + side-channel: 1.1.1 querystringify@2.2.0: {} @@ -14305,6 +14719,8 @@ snapshots: range-parser@1.2.1: {} + range-parser@1.3.0: {} + raw-body@2.5.2: dependencies: bytes: 3.1.2 @@ -14661,25 +15077,25 @@ snapshots: react-app-polyfill@3.0.0: dependencies: - core-js: 3.49.0 + core-js: 3.50.0 object-assign: 4.1.1 promise: 8.3.0 raf: 3.4.1 regenerator-runtime: 0.13.11 whatwg-fetch: 3.6.20 - react-dev-utils@12.0.1(eslint@8.57.1)(typescript@4.9.5)(webpack@5.107.2(postcss@8.5.25)): + react-dev-utils@12.0.1(eslint@8.57.1)(typescript@4.9.5)(webpack@5.109.2(postcss@8.5.25)): dependencies: '@babel/code-frame': 7.29.7 address: 1.2.2 - browserslist: 4.28.2 + browserslist: 4.28.7 chalk: 4.1.2 cross-spawn: 7.0.6 detect-port-alt: 1.1.6 escape-string-regexp: 4.0.0 filesize: 8.0.7 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.57.1)(typescript@4.9.5)(webpack@5.107.2(postcss@8.5.25)) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.57.1)(typescript@4.9.5)(webpack@5.109.2(postcss@8.5.25)) global-modules: 2.0.0 globby: 11.1.0 gzip-size: 6.0.0 @@ -14694,7 +15110,7 @@ snapshots: shell-quote: 1.9.0 strip-ansi: 6.0.1 text-table: 0.2.0 - webpack: 5.107.2(postcss@8.5.25) + webpack: 5.109.2(postcss@8.5.25) optionalDependencies: typescript: 4.9.5 transitivePeerDependencies: @@ -14743,53 +15159,53 @@ snapshots: react-scripts@5.0.0(@babel/plugin-syntax-flow@7.29.7(@babel/core@7.29.7))(@babel/plugin-transform-react-jsx@7.29.7(@babel/core@7.29.7))(@types/babel__core@7.20.5)(eslint@8.57.1)(react@18.3.1)(ts-node@10.9.2(@types/node@14.18.63)(typescript@4.9.5))(type-fest@4.41.0)(typescript@4.9.5): dependencies: '@babel/core': 7.29.7 - '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@4.15.2(webpack@5.107.2(postcss@8.5.25)))(webpack@5.107.2(postcss@8.5.25)) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@4.15.2(webpack@5.109.2(postcss@8.5.25)))(webpack@5.109.2(postcss@8.5.25)) '@svgr/webpack': 5.5.0 babel-jest: 27.5.1(@babel/core@7.29.7) - babel-loader: 8.4.1(@babel/core@7.29.7)(webpack@5.107.2(postcss@8.5.25)) + babel-loader: 8.4.1(@babel/core@7.29.7)(webpack@5.109.2(postcss@8.5.25)) babel-plugin-named-asset-import: 0.3.8(@babel/core@7.29.7) babel-preset-react-app: 10.1.0 bfj: 7.1.0 - browserslist: 4.28.2 + browserslist: 4.28.7 camelcase: 6.3.0 case-sensitive-paths-webpack-plugin: 2.4.0 - css-loader: 6.11.0(webpack@5.107.2(postcss@8.5.25)) - css-minimizer-webpack-plugin: 3.4.1(webpack@5.107.2(postcss@8.5.25)) + css-loader: 6.11.0(webpack@5.109.2(postcss@8.5.25)) + css-minimizer-webpack-plugin: 3.4.1(webpack@5.109.2(postcss@8.5.25)) dotenv: 10.0.0 dotenv-expand: 5.1.0 eslint: 8.57.1 eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.29.7(@babel/core@7.29.7))(@babel/plugin-transform-react-jsx@7.29.7(@babel/core@7.29.7))(eslint@8.57.1)(jest@27.5.1(ts-node@10.9.2(@types/node@14.18.63)(typescript@4.9.5)))(typescript@4.9.5) - eslint-webpack-plugin: 3.2.0(eslint@8.57.1)(webpack@5.107.2(postcss@8.5.25)) - file-loader: 6.2.0(webpack@5.107.2(postcss@8.5.25)) + eslint-webpack-plugin: 3.2.0(eslint@8.57.1)(webpack@5.109.2(postcss@8.5.25)) + file-loader: 6.2.0(webpack@5.109.2(postcss@8.5.25)) fs-extra: 10.1.0 - html-webpack-plugin: 5.6.7(webpack@5.107.2(postcss@8.5.25)) + html-webpack-plugin: 5.6.8(webpack@5.109.2(postcss@8.5.25)) identity-obj-proxy: 3.0.0 jest: 27.5.1(ts-node@10.9.2(@types/node@14.18.63)(typescript@4.9.5)) jest-resolve: 27.5.1 jest-watch-typeahead: 1.1.0(jest@27.5.1(ts-node@10.9.2(@types/node@14.18.63)(typescript@4.9.5))) - mini-css-extract-plugin: 2.10.2(webpack@5.107.2(postcss@8.5.25)) + mini-css-extract-plugin: 2.10.2(webpack@5.109.2(postcss@8.5.25)) postcss: 8.5.25 postcss-flexbugs-fixes: 5.0.2(postcss@8.5.25) - postcss-loader: 6.2.1(postcss@8.5.25)(webpack@5.107.2(postcss@8.5.25)) - postcss-normalize: 10.0.1(browserslist@4.28.2)(postcss@8.5.25) + postcss-loader: 6.2.1(postcss@8.5.25)(webpack@5.109.2(postcss@8.5.25)) + postcss-normalize: 10.0.1(browserslist@4.28.7)(postcss@8.5.25) postcss-preset-env: 7.8.3(postcss@8.5.25) prompts: 2.4.2 react: 18.3.1 react-app-polyfill: 3.0.0 - react-dev-utils: 12.0.1(eslint@8.57.1)(typescript@4.9.5)(webpack@5.107.2(postcss@8.5.25)) + react-dev-utils: 12.0.1(eslint@8.57.1)(typescript@4.9.5)(webpack@5.109.2(postcss@8.5.25)) react-refresh: 0.11.0 resolve: 1.22.12 resolve-url-loader: 4.0.0 - sass-loader: 12.6.0(webpack@5.107.2(postcss@8.5.25)) + sass-loader: 12.6.0(webpack@5.109.2(postcss@8.5.25)) semver: 7.5.2 - source-map-loader: 3.0.2(webpack@5.107.2(postcss@8.5.25)) - style-loader: 3.3.4(webpack@5.107.2(postcss@8.5.25)) + source-map-loader: 3.0.2(webpack@5.109.2(postcss@8.5.25)) + style-loader: 3.3.4(webpack@5.109.2(postcss@8.5.25)) tailwindcss: 3.4.19 - terser-webpack-plugin: 5.6.1(postcss@8.5.25)(webpack@5.107.2(postcss@8.5.25)) - webpack: 5.107.2(postcss@8.5.25) - webpack-dev-server: 4.15.2(webpack@5.107.2(postcss@8.5.25)) - webpack-manifest-plugin: 4.1.1(webpack@5.107.2(postcss@8.5.25)) - workbox-webpack-plugin: 6.6.0(@types/babel__core@7.20.5)(webpack@5.107.2(postcss@8.5.25)) + terser-webpack-plugin: 5.6.1(postcss@8.5.25)(webpack@5.109.2(postcss@8.5.25)) + webpack: 5.109.2(postcss@8.5.25) + webpack-dev-server: 4.15.2(webpack@5.109.2(postcss@8.5.25)) + webpack-manifest-plugin: 4.1.1(webpack@5.109.2(postcss@8.5.25)) + workbox-webpack-plugin: 6.6.0(@types/babel__core@7.20.5)(webpack@5.109.2(postcss@8.5.25)) optionalDependencies: fsevents: 2.3.3 typescript: 4.9.5 @@ -14966,17 +15382,17 @@ snapshots: regenerate: 1.4.2 regenerate-unicode-properties: 10.2.2 regjsgen: 0.8.0 - regjsparser: 0.13.1 + regjsparser: 0.13.2 unicode-match-property-ecmascript: 2.0.0 unicode-match-property-value-ecmascript: 2.2.1 registry-auth-token@5.1.1: dependencies: - '@pnpm/npm-conf': 3.0.2 + '@pnpm/npm-conf': 3.0.3 regjsgen@0.8.0: {} - regjsparser@0.13.1: + regjsparser@0.13.2: dependencies: jsesc: 3.1.0 @@ -15031,7 +15447,7 @@ snapshots: dependencies: es-errors: 1.3.0 is-core-module: 2.16.2 - node-exports-info: 1.6.0 + node-exports-info: 1.6.2 object-keys: 1.1.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -15050,7 +15466,7 @@ snapshots: jest-worker: 26.6.2 rollup: 3.30.0 serialize-javascript: 7.0.5 - terser: 5.48.0 + terser: 5.49.2 rollup@3.30.0: optionalDependencies: @@ -15087,13 +15503,13 @@ snapshots: sanitize.css@13.0.0: {} - sass-loader@12.6.0(webpack@5.107.2(postcss@8.5.25)): + sass-loader@12.6.0(webpack@5.109.2(postcss@8.5.25)): dependencies: klona: 2.0.6 neo-async: 2.6.2 - webpack: 5.107.2(postcss@8.5.25) + webpack: 5.109.2(postcss@8.5.25) - sax@1.6.0: {} + sax@1.6.1: {} saxes@5.0.1: dependencies: @@ -15170,7 +15586,7 @@ snapshots: semver: 7.5.2 semver-diff: 4.0.0 signale: 1.4.0 - yargs: 17.7.2 + yargs: 17.7.3 transitivePeerDependencies: - supports-color - typescript @@ -15280,7 +15696,7 @@ snapshots: object-inspect: 1.13.4 side-channel-map: 1.0.1 - side-channel@1.1.0: + side-channel@1.1.1: dependencies: es-errors: 1.3.0 object-inspect: 1.13.4 @@ -15314,18 +15730,18 @@ snapshots: uuid: 8.3.2 websocket-driver: 0.7.5 - sonarqube-scanner@4.3.6: + sonarqube-scanner@4.4.0: dependencies: adm-zip: 0.6.0 axios: 1.18.0 commander: 14.0.3 hpagent: 1.2.0 node-forge: 1.4.0 - properties-file: 4.0.0 + properties-file: 5.0.5 proxy-from-env: 2.1.0 semver: 7.5.2 slugify: 1.6.9 - tar-stream: 3.1.8 + tar-stream: 3.2.0 transitivePeerDependencies: - bare-abort-controller - bare-buffer @@ -15337,12 +15753,12 @@ snapshots: source-map-js@1.2.1: {} - source-map-loader@3.0.2(webpack@5.107.2(postcss@8.5.25)): + source-map-loader@3.0.2(webpack@5.109.2(postcss@8.5.25)): dependencies: abab: 2.0.6 iconv-lite: 0.6.3 source-map-js: 1.2.1 - webpack: 5.107.2(postcss@8.5.25) + webpack: 5.109.2(postcss@8.5.25) source-map-support@0.5.21: dependencies: @@ -15353,9 +15769,7 @@ snapshots: source-map@0.7.6: {} - source-map@0.8.0-beta.0: - dependencies: - whatwg-url: 7.1.0 + source-map@0.8.0: {} sourcemap-codec@1.4.8: {} @@ -15434,7 +15848,14 @@ snapshots: duplexer2: 0.1.4 readable-stream: 2.3.8 - streamx@2.26.0: + stream-parser@0.3.1: + dependencies: + debug: 2.6.9 + transitivePeerDependencies: + - supports-color + optional: true + + streamx@2.28.0: dependencies: events-universal: 1.0.1 fast-fifo: 1.3.2 @@ -15483,14 +15904,14 @@ snapshots: internal-slot: 1.1.0 regexp.prototype.flags: 1.5.4 set-function-name: 2.0.2 - side-channel: 1.1.0 + side-channel: 1.1.1 string.prototype.repeat@1.0.0: dependencies: define-properties: 1.2.1 es-abstract: 1.24.2 - string.prototype.trim@1.2.10: + string.prototype.trim@1.2.11: dependencies: call-bind: 1.0.9 call-bound: 1.0.4 @@ -15499,8 +15920,9 @@ snapshots: es-abstract: 1.24.2 es-object-atoms: 1.1.2 has-property-descriptors: 1.0.2 + safe-regex-test: 1.1.0 - string.prototype.trimend@1.0.9: + string.prototype.trimend@1.0.10: dependencies: call-bind: 1.0.9 call-bound: 1.0.4 @@ -15559,15 +15981,15 @@ snapshots: dependencies: escape-string-regexp: 1.0.5 - style-loader@3.3.4(webpack@5.107.2(postcss@8.5.25)): + style-loader@3.3.4(webpack@5.109.2(postcss@8.5.25)): dependencies: - webpack: 5.107.2(postcss@8.5.25) + webpack: 5.109.2(postcss@8.5.25) stylehacks@5.1.1(postcss@8.5.25): dependencies: - browserslist: 4.28.2 + browserslist: 4.28.7 postcss: 8.5.25 - postcss-selector-parser: 6.1.2 + postcss-selector-parser: 6.1.4 sucrase@3.35.1: dependencies: @@ -15607,7 +16029,7 @@ snapshots: css-tree: 1.1.3 csso: 4.2.0 picocolors: 1.1.1 - sax: 1.6.0 + sax: 1.6.1 stable: 0.1.8 symbol-tree@3.2.4: {} @@ -15633,7 +16055,7 @@ snapshots: postcss-js: 4.1.0(postcss@8.5.25) postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.25) postcss-nested: 6.2.0(postcss@8.5.25) - postcss-selector-parser: 6.1.2 + postcss-selector-parser: 6.1.4 resolve: 1.22.12 sucrase: 3.35.1 transitivePeerDependencies: @@ -15644,12 +16066,12 @@ snapshots: tapable@2.3.3: {} - tar-stream@3.1.8: + tar-stream@3.2.0: dependencies: b4a: 1.8.1 - bare-fs: 4.7.2 + bare-fs: 4.8.0 fast-fifo: 1.3.2 - streamx: 2.26.0 + streamx: 2.28.0 transitivePeerDependencies: - bare-abort-controller - bare-buffer @@ -15657,7 +16079,7 @@ snapshots: teex@1.0.1: dependencies: - streamx: 2.26.0 + streamx: 2.28.0 transitivePeerDependencies: - bare-abort-controller - react-native-b4a @@ -15685,20 +16107,20 @@ snapshots: ansi-escapes: 4.3.2 supports-hyperlinks: 2.3.0 - terser-webpack-plugin@5.6.1(postcss@8.5.25)(webpack@5.107.2(postcss@8.5.25)): + terser-webpack-plugin@5.6.1(postcss@8.5.25)(webpack@5.109.2(postcss@8.5.25)): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 - terser: 5.48.0 - webpack: 5.107.2(postcss@8.5.25) + terser: 5.49.2 + webpack: 5.109.2(postcss@8.5.25) optionalDependencies: postcss: 8.5.25 - terser@5.48.0: + terser@5.49.2: dependencies: '@jridgewell/source-map': 0.3.11 - acorn: 8.16.0 + acorn: 8.18.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -15743,8 +16165,8 @@ snapshots: tinyglobby@0.2.17: dependencies: - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 tmpl@1.0.5: {} @@ -15763,10 +16185,6 @@ snapshots: universalify: 0.2.0 url-parse: 1.5.10 - tr46@1.0.1: - dependencies: - punycode: 2.3.1 - tr46@2.1.0: dependencies: punycode: 2.3.1 @@ -15791,7 +16209,7 @@ snapshots: '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 '@types/node': 14.18.63 - acorn: 8.16.0 + acorn: 8.18.0 acorn-walk: 8.3.5 arg: 4.1.3 create-require: 1.1.1 @@ -15901,6 +16319,8 @@ snapshots: underscore@1.13.8: {} + undici-types@7.24.6: {} + unicode-canonical-property-names-ecmascript@2.0.1: {} unicode-match-property-ecmascript@2.0.0: @@ -15940,9 +16360,9 @@ snapshots: upath@1.2.0: {} - update-browserslist-db@1.2.3(browserslist@4.28.2): + update-browserslist-db@1.2.3(browserslist@4.28.7): dependencies: - browserslist: 4.28.2 + browserslist: 4.28.7 escalade: 3.2.0 picocolors: 1.1.1 @@ -15994,9 +16414,8 @@ snapshots: dependencies: makeerror: 1.0.12 - watchpack@2.5.1: + watchpack@2.5.2: dependencies: - glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 wbuf@1.7.3: @@ -16005,22 +16424,20 @@ snapshots: web-worker@1.5.0: {} - webidl-conversions@4.0.2: {} - webidl-conversions@5.0.0: {} webidl-conversions@6.1.0: {} - webpack-dev-middleware@5.3.4(webpack@5.107.2(postcss@8.5.25)): + webpack-dev-middleware@5.3.4(webpack@5.109.2(postcss@8.5.25)): dependencies: colorette: 2.0.20 memfs: 3.5.3 mime-types: 2.1.35 - range-parser: 1.2.1 + range-parser: 1.3.0 schema-utils: 4.3.3 - webpack: 5.107.2(postcss@8.5.25) + webpack: 5.109.2(postcss@8.5.25) - webpack-dev-server@4.15.2(webpack@5.107.2(postcss@8.5.25)): + webpack-dev-server@4.15.2(webpack@5.109.2(postcss@8.5.25)): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -16030,7 +16447,7 @@ snapshots: '@types/sockjs': 0.3.36 '@types/ws': 8.18.1 ansi-html-community: 0.0.8 - bonjour-service: 1.4.0 + bonjour-service: 1.4.4 chokidar: 3.6.0 colorette: 2.0.20 compression: 1.8.1 @@ -16039,8 +16456,8 @@ snapshots: express: 4.21.0 graceful-fs: 4.2.11 html-entities: 2.6.0 - http-proxy-middleware: 2.0.9(@types/express@4.17.25) - ipaddr.js: 2.4.0 + http-proxy-middleware: 2.0.10(@types/express@4.17.25) + ipaddr.js: 2.5.0 launch-editor: 2.14.1 open: 8.4.2 p-retry: 4.6.2 @@ -16050,20 +16467,20 @@ snapshots: serve-index: 1.9.2 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 5.3.4(webpack@5.107.2(postcss@8.5.25)) - ws: 8.21.0 + webpack-dev-middleware: 5.3.4(webpack@5.109.2(postcss@8.5.25)) + ws: 8.21.2 optionalDependencies: - webpack: 5.107.2(postcss@8.5.25) + webpack: 5.109.2(postcss@8.5.25) transitivePeerDependencies: - bufferutil - debug - supports-color - utf-8-validate - webpack-manifest-plugin@4.1.1(webpack@5.107.2(postcss@8.5.25)): + webpack-manifest-plugin@4.1.1(webpack@5.109.2(postcss@8.5.25)): dependencies: tapable: 2.3.3 - webpack: 5.107.2(postcss@8.5.25) + webpack: 5.109.2(postcss@8.5.25) webpack-sources: 2.3.1 webpack-merge@4.2.2: @@ -16080,33 +16497,30 @@ snapshots: source-list-map: 2.0.1 source-map: 0.6.1 - webpack-sources@3.5.0: {} + webpack-sources@3.5.1: {} - webpack@5.107.2(postcss@8.5.25): + webpack@5.109.2(postcss@8.5.25): dependencies: '@types/estree': 1.0.9 '@types/json-schema': 7.0.15 '@webassemblyjs/ast': 1.14.1 '@webassemblyjs/wasm-edit': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.16.0 - acorn-import-phases: 1.0.4(acorn@8.16.0) - browserslist: 4.28.2 + acorn: 8.18.0 + browserslist: 4.28.7 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.22.2 - es-module-lexer: 2.1.0 + enhanced-resolve: 5.24.5 + es-module-lexer: 2.3.1 eslint-scope: 5.1.1 events: 3.3.0 - glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 - loader-runner: 4.3.2 mime-db: 1.54.0 + minimizer-webpack-plugin: 5.6.1(postcss@8.5.25)(webpack@5.109.2(postcss@8.5.25)) neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.3 - terser-webpack-plugin: 5.6.1(postcss@8.5.25)(webpack@5.107.2(postcss@8.5.25)) - watchpack: 2.5.1 - webpack-sources: 3.5.0 + watchpack: 2.5.2 + webpack-sources: 3.5.1 transitivePeerDependencies: - '@minify-html/node' - '@swc/core' @@ -16129,6 +16543,8 @@ snapshots: websocket-extensions@0.1.4: {} + wgsl_reflect@1.5.0: {} + whatwg-encoding@1.0.5: dependencies: iconv-lite: 0.4.24 @@ -16137,12 +16553,6 @@ snapshots: whatwg-mimetype@2.3.0: {} - whatwg-url@7.1.0: - dependencies: - lodash.sortby: 4.7.0 - tr46: 1.0.1 - webidl-conversions: 4.0.2 - whatwg-url@8.7.0: dependencies: lodash: 4.18.1 @@ -16160,7 +16570,7 @@ snapshots: which-builtin-type@1.2.1: dependencies: call-bound: 1.0.4 - function.prototype.name: 1.1.8 + function.prototype.name: 1.2.0 has-tostringtag: 1.0.2 is-async-function: 2.1.1 is-date-object: 1.1.0 @@ -16171,7 +16581,7 @@ snapshots: isarray: 2.0.5 which-boxed-primitive: 1.1.1 which-collection: 1.0.2 - which-typed-array: 1.1.21 + which-typed-array: 1.1.22 which-collection@1.0.2: dependencies: @@ -16180,7 +16590,7 @@ snapshots: is-weakmap: 2.0.2 is-weakset: 2.0.4 - which-typed-array@1.1.21: + which-typed-array@1.1.22: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.9 @@ -16230,7 +16640,7 @@ snapshots: pretty-bytes: 5.6.0 rollup: 3.30.0 rollup-plugin-terser: 7.0.2(rollup@3.30.0) - source-map: 0.8.0-beta.0 + source-map: 0.8.0 stringify-object: 3.3.0 strip-comments: 2.0.1 tempy: 0.6.0 @@ -16310,12 +16720,12 @@ snapshots: workbox-sw@6.6.0: {} - workbox-webpack-plugin@6.6.0(@types/babel__core@7.20.5)(webpack@5.107.2(postcss@8.5.25)): + workbox-webpack-plugin@6.6.0(@types/babel__core@7.20.5)(webpack@5.109.2(postcss@8.5.25)): dependencies: fast-json-stable-stringify: 2.1.0 pretty-bytes: 5.6.0 upath: 1.2.0 - webpack: 5.107.2(postcss@8.5.25) + webpack: 5.109.2(postcss@8.5.25) webpack-sources: 1.4.3 workbox-build: 6.6.0(@types/babel__core@7.20.5) transitivePeerDependencies: @@ -16342,9 +16752,9 @@ snapshots: signal-exit: 3.0.7 typedarray-to-buffer: 3.1.5 - ws@7.5.11: {} + ws@7.5.13: {} - ws@8.21.0: {} + ws@8.21.2: {} xml-name-validator@3.0.0: {} @@ -16366,7 +16776,7 @@ snapshots: yargs-parser@21.1.1: {} - yargs@16.2.0: + yargs@16.2.2: dependencies: cliui: 7.0.4 escalade: 3.2.0 @@ -16376,7 +16786,7 @@ snapshots: y18n: 5.0.8 yargs-parser: 20.2.9 - yargs@17.7.2: + yargs@17.7.3: dependencies: cliui: 8.0.1 escalade: 3.2.0 @@ -16392,9 +16802,9 @@ snapshots: yocto-queue@1.2.2: {} - yoctocolors@2.1.2: {} + yoctocolors@2.2.0: {} - zarrita@0.7.3: + zarrita@0.7.4: dependencies: '@zarrita/storage': 0.2.0 numcodecs: 0.3.2 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index cd1888dd..e3e7d341 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -4,7 +4,12 @@ strictPeerDependencies: false allowBuilds: core-js: true core-js-pure: true + # Allow the git-hosted dicom-microscopy-viewer to run its prepare script, + # which builds dist/ when installed from a commit tarball. pnpm matches + # git-hosted packages by their exact tarball URL, so this entry must be + # updated whenever the dependency pin in package.json changes. dicom-microscopy-viewer: true + 'dicom-microscopy-viewer@https://codeload.github.com/ImagingDataCommons/dicom-microscopy-viewer/tar.gz/1b39614eae92e92578d14977f66ced60243e51bc': true overrides: '@types/d3-dispatch': 3.0.6 diff --git a/public/config/e2e.js b/public/config/e2e.js new file mode 100644 index 00000000..90028826 --- /dev/null +++ b/public/config/e2e.js @@ -0,0 +1,25 @@ +/** Config for local verification / e2e runs against the public IDC proxy. */ +window.config = { + path: '/', + servers: [ + { + id: 'e2e', + url: 'https://proxy.imaging.datacommons.cancer.gov/current/viewer-only-no-downloads-see-tinyurl-dot-com-slash-3j3d9jyp/dicomWeb', + write: false, + retry: { + retries: 6, + factor: 2, + minTimeout: 1000, + maxTimeout: 30000, + randomize: true, + retryableStatusCodes: [429, 500, 502, 503, 504] + } + } + ], + disableWorklist: false, + disableAnnotationTools: true, + enableServerSelection: false, + mode: 'light', + preload: true, + annotations: [] +} diff --git a/scripts/serve-e2e.mjs b/scripts/serve-e2e.mjs new file mode 100644 index 00000000..75222398 --- /dev/null +++ b/scripts/serve-e2e.mjs @@ -0,0 +1,136 @@ +#!/usr/bin/env node +/** + * Tiny SPA static file server for e2e / visual-regression runs. + * + * Serves the CRA `build/` directory on 127.0.0.1:3977 and falls back to + * index.html for unknown paths (required for deep links like /studies/...). + * + * Kept dependency-free on purpose: the `serve` package currently crashes + * under path-to-regexp v8 (`pathToRegExp.compile is not a function`), and + * pulling in another static-server package just to host a directory is not + * worth the risk of similar peer-dep breakage. + */ +import { createServer } from 'node:http' +import { existsSync } from 'node:fs' +import { open } from 'node:fs/promises' +import { extname, join, relative, resolve } from 'node:path' +import { fileURLToPath } from 'node:url' + +const HOST = process.env.E2E_HOST ?? '127.0.0.1' +const PORT = Number(process.env.E2E_PORT ?? 3977) +const ROOT = resolve( + process.env.E2E_BUILD_DIR ?? + join(fileURLToPath(new URL('.', import.meta.url)), '..', 'build'), +) + +const MIME = { + '.html': 'text/html; charset=utf-8', + '.js': 'application/javascript; charset=utf-8', + '.css': 'text/css; charset=utf-8', + '.json': 'application/json; charset=utf-8', + '.png': 'image/png', + '.jpg': 'image/jpeg', + '.jpeg': 'image/jpeg', + '.gif': 'image/gif', + '.svg': 'image/svg+xml', + '.ico': 'image/x-icon', + '.woff': 'font/woff', + '.woff2': 'font/woff2', + '.map': 'application/json', + '.txt': 'text/plain; charset=utf-8', + '.wasm': 'application/wasm', +} + +/** + * Resolve a request path under ROOT, rejecting anything that escapes it + * (including encoded `..` segments and absolute paths). + */ +function safeJoin(root, urlPath) { + const raw = (urlPath.split('?')[0] ?? '/').replace(/^\/+/, '') + let decoded + try { + decoded = decodeURIComponent(raw) + } catch { + return null + } + if (decoded.includes('\0')) { + return null + } + const candidate = resolve(root, decoded) + const rel = relative(root, candidate) + if (rel.startsWith('..') || rel.includes(`..${'/'}`) || rel.includes('..\\')) { + return null + } + return candidate +} + +/** + * Stream a regular file to the response. Returns true on success, false if the + * path is missing, not a file, or cannot be opened. Uses open()+fstat so we + * never call existsSync/statSync on a user-controlled path (Sonar S6549) and + * so directories are rejected cleanly (createReadStream on a dir can hang). + */ +async function trySendFile(res, filePath) { + let handle + try { + handle = await open(filePath, 'r') + const stats = await handle.stat() + if (!stats.isFile()) { + await handle.close() + handle = undefined + return false + } + const type = + MIME[extname(filePath).toLowerCase()] ?? 'application/octet-stream' + res.writeHead(200, { + 'Content-Type': type, + 'Cache-Control': 'no-store', + }) + // Stream owns the fd (autoClose); clear our handle so we don't double-close. + const stream = handle.createReadStream() + handle = undefined + stream.pipe(res) + return true + } catch { + if (handle != null) { + await handle.close().catch(() => undefined) + } + return false + } +} + +if (!existsSync(ROOT)) { + process.stderr.write(`[serve-e2e] build directory not found: ${ROOT}\n`) + process.stderr.write('Run `pnpm run build:e2e` first.\n') + process.exit(1) +} + +const SPA_INDEX = join(ROOT, 'index.html') + +const server = createServer((req, res) => { + void (async () => { + const urlPath = req.url ?? '/' + const filePath = safeJoin(ROOT, urlPath) + if (filePath == null) { + res.writeHead(400).end('Bad Request') + return + } + + if (await trySendFile(res, filePath)) { + return + } + + // SPA fallback for client-side routes like /studies/... + if (await trySendFile(res, SPA_INDEX)) { + return + } + + res.writeHead(404).end('Not Found') + })() +}) + +server.listen(PORT, HOST, () => { + process.stdout.write( + `[serve-e2e] serving ${ROOT} at http://${HOST}:${PORT}\n`, + ) +}) diff --git a/src/components/AnnotationGroupItem.tsx b/src/components/AnnotationGroupItem.tsx index caec9519..d8dbfe3e 100644 --- a/src/components/AnnotationGroupItem.tsx +++ b/src/components/AnnotationGroupItem.tsx @@ -170,6 +170,10 @@ interface AnnotationGroupItemProps { measurement?: dcmjs.sr.coding.CodedConcept } }) => void + getMeasurementRange?: ( + annotationGroupUID: string, + measurement: dcmjs.sr.coding.CodedConcept, + ) => { min: number; max: number } | null } interface AnnotationGroupItemState { @@ -369,14 +373,20 @@ class AnnotationGroupItem extends React.Component< ? String(option[0].children[0]) : String(option[0].children), }) + const range = this.props.getMeasurementRange?.( + this.props.annotationGroup.uid, + measurement, + ) + const limitValues = range != null ? [range.min, range.max] : undefined this.props.onStyleChange({ uid: this.props.annotationGroup.uid, - styleOptions: { measurement }, + styleOptions: { measurement, limitValues }, }) this.setState((state) => ({ currentStyle: { opacity: state.currentStyle.opacity, measurement, + limitValues, }, })) } else { @@ -384,6 +394,8 @@ class AnnotationGroupItem extends React.Component< uid: this.props.annotationGroup.uid, styleOptions: { color: this.props.defaultStyle.color, + /** Explicitly clear so the viewer deactivates measurement filtering. */ + measurement: undefined, }, }) this.setState((state) => ({ diff --git a/src/components/AnnotationGroupList.tsx b/src/components/AnnotationGroupList.tsx index afcb1c3b..9ba1a770 100644 --- a/src/components/AnnotationGroupList.tsx +++ b/src/components/AnnotationGroupList.tsx @@ -37,8 +37,13 @@ interface AnnotationGroupListProps { opacity?: number color?: number[] measurement?: dcmjs.sr.coding.CodedConcept + limitValues?: number[] } }) => void + getMeasurementRange?: ( + annotationGroupUID: string, + measurement: dcmjs.sr.coding.CodedConcept, + ) => { min: number; max: number } | null } /** @@ -83,6 +88,7 @@ class AnnotationGroupList extends React.Component< defaultStyle={this.props.defaultAnnotationGroupStyles[uid]} onVisibilityChange={this.props.onAnnotationGroupVisibilityChange} onStyleChange={this.props.onAnnotationGroupStyleChange} + getMeasurementRange={this.props.getMeasurementRange} /> ), } diff --git a/src/components/SlideViewer.tsx b/src/components/SlideViewer.tsx index 8639c913..e809430b 100644 --- a/src/components/SlideViewer.tsx +++ b/src/components/SlideViewer.tsx @@ -4,7 +4,6 @@ import { Descriptions, Divider, Drawer, - InputNumber, Layout, Menu, message, @@ -237,7 +236,6 @@ class SlideViewer extends React.Component { clients: this.props.clients, slide: this.props.slide, preload: this.props.preload, - clusteringPixelSizeThreshold: undefined, // Auto (zoom-based) by default }) this.volumeViewer = volumeViewer this.labelViewer = labelViewer @@ -298,8 +296,6 @@ class SlideViewer extends React.Component { isSegmentationInterpolationEnabled: false, isParametricMapInterpolationEnabled: true, customizedSegmentColors: {}, - clusteringPixelSizeThreshold: null, // null means auto (zoom-based) - isClusteringEnabled: true, // Clustering enabled by default isSettingsDrawerOpen: false, } @@ -400,9 +396,6 @@ class SlideViewer extends React.Component { clients: this.props.clients, slide: this.props.slide, preload: this.props.preload, - clusteringPixelSizeThreshold: this.state.isClusteringEnabled - ? (this.state.clusteringPixelSizeThreshold ?? undefined) - : undefined, }) this.volumeViewer = volumeViewer this.labelViewer = labelViewer @@ -2925,6 +2918,29 @@ class SlideViewer extends React.Component { /** * Handle change of annotation group style. */ + getAnnotationGroupMeasurementRange = ( + annotationGroupUID: string, + measurement: dcmjs.sr.coding.CodedConcept, + ): { min: number; max: number } | null => { + const viewer = this.volumeViewer as dmv.viewer.VolumeImageViewer & { + getAnnotationGroupMeasurementRange?: ( + uid: string, + measurement?: dcmjs.sr.coding.CodedConcept, + ) => { min: number; max: number } | null + } + if (typeof viewer.getAnnotationGroupMeasurementRange !== 'function') { + return null + } + try { + return viewer.getAnnotationGroupMeasurementRange( + annotationGroupUID, + measurement, + ) + } catch { + return null + } + } + handleAnnotationGroupStyleChange = ({ uid, styleOptions, @@ -2934,11 +2950,36 @@ class SlideViewer extends React.Component { opacity?: number color?: number[] measurement?: dcmjs.sr.coding.CodedConcept + limitValues?: number[] } }): void => { logger.log(`change style of annotation group ${uid}`) try { - this.volumeViewer.setAnnotationGroupStyle(uid, styleOptions) + const viewer = this.volumeViewer as dmv.viewer.VolumeImageViewer & { + getAnnotationGroupMeasurementRange?: ( + uid: string, + measurement?: dcmjs.sr.coding.CodedConcept, + ) => { min: number; max: number } | null + } + let nextStyle = { ...styleOptions } + if ( + styleOptions.measurement != null && + styleOptions.limitValues == null && + typeof viewer.getAnnotationGroupMeasurementRange === 'function' + ) { + /** May be null until the viewer has fetched measurement values. */ + const range = viewer.getAnnotationGroupMeasurementRange( + uid, + styleOptions.measurement, + ) + if (range != null) { + nextStyle = { + ...nextStyle, + limitValues: [range.min, range.max], + } + } + } + viewer.setAnnotationGroupStyle(uid, nextStyle) } catch (error) { // eslint-disable-next-line @typescript-eslint/no-floating-promises NotificationMiddleware.onError( @@ -3662,71 +3703,6 @@ class SlideViewer extends React.Component { ).toggleParametricMapInterpolation() } - /** - * Handler that toggles clustering on/off. - */ - handleClusteringToggle = (checked: boolean): void => { - /** Ensure checked is a boolean */ - const newValue = Boolean(checked) - - /** Use functional setState to ensure we have the latest state */ - this.setState((prevState) => { - /** Don't update if the value hasn't actually changed */ - if (prevState.isClusteringEnabled === newValue) { - return null - } - - /** When turning ON with Auto (null/undefined), use viewer default so clustering is enabled; undefined means "clustering off" in the viewer */ - const threshold = newValue - ? (prevState.clusteringPixelSizeThreshold ?? 0.001) - : undefined - - /** - * Update viewer options immediately with the new state - * Check if viewer exists and has the method before calling - */ - if ( - this.volumeViewer !== null && - this.volumeViewer !== undefined && - typeof ( - this.volumeViewer as unknown as { - setAnnotationOptions?(opts: object): void - } - ).setAnnotationOptions === 'function' - ) { - try { - ;( - this.volumeViewer as unknown as { - setAnnotationOptions(opts: object): void - } - ).setAnnotationOptions({ - clusteringPixelSizeThreshold: threshold, - }) - } catch (error) { - console.error('Failed to update annotation options:', error) - } - } - - return { isClusteringEnabled: newValue } - }) - } - - /** - * Handler that updates the global clustering pixel size threshold. - */ - handleClusteringPixelSizeThresholdChange = (value: number | null): void => { - this.setState({ clusteringPixelSizeThreshold: value }) - if (this.state.isClusteringEnabled) { - ;( - this.volumeViewer as unknown as { - setAnnotationOptions?(opts: object): void - } - ).setAnnotationOptions?.({ - clusteringPixelSizeThreshold: value ?? undefined, - }) - } - } - formatAnnotation = (annotation: AnnotationCategoryAndType): void => { const roi = this.volumeViewer.getROI(annotation.uid) const key = getRoiKey(roi) as string @@ -4351,6 +4327,7 @@ class SlideViewer extends React.Component { onAnnotationGroupStyleChange={ this.handleAnnotationGroupStyleChange } + getMeasurementRange={this.getAnnotationGroupMeasurementRange} /> )} @@ -4688,51 +4665,6 @@ class SlideViewer extends React.Component { ) const segmentationItems: React.ReactNode[] = [] - segmentationItems.push( -
- Clustering - -
, - ) - segmentationItems.push( -
-
- Clustering Pixel Size Threshold (mm) -
- -
- When pixel size ≤ threshold, clustering is disabled. Leave empty for - zoom-based detection. -
-
, - ) if ( menus.segmentationInterpolationMenu !== null && menus.segmentationInterpolationMenu !== undefined diff --git a/src/components/SlideViewer/types.ts b/src/components/SlideViewer/types.ts index d460fcff..66cbdd54 100644 --- a/src/components/SlideViewer/types.ts +++ b/src/components/SlideViewer/types.ts @@ -126,7 +126,5 @@ export interface SlideViewerState { isSegmentationInterpolationEnabled: boolean isParametricMapInterpolationEnabled: boolean customizedSegmentColors: { [segmentUID: string]: number[] } - clusteringPixelSizeThreshold: number | null - isClusteringEnabled: boolean isSettingsDrawerOpen: boolean } diff --git a/src/components/SlideViewer/utils/viewerUtils.ts b/src/components/SlideViewer/utils/viewerUtils.ts index 077cba39..7e0480a7 100644 --- a/src/components/SlideViewer/utils/viewerUtils.ts +++ b/src/components/SlideViewer/utils/viewerUtils.ts @@ -20,12 +20,10 @@ export const constructViewers = ({ clients, slide, preload, - clusteringPixelSizeThreshold, }: { clients: { [key: string]: dwc.api.DICOMwebClient } slide: Slide preload?: boolean - clusteringPixelSizeThreshold?: number }): { volumeViewer: dmv.viewer.VolumeImageViewer labelViewer?: dmv.viewer.LabelImageViewer @@ -48,10 +46,6 @@ export const constructViewers = ({ */ useTileGridResolutions: false, preload, - annotationOptions: - clusteringPixelSizeThreshold !== undefined - ? { clusteringPixelSizeThreshold } - : undefined, errorInterceptor: (error: CustomError) => { NotificationMiddleware.onError(NotificationMiddlewareContext.DMV, error) },