diff --git a/docs/README.md b/docs/README.md index 79feef70..44bed4bf 100644 --- a/docs/README.md +++ b/docs/README.md @@ -62,7 +62,7 @@ Core runtime technologies: | Layer | Current implementation | | --- | --- | | API | FastAPI app mounted at `/api/v1`, with Swagger at `/api/docs` and OpenAPI JSON at `/api/openapi.json`. | -| Public web app | React, React Router, TypeScript, Vite, MUI, Leaflet, GeoBlacklight frontend components, and H3 map visualization. | +| Public web app | React, React Router, TypeScript, Vite, MUI, Leaflet, `ogm-viewer` resource previews, GeoBlacklight Leaflet layers for homepage previews, and H3 map visualization. | | Search | Elasticsearch with versioned index builds and alias swaps through `scripts/reindex_atomic.py`. | | Database | ParadeDB/PostgreSQL, SQLAlchemy table metadata in `backend/db/models.py`, script-based migrations in `backend/db/migrations/`. | | Cache | Redis plus durable database caches for generated API responses, resource representations, and visual assets. | diff --git a/docs/frontend/README.md b/docs/frontend/README.md index d38819d6..57a4edde 100644 --- a/docs/frontend/README.md +++ b/docs/frontend/README.md @@ -24,6 +24,10 @@ Features: - [Homepage Map Visualization](homepage-map.md) - H3 hex map, featured carousel, preview layers, and Allmaps behavior. +- Resource-page item previews use the `ogm-viewer` web components with the + Aardvark record already returned by the resource API. Vite leaves the + components un-prebundled and resolves their runtime theme and icon assets in + development, then emits those assets during production builds. Configuration: @@ -39,8 +43,8 @@ The frontend stack currently uses: - TypeScript, Vite 7, and React Router dev tooling. - Vitest 3, Testing Library, `happy-dom`, axe, and pa11y for tests and accessibility checks. -- Material UI 7, Tailwind, Leaflet, GeoBlacklight frontend components, Allmaps, - H3, Recharts, and Lucide icons. +- Material UI 7, Tailwind, Leaflet, `ogm-viewer`, GeoBlacklight Leaflet layers + for homepage previews, Allmaps, H3, Recharts, and Lucide icons. ## Quick Commands diff --git a/frontend/app/providers.tsx b/frontend/app/providers.tsx index 6eacbed5..d97f9722 100644 --- a/frontend/app/providers.tsx +++ b/frontend/app/providers.tsx @@ -1,4 +1,4 @@ -import React, { useEffect } from 'react'; +import React from 'react'; import { ApiProvider } from '../src/context/ApiContext'; import { BookmarkProvider } from '../src/context/BookmarkContext'; import { DebugProvider } from '../src/context/DebugContext'; @@ -7,88 +7,15 @@ import { ThemeProvider } from '../src/context/ThemeContext'; import type { ThemeId } from '../src/config/institution'; import { TurnstileGate } from '../src/components/security/TurnstileGate'; -/** - * App providers + client-side boot for GeoBlacklight (Stimulus). - * - * We keep this intentionally simple: - * - Start Stimulus once - * - Import GeoBlacklight core once (it registers its own controllers/listeners) - * - Trigger GeoBlacklight activation on initial load and on route changes - */ export function Providers({ children, initialThemeId, - locationKey, turnstilePreview = false, }: { children: React.ReactNode; initialThemeId?: ThemeId; - locationKey?: string; turnstilePreview?: boolean; }) { - useEffect(() => { - // Only runs in the browser - if (typeof window === 'undefined') return; - - let cancelled = false; - - async function boot() { - if (cancelled) return; - try { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const g = globalThis as any; - - // Start Stimulus once and expose it globally (GeoBlacklight expects `Stimulus`). - if (!g.Stimulus) { - const { Application } = await import('@hotwired/stimulus'); - g.Stimulus = Application.start(); - (window as any).Stimulus = g.Stimulus; - } - - // Mirador is embedded via an iframe (see ResourceViewer) so we intentionally do NOT - // register a Stimulus controller for it. This avoids any possibility of Mirador code - // affecting the parent page. - - // Import GeoBlacklight core once; it registers its own controllers and listeners. - if (!g.GeoblacklightCore) { - const mod = - await import('@geoblacklight/frontend/app/javascript/geoblacklight/core'); - g.GeoblacklightCore = (mod as any).default ?? mod; - } - - // GeoBlacklight uses DOMContentLoaded / Turbo events; in our SSR+SPA environment, - // those may not fire at the right time. Trigger activation on initial load + navigation. - if (typeof g.GeoblacklightCore?.activate === 'function') { - // Some initializers assume specific DOM nodes exist and can throw if they don't. - // Never let that take down the app or interfere with the viewer. - // Defer one tick so the new route's DOM is committed before initializers run. - setTimeout(() => { - try { - g.GeoblacklightCore.activate( - new Event('react-router:navigation') - ); - } catch (err) { - // eslint-disable-next-line no-console - console.warn('GeoBlacklight activation failed:', err); - } - }, 0); - } - } catch (err) { - // eslint-disable-next-line no-console - console.warn('GeoBlacklight boot failed:', err); - } - } - - boot().catch((err) => { - // eslint-disable-next-line no-console - console.warn('GeoBlacklight boot failed:', err); - }); - - return () => { - cancelled = true; - }; - }, [locationKey]); - return ( diff --git a/frontend/app/root.tsx b/frontend/app/root.tsx index 797686e5..9b70bbe1 100644 --- a/frontend/app/root.tsx +++ b/frontend/app/root.tsx @@ -153,7 +153,6 @@ export default function Root() { ) : ( diff --git a/frontend/package-lock.json b/frontend/package-lock.json index abf03aa2..8a2460fe 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -36,6 +36,7 @@ "lucide-react": "^0.544.0", "mirador": "4.0.0", "mirador-dl-plugin": "1.0.0", + "ogm-viewer": "0.10.0", "opentelemetry-instrumentation-remix": "^0.8.0", "react": "^19.2.6", "react-dom": "^19.2.6", @@ -115,30 +116,60 @@ "license": "MIT" }, "node_modules/@allmaps/annotation": { - "version": "1.0.0-beta.36", - "resolved": "https://registry.npmjs.org/@allmaps/annotation/-/annotation-1.0.0-beta.36.tgz", - "integrity": "sha512-8f79ItFD4TxFfyVJ4Wo96Qayxz2Gizy8XZ0u/10YRFWgDV2ZnQAGfSlZh3ITW1759npYQzruRzyeU68D1RXOPA==", + "version": "1.0.0-beta.37", + "resolved": "https://registry.npmjs.org/@allmaps/annotation/-/annotation-1.0.0-beta.37.tgz", + "integrity": "sha512-KupGu59+pbwefd7x5Og3CzJiiMvot/DN7vkC7IXhOgCYMlMwMslq2mfRRyfQvFQ/FxZJqH152ZwPRz81M9XbGw==", + "license": "MIT", + "dependencies": { + "zod": "^4.3.6" + } + }, + "node_modules/@allmaps/annotation/node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/@allmaps/bearing": { + "version": "1.0.0-beta.12", + "resolved": "https://registry.npmjs.org/@allmaps/bearing/-/bearing-1.0.0-beta.12.tgz", + "integrity": "sha512-GQrpV3aiiz7lLt1SULUgoAHjcuwgY/EovbPFbr2YW/xykSJ6BJAWPALLmloNke8lHvdZbiy1Fy32TsrrbjDhbw==", "license": "MIT", "dependencies": { - "zod": "^3.22.4" + "@allmaps/annotation": "^1.0.0-beta.37", + "@allmaps/project": "^1.0.0-beta.9", + "@allmaps/stdlib": "^1.0.0-beta.41", + "@allmaps/transform": "^1.0.0-beta.52" } }, "node_modules/@allmaps/id": { - "version": "1.0.0-beta.37", - "resolved": "https://registry.npmjs.org/@allmaps/id/-/id-1.0.0-beta.37.tgz", - "integrity": "sha512-6hODPDzFPgCUX26JJABRMqlOHCZB+sN5nrzvN//z7ukfDqaXDM6L95LODc9vAzs85TVHIUYPIYvpiDQbpkL1Qg==", + "version": "1.0.0-beta.38", + "resolved": "https://registry.npmjs.org/@allmaps/id/-/id-1.0.0-beta.38.tgz", + "integrity": "sha512-POedcGDJxqpxI9UicmQF5DxfzgsBFIT5ZyKyaJCJ6Kf9P6j6RX7iPhrUEpDG1HQGOQDbwIu7rwMWf8KjHhHh1g==", "license": "ISC", "engines": { "node": ">=v19.0.0" } }, "node_modules/@allmaps/iiif-parser": { - "version": "1.0.0-beta.47", - "resolved": "https://registry.npmjs.org/@allmaps/iiif-parser/-/iiif-parser-1.0.0-beta.47.tgz", - "integrity": "sha512-GG9Oz2MIzdB4B8x/t2UuNx1Lc0Im7oHnGZoFLjNUeSuzq53m1/wLTEgvxQKabH4JVUMSXlPVZHc7BzO+eE7r0Q==", + "version": "1.0.0-beta.48", + "resolved": "https://registry.npmjs.org/@allmaps/iiif-parser/-/iiif-parser-1.0.0-beta.48.tgz", + "integrity": "sha512-4wjmhbmIqT8gjA9ukJWSzpIU0AhSN8pJHPcOpN2QjBUqJ6Qo262wlJML7iEwqWY4s7yR4TfqI6CASmscUHf4bg==", "license": "MIT", "dependencies": { - "zod": "^3.24.1" + "zod": "^4.3.6" + } + }, + "node_modules/@allmaps/iiif-parser/node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" } }, "node_modules/@allmaps/leaflet": { @@ -153,46 +184,61 @@ "leaflet": "^1.9.4" } }, + "node_modules/@allmaps/maplibre": { + "version": "1.0.0-beta.43", + "resolved": "https://registry.npmjs.org/@allmaps/maplibre/-/maplibre-1.0.0-beta.43.tgz", + "integrity": "sha512-iT+VMiv9vi3kVuHwbNaf5MA5BVD7m8RphEXk3BKfw4wJqgmP+Li6syK+QEiAfEPLpNUH3XoaLpvPqUZJAv45Qg==", + "license": "MIT", + "dependencies": { + "@allmaps/bearing": "^1.0.0-beta.12", + "@allmaps/project": "^1.0.0-beta.9", + "@allmaps/render": "^1.0.0-beta.83", + "@allmaps/stdlib": "^1.0.0-beta.41", + "@allmaps/warpedmaplayer": "^1.0.0-beta.43", + "maplibre-gl": "^5.16" + } + }, "node_modules/@allmaps/project": { - "version": "1.0.0-beta.8", - "resolved": "https://registry.npmjs.org/@allmaps/project/-/project-1.0.0-beta.8.tgz", - "integrity": "sha512-NFz4C69HwFUPEitan2I0hm5lvKlk9xRDNdvnwbo7I/J06+vLMJWGFqKEkReBwC583BxroByeUTa732cG/UaadQ==", + "version": "1.0.0-beta.9", + "resolved": "https://registry.npmjs.org/@allmaps/project/-/project-1.0.0-beta.9.tgz", + "integrity": "sha512-IVmlvLCMIOKsfGO10Ul1lXrssvJyKzOcAF/3+U2RZXVQMRIC4nfpOGrgWZGrY36YaJI+pih6rvgS77+S1+QYOw==", "license": "MIT", "dependencies": { - "@allmaps/stdlib": "^1.0.0-beta.40", - "@allmaps/transform": "^1.0.0-beta.51", + "@allmaps/stdlib": "^1.0.0-beta.41", + "@allmaps/transform": "^1.0.0-beta.52", "proj4": "^2.20.0" } }, "node_modules/@allmaps/render": { - "version": "1.0.0-beta.82", - "resolved": "https://registry.npmjs.org/@allmaps/render/-/render-1.0.0-beta.82.tgz", - "integrity": "sha512-M/zg0xeeeRXlTYozKo6Uw0OMZ+uLLH7S5plNWF4THxSSRBjXjCrzaiAVI/xklqtBW6CCe2QF4pxIkJWgUN3HWg==", - "license": "MIT", - "dependencies": { - "@allmaps/annotation": "^1.0.0-beta.36", - "@allmaps/id": "^1.0.0-beta.37", - "@allmaps/iiif-parser": "^1.0.0-beta.47", - "@allmaps/project": "^1.0.0-beta.8", - "@allmaps/stdlib": "^1.0.0-beta.40", - "@allmaps/tailwind": "^1.0.0-beta.20", - "@allmaps/transform": "^1.0.0-beta.51", - "@allmaps/triangulate": "^1.0.0-beta.32", - "@allmaps/types": "^1.0.0-beta.22", + "version": "1.0.0-beta.83", + "resolved": "https://registry.npmjs.org/@allmaps/render/-/render-1.0.0-beta.83.tgz", + "integrity": "sha512-psSkzbA3Lld5fJ1ei5BCIDnWdqkHWwmnyjiySOFE50UUdUEwRmjevwSOyLF5D2UjmNPss0/VF5UYHtmhHDdPkg==", + "license": "MIT", + "dependencies": { + "@allmaps/annotation": "^1.0.0-beta.37", + "@allmaps/id": "^1.0.0-beta.38", + "@allmaps/iiif-parser": "^1.0.0-beta.48", + "@allmaps/project": "^1.0.0-beta.9", + "@allmaps/stdlib": "^1.0.0-beta.41", + "@allmaps/tailwind": "^1.0.0-beta.21", + "@allmaps/transform": "^1.0.0-beta.52", + "@allmaps/triangulate": "^1.0.0-beta.33", + "@allmaps/types": "^1.0.0-beta.23", "comlink": "^4.4.1", "lodash-es": "^4.17.21", "point-in-polygon-hao": "^1.2.4", + "proj4": "^2.20.0", "rbush": "^4.0.0" } }, "node_modules/@allmaps/stdlib": { - "version": "1.0.0-beta.40", - "resolved": "https://registry.npmjs.org/@allmaps/stdlib/-/stdlib-1.0.0-beta.40.tgz", - "integrity": "sha512-KanrEDClErcu6bSd+4kDsRW8rO6P9hHO6n2WJxmZYpbUzUQ1gPBWv1+AB0sxAMoK1hwV3NPkqtvNEJ12M3NETw==", + "version": "1.0.0-beta.41", + "resolved": "https://registry.npmjs.org/@allmaps/stdlib/-/stdlib-1.0.0-beta.41.tgz", + "integrity": "sha512-NCsH52fElzNB8Ui9A/+FZQrxzP+P1z8l/DMx8YtF/E10Z2WHHlgSD2vnbqas5FqH5MI/HX3XtJwfPslzD/aquA==", "license": "MIT", "dependencies": { - "@allmaps/annotation": "^1.0.0-beta.36", - "@allmaps/iiif-parser": "^1.0.0-beta.47", + "@allmaps/annotation": "^1.0.0-beta.37", + "@allmaps/iiif-parser": "^1.0.0-beta.48", "@turf/rewind": "^7.2.0", "@types/lodash-es": "^4.17.12", "hex-rgb": "^5.0.0", @@ -203,51 +249,50 @@ } }, "node_modules/@allmaps/tailwind": { - "version": "1.0.0-beta.20", - "resolved": "https://registry.npmjs.org/@allmaps/tailwind/-/tailwind-1.0.0-beta.20.tgz", - "integrity": "sha512-kUM2qH4EurYmKbk4yW2ni7J/pZqCnOK/XdaSXeVqREfkWNynrH5di/j3byxtqD1+xYBeI/Fft4JTShKWrZZedA==", + "version": "1.0.0-beta.21", + "resolved": "https://registry.npmjs.org/@allmaps/tailwind/-/tailwind-1.0.0-beta.21.tgz", + "integrity": "sha512-rDqyoiCKCnDPS5mHmM8RqB0kxQiD6hFSlUpAQsvJgZ+GFh8Oj2PMgWRml8V4SGupzVZZoEmenYNDKIdPsKjx/w==", "license": "MIT" }, "node_modules/@allmaps/transform": { - "version": "1.0.0-beta.51", - "resolved": "https://registry.npmjs.org/@allmaps/transform/-/transform-1.0.0-beta.51.tgz", - "integrity": "sha512-tX241cGwMrSFse7vAUO7GRDinHzMy3Pv9Ik/S8ZZQGdjxQHPsKvK7X56NXLUGfsrk7Ls/TjqN9R5Pzo1NnpUng==", + "version": "1.0.0-beta.52", + "resolved": "https://registry.npmjs.org/@allmaps/transform/-/transform-1.0.0-beta.52.tgz", + "integrity": "sha512-ZgIEWJcBk07S652v+DtsJCVMZJSz7Sf4+nW+WeZIrfXRzO2hmyro7D7ZKFsFeyx3g5uuKy5tP8aLEk+WOTISJw==", "license": "MIT", "dependencies": { - "@allmaps/stdlib": "^1.0.0-beta.40", - "@turf/distance": "^7.2.0", - "@turf/midpoint": "^7.2.0", + "@allmaps/stdlib": "^1.0.0-beta.41", "ml-matrix": "^6.12.0" } }, "node_modules/@allmaps/triangulate": { - "version": "1.0.0-beta.32", - "resolved": "https://registry.npmjs.org/@allmaps/triangulate/-/triangulate-1.0.0-beta.32.tgz", - "integrity": "sha512-I8BOLOhPNW4H3+OvgTvBBie0tT3QdjqJbw4SgoFvlVYbPZQPwMWUU6sRGB9kpuww8vGICTkODBZsC6E+jtmx0w==", + "version": "1.0.0-beta.33", + "resolved": "https://registry.npmjs.org/@allmaps/triangulate/-/triangulate-1.0.0-beta.33.tgz", + "integrity": "sha512-J421DxpLLpRnilIJF7A4D63fr6VFNe1a9TBDUiHyNdOMkCJhrBHh8KsTXIe2JYTysVJwuHBox1fxPQZcGw8ovA==", "license": "MIT", "dependencies": { - "@allmaps/stdlib": "^1.0.0-beta.40", - "@allmaps/types": "^1.0.0-beta.22", + "@allmaps/stdlib": "^1.0.0-beta.41", + "@allmaps/types": "^1.0.0-beta.23", "@kninnug/constrainautor": "^4.0.1", "delaunator": "^5.0.1", - "point-in-polygon-hao": "^1.2.4" + "kdbush": "^4.1.0", + "robust-predicates": "^3.0.3" } }, "node_modules/@allmaps/types": { - "version": "1.0.0-beta.22", - "resolved": "https://registry.npmjs.org/@allmaps/types/-/types-1.0.0-beta.22.tgz", - "integrity": "sha512-93XNs2YoKoxzlx9eGsu4+h67pZ39QE5/N2OWdWjsrqcfOLJw3vWb9x2LjoMrWEl7hkB2raY71gbyqtkoGIfKiw==", + "version": "1.0.0-beta.23", + "resolved": "https://registry.npmjs.org/@allmaps/types/-/types-1.0.0-beta.23.tgz", + "integrity": "sha512-pRnkcXGBppzc190NY1NTVQ79qDdQquJFSiXdXOIfzY/UVvdfwDMH27g5Bf7Tnk/eTRrfa/UtoWguUv1vlKa/7A==", "license": "MIT" }, "node_modules/@allmaps/warpedmaplayer": { - "version": "1.0.0-beta.42", - "resolved": "https://registry.npmjs.org/@allmaps/warpedmaplayer/-/warpedmaplayer-1.0.0-beta.42.tgz", - "integrity": "sha512-OnJ/A4AWg/0BeCz5Hf1MrAxwddr4mWsAYKr358FjRGCT+SBXtv75o5se0Hbjl8fuRt8Z32fM8p/nJL8IOexGug==", + "version": "1.0.0-beta.43", + "resolved": "https://registry.npmjs.org/@allmaps/warpedmaplayer/-/warpedmaplayer-1.0.0-beta.43.tgz", + "integrity": "sha512-ebdkDKl4M4JtDevNQldjpUwZL3zHjLuqN0ToKT3YakHiTXHdEC1Htpx9bdqiFOgP5I7m3qqElKvLyCo1m6Fz6Q==", "license": "MIT", "dependencies": { - "@allmaps/project": "^1.0.0-beta.8", - "@allmaps/render": "^1.0.0-beta.82", - "@allmaps/stdlib": "^1.0.0-beta.40" + "@allmaps/project": "^1.0.0-beta.9", + "@allmaps/render": "^1.0.0-beta.83", + "@allmaps/stdlib": "^1.0.0-beta.41" } }, "node_modules/@alloc/quick-lru": { @@ -445,6 +490,48 @@ "dev": true, "license": "MIT" }, + "node_modules/@awesome.me/webawesome": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/@awesome.me/webawesome/-/webawesome-3.11.0.tgz", + "integrity": "sha512-WM8kyP+AdAT3/zwNpc/YzN3Nu5pRD6ksREFZAct/DIn6KMnQs8lPVfiPbJrOpKMk8OaSnQX19iiwFGjoswXVXw==", + "license": "MIT", + "dependencies": { + "@ctrl/tinycolor": "4.1.0", + "@floating-ui/dom": "^1.6.13", + "@konnorr/qr-creator": "^1.0.1", + "@lit-labs/ssr": "^4.1.0", + "@lit-labs/ssr-client": "^1.1.8", + "@lit/context": "^1.1.6", + "@lit/react": "^1.0.8", + "@shoelace-style/animations": "^1.2.0", + "@shoelace-style/localize": "^3.2.3", + "composed-offset-position": "^0.0.6", + "lit": "^3.2.1", + "marked": "^11.2.0", + "nanoid": "^5.1.5" + }, + "engines": { + "node": ">=14.17.0" + } + }, + "node_modules/@awesome.me/webawesome/node_modules/nanoid": { + "version": "5.1.16", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.16.tgz", + "integrity": "sha512-kVrnsrJqMR8+oLJnGEmSWw9BivK5mt7H3FZatVRjrc5wGqFYuBxX1yG7+A7Gi5AefkX6t/oCkizcQgpu0cY1dQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^18 || >=20" + } + }, "node_modules/@axe-core/react": { "version": "4.11.1", "resolved": "https://registry.npmjs.org/@axe-core/react/-/react-4.11.1.tgz", @@ -2140,6 +2227,60 @@ "dev": true, "license": "MIT" }, + "node_modules/@chunkd/middleware": { + "version": "11.3.1", + "resolved": "https://registry.npmjs.org/@chunkd/middleware/-/middleware-11.3.1.tgz", + "integrity": "sha512-BMvxd2Zfb0zhcZUjLera/9ozt1CKcpS71LjekNtJwOxeMN4AJ4DJK8gev9erHX5ZnwBsjbq1VnZSm2TxEFhv1Q==", + "license": "MIT", + "dependencies": { + "@chunkd/source": "^11.4.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@chunkd/source": { + "version": "11.4.1", + "resolved": "https://registry.npmjs.org/@chunkd/source/-/source-11.4.1.tgz", + "integrity": "sha512-R4/gIKbx059Am4UOYplEjKkE6g9jhDQF4M7jKNkMZR8Toeudr9vQl0z9ppb9fkTQIuvW8oKjO0Hc5/s4RCCCzg==", + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@chunkd/source-http": { + "version": "11.4.1", + "resolved": "https://registry.npmjs.org/@chunkd/source-http/-/source-http-11.4.1.tgz", + "integrity": "sha512-h/7tWxFh6EUh5k/pcYh66WSwiVbIWM6mCCLH0TZpBSWzgekjOXqXkEMRUBXrhekqrmtPQdTPro5e7tnknIdESg==", + "license": "MIT", + "dependencies": { + "@chunkd/source": "^11.4.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@chunkd/source-memory": { + "version": "11.2.1", + "resolved": "https://registry.npmjs.org/@chunkd/source-memory/-/source-memory-11.2.1.tgz", + "integrity": "sha512-+WDp5x71OqfFm2AbX4ev9xn+HhP8SAfUAdTsDQtiO8sR65abZAkZ6GK0laOK5p24tA72dhCaUIVrFC8swVgFiQ==", + "license": "MIT", + "dependencies": { + "@chunkd/source": "^11.4.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@cogeotiff/core": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/@cogeotiff/core/-/core-9.5.0.tgz", + "integrity": "sha512-BsBlk8UGq9b8aIlUliKweS2V48KK8O3xORjd+IZLBxErr0kHP1WmWnqBRG+JcmNGoPMaE4lUHl/YVbY9UHLr+A==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, "node_modules/@colors/colors": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", @@ -2305,6 +2446,15 @@ "node": ">=20.19.0" } }, + "node_modules/@ctrl/tinycolor": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-4.1.0.tgz", + "integrity": "sha512-WyOx8cJQ+FQus4Mm4uPIZA64gbk3Wxh0so5Lcii0aJifqwoVOlfFtorjLE0Hen4OYyHZMXDWqMmaQemBhgxFRQ==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, "node_modules/@custom-react-hooks/use-element-size": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/@custom-react-hooks/use-element-size/-/use-element-size-1.5.1.tgz", @@ -2325,6 +2475,268 @@ "kuler": "^2.0.0" } }, + "node_modules/@deck.gl/core": { + "version": "9.3.10", + "resolved": "https://registry.npmjs.org/@deck.gl/core/-/core-9.3.10.tgz", + "integrity": "sha512-BAJ6r+eRV4euuGcIi2SnlzrodgZ+sD2VuXsoL1DER0LwwKXmKmQu6WA8ax6DB9KFsBghLVoTUN5zaCGF6uKHuQ==", + "license": "MIT", + "dependencies": { + "@loaders.gl/core": "^4.4.3", + "@loaders.gl/images": "^4.4.3", + "@luma.gl/core": "^9.3.5", + "@luma.gl/engine": "^9.3.5", + "@luma.gl/shadertools": "^9.3.5", + "@luma.gl/webgl": "^9.3.5", + "@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.6.4", + "gl-matrix": "^3.0.0", + "mjolnir.js": "^3.0.0" + } + }, + "node_modules/@deck.gl/extensions": { + "version": "9.3.10", + "resolved": "https://registry.npmjs.org/@deck.gl/extensions/-/extensions-9.3.10.tgz", + "integrity": "sha512-VT5NxR+SgUCwvaWeKFKkql5HV90KjyiPyXYlzKfxxXoE8wxlOgt5Enl2MTAOLcIhlCymLp9vtWO/HEgTfvlzDw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@luma.gl/shadertools": "^9.3.5", + "@luma.gl/webgl": "^9.3.5", + "@math.gl/core": "^4.1.0" + }, + "peerDependencies": { + "@deck.gl/core": "~9.3.0", + "@luma.gl/core": "~9.3.5", + "@luma.gl/engine": "~9.3.5" + } + }, + "node_modules/@deck.gl/geo-layers": { + "version": "9.3.10", + "resolved": "https://registry.npmjs.org/@deck.gl/geo-layers/-/geo-layers-9.3.10.tgz", + "integrity": "sha512-MH6/MyWTiJ02yxrkMz6bMP1Z8d13JEmxogwZmWx2I9XLDNpCnLxnXElnVxxvDvhIbWdWq/i/xl8Kn9WOLiywBg==", + "license": "MIT", + "dependencies": { + "@loaders.gl/3d-tiles": "^4.4.3", + "@loaders.gl/gis": "^4.4.3", + "@loaders.gl/loader-utils": "^4.4.3", + "@loaders.gl/mvt": "^4.4.3", + "@loaders.gl/schema": "^4.4.3", + "@loaders.gl/terrain": "^4.4.3", + "@loaders.gl/tiles": "^4.4.3", + "@loaders.gl/wms": "^4.4.3", + "@luma.gl/gltf": "^9.3.5", + "@luma.gl/shadertools": "^9.3.5", + "@math.gl/core": "^4.1.0", + "@math.gl/culling": "^4.1.0", + "@math.gl/web-mercator": "^4.1.0", + "@types/geojson": "^7946.0.8", + "a5-js": "^0.7.2", + "h3-js": "^4.4.0", + "long": "^3.2.0" + }, + "peerDependencies": { + "@deck.gl/core": "~9.3.0", + "@deck.gl/extensions": "~9.3.0", + "@deck.gl/layers": "~9.3.0", + "@deck.gl/mesh-layers": "~9.3.0", + "@loaders.gl/core": "^4.4.3", + "@luma.gl/core": "~9.3.5", + "@luma.gl/engine": "~9.3.5" + } + }, + "node_modules/@deck.gl/geo-layers/node_modules/long": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", + "integrity": "sha512-ZYvPPOMqUwPoDsbJaR10iQJYnMuZhRTvHYl62ErLIEX7RgFlziSBUUvrt3OVfc47QlHHpzPZYP17g3Fv7oeJkg==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/@deck.gl/layers": { + "version": "9.3.10", + "resolved": "https://registry.npmjs.org/@deck.gl/layers/-/layers-9.3.10.tgz", + "integrity": "sha512-F9CRJlRWXvTKlgjKmmTotm0cA5V7I1zMtdnwJbjBZTyCJ4skuskbIIt6f+BSQ+rSxM2uW4q5/8VkcCJ2SePhXg==", + "license": "MIT", + "dependencies": { + "@loaders.gl/images": "^4.4.3", + "@loaders.gl/schema": "^4.4.3", + "@luma.gl/shadertools": "^9.3.5", + "@mapbox/tiny-sdf": "^2.0.5", + "@math.gl/core": "^4.1.0", + "@math.gl/polygon": "^4.1.0", + "@math.gl/web-mercator": "^4.1.0", + "@types/geojson": "^7946.0.16", + "earcut": "^2.2.4" + }, + "peerDependencies": { + "@deck.gl/core": "~9.3.0", + "@loaders.gl/core": "^4.4.3", + "@luma.gl/core": "~9.3.5", + "@luma.gl/engine": "~9.3.5" + } + }, + "node_modules/@deck.gl/mapbox": { + "version": "9.3.10", + "resolved": "https://registry.npmjs.org/@deck.gl/mapbox/-/mapbox-9.3.10.tgz", + "integrity": "sha512-go5+imfjdq/+P5ELMX88ncuzNSpUpL4wolV7LbegwXnKcBIgU13IKbCxJnoGCSW8oxHZu+J99sGDcDyvkYtZcw==", + "license": "MIT", + "dependencies": { + "@math.gl/web-mercator": "^4.1.0" + }, + "peerDependencies": { + "@deck.gl/core": "~9.3.0", + "@luma.gl/core": "~9.3.5", + "@math.gl/web-mercator": "^4.1.0" + } + }, + "node_modules/@deck.gl/mesh-layers": { + "version": "9.3.10", + "resolved": "https://registry.npmjs.org/@deck.gl/mesh-layers/-/mesh-layers-9.3.10.tgz", + "integrity": "sha512-HzExbHWQ05fU7YgXcCQPHjHKoMc2PTWUTu3THzdXc5HXhGqpiAd/X1YA7McA9fRJBjw1yD36otMwGEXqUOEKAA==", + "license": "MIT", + "dependencies": { + "@loaders.gl/gltf": "^4.4.3", + "@loaders.gl/schema": "^4.4.3", + "@luma.gl/gltf": "^9.3.5", + "@luma.gl/shadertools": "^9.3.5" + }, + "peerDependencies": { + "@deck.gl/core": "~9.3.0", + "@luma.gl/core": "~9.3.5", + "@luma.gl/engine": "~9.3.5", + "@luma.gl/gltf": "~9.3.5", + "@luma.gl/shadertools": "~9.3.5" + } + }, + "node_modules/@developmentseed/affine": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@developmentseed/affine/-/affine-0.7.0.tgz", + "integrity": "sha512-O00T3nLFY8DiEqTIpKzEDc6wyVLth4DoFc0gPE6EiaEdFM4lQsQnH8x5mrknDB7jeLyKW2aPnNyBxoPqS7JKHA==", + "license": "MIT" + }, + "node_modules/@developmentseed/deck.gl-geotiff": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@developmentseed/deck.gl-geotiff/-/deck.gl-geotiff-0.7.0.tgz", + "integrity": "sha512-HfeXC14btr1P0SsN9yFhNKCA4j9ZDNfSUa6LaZKFeTQB739C6t1Bxn1OM5wDHrHv6wdcq4CcdYPI0ZiClI9bSA==", + "license": "MIT", + "dependencies": { + "@cogeotiff/core": "^9.5.0", + "@developmentseed/affine": "^0.7.0", + "@developmentseed/deck.gl-raster": "^0.7.0", + "@developmentseed/geotiff": "^0.7.0", + "@developmentseed/morecantile": "^0.7.0", + "@developmentseed/proj": "^0.7.0", + "@developmentseed/raster-reproject": "^0.7.0", + "flatbush": "^4.5.1", + "proj4": "^2.20.8" + }, + "peerDependencies": { + "@deck.gl/core": "^9.3.0", + "@deck.gl/geo-layers": "^9.3.0", + "@deck.gl/layers": "^9.3.0", + "@deck.gl/mesh-layers": "^9.3.0", + "@luma.gl/core": "^9.3.2" + } + }, + "node_modules/@developmentseed/deck.gl-raster": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@developmentseed/deck.gl-raster/-/deck.gl-raster-0.7.0.tgz", + "integrity": "sha512-I9X81fus7r9MoOZUwMj6GAR24diPGlMT2ep3N5vQOnmfntT+kGSLYX1EEkO6jwKBO0roOMrqb/8U2JkPhtT/gQ==", + "license": "MIT", + "dependencies": { + "@developmentseed/affine": "^0.7.0", + "@developmentseed/proj": "^0.7.0", + "@developmentseed/raster-reproject": "^0.7.0", + "@math.gl/core": "^4.1.0", + "@math.gl/culling": "^4.1.0", + "@math.gl/web-mercator": "^4.1.0" + }, + "peerDependencies": { + "@deck.gl/core": "^9.3.0", + "@deck.gl/geo-layers": "^9.3.0", + "@deck.gl/layers": "^9.3.0", + "@deck.gl/mesh-layers": "^9.3.0", + "@developmentseed/morecantile": "^0.7.0", + "@luma.gl/core": "^9.3.2", + "@luma.gl/shadertools": "^9.3.2" + } + }, + "node_modules/@developmentseed/geotiff": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@developmentseed/geotiff/-/geotiff-0.7.0.tgz", + "integrity": "sha512-KnTJ7ZRzg7laiNRlfuslNN4EmM8lvOp4h7Y/RTyojCmiDycJxT0tbo7gMDjFPSvys5tWxoR/9WGPLKyipkzRiQ==", + "license": "MIT", + "dependencies": { + "@chunkd/middleware": "^11.3.0", + "@chunkd/source": "^11.4.0", + "@chunkd/source-http": "^11.4.0", + "@chunkd/source-memory": "^11.2.0", + "@cogeotiff/core": "^9.5.0", + "@developmentseed/affine": "^0.7.0", + "@developmentseed/lzw-tiff-decoder": "^0.2.2", + "@developmentseed/morecantile": "^0.7.0", + "@developmentseed/proj": "^0.7.0", + "fzstd": "^0.1.1", + "lerc": "^4.1.1", + "uuid": "^14.0.0" + } + }, + "node_modules/@developmentseed/geotiff/node_modules/lerc": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lerc/-/lerc-4.2.0.tgz", + "integrity": "sha512-5TeQPWq2xnHjaxkTrskOG+Ove9pWRGFMKlofBx2hPORFHmIMhyoYWC5zMUJ9mibq0e5tqTZR/dvyAMZ3F6yCqw==", + "license": "Apache-2.0" + }, + "node_modules/@developmentseed/geotiff/node_modules/uuid": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.2.tgz", + "integrity": "sha512-xZe/16rV4aa+HGSOCiY2YeLT1OybRLrrkL/Rqaq7p7GMVXjFh+6wN4oMYgjFmnSnhY8t6Xpdl2l9qmnHYuMHwQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist-node/bin/uuid" + } + }, + "node_modules/@developmentseed/lzw-tiff-decoder": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@developmentseed/lzw-tiff-decoder/-/lzw-tiff-decoder-0.2.2.tgz", + "integrity": "sha512-bsBIdV1LyqcrtnYtIYu3C/297X2wxeYkmmhHzR02OOX823sGxT8GLGdenTmwoXvNWkozk3b+ptXtJeSUmNPaTA==", + "license": "MIT" + }, + "node_modules/@developmentseed/morecantile": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@developmentseed/morecantile/-/morecantile-0.7.0.tgz", + "integrity": "sha512-m9tWDase9COlP/EZ2KK/ydraRU/5yfwvmF/y/2g/iFMFW1vYHQTW/8JYjmo84SiJXUifDDY2xoA3ErYlcWJctg==", + "license": "MIT", + "dependencies": { + "@developmentseed/affine": "^0.7.0" + } + }, + "node_modules/@developmentseed/proj": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@developmentseed/proj/-/proj-0.7.0.tgz", + "integrity": "sha512-3EPvX29sM3iCn+avpGKz18ZzlRJdn53SbkmFWJXDWh/fNreP3RjcDJGBbvfwnZnVtiLUqnTzM8V4fLKnYHKj0A==", + "license": "MIT", + "dependencies": { + "wkt-parser": "1.5.5" + } + }, + "node_modules/@developmentseed/raster-reproject": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@developmentseed/raster-reproject/-/raster-reproject-0.7.0.tgz", + "integrity": "sha512-2tZzANK0nZIV3Y5E2qYhbNtdjN04LKQYECPZsGii1r5ylGySoKjh3oJzVBCKfRq/PTEZTtVol0r7krmT6Ry8fQ==", + "license": "MIT" + }, "node_modules/@edsilv/http-status-codes": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@edsilv/http-status-codes/-/http-status-codes-1.0.3.tgz", @@ -3202,6 +3614,31 @@ } } }, + "node_modules/@floating-ui/core": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.8.0.tgz", + "integrity": "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.12" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.8.0.tgz", + "integrity": "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.8.0", + "@floating-ui/utils": "^0.2.12" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.12.tgz", + "integrity": "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==", + "license": "MIT" + }, "node_modules/@geoblacklight/frontend": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@geoblacklight/frontend/-/frontend-5.1.0.tgz", @@ -3221,6 +3658,70 @@ "ol-pmtiles": "^0.3.0" } }, + "node_modules/@geomatico/maplibre-cog-protocol": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@geomatico/maplibre-cog-protocol/-/maplibre-cog-protocol-0.9.2.tgz", + "integrity": "sha512-vG6z5EdV4Q20PhpGBdbtQdss/zfeGbok4Qu2s3XhD/xI7/TWA+CAoYuunjoYrdSonsLp02dakWbm22JOpQ+GzA==", + "license": "MIT", + "dependencies": { + "@mapbox/sphericalmercator": "^2.0.2", + "d3-scale": "^4.0.2", + "geotiff": "^3.0.5", + "quick-lru": "^7.1.0" + }, + "peerDependencies": { + "maplibre-gl": "^4.5.0 || ^5.0.0 || ^6.0.0" + } + }, + "node_modules/@geomatico/maplibre-cog-protocol/node_modules/geotiff": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/geotiff/-/geotiff-3.0.5.tgz", + "integrity": "sha512-OWcL9S9+yDZ6iAlXMt32T1iwUApJM8UiD47xbm6ZP1h33d10fqkPs14EG/ttT5EnefpZSx3G15iDFC5FxUNUwA==", + "license": "MIT", + "dependencies": { + "@petamoriken/float16": "^3.9.3", + "lerc": "^3.0.0", + "pako": "^2.0.4", + "parse-headers": "^2.0.2", + "quick-lru": "^6.1.1", + "web-worker": "^1.5.0", + "xml-utils": "^1.10.2", + "zstddec": "^0.2.0" + }, + "engines": { + "node": ">=10.19" + } + }, + "node_modules/@geomatico/maplibre-cog-protocol/node_modules/geotiff/node_modules/quick-lru": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-6.1.2.tgz", + "integrity": "sha512-AAFUA5O1d83pIHEhJwWCq/RQcRukCkn/NSm2QsTEMle5f2hP0ChI2+3Xb051PZCkLryI/Ir1MVKviT2FIloaTQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@geomatico/maplibre-cog-protocol/node_modules/quick-lru": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-7.3.0.tgz", + "integrity": "sha512-k9lSsjl36EJdK7I06v7APZCbyGT2vMTsYSRX1Q2nbYmnkBqgUhRkAuzH08Ciotteu/PLJmIF2+tti7o3C/ts2g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@geomatico/maplibre-cog-protocol/node_modules/zstddec": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/zstddec/-/zstddec-0.2.0.tgz", + "integrity": "sha512-oyPnDa1X5c13+Y7mA/FDMNJrn4S8UNBe0KCqtDmor40Re7ALrPN6npFwyYVRRh+PqozZQdeg23QtbcamZnG5rA==", + "license": "MIT AND BSD-3-Clause" + }, "node_modules/@github/auto-complete-element": { "version": "3.8.0", "resolved": "https://registry.npmjs.org/@github/auto-complete-element/-/auto-complete-element-3.8.0.tgz", @@ -3396,6 +3897,24 @@ "url": "https://github.com/sponsors/nzakas" } }, + "node_modules/@iiif/presentation-2": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@iiif/presentation-2/-/presentation-2-1.0.4.tgz", + "integrity": "sha512-hJakpq62VBajesLJrYPtFm6hcn6c/HkKP7CmKZ5atuzu40m0nifWYsqigR1l9sZGvhhHb/DRshPmiW/0GNrJoA==", + "license": "MIT", + "peerDependencies": { + "@iiif/presentation-3": "*" + } + }, + "node_modules/@iiif/presentation-3": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@iiif/presentation-3/-/presentation-3-2.2.3.tgz", + "integrity": "sha512-xCLbUr9euqegsrxGe65M2fWbv6gKpiUhHXCpOn+V+qtawkMbOSNWbYOISo2aLQdYVg4DGYD0g2bMzSCF33uNOQ==", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.10" + } + }, "node_modules/@iiif/vocabulary": { "version": "1.0.31", "resolved": "https://registry.npmjs.org/@iiif/vocabulary/-/vocabulary-1.0.31.tgz", @@ -3826,111 +4345,941 @@ "node": ">=12" } }, - "node_modules/@isaacs/fs-minipass": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", - "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@js-sdsl/ordered-map": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", + "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, + "node_modules/@kninnug/constrainautor": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@kninnug/constrainautor/-/constrainautor-4.1.0.tgz", + "integrity": "sha512-YEkGtzMewRxPRZuK1QmFDmELwaSL4LSLmc0WXTmpT8AqdcR/Ueu77fiJZ2lwOwXUX8aBJpHuy/e/06/Ve2dPNQ==", + "license": "ISC", + "dependencies": { + "robust-predicates": "^3.0.1" + } + }, + "node_modules/@konnorr/qr-creator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@konnorr/qr-creator/-/qr-creator-1.1.0.tgz", + "integrity": "sha512-6Ae3AfG45MOqF9Qde+1YxIxKf/GUsRmcriV7iCb/HaR+Mk1YDFYP3RINDRMI8z8YMWW3BnSthOujX9RoOex/Kw==", + "license": "MIT" + }, + "node_modules/@krozamdev/overlapping-marker-spiderfier": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@krozamdev/overlapping-marker-spiderfier/-/overlapping-marker-spiderfier-0.2.8.tgz", + "integrity": "sha512-qm9w6gg8eQJjbAiFS3UCrhEMDjfefd3kF/DJO6tRTxSyIc0DONCXjF9o3tPhnxJLUIyfo0ue+CR97zuqXsuytw==", + "license": "MIT", + "peerDependencies": { + "leaflet": "^1.7.1" + } + }, + "node_modules/@lit-labs/ssr": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@lit-labs/ssr/-/ssr-4.1.0.tgz", + "integrity": "sha512-m0zymVVlHB1ddJQ1lastsV8ROW3whFOiHJhVPQWd04MnGTkTlUUVLQctux1QlyD9BtLXNN6iASxv388vhgKMFg==", + "license": "BSD-3-Clause", + "dependencies": { + "@lit-labs/ssr-client": "^1.1.7", + "@lit-labs/ssr-dom-shim": "^1.6.0", + "@lit/reactive-element": "^2.0.4", + "@parse5/tools": "^0.3.0", + "enhanced-resolve": "^5.10.0", + "lit": "^3.1.2", + "lit-element": "^4.0.4", + "lit-html": "^3.1.2", + "node-fetch": "^3.2.8", + "parse5": "^7.1.1" + }, + "engines": { + "node": ">=13.9.0" + }, + "peerDependencies": { + "@types/node": ">=20.0.0 <25.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@lit-labs/ssr-client": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@lit-labs/ssr-client/-/ssr-client-1.1.8.tgz", + "integrity": "sha512-PjGh81oKsoI64m3IDjTqqjhC7dr2uC/o0jrllUb5gRAyp/RlAHxapgJrjq9kWz97faCHLQ8jUlTi6tGm+8fgyA==", + "license": "BSD-3-Clause", + "dependencies": { + "@lit/reactive-element": "^2.0.4", + "lit": "^3.1.2", + "lit-html": "^3.1.2" + } + }, + "node_modules/@lit-labs/ssr-dom-shim": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.6.0.tgz", + "integrity": "sha512-VHb0ALPMTlgKjM6yIxxoQNnpKyUKLD04VzeQdsiXkMqkvYlAHxq9glGLmgbb889/1GsohSOAjvQYoiBppXFqrQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@lit-labs/ssr/node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/@lit-labs/ssr/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/@lit-labs/ssr/node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/@lit-labs/ssr/node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/@lit/context": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@lit/context/-/context-1.1.6.tgz", + "integrity": "sha512-M26qDE6UkQbZA2mQ3RjJ3Gzd8TxP+/0obMgE5HfkfLhEEyYE3Bui4A5XHiGPjy0MUGAyxB3QgVuw2ciS0kHn6A==", + "license": "BSD-3-Clause", + "dependencies": { + "@lit/reactive-element": "^1.6.2 || ^2.1.0" + } + }, + "node_modules/@lit/react": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@lit/react/-/react-1.0.8.tgz", + "integrity": "sha512-p2+YcF+JE67SRX3mMlJ1TKCSTsgyOVdAwd/nxp3NuV1+Cb6MWALbN6nT7Ld4tpmYofcE5kcaSY1YBB9erY+6fw==", + "license": "BSD-3-Clause", + "peerDependencies": { + "@types/react": "17 || 18 || 19" + } + }, + "node_modules/@lit/reactive-element": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.1.2.tgz", + "integrity": "sha512-pbCDiVMnne1lYUIaYNN5wrwQXDtHaYtg7YEFPeW+hws6U47WeFvISGUWekPGKWOP1ygrs0ef0o1VJMk1exos5A==", + "license": "BSD-3-Clause", + "dependencies": { + "@lit-labs/ssr-dom-shim": "^1.5.0" + } + }, + "node_modules/@loaders.gl/3d-tiles": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@loaders.gl/3d-tiles/-/3d-tiles-4.4.5.tgz", + "integrity": "sha512-+W9ncpVw5+OX9pjhZFmpbK+pBqT1XNCAaUbUY/qItFlK1PcTSQdy34NVvAziRR7dFxJ0VmWPEu5Q75LcNCCX2A==", + "license": "MIT", + "dependencies": { + "@loaders.gl/compression": "4.4.5", + "@loaders.gl/crypto": "4.4.5", + "@loaders.gl/draco": "4.4.5", + "@loaders.gl/gltf": "4.4.5", + "@loaders.gl/images": "4.4.5", + "@loaders.gl/loader-utils": "4.4.5", + "@loaders.gl/math": "4.4.5", + "@loaders.gl/tiles": "4.4.5", + "@loaders.gl/zip": "4.4.5", + "@math.gl/core": "^4.1.0", + "@math.gl/culling": "^4.1.0", + "@math.gl/geospatial": "^4.1.0", + "@probe.gl/log": "^4.1.1", + "long": "^5.2.1" + }, + "peerDependencies": { + "@loaders.gl/core": "~4.4.0" + } + }, + "node_modules/@loaders.gl/compression": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@loaders.gl/compression/-/compression-4.4.5.tgz", + "integrity": "sha512-vsuvdIyn3xLqiJxXhK970ENO3T8bLPtmM0jka8/y0zVAEover6q3Vd8gVsaqgWGfc28cWx5RYI4zKhJzRcTHNg==", + "license": "MIT", + "dependencies": { + "@loaders.gl/loader-utils": "4.4.5", + "@loaders.gl/worker-utils": "4.4.5", + "@types/pako": "^1.0.1", + "fflate": "0.7.4", + "pako": "1.0.11", + "snappyjs": "^0.6.1" + }, + "optionalDependencies": { + "@types/brotli": "^1.3.0", + "brotli": "^1.3.2", + "lz4js": "^0.2.0", + "zstd-codec": "^0.1" + }, + "peerDependencies": { + "@loaders.gl/core": "~4.4.0" + } + }, + "node_modules/@loaders.gl/compression/node_modules/fflate": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.7.4.tgz", + "integrity": "sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw==", + "license": "MIT" + }, + "node_modules/@loaders.gl/compression/node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "license": "(MIT AND Zlib)" + }, + "node_modules/@loaders.gl/core": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@loaders.gl/core/-/core-4.4.5.tgz", + "integrity": "sha512-hlpE200MinDAyU0kMjEM4yk+0TDxiB9nT+GcwOCrXc7buE0e0YwTn+Ynz2Q85dwDKvJZw3kNHTTBGvQwq9533A==", + "license": "MIT", + "dependencies": { + "@loaders.gl/loader-utils": "4.4.5", + "@loaders.gl/schema": "4.4.5", + "@loaders.gl/schema-utils": "4.4.5", + "@loaders.gl/worker-utils": "4.4.5", + "@probe.gl/log": "^4.1.1" + } + }, + "node_modules/@loaders.gl/crypto": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@loaders.gl/crypto/-/crypto-4.4.5.tgz", + "integrity": "sha512-P0n43KWN7GGsWF7+E094Nj1mwngN6ypfgts5tu2hSEroUS5dB01TgDa0Pr3sVeZ672jFSKKRgRuFDazRcITOFA==", + "license": "MIT", + "dependencies": { + "@loaders.gl/loader-utils": "4.4.5", + "@loaders.gl/worker-utils": "4.4.5", + "@types/crypto-js": "^4.0.2" + }, + "peerDependencies": { + "@loaders.gl/core": "~4.4.0" + } + }, + "node_modules/@loaders.gl/draco": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@loaders.gl/draco/-/draco-4.4.5.tgz", + "integrity": "sha512-J4DuzoUQNJhjxmErCArF5J1PC0LCMbhPkY/YdkTaDmUwxSQdh1M/VWg85AXKLAxUiwGkhmC8AUUaSyPxTpCUrQ==", + "license": "MIT", + "dependencies": { + "@loaders.gl/loader-utils": "4.4.5", + "@loaders.gl/schema": "4.4.5", + "@loaders.gl/schema-utils": "4.4.5", + "@loaders.gl/worker-utils": "4.4.5", + "draco3d": "1.5.7" + }, + "peerDependencies": { + "@loaders.gl/core": "~4.4.0" + } + }, + "node_modules/@loaders.gl/geoarrow": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@loaders.gl/geoarrow/-/geoarrow-4.4.5.tgz", + "integrity": "sha512-uUWp+5nZxQe6Sv/o36R6jcmCCNhguY0VhjougyMoH6FWqF6iJHrOnwx5UdEtvkw/zV9mHabs05Hv91dBvhfljQ==", + "license": "MIT", + "dependencies": { + "@math.gl/polygon": "^4.1.0", + "apache-arrow": ">= 17.0.0" + }, + "peerDependencies": { + "@loaders.gl/core": "~4.4.0" + } + }, + "node_modules/@loaders.gl/gis": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@loaders.gl/gis/-/gis-4.4.5.tgz", + "integrity": "sha512-r3klnZ6jjzaEZlUSCmGufPbH1pQpM5PCcGS70zLlGIFbpJPo80gaXDtZDVOSQvpWmqY8u8d7/6moAsogVoymzA==", + "license": "MIT", + "dependencies": { + "@loaders.gl/geoarrow": "4.4.5", + "@loaders.gl/loader-utils": "4.4.5", + "@loaders.gl/schema": "4.4.5", + "@loaders.gl/schema-utils": "4.4.5", + "@mapbox/vector-tile": "^1.3.1", + "@math.gl/polygon": "^4.1.0", + "pbf": "^3.2.1" + }, + "peerDependencies": { + "@loaders.gl/core": "~4.4.0" + } + }, + "node_modules/@loaders.gl/gltf": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@loaders.gl/gltf/-/gltf-4.4.5.tgz", + "integrity": "sha512-YIhgeoDYdRbfXQS+cpRWYbiRiiaajF5UCqpEoFpDEpOpcW6pKC2sfp5vZ1LiUIXu2CVv/HFJaDeLuQjeX5uVlQ==", + "license": "MIT", + "dependencies": { + "@loaders.gl/draco": "4.4.5", + "@loaders.gl/images": "4.4.5", + "@loaders.gl/loader-utils": "4.4.5", + "@loaders.gl/schema": "4.4.5", + "@loaders.gl/textures": "4.4.5", + "@math.gl/core": "^4.1.0", + "meshoptimizer": "^1.2.0" + }, + "peerDependencies": { + "@loaders.gl/core": "~4.4.0" + } + }, + "node_modules/@loaders.gl/images": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@loaders.gl/images/-/images-4.4.5.tgz", + "integrity": "sha512-7/odHt5n67OVLHelTm1euNNw5gCwycezQI7Wg3NBUg7q3bHWmTPY++Z4uz2egiuzJNY3GLegfg8AI1c3fD64Jw==", + "license": "MIT", + "dependencies": { + "@loaders.gl/loader-utils": "4.4.5" + }, + "peerDependencies": { + "@loaders.gl/core": "~4.4.0" + } + }, + "node_modules/@loaders.gl/loader-utils": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@loaders.gl/loader-utils/-/loader-utils-4.4.5.tgz", + "integrity": "sha512-c4h2RUMEru+hbfvgZEIy5cLQKyQka2TPQZW/2Wy+yIPr3FU7RKwfp+vLwIfir6Xkdn2zniWyWretZwE02aY/Ug==", + "license": "MIT", + "dependencies": { + "@loaders.gl/schema": "4.4.5", + "@loaders.gl/worker-utils": "4.4.5", + "@probe.gl/log": "^4.1.1", + "@probe.gl/stats": "^4.1.1" + } + }, + "node_modules/@loaders.gl/math": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@loaders.gl/math/-/math-4.4.5.tgz", + "integrity": "sha512-Az7rMw7oMNMzi1bXgPaabdkpPtk0safkWBr+I+dHjZHzny1RK5mFF4VjRkalw++DZBKbL0TskMw/OcdiRaL/Bw==", + "license": "MIT", + "dependencies": { + "@math.gl/core": "^4.1.0" + }, + "peerDependencies": { + "@loaders.gl/core": "~4.4.0" + } + }, + "node_modules/@loaders.gl/mvt": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@loaders.gl/mvt/-/mvt-4.4.5.tgz", + "integrity": "sha512-3c4ojvF6+Fb0XjX2xGeRKIUAshaNgBfi0VkszooFNCNvrVv7faGcn69jI9wh1Pjf2ge1PtsZnAoOuLQXLLzWSQ==", + "license": "MIT", + "dependencies": { + "@loaders.gl/gis": "4.4.5", + "@loaders.gl/images": "4.4.5", + "@loaders.gl/loader-utils": "4.4.5", + "@loaders.gl/schema": "4.4.5", + "@loaders.gl/schema-utils": "4.4.5", + "@math.gl/polygon": "^4.1.0", + "@probe.gl/stats": "^4.1.1", + "pbf": "^3.2.1" + }, + "peerDependencies": { + "@loaders.gl/core": "~4.4.0" + } + }, + "node_modules/@loaders.gl/schema": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@loaders.gl/schema/-/schema-4.4.5.tgz", + "integrity": "sha512-q2XNquegw+hX+ZEshacKYL/+FKBUIS5FHA+2Ft3JWmcNiR6umGnYCdXQhDcFCqAm8Ks87fMCV+z/zTloxaIZgQ==", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.7", + "apache-arrow": ">= 17.0.0" + } + }, + "node_modules/@loaders.gl/schema-utils": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@loaders.gl/schema-utils/-/schema-utils-4.4.5.tgz", + "integrity": "sha512-vi6AROLWvoLIN609tVmchwotTaHK5rHv8SWjoVUWLhPCXmIc9npz0rCl7NJScCgr7UjYifZG1rWOnrAxaYTlyA==", + "license": "MIT", + "dependencies": { + "@loaders.gl/schema": "4.4.5", + "@math.gl/types": "^4.1.0", + "@types/geojson": "^7946.0.7", + "apache-arrow": ">= 17.0.0" + }, + "peerDependencies": { + "@loaders.gl/core": "~4.4.0" + } + }, + "node_modules/@loaders.gl/terrain": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@loaders.gl/terrain/-/terrain-4.4.5.tgz", + "integrity": "sha512-H8BED2/0I1wrviE8mBr1ny/01nK1vqctMHBYSoAHS36JJm5m+Tt2JfKXIgnNY2TU3Ulfr9L9x1VfH9a/z9V1jw==", + "license": "MIT", + "dependencies": { + "@loaders.gl/images": "4.4.5", + "@loaders.gl/loader-utils": "4.4.5", + "@loaders.gl/schema": "4.4.5", + "@mapbox/martini": "^0.2.0" + }, + "peerDependencies": { + "@loaders.gl/core": "~4.4.0" + } + }, + "node_modules/@loaders.gl/textures": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@loaders.gl/textures/-/textures-4.4.5.tgz", + "integrity": "sha512-zB9xMIKiU3tQN6q5/A6yaXw/DbodA+bqMDTVu7pzk4lw4zcBwWiGtD5LV0QjgtlTj2ZnwV8cCd1rYk9bwiX2Bw==", + "license": "MIT", + "dependencies": { + "@loaders.gl/images": "4.4.5", + "@loaders.gl/loader-utils": "4.4.5", + "@loaders.gl/schema": "4.4.5", + "@loaders.gl/worker-utils": "4.4.5", + "@math.gl/types": "^4.1.0", + "ktx-parse": "^0.7.0", + "texture-compressor": "^1.0.2" + }, + "peerDependencies": { + "@loaders.gl/core": "~4.4.0" + } + }, + "node_modules/@loaders.gl/tiles": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@loaders.gl/tiles/-/tiles-4.4.5.tgz", + "integrity": "sha512-XO9NeUsukjj+90YN1GEJWOgt7rI5GIv20dCpPIYdgj299aa8iYB5DWcm1YGcOuNjGqdQNZXIgPSv6ocdN/X7Mw==", + "license": "MIT", + "dependencies": { + "@loaders.gl/loader-utils": "4.4.5", + "@loaders.gl/math": "4.4.5", + "@math.gl/core": "^4.1.0", + "@math.gl/culling": "^4.1.0", + "@math.gl/geospatial": "^4.1.0", + "@math.gl/web-mercator": "^4.1.0", + "@probe.gl/stats": "^4.1.1" + }, + "peerDependencies": { + "@loaders.gl/core": "~4.4.0" + } + }, + "node_modules/@loaders.gl/wms": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@loaders.gl/wms/-/wms-4.4.5.tgz", + "integrity": "sha512-0+nXHY017bAl3tELIefUa0FB3ptUpEVxtQD1imNqyUtRr1vrzhyc+kbBcc3uRIcDj/F6iW9pq2V6lBwcIGZXFw==", + "license": "MIT", + "dependencies": { + "@loaders.gl/images": "4.4.5", + "@loaders.gl/loader-utils": "4.4.5", + "@loaders.gl/schema": "4.4.5", + "@loaders.gl/xml": "4.4.5", + "@turf/rewind": "^5.1.5", + "deep-strict-equal": "^0.2.0" + }, + "peerDependencies": { + "@loaders.gl/core": "~4.4.0" + } + }, + "node_modules/@loaders.gl/wms/node_modules/@turf/boolean-clockwise": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/boolean-clockwise/-/boolean-clockwise-5.1.5.tgz", + "integrity": "sha512-FqbmEEOJ4rU4/2t7FKx0HUWmjFEVqR+NJrFP7ymGSjja2SQ7Q91nnBihGuT+yuHHl6ElMjQ3ttsB/eTmyCycxA==", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5" + } + }, + "node_modules/@loaders.gl/wms/node_modules/@turf/clone": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/clone/-/clone-5.1.5.tgz", + "integrity": "sha512-//pITsQ8xUdcQ9pVb4JqXiSqG4dos5Q9N4sYFoWghX21tfOV2dhc5TGqYOhnHrQS7RiKQL1vQ48kIK34gQ5oRg==", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^5.1.5" + } + }, + "node_modules/@loaders.gl/wms/node_modules/@turf/helpers": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-5.1.5.tgz", + "integrity": "sha512-/lF+JR+qNDHZ8bF9d+Cp58nxtZWJ3sqFe6n3u3Vpj+/0cqkjk4nXKYBSY0azm+GIYB5mWKxUXvuP/m0ZnKj1bw==", + "license": "MIT" + }, + "node_modules/@loaders.gl/wms/node_modules/@turf/invariant": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-5.2.0.tgz", + "integrity": "sha512-28RCBGvCYsajVkw2EydpzLdcYyhSA77LovuOvgCJplJWaNVyJYH6BOR3HR9w50MEkPqb/Vc/jdo6I6ermlRtQA==", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^5.1.5" + } + }, + "node_modules/@loaders.gl/wms/node_modules/@turf/meta": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@turf/meta/-/meta-5.2.0.tgz", + "integrity": "sha512-ZjQ3Ii62X9FjnK4hhdsbT+64AYRpaI8XMBMcyftEOGSmPMUVnkbvuv3C9geuElAXfQU7Zk1oWGOcrGOD9zr78Q==", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^5.1.5" + } + }, + "node_modules/@loaders.gl/wms/node_modules/@turf/rewind": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/rewind/-/rewind-5.1.5.tgz", + "integrity": "sha512-Gdem7JXNu+G4hMllQHXRFRihJl3+pNl7qY+l4qhQFxq+hiU1cQoVFnyoleIqWKIrdK/i2YubaSwc3SCM7N5mMw==", + "license": "MIT", + "dependencies": { + "@turf/boolean-clockwise": "^5.1.5", + "@turf/clone": "^5.1.5", + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5", + "@turf/meta": "^5.1.5" + } + }, + "node_modules/@loaders.gl/worker-utils": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@loaders.gl/worker-utils/-/worker-utils-4.4.5.tgz", + "integrity": "sha512-ZQDoM6f/HpZ3Lzj6vjtPHXSvi+cUK0QG7yJz+MKWAokmeWa98WMZwswS8zkn/qNkY95rLcxh66N4Sl96+7hqAQ==", + "license": "MIT", + "peerDependencies": { + "@loaders.gl/core": "~4.4.0" + } + }, + "node_modules/@loaders.gl/xml": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@loaders.gl/xml/-/xml-4.4.5.tgz", + "integrity": "sha512-UsN7T9e67Sa1Q6Ra/u+j2mtaT9GTcFhH8iz8ba5QFU90YrRn3dwBEwq9SVxQiJrfC6dE4jFdMannW5mzeV5owg==", + "license": "MIT", + "dependencies": { + "@loaders.gl/loader-utils": "4.4.5", + "@loaders.gl/schema": "4.4.5", + "fast-xml-parser": "^5.3.6" + }, + "peerDependencies": { + "@loaders.gl/core": "~4.4.0" + } + }, + "node_modules/@loaders.gl/zip": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@loaders.gl/zip/-/zip-4.4.5.tgz", + "integrity": "sha512-vXlwnJ2QCCtXc8Pf55YJUNTJ0sjtjbUr34StDY91GPmoutdAXovqikuwzehrAlMDE69ldbnMtVATmNe4XeWGXQ==", + "license": "MIT", + "dependencies": { + "@loaders.gl/compression": "4.4.5", + "@loaders.gl/crypto": "4.4.5", + "@loaders.gl/loader-utils": "4.4.5", + "jszip": "^3.1.5", + "md5": "^2.3.0" + }, + "peerDependencies": { + "@loaders.gl/core": "~4.4.0" + } + }, + "node_modules/@luma.gl/core": { + "version": "9.3.6", + "resolved": "https://registry.npmjs.org/@luma.gl/core/-/core-9.3.6.tgz", + "integrity": "sha512-eqHnCPh2xHYkdd9rEkiIIkGMixNiJkq1ROrnTob6npvmZNVHXL0ubIw5KueL7rqW0+J1tm+p2+TXZaCmn0sP7Q==", + "license": "MIT", + "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" + } + }, + "node_modules/@luma.gl/engine": { + "version": "9.3.6", + "resolved": "https://registry.npmjs.org/@luma.gl/engine/-/engine-9.3.6.tgz", + "integrity": "sha512-NYTdhn2NaH/MjN8qXCl2ukrT1Ac9iTKu1mgN0wz11XRd1QYnlMNBXswRROD7IZ2PUsBWdmYHc9qE8wKBQqMuIA==", + "license": "MIT", + "dependencies": { + "@math.gl/core": "^4.1.0", + "@math.gl/types": "^4.1.0", + "@probe.gl/log": "^4.1.1", + "@probe.gl/stats": "^4.1.1" + }, + "peerDependencies": { + "@luma.gl/core": "~9.3.0", + "@luma.gl/shadertools": "~9.3.0" + } + }, + "node_modules/@luma.gl/gltf": { + "version": "9.3.6", + "resolved": "https://registry.npmjs.org/@luma.gl/gltf/-/gltf-9.3.6.tgz", + "integrity": "sha512-9R27aYwvu6KBJzd9Kxs4cqIJpgJsI1AyL6Pn6+5CrmGbaCqMtgWi7Sf9Wo+bqv0PRxwzH0j1oAv7qRk0hGbstw==", + "license": "MIT", + "dependencies": { + "@loaders.gl/core": "~4.4.0", + "@loaders.gl/gltf": "~4.4.0", + "@loaders.gl/textures": "~4.4.0", + "@math.gl/core": "^4.1.0" + }, + "peerDependencies": { + "@luma.gl/core": "~9.3.0", + "@luma.gl/engine": "~9.3.0", + "@luma.gl/shadertools": "~9.3.0" + } + }, + "node_modules/@luma.gl/shadertools": { + "version": "9.3.6", + "resolved": "https://registry.npmjs.org/@luma.gl/shadertools/-/shadertools-9.3.6.tgz", + "integrity": "sha512-dDuD8lCOkAE1L7hJGZEyZAi7upR1HG3wEEIQ1gCLaTTbJWC7tNtnVz853lqUA+VXgjgS9NiQFFRcosiIZmW4Vg==", + "license": "MIT", + "dependencies": { + "@math.gl/core": "^4.1.0", + "@math.gl/types": "^4.1.0" + }, + "peerDependencies": { + "@luma.gl/core": "~9.3.0" + } + }, + "node_modules/@luma.gl/webgl": { + "version": "9.3.6", + "resolved": "https://registry.npmjs.org/@luma.gl/webgl/-/webgl-9.3.6.tgz", + "integrity": "sha512-tGm7FGWPmJKxGZMvkRPRi219x3tKmBxR7Uke09nTp2ujNak/O5V9xPIQ9lUBGTxqAb8U2yjKkXG8j+f/4b2+sw==", + "license": "MIT", + "dependencies": { + "@math.gl/types": "^4.1.0", + "@probe.gl/env": "^4.1.1" + }, + "peerDependencies": { + "@luma.gl/core": "~9.3.0" + } + }, + "node_modules/@mapbox/extent": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@mapbox/extent/-/extent-0.4.0.tgz", + "integrity": "sha512-MSoKw3qPceGuupn04sdaJrFeLKvcSETVLZCGS8JA9x6zXQL3FWiKaIXYIZEDXd5jpXpWlRxinCZIN49yRy0C9A==", + "license": "ISC" + }, + "node_modules/@mapbox/geojson-coords": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@mapbox/geojson-coords/-/geojson-coords-0.0.2.tgz", + "integrity": "sha512-YuVzpseee/P1T5BWyeVVPppyfmuXYHFwZHmybkqaMfu4BWlOf2cmMGKj2Rr92MwfSTOCSUA0PAsVGRG8akY0rg==", + "license": "ISC", + "dependencies": { + "@mapbox/geojson-normalize": "0.0.1", + "geojson-flatten": "^1.0.4" + } + }, + "node_modules/@mapbox/geojson-extent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@mapbox/geojson-extent/-/geojson-extent-1.0.1.tgz", + "integrity": "sha512-hh8LEO3djT4fqfr8sSC6wKt+p0TMiu+KOLMBUiFOyj+zGq7+IXwQGl0ppCVDkyzCewyd9LoGe9zAvDxXrLfhLw==", + "license": "ISC", + "dependencies": { + "@mapbox/extent": "0.4.0", + "@mapbox/geojson-coords": "0.0.2", + "rw": "~0.1.4", + "traverse": "~0.6.6" + }, + "bin": { + "geojson-extent": "bin/geojson-extent" + } + }, + "node_modules/@mapbox/geojson-normalize": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@mapbox/geojson-normalize/-/geojson-normalize-0.0.1.tgz", + "integrity": "sha512-82V7YHcle8lhgIGqEWwtXYN5cy0QM/OHq3ypGhQTbvHR57DF0vMHMjjVSQKFfVXBe/yWCBZTyOuzvK7DFFnx5Q==", + "license": "ISC", + "bin": { + "geojson-normalize": "geojson-normalize" + } + }, + "node_modules/@mapbox/jsonlint-lines-primitives": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.3.tgz", + "integrity": "sha512-0SElaV0uMxEnxzBhhX9WTuPyUeMsAN/SS0i16tjuba4/mio63MG9khjC1a0JAiPGXAwvwm4UfHJURCN7nyudQg==", + "license": "MIT", + "engines": { + "node": ">= 22" + } + }, + "node_modules/@mapbox/martini": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@mapbox/martini/-/martini-0.2.0.tgz", + "integrity": "sha512-7hFhtkb0KTLEls+TRw/rWayq5EeHtTaErgm/NskVoXmtgAQu/9D299aeyj6mzAR/6XUnYRp2lU+4IcrYRFjVsQ==", + "license": "ISC" + }, + "node_modules/@mapbox/point-geometry": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz", + "integrity": "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==", + "license": "ISC" + }, + "node_modules/@mapbox/sphericalmercator": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@mapbox/sphericalmercator/-/sphericalmercator-2.0.2.tgz", + "integrity": "sha512-Ai/S9qXupBzFCM0i4sYDIx1A0pDYMaD3xlhVg05JToYeyORq8aAuHbd6CCPC86HlLSjYmoPeljJ5tMVKtzd4Lg==" + }, + "node_modules/@mapbox/tiny-sdf": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-2.2.0.tgz", + "integrity": "sha512-LVL4wgI9YAum5V+LNVQO6QgFBPw7/MIIY4XJPNsPDMrjEwcE+JfKk1LuIl8GnF197ejVdC9QdPaxrx5gfgdGXg==", + "license": "BSD-2-Clause" + }, + "node_modules/@mapbox/unitbezier": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.1.tgz", + "integrity": "sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw==", + "license": "BSD-2-Clause" + }, + "node_modules/@mapbox/vector-tile": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@mapbox/vector-tile/-/vector-tile-1.3.1.tgz", + "integrity": "sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==", + "license": "BSD-3-Clause", + "dependencies": { + "@mapbox/point-geometry": "~0.1.0" + } + }, + "node_modules/@mapbox/whoots-js": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz", + "integrity": "sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==", + "license": "ISC", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@maplibre/geojson-vt": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@maplibre/geojson-vt/-/geojson-vt-6.1.1.tgz", + "integrity": "sha512-FVMOcmSP/yqol45t7StApEyTL5/vmqBCuFhH9n+fFuINenhaX+YgHHIt1yJ86S8kln3uJLcMvmEU2cfn6E2eCQ==", + "license": "ISC", + "dependencies": { + "kdbush": "^4.1.0" + } + }, + "node_modules/@maplibre/maplibre-gl-style-spec": { + "version": "24.10.0", + "resolved": "https://registry.npmjs.org/@maplibre/maplibre-gl-style-spec/-/maplibre-gl-style-spec-24.10.0.tgz", + "integrity": "sha512-lichxSiagMEBBrqHF0trtMQH9RKh+9jUlIJl0qW0QHvt2H/tbvUWdE+ZzI2Jd0/pT7j/iavLonlPu7EQ/ixTOw==", "license": "ISC", "dependencies": { - "minipass": "^7.0.4" + "@mapbox/jsonlint-lines-primitives": "~2.0.2", + "@mapbox/unitbezier": "^1.0.0", + "json-stringify-pretty-compact": "^4.0.0", + "minimist": "^1.2.8", + "quickselect": "^3.0.0", + "tinyqueue": "^3.0.0" }, - "engines": { - "node": ">=18.0.0" + "bin": { + "gl-style-format": "dist/gl-style-format.mjs", + "gl-style-migrate": "dist/gl-style-migrate.mjs", + "gl-style-validate": "dist/gl-style-validate.mjs" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "license": "MIT", + "node_modules/@maplibre/maplibre-gl-style-spec/node_modules/@mapbox/unitbezier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-1.0.0.tgz", + "integrity": "sha512-fqd515fjBmANKGGsQ286E2Wvj/XvDFpGzwJxq4CI6jMQue6Oy04uCKp+JWKF00xRTmk6cEu1jPJ9p3xqH8YWqQ==", + "license": "BSD-2-Clause" + }, + "node_modules/@maplibre/mlt": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@maplibre/mlt/-/mlt-1.2.0.tgz", + "integrity": "sha512-g45M8gEI4sMO3X9ib4K7n3ZKFf0qQOL+NMkHCnEK51lOrYFHiEssOuZncx1+miIgi1IEE2NcbRMcq8RBkL+QHA==", + "license": "(MIT OR Apache-2.0)", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" + "@mapbox/point-geometry": "^1.1.0" } }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, + "node_modules/@maplibre/mlt/node_modules/@mapbox/point-geometry": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-1.1.0.tgz", + "integrity": "sha512-YGcBz1cg4ATXDCM/71L9xveh4dynfGmcLDqufR+nQQy3fKwsAZsWd/x4621/6uJaeB9mwOHE6hPeDgXz9uViUQ==", + "license": "ISC" + }, + "node_modules/@maplibre/vt-pbf": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@maplibre/vt-pbf/-/vt-pbf-4.3.2.tgz", + "integrity": "sha512-j6p0AdjvAR19Z3XaCysle7A4ZSo08tYOzxD0Y9NQylwPAkwJJeYub5b2eVucdeDh7erhv69DahoLOevDRERRUw==", "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" + "@mapbox/point-geometry": "^1.1.0", + "@types/geojson": "^7946.0.16", + "pbf": "^5.1.0" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } + "node_modules/@maplibre/vt-pbf/node_modules/@mapbox/point-geometry": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-1.1.0.tgz", + "integrity": "sha512-YGcBz1cg4ATXDCM/71L9xveh4dynfGmcLDqufR+nQQy3fKwsAZsWd/x4621/6uJaeB9mwOHE6hPeDgXz9uViUQ==", + "license": "ISC" }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.11", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", - "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", - "dev": true, - "license": "MIT", + "node_modules/@maplibre/vt-pbf/node_modules/pbf": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/pbf/-/pbf-5.1.2.tgz", + "integrity": "sha512-mnvGdvOrIvJOBGUEdGkrVXjN8E/VkIJCkf2eS1DH2yv82ORUlLttmDt0rWY38yYZmVwciZwBUvHM20qxBZf40w==", + "license": "BSD-3-Clause", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" + "resolve-protobuf-schema": "^2.1.0" + }, + "bin": { + "pbf": "bin/pbf" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "license": "MIT" + "node_modules/@marsidev/react-turnstile": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@marsidev/react-turnstile/-/react-turnstile-1.5.2.tgz", + "integrity": "sha512-+3aBPxp86JzSC0ZmgyonoGoUEENcUkH3LGahXSpkV87ArvD2DzRCmPgh0FyQk6PQRmJwQJDAfwNavFsxUxMQWA==", + "license": "MIT", + "peerDependencies": { + "react": "^17.0.2 || ^18.0.0 || ^19.0", + "react-dom": "^17.0.2 || ^18.0.0 || ^19.0" + } }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "node_modules/@math.gl/core": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@math.gl/core/-/core-4.1.0.tgz", + "integrity": "sha512-FrdHBCVG3QdrworwrUSzXIaK+/9OCRLscxI2OUy6sLOHyHgBMyfnEGs99/m3KNvs+95BsnQLWklVfpKfQzfwKA==", "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "@math.gl/types": "4.1.0" } }, - "node_modules/@js-sdsl/ordered-map": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", - "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", + "node_modules/@math.gl/culling": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@math.gl/culling/-/culling-4.1.0.tgz", + "integrity": "sha512-jFmjFEACnP9kVl8qhZxFNhCyd47qPfSVmSvvjR0/dIL6R9oD5zhR1ub2gN16eKDO/UM7JF9OHKU3EBIfeR7gtg==", "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" + "dependencies": { + "@math.gl/core": "4.1.0", + "@math.gl/types": "4.1.0" } }, - "node_modules/@kninnug/constrainautor": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@kninnug/constrainautor/-/constrainautor-4.0.1.tgz", - "integrity": "sha512-wVnev6bmVBY3GjZeaDK+SQFIc2crpLQAmb5nYUVy/QtYUBz0masTji20XToVXfym7WgpaRFHDhcyX15CMhND8w==", - "license": "ISC", + "node_modules/@math.gl/geospatial": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@math.gl/geospatial/-/geospatial-4.1.0.tgz", + "integrity": "sha512-BzsUhpVvnmleyYF6qdqJIip6FtIzJmnWuPTGhlBuPzh7VBHLonCFSPtQpbkRuoyAlbSyaGXcVt6p6lm9eK2vtg==", + "license": "MIT", "dependencies": { - "robust-predicates": "^3.0.1" + "@math.gl/core": "4.1.0", + "@math.gl/types": "4.1.0" } }, - "node_modules/@krozamdev/overlapping-marker-spiderfier": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/@krozamdev/overlapping-marker-spiderfier/-/overlapping-marker-spiderfier-0.2.8.tgz", - "integrity": "sha512-qm9w6gg8eQJjbAiFS3UCrhEMDjfefd3kF/DJO6tRTxSyIc0DONCXjF9o3tPhnxJLUIyfo0ue+CR97zuqXsuytw==", + "node_modules/@math.gl/polygon": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@math.gl/polygon/-/polygon-4.1.0.tgz", + "integrity": "sha512-YA/9PzaCRHbIP5/0E9uTYrqe+jsYTQoqoDWhf6/b0Ixz8bPZBaGDEafLg3z7ffBomZLacUty9U3TlPjqMtzPjA==", "license": "MIT", - "peerDependencies": { - "leaflet": "^1.7.1" + "dependencies": { + "@math.gl/core": "4.1.0" } }, - "node_modules/@marsidev/react-turnstile": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@marsidev/react-turnstile/-/react-turnstile-1.5.2.tgz", - "integrity": "sha512-+3aBPxp86JzSC0ZmgyonoGoUEENcUkH3LGahXSpkV87ArvD2DzRCmPgh0FyQk6PQRmJwQJDAfwNavFsxUxMQWA==", + "node_modules/@math.gl/sun": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@math.gl/sun/-/sun-4.1.0.tgz", + "integrity": "sha512-i3q6OCBLSZ5wgZVhXg+X7gsjY/TUtuFW/2KBiq/U1ypLso3S4sEykoU/MGjxUv1xiiGtr+v8TeMbO1OBIh/HmA==", + "license": "MIT" + }, + "node_modules/@math.gl/types": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@math.gl/types/-/types-4.1.0.tgz", + "integrity": "sha512-clYZdHcmRvMzVK5fjeDkQlHUzXQSNdZ7s4xOqC3nJPgz4C/TZkUecTo9YS4PruZqtDda/ag4erndP0MIn40dGA==", + "license": "MIT" + }, + "node_modules/@math.gl/web-mercator": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@math.gl/web-mercator/-/web-mercator-4.1.0.tgz", + "integrity": "sha512-HZo3vO5GCMkXJThxRJ5/QYUYRr3XumfT8CzNNCwoJfinxy5NtKUd7dusNTXn7yJ40UoB8FMIwkVwNlqaiRZZAw==", "license": "MIT", - "peerDependencies": { - "react": "^17.0.2 || ^18.0.0 || ^19.0", - "react-dom": "^17.0.2 || ^18.0.0 || ^19.0" + "dependencies": { + "@math.gl/core": "4.1.0" } }, "node_modules/@mjackson/node-fetch-server": { @@ -4243,6 +5592,18 @@ "@tybys/wasm-util": "^0.10.0" } }, + "node_modules/@nodable/entities": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@nodable/entities/-/entities-3.0.0.tgz", + "integrity": "sha512-8L9xFeTYKhm49xfIypoe2W5wV1m/3Z58kT+7kR9A8OyFxcPduI4VmxaUMQyKYrRjUoLLSXv6EKKID5Tvj9cUVw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/nodable" + } + ], + "license": "MIT" + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -7605,6 +8966,39 @@ "node": ">=6" } }, + "node_modules/@parse5/tools": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@parse5/tools/-/tools-0.3.0.tgz", + "integrity": "sha512-zxRyTHkqb7WQMV8kTNBKWb1BeOFUKXBXTBWuxg9H9hfvQB3IwP6Iw2U75Ia5eyRxPNltmY7E8YAlz6zWwUnjKg==", + "license": "MIT", + "dependencies": { + "parse5": "^7.0.0" + } + }, + "node_modules/@parse5/tools/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/@parse5/tools/node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, "node_modules/@petamoriken/float16": { "version": "3.9.3", "resolved": "https://registry.npmjs.org/@petamoriken/float16/-/float16-3.9.3.tgz", @@ -7723,6 +9117,27 @@ "node": ">=9.3.0 || >=8.10.0 <9.0.0" } }, + "node_modules/@probe.gl/env": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@probe.gl/env/-/env-4.1.1.tgz", + "integrity": "sha512-+68seNDMVsEegRB47pFA/Ws1Fjy8agcFYXxzorKToyPcD6zd+gZ5uhwoLd7TzsSw6Ydns//2KEszWn+EnNHTbA==", + "license": "MIT" + }, + "node_modules/@probe.gl/log": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@probe.gl/log/-/log-4.1.1.tgz", + "integrity": "sha512-kcZs9BT44pL7hS1OkRGKYRXI/SN9KejUlPD+BY40DguRLzdC5tLG/28WGMyfKdn/51GT4a0p+0P8xvDn1Ez+Kg==", + "license": "MIT", + "dependencies": { + "@probe.gl/env": "4.1.1" + } + }, + "node_modules/@probe.gl/stats": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@probe.gl/stats/-/stats-4.1.1.tgz", + "integrity": "sha512-4VpAyMHOqydSvPlEyHwXaE+AkIdR03nX+Qhlxsk2D/IW4OVmDZgIsvJB1cDzyEEtcfKcnaEbfXeiPgejBceT6g==", + "license": "MIT" + }, "node_modules/@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", @@ -8558,6 +9973,22 @@ "dev": true, "license": "MIT" }, + "node_modules/@shoelace-style/animations": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@shoelace-style/animations/-/animations-1.2.0.tgz", + "integrity": "sha512-avvo1xxkLbv2dgtabdewBbqcJfV0e0zCwFqkPMnHFGbJbBHorRFfMAHh1NG9ymmXn0jW95ibUVH03E1NYXD6Gw==", + "license": "MIT", + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/claviska" + } + }, + "node_modules/@shoelace-style/localize": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@shoelace-style/localize/-/localize-3.2.3.tgz", + "integrity": "sha512-pWoZywizMilenLfQcpE9bjaqi7WKiQXJB42cxvmSPwYS76U776wJ7B5QQ0P28yVit1vpHuFZzq1CtfVFv32jaQ==", + "license": "MIT" + }, "node_modules/@so-ric/colorspace": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/@so-ric/colorspace/-/colorspace-1.1.6.tgz", @@ -8751,18 +10182,24 @@ } }, "node_modules/@terraformer/arcgis": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@terraformer/arcgis/-/arcgis-2.1.2.tgz", - "integrity": "sha512-IvdfqehcNAUtKU1OFMKwPT8EvdKlVFZ7q7ZKzkIF8XzYZIVsZLuXuOS1UBdRh5u/o+X5Gax7jiZhD8U/4TV+Jw==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@terraformer/arcgis/-/arcgis-2.2.2.tgz", + "integrity": "sha512-Qcl7jhSdJU0HEBfQema6u6RY5zQYecx83CH1++7GXNPlFC42yRF9cxB17Kfi3Jr7ck/tgxhCo6IP3b0OA97f8w==", "license": "MIT", "dependencies": { - "@terraformer/common": "^2.1.2" + "@terraformer/common": "^2.2.2" } }, "node_modules/@terraformer/common": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@terraformer/common/-/common-2.1.2.tgz", - "integrity": "sha512-cwPdTFzIpekZhZRrgDEkqLKNPoqbyCBQHiemaovnGIeUx0Pl336MY/eCxzJ5zXkrQLVo9zPalq/vYW5HnyKevQ==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@terraformer/common/-/common-2.2.2.tgz", + "integrity": "sha512-W+O/hblr5g1RBzkehaEfF/EdCerkG7j6g2cGBawp2B2zHXdCdR7NrXc0Sh106SFFJyadQZ62On36S+8wHF4Kag==", + "license": "MIT" + }, + "node_modules/@terraformer/wkt": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@terraformer/wkt/-/wkt-2.2.2.tgz", + "integrity": "sha512-BR7eAEip+LeveDPFRf+z/pi3zAm1TCp08V9XzxhRIUaFTnnk7k/PfHYjhCQliVYAuEwbHmBg3rYSjbm9cfl90Q==", "license": "MIT" }, "node_modules/@testing-library/dom": { @@ -8889,21 +10326,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@turf/bearing": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@turf/bearing/-/bearing-7.3.4.tgz", - "integrity": "sha512-zvFjapyFaOrM8nBtAND7f4yb0BJV0jyj6cyoXyTYqLY+3Hn0eHgL0M8lwxDLbTom5KfqYDHDVDQC3+VSfypoEA==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.4", - "@turf/invariant": "7.3.4", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, "node_modules/@turf/boolean-clockwise": { "version": "7.3.4", "resolved": "https://registry.npmjs.org/@turf/boolean-clockwise/-/boolean-clockwise-7.3.4.tgz", @@ -8933,36 +10355,6 @@ "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/destination": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@turf/destination/-/destination-7.3.4.tgz", - "integrity": "sha512-YxoUJwkKmTHiRFQxMQOP0tz8Vy+ga5EXl+C+F/WubjDLwT1AJu5y8CNIjLvWyjPWckj/vZG4u/1js5bx6MLADA==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.4", - "@turf/invariant": "7.3.4", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/distance": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@turf/distance/-/distance-7.3.4.tgz", - "integrity": "sha512-9drWgd46uHPPyzgrcRQLgSvdS/SjVlQ6ZIBoRQagS5P2kSjUbcOXHIMeOSPwfxwlKhEtobLyr+IiR2ns1TfF8w==", - "license": "MIT", - "dependencies": { - "@turf/helpers": "7.3.4", - "@turf/invariant": "7.3.4", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, "node_modules/@turf/helpers": { "version": "7.3.4", "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-7.3.4.tgz", @@ -9004,23 +10396,6 @@ "url": "https://opencollective.com/turf" } }, - "node_modules/@turf/midpoint": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@turf/midpoint/-/midpoint-7.3.4.tgz", - "integrity": "sha512-/XAeGvsz8l5HaqcP7TUlexzGfibqXozQgBZ8rH7az6op2Dfm3pL/Z7bKLHoVavM0ccBg0Pt7g6j9NM54kZWdKA==", - "license": "MIT", - "dependencies": { - "@turf/bearing": "7.3.4", - "@turf/destination": "7.3.4", - "@turf/distance": "7.3.4", - "@turf/helpers": "7.3.4", - "@types/geojson": "^7946.0.10", - "tslib": "^2.8.1" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, "node_modules/@turf/rewind": { "version": "7.3.4", "resolved": "https://registry.npmjs.org/@turf/rewind/-/rewind-7.3.4.tgz", @@ -9113,6 +10488,16 @@ "@types/node": "*" } }, + "node_modules/@types/brotli": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/brotli/-/brotli-1.3.5.tgz", + "integrity": "sha512-9xoNr+bcxT236/7ZgcWw/6Pb2RRetE13p4bFy1xYSckKwyOiRfmInay8baUWZgH7/284Wl6IPe7+nOI9+OQg/A==", + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/chai": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", @@ -9144,6 +10529,12 @@ "@types/node": "*" } }, + "node_modules/@types/crypto-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@types/crypto-js/-/crypto-js-4.2.2.tgz", + "integrity": "sha512-sDOLlVbHhXpAUAL0YHDUUwDZf3iN4Bwi4W6a0W0b+QcAezUbRtH4FVb+9J4h+XFPW7l/gQ9F8qC7P+Ec4k8QVQ==", + "license": "MIT" + }, "node_modules/@types/d3-array": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", @@ -9332,14 +10723,26 @@ } }, "node_modules/@types/node": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.3.0.tgz", - "integrity": "sha512-4K3bqJpXpqfg2XKGK9bpDTc6xO/xoUP/RBWS7AtRMug6zZFaRekiLzjVtAoZMquxoAbzBvy5nxQ7veS5eYzf8A==", + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.3.tgz", + "integrity": "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==", "license": "MIT", "dependencies": { "undici-types": "~7.18.0" } }, + "node_modules/@types/offscreencanvas": { + "version": "2019.7.3", + "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz", + "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==", + "license": "MIT" + }, + "node_modules/@types/pako": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/pako/-/pako-1.0.7.tgz", + "integrity": "sha512-YBtzT2ztNF6R/9+UXj2wTGFnC9NklAnASt3sC0h2m1bbH7G6FyBIkt4AN8ThZpNfxUo1b2iMVO0UawiJymEt8A==", + "license": "MIT" + }, "node_modules/@types/parse-json": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", @@ -9476,7 +10879,6 @@ "version": "2.0.7", "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", - "devOptional": true, "license": "MIT" }, "node_modules/@types/use-sync-external-store": { @@ -10256,6 +11658,15 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/a5-js": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/a5-js/-/a5-js-0.7.3.tgz", + "integrity": "sha512-3aoMwHmNkyuMDHS4q6GRRInpOawamen2pokIbc0MQmR9cqG0Y9+B0bZpzswwetjrSG2ckbYtShH+nKru6+3O5Q==", + "license": "Apache-2.0", + "dependencies": { + "gl-matrix": "^3.4.3" + } + }, "node_modules/abbrev": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz", @@ -10396,10 +11807,52 @@ "normalize-path": "^3.0.0", "picomatch": "^2.0.4" }, - "engines": { - "node": ">= 8" + "engines": { + "node": ">= 8" + } + }, + "node_modules/anynum": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/anynum/-/anynum-1.0.1.tgz", + "integrity": "sha512-N6//FLET/tXYNM/F6ABca1oH6fWB+KlTt909Le28WMDBk8oaT4vY17DCrwg2MvmuqUKt3Ni4N5dGJ/EoBgcO6A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, + "node_modules/apache-arrow": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/apache-arrow/-/apache-arrow-21.2.0.tgz", + "integrity": "sha512-Hxe6Agq26gQOM954qpzYSllJBPJl+e16U5CkfuMUhLrNba+5nKkttIVlflaovN6oaTratqMGAO8H5u/aNhmHWQ==", + "license": "Apache-2.0", + "dependencies": { + "@types/node": "^25.2.0", + "flatbuffers": "^25.1.24", + "json-with-bigint": "^3.5.3", + "tslib": "^2.6.2" + }, + "bin": { + "arrow2csv": "bin/arrow2csv.js" + } + }, + "node_modules/apache-arrow/node_modules/@types/node": { + "version": "25.9.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.9.5.tgz", + "integrity": "sha512-OScDchr2fwuUmWdf4kZ9h7PcJiYDVInhJizG/biAq3cAvqwYktuy/TYGGdZNMtNTFUP7rnb0NU4TUdm82kt4Rg==", + "license": "MIT", + "dependencies": { + "undici-types": ">=7.24.0 <7.24.7" } }, + "node_modules/apache-arrow/node_modules/undici-types": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz", + "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==", + "license": "MIT" + }, "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", @@ -10438,7 +11891,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", - "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.3", @@ -10602,7 +12054,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", - "dev": true, "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.1", @@ -10679,7 +12130,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -10702,6 +12152,18 @@ "node": ">= 4.0.0" } }, + "node_modules/autolinker": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-4.1.5.tgz", + "integrity": "sha512-vEfYZPmvVOIuE567XBVCsx8SBgOYtjB2+S1iAaJ+HgH+DNjAcrHem2hmAeC9yaNGWayicv4yR+9UaJlkF3pvtw==", + "license": "MIT", + "dependencies": { + "tslib": "^2.8.1" + }, + "engines": { + "pnpm": ">=10.10.0" + } + }, "node_modules/autoprefixer": { "version": "10.4.27", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.27.tgz", @@ -10743,7 +12205,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, "license": "MIT", "dependencies": { "possible-typed-array-names": "^1.0.0" @@ -11009,6 +12470,27 @@ "bare-path": "^3.0.0" } }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "optional": true + }, "node_modules/baseline-browser-mapping": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz", @@ -11192,6 +12674,16 @@ "node": ">=8" } }, + "node_modules/brotli": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz", + "integrity": "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==", + "license": "MIT", + "optional": true, + "dependencies": { + "base64-js": "^1.1.2" + } + }, "node_modules/browserslist": { "version": "4.28.1", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", @@ -11226,6 +12718,15 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/buf-compare": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buf-compare/-/buf-compare-1.0.1.tgz", + "integrity": "sha512-Bvx4xH00qweepGc43xFvMs5BKASXTbHaHm6+kDYIK9p/4iFwjATQkmPKHQSgJZzKbAymhztRbXUf1Nqhzl73/Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", @@ -11294,7 +12795,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", - "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.0", @@ -11417,6 +12917,15 @@ "node": ">=8" } }, + "node_modules/charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", + "license": "BSD-3-Clause", + "engines": { + "node": "*" + } + }, "node_modules/check-more-types": { "version": "2.24.0", "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", @@ -11733,6 +13242,15 @@ "dev": true, "license": "MIT" }, + "node_modules/composed-offset-position": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/composed-offset-position/-/composed-offset-position-0.0.6.tgz", + "integrity": "sha512-Q7dLompI6lUwd7LWyIcP66r4WcS9u7AL2h8HaeipiRfCRPLMWqRx8fYsjb4OHi6UQFifO7XtNC2IlEJ1ozIFxw==", + "license": "MIT", + "peerDependencies": { + "@floating-ui/utils": "^0.2.5" + } + }, "node_modules/compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -11882,6 +13400,19 @@ "toggle-selection": "^1.0.6" } }, + "node_modules/core-assert": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/core-assert/-/core-assert-0.2.1.tgz", + "integrity": "sha512-IG97qShIP+nrJCXMCgkNZgH7jZQ4n8RpPyPeXX++T6avR/KhLhgLiHKoEn5Rc1KjfycSfA9DMa6m+4C4eguHhw==", + "license": "MIT", + "dependencies": { + "buf-compare": "^1.0.0", + "is-error": "^2.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/core-js-compat": { "version": "3.48.0", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.48.0.tgz", @@ -11896,6 +13427,12 @@ "url": "https://opencollective.com/core-js" } }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, "node_modules/cors": { "version": "2.8.6", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", @@ -11961,6 +13498,15 @@ "node": ">= 8" } }, + "node_modules/crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", + "license": "BSD-3-Clause", + "engines": { + "node": "*" + } + }, "node_modules/crypto-random-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", @@ -12250,7 +13796,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", - "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.3", @@ -12268,7 +13813,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", - "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.3", @@ -12286,7 +13830,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", - "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -12398,6 +13941,18 @@ "dev": true, "license": "MIT" }, + "node_modules/deep-strict-equal": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/deep-strict-equal/-/deep-strict-equal-0.2.0.tgz", + "integrity": "sha512-3daSWyvZ/zwJvuMGlzG1O+Ow0YSadGfb3jsh9xoCutv2tWyB9dA4YvR9L9/fSdDZa2dByYQe+TqapSGUrjnkoA==", + "license": "MIT", + "dependencies": { + "core-assert": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", @@ -12411,7 +13966,6 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", @@ -12429,7 +13983,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, "license": "MIT", "dependencies": { "define-data-property": "^1.0.1", @@ -12466,9 +14019,9 @@ } }, "node_modules/delaunator": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", - "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.1.0.tgz", + "integrity": "sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ==", "license": "ISC", "dependencies": { "robust-predicates": "^3.0.2" @@ -12721,6 +14274,12 @@ "url": "https://dotenvx.com" } }, + "node_modules/draco3d": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/draco3d/-/draco3d-1.5.7.tgz", + "integrity": "sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ==", + "license": "Apache-2.0" + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -12871,6 +14430,19 @@ "once": "^1.4.0" } }, + "node_modules/enhanced-resolve": { + "version": "5.24.5", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.5.tgz", + "integrity": "sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/entities": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", @@ -12931,7 +14503,6 @@ "version": "1.24.1", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz", "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==", - "dev": true, "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.2", @@ -13065,7 +14636,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -13094,7 +14664,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", - "dev": true, "license": "MIT", "dependencies": { "is-callable": "^1.2.7", @@ -14187,6 +15756,45 @@ ], "license": "BSD-3-Clause" }, + "node_modules/fast-xml-builder": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.3.1.tgz", + "integrity": "sha512-pIM/1n3ntFXKYrUZwW7QCK0gAW7XY+wzj1YMIV3tLDvPj/V+zTGJK5e3/4WJfwj0qWw2ElNXiTixda/R+3YSug==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "path-expression-matcher": "^1.6.2", + "xml-naming": "^0.3.0" + } + }, + "node_modules/fast-xml-parser": { + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.11.0.tgz", + "integrity": "sha512-9IGxMqvqLOnqP+Egi1nqDHKv5k8aZ7r9n558enxcucmyVGEBNPAU+MOg/8jPIS7rO7sSq4gFm1/nHtiaubMruw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "@nodable/entities": "^3.0.0", + "fast-xml-builder": "^1.2.0", + "is-unsafe": "^2.0.0", + "path-expression-matcher": "^1.6.2", + "strnum": "^2.4.2", + "xml-naming": "^0.3.0" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, "node_modules/fastq": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", @@ -14229,6 +15837,29 @@ "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", "license": "MIT" }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, "node_modules/fflate": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", @@ -14408,6 +16039,27 @@ "node": ">=16" } }, + "node_modules/flatbuffers": { + "version": "25.9.23", + "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-25.9.23.tgz", + "integrity": "sha512-MI1qs7Lo4Syw0EOzUl0xjs2lsoeqFku44KpngfIduHBYvzm8h2+7K8YMQh1JtVVVrUvhLpNwqVi4DERegUJhPQ==", + "license": "Apache-2.0" + }, + "node_modules/flatbush": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/flatbush/-/flatbush-4.6.2.tgz", + "integrity": "sha512-nNT7MFJ58Q4IAm3aYsEg+zgZGpdRcmR1i4U+aa8c+r91jmYZg7FTQwNnIMC0FyBqVZTbClKdAnrJkKkfp1BOvw==", + "license": "ISC", + "dependencies": { + "flatqueue": "^3.1.0" + } + }, + "node_modules/flatqueue": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/flatqueue/-/flatqueue-3.1.0.tgz", + "integrity": "sha512-Ia4qIYrrsEqIRx3c3XhkT+QDLQuUV5ovsr6ah1rIgKT5wclhoGK3lAMS1bWRAWxlx7wtlTBpV7QXB5d9fOSRxA==", + "license": "ISC" + }, "node_modules/flatted": { "version": "3.4.2", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", @@ -14446,7 +16098,6 @@ "version": "0.3.5", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", - "dev": true, "license": "MIT", "dependencies": { "is-callable": "^1.2.7" @@ -14491,6 +16142,18 @@ "node": ">= 6" } }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "license": "MIT", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -14603,7 +16266,6 @@ "version": "1.1.8", "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", @@ -14624,17 +16286,21 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/fzstd": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/fzstd/-/fzstd-0.1.1.tgz", + "integrity": "sha512-dkuVSOKKwh3eas5VkJy1AW1vFpet8TA/fGmVA5krThl8YcOVE/8ZIoEA1+U1vEn5ckxxhLirSdY837azmbaNHA==", + "license": "MIT" + }, "node_modules/generator-function": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -14650,6 +16316,12 @@ "node": ">=6.9.0" } }, + "node_modules/geojson-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/geojson-flatten/-/geojson-flatten-1.1.1.tgz", + "integrity": "sha512-k/6BCd0qAt7vdqdM1LkLfAy72EsLDy0laNwX0x2h49vfYCiQkRc4PSra8DNEdJ10EKRpwEvDXMb0dBknTJuWpQ==", + "license": "BSD-2-Clause" + }, "node_modules/geotiff": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/geotiff/-/geotiff-2.1.3.tgz", @@ -14754,7 +16426,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", - "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.3", @@ -14819,6 +16490,12 @@ "node": ">=10" } }, + "node_modules/gl-matrix": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.4.tgz", + "integrity": "sha512-latSnyDNt/8zYUB6VIJ6PCh2jBjJX6gnDsoCZ7LyW7GkqrD51EWwa9qCoGixj8YqBtETQK/xY7OmpTF8xz1DdQ==", + "license": "MIT" + }, "node_modules/glob": { "version": "10.5.0", "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", @@ -14884,7 +16561,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "dev": true, "license": "MIT", "dependencies": { "define-properties": "^1.2.1", @@ -14979,7 +16655,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -15002,7 +16677,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" @@ -15015,7 +16689,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", - "dev": true, "license": "MIT", "dependencies": { "dunder-proto": "^1.0.0" @@ -15043,7 +16716,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" @@ -15358,6 +17030,24 @@ "node": ">= 4" } }, + "node_modules/image-size": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.7.5.tgz", + "integrity": "sha512-Hiyv+mXHfFEP7LzUL/llg9RwFxxY+o9N3JVLIeG5E7iFIFAalxvRU9UZthBdYDEVnzHMgjnKJPPpay5BWf1g9g==", + "license": "MIT", + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "license": "MIT" + }, "node_modules/immer": { "version": "10.2.0", "resolved": "https://registry.npmjs.org/immer/-/immer-10.2.0.tgz", @@ -15449,7 +17139,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -15507,16 +17196,15 @@ } }, "node_modules/is-any-array": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-any-array/-/is-any-array-2.0.1.tgz", - "integrity": "sha512-UtilS7hLRu++wb/WBAw9bNuP1Eg04Ivn1vERJck8zJthEvXCBEBpGR/33u/xLKWEQf95803oalHrVDptcAvFdQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-any-array/-/is-any-array-3.0.0.tgz", + "integrity": "sha512-o4h+tylWykC4BD1vaejp6gDxoM13bwW8FGuNs4yIKpj8xbBJcRxJx8vZpq0dCr7ZDEfeKjmsi/euolKhX6f/ww==", "license": "MIT" }, "node_modules/is-array-buffer": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", @@ -15541,7 +17229,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", - "dev": true, "license": "MIT", "dependencies": { "async-function": "^1.0.0", @@ -15561,7 +17248,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", - "dev": true, "license": "MIT", "dependencies": { "has-bigints": "^1.0.2" @@ -15589,7 +17275,6 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", - "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.3", @@ -15602,6 +17287,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "license": "MIT" + }, "node_modules/is-bun-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", @@ -15616,7 +17307,6 @@ "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -15644,7 +17334,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", - "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -15662,7 +17351,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", - "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -15675,6 +17363,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-error": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-error/-/is-error-2.2.2.tgz", + "integrity": "sha512-IOQqts/aHWbiisY5DuPJQ0gcbvaLFCa7fBa9xoLfxBZvQ+ZI/Zh9xoI7Gk+G64N0FdK4AbibytHht2tWgpJWLg==", + "license": "MIT" + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -15688,7 +17382,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", - "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.3" @@ -15713,7 +17406,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", - "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.4", @@ -15745,7 +17437,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -15765,7 +17456,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -15787,7 +17477,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", - "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.3", @@ -15821,7 +17510,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", - "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -15850,7 +17538,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -15863,7 +17550,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", - "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.3" @@ -15891,7 +17577,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", - "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.3", @@ -15908,7 +17593,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", - "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -15926,7 +17610,6 @@ "version": "1.1.15", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", - "dev": true, "license": "MIT", "dependencies": { "which-typed-array": "^1.1.16" @@ -15938,11 +17621,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-unsafe": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-unsafe/-/is-unsafe-2.0.2.tgz", + "integrity": "sha512-HgbIHPBH0KHHCcjLfGsCvhtPTVxjaAZlXjwdz7/GQC40SjSe4sfQsar8J5VFo8JOSbarkpV0OLG95bbaNd9aAQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, "node_modules/is-weakmap": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -15955,7 +17649,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", - "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.3" @@ -15971,7 +17664,6 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", - "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.3", @@ -15988,7 +17680,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, "license": "MIT" }, "node_modules/isbot": { @@ -16296,6 +17987,18 @@ "dev": true, "license": "MIT" }, + "node_modules/json-stringify-pretty-compact": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-4.0.0.tgz", + "integrity": "sha512-3CNZ2DnrpByG9Nqj6Xo8vqbjT4F6N+tb4Gb28ESAZjYZ5yqvmc56J+/kuIwkaAMOyblTQhUW7PxMkUb8Q36N3Q==", + "license": "MIT" + }, + "node_modules/json-with-bigint": { + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/json-with-bigint/-/json-with-bigint-3.5.12.tgz", + "integrity": "sha512-uwbF/wSSuOgC7qqlq27Xp5B6a2MHVug3t0idZdTqu0JnlFvgJuH7ju+KAk/J06C7GfhoYy2gnb9wz2INqcne7w==", + "license": "MIT" + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -16348,6 +18051,66 @@ "node": ">=4.0" } }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "license": "(MIT OR GPL-3.0-or-later)", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/jszip/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/jszip/node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "license": "(MIT AND Zlib)" + }, + "node_modules/jszip/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/jszip/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/jszip/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/kdbush": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-4.1.0.tgz", + "integrity": "sha512-e9vurzrXJQrFX6ckpHP3bvj5l+9CnYzkxDNnNQ1h2QTqdWsUAJgXiKdGNcOa1EY85dU8KbQ+z/FdQdB7P+9yfQ==", + "license": "ISC" + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -16368,6 +18131,12 @@ "node": ">=6" } }, + "node_modules/ktx-parse": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ktx-parse/-/ktx-parse-0.7.1.tgz", + "integrity": "sha512-FeA3g56ksdFNwjXJJsc1CCc7co+AJYDp6ipIp878zZ2bU8kWROatLYf39TQEd4/XRSUvBXovQ8gaVKWPXsCLEQ==", + "license": "MIT" + }, "node_modules/kuler": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", @@ -16458,6 +18227,15 @@ "node": ">= 0.8.0" } }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, "node_modules/lilconfig": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", @@ -16476,6 +18254,37 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "license": "MIT" }, + "node_modules/lit": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/lit/-/lit-3.3.3.tgz", + "integrity": "sha512-fycuvZg/hkpozL00lm1pEJH5nN/lr9ZXd6mJI2HSN4+Bzc+LDNdEApJ6HFbPkdFNHLvOplIIuJvxkS4XUxqirw==", + "license": "BSD-3-Clause", + "dependencies": { + "@lit/reactive-element": "^2.1.0", + "lit-element": "^4.2.0", + "lit-html": "^3.3.0" + } + }, + "node_modules/lit-element": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.2.2.tgz", + "integrity": "sha512-aFKhNToWxoyhkNDmWZwEva2SlQia+jfG0fjIWV//YeTaWrVnOxD89dPKfigCUspXFmjzOEUQpOkejH5Ly6sG0w==", + "license": "BSD-3-Clause", + "dependencies": { + "@lit-labs/ssr-dom-shim": "^1.5.0", + "@lit/reactive-element": "^2.1.0", + "lit-html": "^3.3.0" + } + }, + "node_modules/lit-html": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.3.3.tgz", + "integrity": "sha512-el8M6jK2o3RXBnrSHX3ZKrsN8zEV63pSExTO1wYJz7QndGYZ8353e2a5PPX+qHe2aGayfnchQmkAojaWAREOIA==", + "license": "BSD-3-Clause", + "dependencies": { + "@types/trusted-types": "^2.0.2" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -16595,6 +18404,13 @@ "lz-string": "bin/bin.js" } }, + "node_modules/lz4js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/lz4js/-/lz4js-0.2.0.tgz", + "integrity": "sha512-gY2Ia9Lm7Ep8qMiuGRhvUq0Q7qUereeldZPP1PMEJxPtEWHJLqw9pgX68oHajBH0nzJK4MaZEA/YNV3jT8u8Bg==", + "license": "ISC", + "optional": true + }, "node_modules/magic-string": { "version": "0.30.21", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", @@ -16703,6 +18519,87 @@ "integrity": "sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==", "dev": true }, + "node_modules/maplibre-gl": { + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-5.24.0.tgz", + "integrity": "sha512-ALyFxgtd5R+65UqZ/++lOqwWcC0SNho9c27fYSyLmG7AfnAul2o46F05aDJGPbFU57wos9dgcIySHs0Xe6ia3A==", + "license": "BSD-3-Clause", + "dependencies": { + "@mapbox/jsonlint-lines-primitives": "^2.0.2", + "@mapbox/point-geometry": "^1.1.0", + "@mapbox/tiny-sdf": "^2.1.0", + "@mapbox/unitbezier": "^0.0.1", + "@mapbox/vector-tile": "^2.0.4", + "@mapbox/whoots-js": "^3.1.0", + "@maplibre/geojson-vt": "^6.1.0", + "@maplibre/maplibre-gl-style-spec": "^24.8.1", + "@maplibre/mlt": "^1.1.8", + "@maplibre/vt-pbf": "^4.3.0", + "@types/geojson": "^7946.0.16", + "earcut": "^3.0.2", + "gl-matrix": "^3.4.4", + "kdbush": "^4.0.2", + "murmurhash-js": "^1.0.0", + "pbf": "^4.0.1", + "potpack": "^2.1.0", + "quickselect": "^3.0.0", + "tinyqueue": "^3.0.0" + }, + "engines": { + "node": ">=16.14.0", + "npm": ">=8.1.0" + }, + "funding": { + "url": "https://github.com/maplibre/maplibre-gl-js?sponsor=1" + } + }, + "node_modules/maplibre-gl/node_modules/@mapbox/point-geometry": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-1.1.0.tgz", + "integrity": "sha512-YGcBz1cg4ATXDCM/71L9xveh4dynfGmcLDqufR+nQQy3fKwsAZsWd/x4621/6uJaeB9mwOHE6hPeDgXz9uViUQ==", + "license": "ISC" + }, + "node_modules/maplibre-gl/node_modules/@mapbox/vector-tile": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@mapbox/vector-tile/-/vector-tile-2.0.5.tgz", + "integrity": "sha512-pXj8m7KTsqZt+1jsE0xIpGvqTSbblfkuEJL/NJmNePMtEwxO8V3XMDo9WMSfDeqHvCtBI9Lmt4mGcGR10zecmw==", + "license": "BSD-3-Clause", + "dependencies": { + "@mapbox/point-geometry": "~1.1.0", + "@types/geojson": "^7946.0.16", + "pbf": "^4.0.2" + } + }, + "node_modules/maplibre-gl/node_modules/earcut": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/earcut/-/earcut-3.2.3.tgz", + "integrity": "sha512-vnS4AVwp1KHAF13i1vp1/2D5evWy3k5u/iW/B81QVsUZtV8cv2tU0b2VNFlqvh4kYwrFMDdjPCfAmfyJW9y14Q==", + "license": "ISC" + }, + "node_modules/maplibre-gl/node_modules/pbf": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/pbf/-/pbf-4.0.2.tgz", + "integrity": "sha512-J0ajxARhZfpUEebxYs1vhMGMuLSXtBe1e+fFPDrf2uA2hgo+UshKfNUWOz92HJNz6/NFEXseQPddnHkTreWRqg==", + "license": "BSD-3-Clause", + "dependencies": { + "resolve-protobuf-schema": "^2.1.0" + }, + "bin": { + "pbf": "bin/pbf" + } + }, + "node_modules/marked": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-11.2.0.tgz", + "integrity": "sha512-HR0m3bvu0jAPYiIvLUUQtdg1g6D247//lvcekpHO1WMvbwDlwSkZAX9Lw4F4YHE1T0HaaNve0tuAWuV1UJ6vtw==", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 18" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -16712,6 +18609,17 @@ "node": ">= 0.4" } }, + "node_modules/md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "license": "BSD-3-Clause", + "dependencies": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, "node_modules/mdn-data": { "version": "2.12.2", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", @@ -16776,6 +18684,12 @@ "node": ">= 8" } }, + "node_modules/meshoptimizer": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-1.2.0.tgz", + "integrity": "sha512-davRZeIJbxJrE24cwQle7ZDsxjdk/OphNOV83oX+efQinyoHY9Jcyz3MHbaoG0qySZajldGztNZ1RN/T19PZsg==", + "license": "MIT" + }, "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -16886,7 +18800,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -17155,6 +19068,12 @@ "dev": true, "license": "MIT" }, + "node_modules/mjolnir.js": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mjolnir.js/-/mjolnir.js-3.1.0.tgz", + "integrity": "sha512-fWcei0lo+xauQK0CVb5vwC8FaS9xeEBiNPd5vMIM89DchQAi6ENMq9itOjq+G8zAvhKmJu5UPnuEnU8kVrHzdg==", + "license": "MIT" + }, "node_modules/mkdirp": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", @@ -17167,42 +19086,42 @@ } }, "node_modules/ml-array-max": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/ml-array-max/-/ml-array-max-1.2.4.tgz", - "integrity": "sha512-BlEeg80jI0tW6WaPyGxf5Sa4sqvcyY6lbSn5Vcv44lp1I2GR6AWojfUvLnGTNsIXrZ8uqWmo8VcG1WpkI2ONMQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ml-array-max/-/ml-array-max-2.0.0.tgz", + "integrity": "sha512-QQZ4kENwpWmyNb98UXRDFXrmtIXuXtt1+bSbda/2KA85+F+rrJP8hZk6QOkCQXM2Th9mUDYdq/PNByPdT9ID4A==", "license": "MIT", "dependencies": { - "is-any-array": "^2.0.0" + "is-any-array": "^3.0.0" } }, "node_modules/ml-array-min": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/ml-array-min/-/ml-array-min-1.2.3.tgz", - "integrity": "sha512-VcZ5f3VZ1iihtrGvgfh/q0XlMobG6GQ8FsNyQXD3T+IlstDv85g8kfV0xUG1QPRO/t21aukaJowDzMTc7j5V6Q==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ml-array-min/-/ml-array-min-2.0.0.tgz", + "integrity": "sha512-GRj6Ky6sW9vGL6yIjgsHmXZ9YgrdmcQ8nCxPqEGeKc6dkfYg1XDYxGFxADUjNuZyoCd5PUscWAS4N+cFaX6hFg==", "license": "MIT", "dependencies": { - "is-any-array": "^2.0.0" + "is-any-array": "^3.0.0" } }, "node_modules/ml-array-rescale": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/ml-array-rescale/-/ml-array-rescale-1.3.7.tgz", - "integrity": "sha512-48NGChTouvEo9KBctDfHC3udWnQKNKEWN0ziELvY3KG25GR5cA8K8wNVzracsqSW1QEkAXjTNx+ycgAv06/1mQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ml-array-rescale/-/ml-array-rescale-2.0.0.tgz", + "integrity": "sha512-2GGtKfSno94/kIloWGvpp/U5Q5vLvLrza+SAaGsLeo6Xj4mEbA6Gqx+oTfZFkxnd1grT2X007HfJNs3T5BsiVg==", "license": "MIT", "dependencies": { - "is-any-array": "^2.0.0", - "ml-array-max": "^1.2.4", - "ml-array-min": "^1.2.3" + "is-any-array": "^3.0.0", + "ml-array-max": "^2.0.0", + "ml-array-min": "^2.0.0" } }, "node_modules/ml-matrix": { - "version": "6.12.1", - "resolved": "https://registry.npmjs.org/ml-matrix/-/ml-matrix-6.12.1.tgz", - "integrity": "sha512-TJ+8eOFdp+INvzR4zAuwBQJznDUfktMtOB6g/hUcGh3rcyjxbz4Te57Pgri8Q9bhSQ7Zys4IYOGhFdnlgeB6Lw==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ml-matrix/-/ml-matrix-6.15.0.tgz", + "integrity": "sha512-wFa1v6KP8bKp+fj0nYmRs1Pb5K4zRkXGKsOvLinvILENFIADncm4XlOI+S1M7yuACMGfI6cfk0IifDgd4j5xmw==", "license": "MIT", "dependencies": { - "is-any-array": "^2.0.1", - "ml-array-rescale": "^1.3.7" + "is-any-array": "^3.0.0", + "ml-array-rescale": "^2.0.0" } }, "node_modules/module-details-from-path": { @@ -17268,6 +19187,12 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, + "node_modules/murmurhash-js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz", + "integrity": "sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==", + "license": "MIT" + }, "node_modules/mustache": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", @@ -17358,6 +19283,26 @@ "node": "^18 || ^20 || >= 21" } }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "deprecated": "Use your platform's native DOMException instead", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, "node_modules/node-exports-info": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.0.tgz", @@ -17594,7 +19539,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -17604,7 +19548,6 @@ "version": "4.1.7", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", @@ -17704,6 +19647,53 @@ "node": ">=12.20.0" } }, + "node_modules/ogm-viewer": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/ogm-viewer/-/ogm-viewer-0.10.0.tgz", + "integrity": "sha512-/KzBLX03LKYaAporCvo0b8ubLjlQCiJTcjyBVEqWFaA8mL0t3aO8CsAmvEwVtoBYXiabIyExjKWrnk2sOuy8IQ==", + "license": "MIT", + "dependencies": { + "@allmaps/maplibre": "^1.0.0-beta.43", + "@awesome.me/webawesome": "^3.10.0", + "@chunkd/middleware": "^11.3.0", + "@chunkd/source": "^11.4.0", + "@deck.gl/core": "^9.3.1", + "@deck.gl/geo-layers": "^9.3.1", + "@deck.gl/layers": "^9.3.1", + "@deck.gl/mapbox": "^9.3.1", + "@deck.gl/mesh-layers": "^9.3.1", + "@developmentseed/deck.gl-geotiff": "^0.7.0", + "@developmentseed/geotiff": "^0.7.0", + "@geomatico/maplibre-cog-protocol": "^0.9.0", + "@iiif/presentation-2": "^1.0.4", + "@iiif/presentation-3": "^2.2.3", + "@luma.gl/core": "^9.3.3", + "@mapbox/geojson-extent": "^1.0.1", + "@terraformer/wkt": "^2.2.1", + "autolinker": "^4.1.5", + "d3-color": "^3.1.0", + "d3-scale": "^4.0.2", + "lerc": "^4.1.1", + "maplibre-gl": "^5.24.0", + "openseadragon": "^5.0.1", + "pmtiles": "^4.4.1" + } + }, + "node_modules/ogm-viewer/node_modules/lerc": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lerc/-/lerc-4.2.0.tgz", + "integrity": "sha512-5TeQPWq2xnHjaxkTrskOG+Ove9pWRGFMKlofBx2hPORFHmIMhyoYWC5zMUJ9mibq0e5tqTZR/dvyAMZ3F6yCqw==", + "license": "Apache-2.0" + }, + "node_modules/ogm-viewer/node_modules/pmtiles": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/pmtiles/-/pmtiles-4.5.0.tgz", + "integrity": "sha512-CBeD4SoUluFziGdy/8k7FOjQxQy486n+929W/tWophauvMICpkZ26vGBWhDt/6b1FZQWNaf4jFdT/5+q0Wii5w==", + "license": "BSD-3-Clause", + "dependencies": { + "fflate": "^0.8.2" + } + }, "node_modules/ol": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/ol/-/ol-8.1.0.tgz", @@ -17847,7 +19837,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", - "dev": true, "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.6", @@ -18288,6 +20277,21 @@ "node": ">=8" } }, + "node_modules/path-expression-matcher": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.6.2.tgz", + "integrity": "sha512-enSlaiat05iasnzmgNxRj8reFdj3puY2QpNgP1aPIaVfT6nn9ICuPoFlKHk8EN22HcwewshO+mN2DGbkCEOtqQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -18599,7 +20603,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -18813,6 +20816,12 @@ "node": ">=0.10.0" } }, + "node_modules/potpack": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/potpack/-/potpack-2.1.0.tgz", + "integrity": "sha512-pcaShQc1Shq0y+E7GqJqvZj8DTthWV1KeHGdi0Z6IAin2Oi3JnLCOfwnCo84qc+HAp52wT9nK9H7FAJp5a44GQ==", + "license": "ISC" + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -18906,6 +20915,12 @@ "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, "node_modules/progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -18917,16 +20932,24 @@ } }, "node_modules/proj4": { - "version": "2.20.2", - "resolved": "https://registry.npmjs.org/proj4/-/proj4-2.20.2.tgz", - "integrity": "sha512-ipfBRfQly0HhHTO7hnC1GfaX8bvroO7VV4KH889ehmADSE8C/qzp2j+Jj6783S9Tj6c2qX/hhYm7oH0kgXzBAA==", + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/proj4/-/proj4-2.21.0.tgz", + "integrity": "sha512-33HfDftqw8kY+Cl1dcL16SJuqTSzYxmz4re7Nmhk+fs1/N1fFrAkkF579msQTR/4fLeJVSNne8/gpoCz0fk1uw==", "license": "MIT", "dependencies": { "mgrs": "1.0.0", - "wkt-parser": "^1.5.1" + "wkt-parser": "^1.5.5" }, "funding": { "url": "https://github.com/sponsors/ahocevar" + }, + "peerDependencies": { + "geotiff": "*" + }, + "peerDependenciesMeta": { + "geotiff": { + "optional": true + } } }, "node_modules/promise-retry": { @@ -19873,7 +21896,6 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", @@ -19916,7 +21938,6 @@ "version": "1.5.4", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", @@ -20110,9 +22131,9 @@ } }, "node_modules/robust-predicates": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", - "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz", + "integrity": "sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==", "license": "Unlicense" }, "node_modules/rollup": { @@ -20183,6 +22204,11 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/rw": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/rw/-/rw-0.1.4.tgz", + "integrity": "sha512-vSj3D96kMcjNyqPcp65wBRIDImGSrUuMxngNNxvw8MQaO+aQ6llzRPH7XcJy5zrpb3wU++045+Uz/IDIM684iw==" + }, "node_modules/rxjs": { "version": "7.8.2", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", @@ -20197,7 +22223,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", @@ -20237,7 +22262,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -20254,7 +22278,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", - "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -20388,7 +22411,6 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", @@ -20406,7 +22428,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dev": true, "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", @@ -20422,7 +22443,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", - "dev": true, "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", @@ -20433,6 +22453,12 @@ "node": ">= 0.4" } }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "license": "MIT" + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -20683,6 +22709,12 @@ "node": ">=20.0.0" } }, + "node_modules/snappyjs": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/snappyjs/-/snappyjs-0.6.1.tgz", + "integrity": "sha512-YIK6I2lsH072UE0aOFxxY1dPDCS43I5ktqHpeAsuLNYWkE5pGxRGWfDM4/vSUfNzXjC1Ivzt3qx31PCLmc9yqg==", + "license": "MIT" + }, "node_modules/socks": { "version": "2.8.7", "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", @@ -20775,6 +22807,12 @@ "node": ">= 10.x" } }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" + }, "node_modules/ssri": { "version": "12.0.0", "resolved": "https://registry.npmjs.org/ssri/-/ssri-12.0.0.tgz", @@ -20855,7 +22893,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -21004,7 +23041,6 @@ "version": "1.2.10", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", @@ -21026,7 +23062,6 @@ "version": "1.0.9", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", @@ -21045,7 +23080,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.7", @@ -21193,6 +23227,21 @@ "node": ">=0.8.0" } }, + "node_modules/strnum": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.4.2.tgz", + "integrity": "sha512-rDG3Ah4TV0k1hWvLSzkZtMmLN9+eS+h3knq4MP6A42Y3Yh5qGNnOUs1jJkoSr8FG5dsL28c7KgkIBzSEykqtuw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "anynum": "^1.0.1" + } + }, "node_modules/stylis": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", @@ -21397,6 +23446,19 @@ "node": ">=8.10.0" } }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/tar": { "version": "7.5.16", "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.16.tgz", @@ -21594,6 +23656,28 @@ "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", "license": "MIT" }, + "node_modules/texture-compressor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/texture-compressor/-/texture-compressor-1.0.2.tgz", + "integrity": "sha512-dStVgoaQ11mA5htJ+RzZ51ZxIZqNOgWKAIvtjLrW1AliQQLCmrDqNzQZ8Jh91YealQ95DXt4MEduLzJmbs6lig==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.10", + "image-size": "^0.7.4" + }, + "bin": { + "texture-compressor": "bin/texture-compressor.js" + } + }, + "node_modules/texture-compressor/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, "node_modules/thenify": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", @@ -21667,6 +23751,12 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, + "node_modules/tinyqueue": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-3.0.0.tgz", + "integrity": "sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g==", + "license": "ISC" + }, "node_modules/tinyrainbow": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", @@ -21767,6 +23857,23 @@ "node": ">=20" } }, + "node_modules/traverse": { + "version": "0.6.11", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.11.tgz", + "integrity": "sha512-vxXDZg8/+p3gblxB6BhhG5yWVn1kGRlaL8O78UDXc3wRnPizB5g83dcvWV1jpDMIPnjZjOFuxlMmE82XJ4407w==", + "license": "MIT", + "dependencies": { + "gopd": "^1.2.0", + "typedarray.prototype.slice": "^1.0.5", + "which-typed-array": "^1.1.18" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", @@ -21961,7 +24068,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", - "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.3", @@ -21976,7 +24082,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", @@ -21996,7 +24101,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", - "dev": true, "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", @@ -22018,7 +24122,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.7", @@ -22042,6 +24145,28 @@ "dev": true, "license": "MIT" }, + "node_modules/typedarray.prototype.slice": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/typedarray.prototype.slice/-/typedarray.prototype.slice-1.0.5.tgz", + "integrity": "sha512-q7QNVDGTdl702bVFiI5eY4l/HkgCM6at9KhcFbgUAzezHFbOVy4+0O/lCjsABEQwbZPravVfBIiBVGo89yzHFg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "math-intrinsics": "^1.1.0", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-offset": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typescript": { "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", @@ -22108,7 +24233,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", - "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.3", @@ -22816,6 +24940,15 @@ "node": ">=20.0.0" } }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, "node_modules/web-worker": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.5.0.tgz", @@ -22909,7 +25042,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", - "dev": true, "license": "MIT", "dependencies": { "is-bigint": "^1.1.0", @@ -22929,7 +25061,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", - "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -22957,7 +25088,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "dev": true, "license": "MIT", "dependencies": { "is-map": "^2.0.3", @@ -22976,7 +25106,6 @@ "version": "1.1.20", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", - "dev": true, "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", @@ -23054,10 +25183,13 @@ "license": "MIT" }, "node_modules/wkt-parser": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/wkt-parser/-/wkt-parser-1.5.2.tgz", - "integrity": "sha512-1ZUiV1FTwSiSrgWzV9KXJuOF2BVW91KY/mau04BhnmgOdroRQea7Q0s5TVqwGLm0D2tZwObd/tBYXW49sSxp3Q==", - "license": "MIT" + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/wkt-parser/-/wkt-parser-1.5.5.tgz", + "integrity": "sha512-/zMYi94/7D7fxcOSlVmWn6vnOMj3Gq5d1xvVjaYOS9n6h0qOJ4I7YYVxBWYcH1vq9+suhqzXkn05Yx47zQNUIA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ahocevar" + } }, "node_modules/word-wrap": { "version": "1.2.5", @@ -23688,6 +25820,21 @@ "node": ">=18" } }, + "node_modules/xml-naming": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/xml-naming/-/xml-naming-0.3.0.tgz", + "integrity": "sha512-ghig2TBE/H11aOVgmahA3MhimvkBr6JIYknH/Dhdk10nXwdbIqBJsbfMxpvFPG8bAw77gN29aQWvKpmVoPlvPQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/xml-utils": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/xml-utils/-/xml-utils-1.10.2.tgz", @@ -23838,11 +25985,19 @@ "version": "3.25.76", "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" } }, + "node_modules/zstd-codec": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/zstd-codec/-/zstd-codec-0.1.5.tgz", + "integrity": "sha512-v3fyjpK8S/dpY/X5WxqTK3IoCnp/ZOLxn144GZVlNUjtwAchzrVo03h+oMATFhCIiJ5KTr4V3vDQQYz4RU684g==", + "license": "MIT", + "optional": true + }, "node_modules/zstddec": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/zstddec/-/zstddec-0.1.0.tgz", diff --git a/frontend/package.json b/frontend/package.json index 50213658..c746065e 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -57,6 +57,7 @@ "lucide-react": "^0.544.0", "mirador": "4.0.0", "mirador-dl-plugin": "1.0.0", + "ogm-viewer": "0.10.0", "opentelemetry-instrumentation-remix": "^0.8.0", "react": "^19.2.6", "react-dom": "^19.2.6", diff --git a/frontend/src/__tests__/components/ResourceView.test.tsx b/frontend/src/__tests__/components/ResourceView.test.tsx index 3f93c83c..4ea3fafb 100644 --- a/frontend/src/__tests__/components/ResourceView.test.tsx +++ b/frontend/src/__tests__/components/ResourceView.test.tsx @@ -21,6 +21,10 @@ vi.mock('../../components/resource/AllmapsOverlayViewer', () => ({ ), })); +vi.mock('../../components/resource/ResourceViewer', () => ({ + ResourceViewer: () =>
, +})); + // Mock the API functions to return real fixture data vi.mock('../../services/api', () => ({ fetchResourceDetails: vi.fn(), @@ -908,11 +912,7 @@ describe('ResourceView Component', () => { ).toBeInTheDocument(); }); - // ResourceViewer should be rendered (it's a complex component, so we check for its container) - const viewerContainer = document.querySelector( - '.bg-white.rounded-lg.shadow-md' - ); - expect(viewerContainer).toBeInTheDocument(); + expect(screen.getByTestId('resource-viewer')).toBeInTheDocument(); }); it('renders AttributeTable when protocol is wms', async () => { diff --git a/frontend/src/__tests__/components/ResourceViewComponent.test.tsx b/frontend/src/__tests__/components/ResourceViewComponent.test.tsx index 583ad58f..d6abe0ec 100644 --- a/frontend/src/__tests__/components/ResourceViewComponent.test.tsx +++ b/frontend/src/__tests__/components/ResourceViewComponent.test.tsx @@ -10,6 +10,10 @@ import { BookmarkProvider } from '../../context/BookmarkContext'; import { vi } from 'vitest'; import type { GeoDocument } from '../../types/api'; +vi.mock('../../components/resource/ResourceViewer', () => ({ + ResourceViewer: () =>
, +})); + // Real fixture data from the /test/fixtures page const realFixtureData: GeoDocument[] = [ { @@ -598,11 +602,7 @@ describe('ResourceView Component', () => { ).toBeGreaterThan(0); }); - // ResourceViewer should be rendered when protocol is available - expect( - screen.getAllByText('Nondigitized paper map with library catalog link') - .length - ).toBeGreaterThan(0); + expect(screen.getByTestId('resource-viewer')).toBeInTheDocument(); }); it('renders AttributeTable when protocol is wms', async () => { diff --git a/frontend/src/__tests__/components/resource/ResourceViewer.test.tsx b/frontend/src/__tests__/components/resource/ResourceViewer.test.tsx index bfabf0d9..9578071c 100644 --- a/frontend/src/__tests__/components/resource/ResourceViewer.test.tsx +++ b/frontend/src/__tests__/components/resource/ResourceViewer.test.tsx @@ -1,556 +1,160 @@ -import { act, render } from '@testing-library/react'; -import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; - -const mocks = vi.hoisted(() => { - const fitInternal = vi.fn(); - const fit = vi.fn(); - const setCenter = vi.fn(); - const setResolution = vi.fn(); - const setViewportSize = vi.fn(); - const useGeographic = vi.fn(); - const transformExtent = vi.fn((extent: number[]) => extent); - const geoTiff = vi.fn(); - const pmtilesVectorSource = vi.fn(); - const vectorTileLayer = vi.fn(); - const webglTileLayer = vi.fn(); - const tileLayer = vi.fn(); - const xyzSource = vi.fn(); - const style = vi.fn(); - const stroke = vi.fn(); - const fill = vi.fn(); - const circle = vi.fn(); - const polygonFromExtent = vi.fn((extent: number[]) => ({ - extent, - getFlatCoordinates: () => extent, - getStride: () => 2, - })); - const overlaySource = { - getState: vi.fn(() => 'ready'), - on: vi.fn(), - un: vi.fn(), - }; - const overlay = { - getSource: vi.fn(() => overlaySource), - }; - const map = { - getSize: vi.fn(() => undefined), - updateSize: vi.fn(), - renderSync: vi.fn(), - on: vi.fn(), - setTarget: vi.fn(), - getEventPixel: vi.fn(() => [0, 0]), - hasFeatureAtPixel: vi.fn(() => false), - getViewport: vi.fn(() => ({ style: { cursor: '' } })), - getFeaturesAtPixel: vi.fn(() => []), - }; - const view = { - getProjection: vi.fn(() => ({ getCode: () => 'EPSG:3857' })), - setViewportSize, - fitInternal, - fit, - getCenterInternal: vi.fn(() => [-10381844.95, 5616966.0]), - getCenter: vi.fn(() => [-10381844.95, 5616966.0]), - setCenter, - setResolution, - getResolutionForExtentInternal: vi.fn(() => 128), - }; - const olMap = vi.fn(function OlMap() { - return map; - }); - const olView = vi.fn(function View() { - return view; - }); - - vectorTileLayer.mockImplementation(function VectorTileLayer() { - return overlay; - }); - webglTileLayer.mockImplementation(function WebGLTileLayer() { - return overlay; - }); - - return { - circle, - fill, - fit, - fitInternal, - geoTiff, - map, - olMap, - olView, - overlay, - overlaySource, - pmtilesVectorSource, - polygonFromExtent, - setCenter, - setResolution, - setViewportSize, - stroke, - style, - tileLayer, - transformExtent, - useGeographic, - vectorTileLayer, - view, - webglTileLayer, - xyzSource, - }; -}); - -vi.mock('ol/Map', () => ({ - default: mocks.olMap, -})); - -vi.mock('ol/View', () => ({ - default: mocks.olView, -})); - -vi.mock('ol/control', () => ({ - FullScreen: vi.fn(function FullScreen() {}), - defaults: vi.fn(() => ({ - extend: vi.fn(() => []), - })), -})); - -vi.mock('ol/layer/Tile', () => ({ - default: mocks.tileLayer, -})); - -vi.mock('ol/source/XYZ', () => ({ - default: mocks.xyzSource, -})); - -vi.mock('ol/layer/VectorTile.js', () => ({ - default: mocks.vectorTileLayer, -})); - -vi.mock('ol/layer/WebGLTile.js', () => ({ - default: mocks.webglTileLayer, -})); - -vi.mock('ol/source/GeoTIFF.js', () => ({ - default: mocks.geoTiff, +import { render, screen, waitFor } from '@testing-library/react'; +import { afterEach, beforeAll, describe, expect, it, vi } from 'vitest'; + +const mocks = vi.hoisted(() => ({ + setAssetBase: vi.fn(), + recordConstructor: vi.fn(function MockOgmRecord( + this: { json?: Record }, + data: Record + ) { + this.json = data; + }), })); -vi.mock('ol-pmtiles', () => ({ - PMTilesVectorSource: mocks.pmtilesVectorSource, +vi.mock('ogm-viewer', () => ({})); +vi.mock('ogm-viewer/lib', () => ({ + OgmRecord: mocks.recordConstructor, })); - -vi.mock('ol/style.js', () => ({ - Circle: mocks.circle, - Fill: mocks.fill, - Stroke: mocks.stroke, - Style: mocks.style, -})); - -vi.mock('ol/geom/Polygon', () => ({ - fromExtent: mocks.polygonFromExtent, -})); - -vi.mock('ol/proj', () => ({ - transformExtent: mocks.transformExtent, - useGeographic: mocks.useGeographic, +vi.mock('ogm-viewer/components/p-BbMGvQFJ.js', () => ({ + s: mocks.setAssetBase, })); import { ResourceViewer } from '../../../components/resource/ResourceViewer'; -const cogDataWithGeometry = { - attributes: { dct_references_s: {} }, - meta: { - ui: { - viewer: { - protocol: 'cog', - endpoint: 'https://example.com/cog.tif', - geometry: { - type: 'Polygon', - coordinates: [ - [ - [-97.73743, 30.28753], - [-97.73743, 30.28409], - [-97.73346, 30.28409], - [-97.73346, 30.28753], - [-97.73743, 30.28753], - ], - ], - }, - }, - }, - }, -} as Parameters[0]['data']; - -const pmtilesDataWithGeometry = { - attributes: { dct_references_s: {} }, - meta: { - ui: { - viewer: { - protocol: 'pmtiles', - endpoint: 'https://example.com/test.pmtiles', - geometry: { - type: 'Polygon', - coordinates: [ - [ - [-93.3291, 44.8908], - [-93.3291, 45.0512], - [-93.1943, 45.0512], - [-93.1943, 44.8908], - [-93.3291, 44.8908], - ], - ], - }, - }, - }, - }, -} as Parameters[0]['data']; - -const pmtilesDataWithMultiPolygonGeometry = { - attributes: { dct_references_s: {} }, - meta: { - ui: { - viewer: { - protocol: 'pmtiles', - endpoint: 'https://example.com/champaign.pmtiles', - geometry: { - type: 'MultiPolygon', - coordinates: [ - [ - [ - [-88.3336, 40.0619], - [-88.2801, 40.1488], - [-88.3336, 40.0619], - ], - ], - [ - [ - [-88.277, 40.1212], - [-88.2226, 40.1709], - [-88.277, 40.1212], - ], - ], - ], - }, - }, - }, - }, -} as Parameters[0]['data']; - -const wmsDataWithGeometry = { - attributes: { - dct_references_s: {}, - ogm: { - id: 'cook-county-contours', - gbl_wxsIdentifier_s: 'Contours', - }, - }, - meta: { - ui: { - viewer: { - protocol: 'wms', - endpoint: - 'https://example.com/cook-county/services/contours/MapServer/WMSServer', - geometry: { - type: 'Polygon', - coordinates: [ - [ - [-88.2, 41.6], - [-88.2, 42.2], - [-87.4, 42.2], - [-87.4, 41.6], - [-88.2, 41.6], - ], - ], - }, - }, - }, - }, -} as Parameters[0]['data']; - -const secondWmsDataWithGeometry = { - attributes: { - dct_references_s: {}, - ogm: { - id: 'cook-county-zoning', - gbl_wxsIdentifier_s: 'Zoning', - }, - }, - meta: { - ui: { - viewer: { - protocol: 'wms', - endpoint: - 'https://example.com/cook-county/services/zoning/MapServer/WMSServer', - geometry: { - type: 'Polygon', - coordinates: [ - [ - [-88.0, 41.7], - [-88.0, 42.0], - [-87.5, 42.0], - [-87.5, 41.7], - [-88.0, 41.7], - ], - ], - }, - }, - }, - }, -} as Parameters[0]['data']; - -const iiifManifestData = { - attributes: { dct_references_s: {} }, - meta: { - ui: { - viewer: { - protocol: 'iiif_manifest', - endpoint: 'https://example.com/iiif/manifest.json', - geometry: { - type: 'Polygon', - coordinates: [ - [ - [-88.0, 41.7], - [-88.0, 42.0], - [-87.5, 42.0], - [-87.5, 41.7], - [-88.0, 41.7], - ], - ], - }, - }, - }, - }, -} as Parameters[0]['data']; +const PMTILES_REFERENCE = 'https://github.com/protomaps/PMTiles'; +const WMS_REFERENCE = 'http://www.opengis.net/def/serviceType/ogc/wms'; -const iiifImageDataWithoutGeometry = { - attributes: { dct_references_s: {} }, - meta: { - ui: { - viewer: { - protocol: 'iiif_image', - endpoint: - 'https://cdm17287.contentdm.oclc.org/digital/iiif/wpamaps/2535/info.json', +function viewerData(id: string, references: string | Record) { + return { + id, + attributes: { + ogm: { + id, + dct_title_s: `Resource ${id}`, + gbl_resourceClass_sm: ['Datasets'], + dct_accessRights_s: 'Public', + gbl_mdVersion_s: 'Aardvark', + gbl_wxsIdentifier_s: 'example-layer', + dct_references_s: references, }, }, - }, -} as Parameters[0]['data']; + } as Parameters[0]['data']; +} describe('ResourceViewer', () => { - let rectSpy: ReturnType; - - beforeEach(() => { - vi.useFakeTimers(); - vi.stubGlobal('requestAnimationFrame', (cb: FrameRequestCallback) => { - cb(0); - return 1; - }); - vi.stubGlobal('cancelAnimationFrame', vi.fn()); - vi.stubGlobal( - 'ResizeObserver', - class ResizeObserver { - observe = vi.fn(); - disconnect = vi.fn(); - } - ); - rectSpy = vi - .spyOn(HTMLElement.prototype, 'getBoundingClientRect') - .mockReturnValue({ - width: 1094, - height: 600, - top: 0, - left: 0, - right: 1094, - bottom: 600, - x: 0, - y: 0, - toJSON: () => ({}), - } as DOMRect); + beforeAll(() => { + if (!customElements.get('ogm-viewer')) { + customElements.define( + 'ogm-viewer', + class extends HTMLElement { + private currentRecord?: unknown; + + get loadedRecord() { + return this.currentRecord; + } + + async loadRecord(record: unknown) { + this.currentRecord = record; + this.dispatchEvent(new CustomEvent('previewsLoading')); + queueMicrotask(() => { + this.dispatchEvent(new CustomEvent('previewsLoaded')); + }); + } + } + ); + } }); afterEach(() => { - rectSpy.mockRestore(); - vi.useRealTimers(); - vi.unstubAllGlobals(); vi.clearAllMocks(); - mocks.map.getSize.mockReturnValue(undefined); - mocks.view.getCenterInternal.mockReturnValue([-10381844.95, 5616966.0]); - mocks.overlaySource.getState.mockReturnValue('ready'); }); - describe('OpenLayers viewer bootstrap', () => { - it('fits a COG map using the rendered element size when map size is unavailable', async () => { - render(); - - await act(async () => { - await vi.runAllTimersAsync(); - }); - - expect(mocks.olMap).toHaveBeenCalled(); - expect(mocks.geoTiff).toHaveBeenCalledWith({ - sources: [{ url: 'https://example.com/cog.tif' }], - convertToRGB: true, - }); - expect(mocks.setViewportSize).toHaveBeenCalledWith([1094, 600]); - expect(mocks.fitInternal).toHaveBeenCalled(); - expect(mocks.fitInternal.mock.calls[0][1]).toMatchObject({ - size: [1094, 600], - maxZoom: 19, - }); - }); - - it('boots PMTiles through the local layer path and enables geographic mode', async () => { - render( - - ); - - await act(async () => { - await vi.runAllTimersAsync(); - }); + it('loads the Aardvark record into the full OGM viewer', async () => { + const references = { + [PMTILES_REFERENCE]: 'https://example.com/resource.pmtiles', + }; + const { container } = render( + + ); - expect(mocks.useGeographic).toHaveBeenCalled(); - expect(mocks.pmtilesVectorSource).toHaveBeenCalledWith({ - url: 'https://example.com/test.pmtiles', - }); - expect(mocks.vectorTileLayer).toHaveBeenCalled(); - expect(mocks.fitInternal).toHaveBeenCalled(); - }); + expect(screen.getByRole('status')).toHaveTextContent('Loading viewer…'); - it('boots PMTiles when viewer geometry is a MultiPolygon', async () => { - render( - - ); + await waitFor(() => expect(mocks.recordConstructor).toHaveBeenCalled()); - await act(async () => { - await vi.runAllTimersAsync(); - }); + expect(mocks.setAssetBase).toHaveBeenCalledWith('/ogm-viewer/'); + expect(mocks.recordConstructor).toHaveBeenCalledWith( + expect.objectContaining({ + id: 'resource-1', + gbl_mdVersion_s: 'Aardvark', + dct_references_s: JSON.stringify(references), + }) + ); - expect(mocks.pmtilesVectorSource).toHaveBeenCalledWith({ - url: 'https://example.com/champaign.pmtiles', - }); - expect(mocks.olMap).toHaveBeenCalled(); - expect(mocks.transformExtent).toHaveBeenCalledWith( - [-88.3336, 40.0619, -88.2226, 40.1709], - 'EPSG:4326', - 'EPSG:3857' - ); - expect(mocks.fitInternal).toHaveBeenCalled(); - }); + const viewer = container.querySelector('ogm-viewer') as HTMLElement & { + loadedRecord?: unknown; + }; + expect(viewer.loadedRecord).toBe(mocks.recordConstructor.mock.instances[0]); + expect(viewer).toHaveAttribute('theme', 'light'); + expect(viewer).toHaveClass('h-[600px]'); + expect(screen.queryByRole('status')).not.toBeInTheDocument(); }); - describe('Leaflet-backed viewer remounts', () => { - it('renders IIIF Image API endpoints through the Leaflet IIIF protocol instead of Mirador', async () => { - const { container } = render( - - ); - - await act(async () => {}); - - expect( - container.querySelector('iframe[title="Mirador viewer"]') - ).toBeNull(); - - const viewer = container.querySelector('#leaflet-viewer'); - expect(viewer).not.toBeNull(); - expect(viewer?.getAttribute('data-leaflet-viewer-protocol-value')).toBe( - 'Iiif' - ); - expect(viewer?.getAttribute('data-leaflet-viewer-available-value')).toBe( - 'true' - ); - expect(viewer?.getAttribute('data-leaflet-viewer-url-value')).toBe( - 'https://cdm17287.contentdm.oclc.org/digital/iiif/wpamaps/2535/info.json' - ); - expect(viewer?.hasAttribute('data-leaflet-viewer-map-geom-value')).toBe( - false - ); + it('preserves serialized references and replaces the record when data changes', async () => { + const firstReferences = JSON.stringify({ + [WMS_REFERENCE]: 'https://example.com/first/wms', }); + const secondReferences = JSON.stringify({ + [WMS_REFERENCE]: 'https://example.com/second/wms', + }); + const { container, rerender } = render( + + ); - it('replaces the viewer container when the resource changes', async () => { - const { rerender, container } = render( - - ); - - await act(async () => {}); - - const firstViewer = container.querySelector('#leaflet-viewer'); - expect(firstViewer).not.toBeNull(); - expect( - firstViewer?.getAttribute('data-leaflet-viewer-layer-id-value') - ).toBe('Contours'); - expect( - JSON.parse( - firstViewer?.getAttribute('data-leaflet-viewer-options-value') ?? '{}' - ) - ).toMatchObject({ - MAP: { - gestureHandling: true, - scrollWheelZoom: true, - }, - SLEEP: { - SLEEP: false, - }, - }); + await waitFor(() => + expect(mocks.recordConstructor).toHaveBeenCalledTimes(1) + ); + expect(mocks.recordConstructor).toHaveBeenLastCalledWith( + expect.objectContaining({ dct_references_s: firstReferences }) + ); - rerender( - - ); + rerender( + + ); - await act(async () => {}); + await waitFor(() => + expect(mocks.recordConstructor).toHaveBeenCalledTimes(2) + ); + expect(mocks.recordConstructor).toHaveBeenLastCalledWith( + expect.objectContaining({ + id: 'resource-2', + dct_references_s: secondReferences, + }) + ); - const secondViewer = container.querySelector('#leaflet-viewer'); - expect(secondViewer).not.toBeNull(); - expect(secondViewer).not.toBe(firstViewer); - expect( - secondViewer?.getAttribute('data-leaflet-viewer-layer-id-value') - ).toBe('Zoning'); - expect(secondViewer?.getAttribute('data-leaflet-viewer-url-value')).toBe( - 'https://example.com/cook-county/services/zoning/MapServer/WMSServer' - ); - }); + const viewer = container.querySelector('ogm-viewer') as HTMLElement & { + loadedRecord?: unknown; + }; + expect(viewer.loadedRecord).toBe(mocks.recordConstructor.mock.instances[1]); }); - describe('Mirador viewer iframe', () => { - it('loads the local Mirador route with the manifest URL and download-safe sandbox permissions', async () => { - const happyDOM = ( - window as typeof window & { - happyDOM?: { - settings: { - fetch: { - interceptor: unknown; - }; - }; - }; - } - ).happyDOM; - const previousInterceptor = happyDOM?.settings.fetch.interceptor; - if (happyDOM) { - happyDOM.settings.fetch.interceptor = { - beforeAsyncRequest: async () => - new window.Response('', { - headers: { 'Content-Type': 'text/html' }, - }), - }; - } - - const { container } = render( - - ); - - await act(async () => {}); + it('shows an accessible fallback when the OGM record cannot be loaded', async () => { + const consoleError = vi + .spyOn(console, 'error') + .mockImplementation(() => {}); + mocks.recordConstructor.mockImplementationOnce(function BrokenOgmRecord() { + throw new Error('Invalid record'); + }); - const iframe = container.querySelector('iframe[title="Mirador viewer"]'); - expect(iframe).not.toBeNull(); + render(); - const src = iframe?.getAttribute('src'); - expect(src).toContain('/mirador?'); - expect(new URL(src ?? '').searchParams.get('manifest')).toBe( - 'https://example.com/iiif/manifest.json' - ); - expect(iframe?.getAttribute('sandbox')).toContain('allow-downloads'); - expect(iframe?.getAttribute('sandbox')).toContain('allow-popups'); + expect(await screen.findByRole('alert')).toHaveTextContent( + 'Item viewer unavailable.' + ); + expect(consoleError).toHaveBeenCalledWith( + 'Failed to load OGM viewer:', + expect.any(Error) + ); - if (happyDOM) { - happyDOM.settings.fetch.interceptor = previousInterceptor; - } - }); + consoleError.mockRestore(); }); }); diff --git a/frontend/src/__tests__/geoblacklight/leaflet_viewer_controller.test.js b/frontend/src/__tests__/geoblacklight/leaflet_viewer_controller.test.js deleted file mode 100644 index 0e187456..00000000 --- a/frontend/src/__tests__/geoblacklight/leaflet_viewer_controller.test.js +++ /dev/null @@ -1,180 +0,0 @@ -import Leaflet from 'leaflet'; -import { describe, expect, it } from 'vitest'; -import { - EMPTY_IIIF_TILE_URL, - getIiifImageBounds, - getIiifLeafletMapOptions, - getIiifMaxNativeZoom, - getIiifTileUrl, - IIIF_MIN_ZOOM, - normalizeIiifImageServiceId, - resizeIiifTileToNaturalSize, -} from '../../geoblacklight/iiif_image_layer'; - -const baseTileOptions = { - imageApiVersion: 2, - imageHeight: 6270, - imageWidth: 7392, - maxNativeZoom: 3, - serviceId: - 'https://s3.amazonaws.com/ogm-metadata-studio/uploads/unr-74479f22-0e6b-4c13-b376-0195a7461525/iiif', - tileFormat: 'jpg', - tileQuality: 'default', - tileSize: 1024, -}; - -describe('Leaflet IIIF helpers', () => { - it('computes the native zoom from IIIF image dimensions and tile size', () => { - expect(getIiifMaxNativeZoom(7392, 6270, 1024)).toBe(3); - }); - - it('builds CRS.Simple image bounds from pixel dimensions at native zoom', () => { - const bounds = getIiifImageBounds(Leaflet, 7392, 6270, 3); - - expect(bounds.getSouthWest().lat).toBeCloseTo(-783.75); - expect(bounds.getSouthWest().lng).toBeCloseTo(0); - expect(bounds.getNorthEast().lat).toBeCloseTo(0); - expect(bounds.getNorthEast().lng).toBeCloseTo(924); - }); - - it('pins IIIF maps to CRS.Simple and image bounds even when generic map settings exist', () => { - const bounds = getIiifImageBounds(Leaflet, 7392, 6270, 3); - const options = getIiifLeafletMapOptions( - Leaflet, - bounds, - 3, - { SLEEP: false }, - { - crs: Leaflet.CRS.EPSG3857, - gestureHandling: true, - maxZoom: 18, - scrollWheelZoom: true, - zoom: 7, - } - ); - - expect(options.crs).toBe(Leaflet.CRS.Simple); - expect(options.center.equals(bounds.getCenter())).toBe(true); - expect(options.gestureHandling).toBe(true); - expect(options.maxBounds.contains(bounds)).toBe(true); - expect(options.maxZoom).toBe(3); - expect(options.minZoom).toBe(IIIF_MIN_ZOOM); - expect(options.scrollWheelZoom).toBe(true); - expect(options.zoom).toBe(0); - }); - - it('allows large CONTENTdm scans to fit by zooming out below native IIIF zoom 0', () => { - const maxNativeZoom = getIiifMaxNativeZoom(8826, 11246, 1024); - const bounds = getIiifImageBounds(Leaflet, 8826, 11246, maxNativeZoom); - const options = getIiifLeafletMapOptions( - Leaflet, - bounds, - maxNativeZoom, - { SLEEP: false }, - {} - ); - - expect(maxNativeZoom).toBe(4); - expect(bounds.getNorthEast().lng).toBeCloseTo(551.625); - expect(bounds.getSouthWest().lat).toBeCloseTo(-702.875); - expect(options.minZoom).toBe(-5); - }); - - it('normalizes IIIF service ids from info.json metadata', () => { - expect( - normalizeIiifImageServiceId('https://example.com/fallback/info.json', { - '@id': 'https://example.com/canonical/info.json', - }) - ).toBe('https://example.com/canonical'); - }); - - it('preserves encoded slashes when the decoded IIIF service id would break routing', () => { - expect( - normalizeIiifImageServiceId( - 'https://asset.library.wisc.edu/iiif/1711.dl%2F5WA3TYLSGTMK29A/info.json', - { - '@id': 'https://asset.library.wisc.edu/iiif/1711.dl/5WA3TYLSGTMK29A', - } - ) - ).toBe('https://asset.library.wisc.edu/iiif/1711.dl%2F5WA3TYLSGTMK29A'); - }); - - it('generates IIIF v2 region tile URLs for the initial zoom level', () => { - expect( - getIiifTileUrl({ - ...baseTileOptions, - coords: { x: 0, y: 0, z: 0 }, - }) - ).toBe( - 'https://s3.amazonaws.com/ogm-metadata-studio/uploads/unr-74479f22-0e6b-4c13-b376-0195a7461525/iiif/0,0,7392,6270/924,/0/default.jpg' - ); - }); - - it('clamps display zooms below the native IIIF pyramid to zoom 0 tile requests', () => { - expect( - getIiifTileUrl({ - ...baseTileOptions, - coords: { x: 0, y: 0, z: -2 }, - }) - ).toBe( - getIiifTileUrl({ - ...baseTileOptions, - coords: { x: 0, y: 0, z: 0 }, - }) - ); - }); - - it('clips IIIF edge tiles to the image dimensions', () => { - expect( - getIiifTileUrl({ - ...baseTileOptions, - coords: { x: 7, y: 6, z: 3 }, - }) - ).toBe( - 'https://s3.amazonaws.com/ogm-metadata-studio/uploads/unr-74479f22-0e6b-4c13-b376-0195a7461525/iiif/7168,6144,224,126/224,/0/default.jpg' - ); - }); - - it('uses IIIF v3 width,height size syntax', () => { - expect( - getIiifTileUrl({ - ...baseTileOptions, - imageApiVersion: 3, - coords: { x: 0, y: 0, z: 3 }, - }) - ).toBe( - 'https://s3.amazonaws.com/ogm-metadata-studio/uploads/unr-74479f22-0e6b-4c13-b376-0195a7461525/iiif/0,0,1024,1024/1024,1024/0/default.jpg' - ); - }); - - it('does not request remote URLs for tiles outside the image', () => { - expect( - getIiifTileUrl({ - ...baseTileOptions, - coords: { x: 8, y: 0, z: 3 }, - }) - ).toBe(EMPTY_IIIF_TILE_URL); - }); - - it('resizes non-square IIIF tiles to their natural image dimensions', () => { - const tile = document.createElement('img'); - Object.defineProperty(tile, 'naturalWidth', { value: 552 }); - Object.defineProperty(tile, 'naturalHeight', { value: 703 }); - - resizeIiifTileToNaturalSize(tile, 1024); - - expect(tile.style.width).toBe('552px'); - expect(tile.style.height).toBe('703px'); - }); - - it('leaves full-size square IIIF tiles alone', () => { - const tile = document.createElement('img'); - Object.defineProperty(tile, 'naturalWidth', { value: 1024 }); - Object.defineProperty(tile, 'naturalHeight', { value: 1024 }); - - resizeIiifTileToNaturalSize(tile, 1024); - - expect(tile.style.width).toBe(''); - expect(tile.style.height).toBe(''); - }); -}); diff --git a/frontend/src/components/resource/ResourceView.tsx b/frontend/src/components/resource/ResourceView.tsx index 9f656001..aa82baad 100644 --- a/frontend/src/components/resource/ResourceView.tsx +++ b/frontend/src/components/resource/ResourceView.tsx @@ -315,7 +315,7 @@ export function ResourceView() { {viewerProtocol && (
- +
)} diff --git a/frontend/src/components/resource/ResourceViewer.tsx b/frontend/src/components/resource/ResourceViewer.tsx index f8082c74..5e6284d0 100644 --- a/frontend/src/components/resource/ResourceViewer.tsx +++ b/frontend/src/components/resource/ResourceViewer.tsx @@ -1,642 +1,137 @@ import { useEffect, useRef, useState } from 'react'; -import OlMap from 'ol/Map'; -import View from 'ol/View'; -import { FullScreen, defaults as defaultControls } from 'ol/control'; -import VectorTileLayer from 'ol/layer/VectorTile.js'; -import { leafletViewerOptions } from '../../config/leafletConfig'; -import { MetadataTable } from './MetadataTable'; -import { getWgs84ExtentFromViewerGeometry } from '../../utils/geometryUtils'; -import { fromExtent as polygonFromExtent } from 'ol/geom/Polygon'; -import { transformExtent, useGeographic } from 'ol/proj'; -import TileLayer from 'ol/layer/Tile'; -import WebGLTileLayer from 'ol/layer/WebGLTile.js'; -import XYZ from 'ol/source/XYZ'; -import GeoTIFF from 'ol/source/GeoTIFF.js'; -import { PMTilesVectorSource } from 'ol-pmtiles'; -import { Circle as CircleStyle, Fill, Stroke, Style } from 'ol/style.js'; +import type { GeoBlacklightSchemaAardvark, OgmRecord } from 'ogm-viewer/lib'; interface ResourceViewerProps { data: { + id?: string; attributes: { - dct_references_s?: string | Record; - ogm?: { + ogm?: Record & { id?: string; - gbl_wxsIdentifier_s?: string; - gbl_wxsidentifier_s?: string; - }; - [key: string]: unknown; - }; - meta?: { - ui?: { - viewer?: { - protocol?: string; - endpoint?: string; - geometry?: string; - }; + dct_title_s?: string; + gbl_resourceClass_sm?: string[]; + dct_accessRights_s?: string; + gbl_mdVersion_s?: string; + dct_references_s?: string | Record; + gbl_mdversion_s?: string; }; }; }; - pageValue: string; - totalResults?: number; - searchUrl?: string; - currentPage?: number; } -type ViewerExtent = [number, number, number, number]; - -const OPENLAYERS_BASEMAP = { - url: 'https://{a-d}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png', - attributions: - '© OpenStreetMap contributors, © Carto', - maxZoom: 18, +type OgmViewerElement = HTMLElement & { + loadRecord(record: OgmRecord): Promise; + theme: 'light' | 'dark'; }; -function isFiniteExtent( - extent: number[] | null | undefined -): extent is ViewerExtent { - return !!extent && extent.length === 4 && extent.every(Number.isFinite); -} - -function getFitSize( - map: OlMap, - element: HTMLDivElement -): [number, number] | null { - const mapSize = map.getSize(); - if ( - mapSize && - mapSize.length === 2 && - mapSize[0] > 0 && - mapSize[1] > 0 && - Number.isFinite(mapSize[0]) && - Number.isFinite(mapSize[1]) - ) { - return [mapSize[0], mapSize[1]]; - } - - const rect = element.getBoundingClientRect(); - if (rect.width > 0 && rect.height > 0) { - return [Math.round(rect.width), Math.round(rect.height)]; - } - - return null; -} - -function fitViewToWgs84Extent(params: { - map: OlMap; - view: View; - element: HTMLDivElement; - wgs84Extent: ViewerExtent; -}) { - const { map, view, element, wgs84Extent } = params; - map.updateSize(); - - const fitSize = getFitSize(map, element); - if (!fitSize) return; - - view.setViewportSize?.(fitSize); - - const projectionCode = view.getProjection()?.getCode?.() || 'EPSG:3857'; - const extentInViewProjection = - projectionCode === 'EPSG:4326' - ? wgs84Extent - : (transformExtent( - wgs84Extent, - 'EPSG:4326', - projectionCode - ) as ViewerExtent); - - if (!extentInViewProjection.every(Number.isFinite)) { - return; - } - - const fitOptions = { - size: fitSize, - padding: [16, 16, 16, 16] as [number, number, number, number], - maxZoom: 19, - duration: 0, - }; - - if (typeof (view as any).fitInternal === 'function') { - (view as any).fitInternal( - polygonFromExtent(extentInViewProjection), - fitOptions - ); - } else { - view.fit(extentInViewProjection, fitOptions); - } - - const center = view.getCenterInternal?.() ?? view.getCenter?.(); - if (center && Number.isFinite(center[0]) && Number.isFinite(center[1])) { - return; - } - - const fallbackCenter: [number, number] = [ - (extentInViewProjection[0] + extentInViewProjection[2]) / 2, - (extentInViewProjection[1] + extentInViewProjection[3]) / 2, - ]; - view.setCenter(fallbackCenter); - - if (typeof (view as any).getResolutionForExtentInternal === 'function') { - const paddedSize: [number, number] = [ - Math.max(fitSize[0] - 32, 1), - Math.max(fitSize[1] - 32, 1), - ]; - const resolution = (view as any).getResolutionForExtentInternal( - extentInViewProjection, - paddedSize - ); - if (Number.isFinite(resolution) && resolution > 0) { - view.setResolution(resolution); - } - } +function toAardvarkRecord(data: ResourceViewerProps['data']) { + const ogm = data.attributes.ogm ?? {}; + const references = ogm.dct_references_s; + + return { + ...ogm, + id: ogm.id ?? data.id ?? '', + dct_title_s: ogm.dct_title_s ?? '', + gbl_resourceClass_sm: ogm.gbl_resourceClass_sm ?? [], + dct_accessRights_s: + ogm.dct_accessRights_s === 'Restricted' ? 'Restricted' : 'Public', + gbl_mdVersion_s: ogm.gbl_mdVersion_s ?? ogm.gbl_mdversion_s ?? 'Aardvark', + dct_references_s: + typeof references === 'string' + ? references + : JSON.stringify(references ?? {}), + } as unknown as GeoBlacklightSchemaAardvark; } -function createPmTilesLayer(url: string) { - useGeographic(); - - return new VectorTileLayer({ - declutter: true, - source: new PMTilesVectorSource({ url }), - style: new Style({ - stroke: new Stroke({ - color: '#7070B3', - width: 1, - }), - fill: new Fill({ - color: '#FFFFFF', - }), - image: new CircleStyle({ - radius: 7, - fill: new Fill({ - color: '#7070B3', - }), - stroke: new Stroke({ - color: '#FFFFFF', - width: 2, - }), - }), - }), - }); -} - -function createCogLayer(url: string) { - return new WebGLTileLayer({ - source: new GeoTIFF({ - sources: [{ url }], - convertToRGB: true, - }), - }); -} - -function escapeHtml(value: string) { - return value - .replaceAll('&', '&') - .replaceAll('<', '<') - .replaceAll('>', '>') - .replaceAll('"', '"') - .replaceAll("'", '''); -} - -function formatInspectionValue(value: unknown) { - if (value === null || value === undefined) return ''; - if (typeof value === 'string') { - const trimmed = value.trim(); - if (/^https?:\/\//i.test(trimmed)) { - const safeUrl = escapeHtml(trimmed); - return `${safeUrl}`; - } - return escapeHtml(trimmed); - } - if (typeof value === 'number' || typeof value === 'boolean') { - return String(value); - } - - try { - return escapeHtml(JSON.stringify(value)); - } catch { - return escapeHtml(String(value)); - } -} - -function enablePmTilesInspection(map: OlMap) { - map.on('pointermove', (event: any) => { - const pixel = map.getEventPixel(event.originalEvent); - const hit = map.hasFeatureAtPixel(pixel); - map.getViewport().style.cursor = hit ? 'crosshair' : ''; - }); - - map.on('click', (event: any) => { - const tableBody = document.querySelector('.attribute-table-body'); - if (!tableBody) return; - - const features = map.getFeaturesAtPixel(event.pixel); - if (!features.length) { - tableBody.innerHTML = - 'Could not find that feature'; - return; - } - - const properties = features[0].getProperties(); - let html = ''; - Object.entries(properties).forEach(([property, value]) => { - html += `${escapeHtml(property)}${formatInspectionValue(value)}`; - }); - html += ''; - tableBody.outerHTML = html; - }); -} - -function OpenLayersPreviewMap({ - protocol, - endpoint, - geometryForViewer, - preCalculatedExtent, -}: { - protocol: string; - endpoint: string; - geometryForViewer: string; - preCalculatedExtent: number[] | null; -}) { - const elementRef = useRef(null); +export function ResourceViewer({ data }: ResourceViewerProps) { + const viewerRef = useRef(null); + const [ready, setReady] = useState(false); + const [error, setError] = useState(false); useEffect(() => { - const element = elementRef.current; - if (!element) return; + const viewerElement = viewerRef.current; + let cancelled = false; - const wgs84Extent = - (isFiniteExtent(preCalculatedExtent) && preCalculatedExtent) || - getWgs84ExtentFromViewerGeometry(geometryForViewer); + async function loadViewer() { + setReady(false); + setError(false); - if (!isFiniteExtent(wgs84Extent)) { - return; - } - - const isPmtilesProtocol = protocol.toLowerCase() === 'pmtiles'; - const basemap = new TileLayer({ - source: new XYZ(OPENLAYERS_BASEMAP), - }); - const overlay = isPmtilesProtocol - ? createPmTilesLayer(endpoint) - : createCogLayer(endpoint); - const view = new View({ - projection: 'EPSG:3857', - center: [0, 0], - zoom: 2, - }); - const map = new OlMap({ - target: element, - controls: defaultControls().extend([new FullScreen()]), - layers: [basemap, overlay], - view, - }); - - if (isPmtilesProtocol) { try { - enablePmTilesInspection(map); - } catch (error) { - console.warn('PMTiles inspection setup failed:', error); - } - } - - const refit = () => { - fitViewToWgs84Extent({ - map, - view, - element, - wgs84Extent, - }); - map.renderSync?.(); - }; - - let disposed = false; - const timeoutIds = [0, 100, 300].map((delay) => - window.setTimeout(() => { - if (!disposed) refit(); - }, delay) - ); - let secondFrame = 0; - const firstFrame = window.requestAnimationFrame(() => { - refit(); - secondFrame = window.requestAnimationFrame(() => { - if (!disposed) refit(); - }); - }); - - const resizeObserver = - typeof ResizeObserver !== 'undefined' - ? new ResizeObserver(() => { - if (!disposed) refit(); - }) - : null; - resizeObserver?.observe(element); - - const source = overlay.getSource?.(); - const onSourceChange = () => { - const state = source?.getState?.(); - if (state === 'ready') { - refit(); - } - }; - - if (source && typeof (source as any).on === 'function') { - (source as any).on('change', onSourceChange); - } - - refit(); - - return () => { - disposed = true; - window.cancelAnimationFrame(firstFrame); - window.cancelAnimationFrame(secondFrame); - timeoutIds.forEach((id) => window.clearTimeout(id)); - resizeObserver?.disconnect(); - if (source && typeof (source as any).un === 'function') { - (source as any).un('change', onSourceChange); - } - map.setTarget(undefined); - }; - }, [endpoint, geometryForViewer, preCalculatedExtent, protocol]); - - return
; -} - -export function ResourceViewer({ data, pageValue }: ResourceViewerProps) { - // Extract viewer information from the new data structure - const protocol = data.meta?.ui?.viewer?.protocol || ''; - const endpoint = data.meta?.ui?.viewer?.endpoint || ''; - const geometry = data.meta?.ui?.viewer?.geometry; - const available = - !!protocol && !!endpoint && (protocol === 'iiif_image' || !!geometry); - const layerIdentifier = - data.attributes.ogm?.gbl_wxsIdentifier_s || - data.attributes.ogm?.gbl_wxsidentifier_s || - ''; - const resourceIdentifier = data.attributes.ogm?.id || ''; - const viewerInstanceKey = [ - protocol, - endpoint, - layerIdentifier, - resourceIdentifier, - pageValue, - ].join('|'); - - // Helper function to titleize a string - const titleize = (str: string) => str.charAt(0).toUpperCase() + str.slice(1); - - // Helper function to determine viewer type - const getViewerType = (protocol: string) => { - if (protocol === 'iiif_manifest') { - return 'mirador'; - } - if (['cog', 'pmtiles'].includes(protocol)) { - return 'openlayers'; - } - if (protocol === 'oembed') { - return 'oembed-viewer'; - } - return 'leaflet'; - }; - - const viewerType = getViewerType(protocol); - - // SSR safety + deterministic markup: don't render GeoBlacklight viewer containers - // until after mount (prevents hydration mismatches and guarantees DOM insertion - // after controllers are registered). - const [mounted, setMounted] = useState(false); - - useEffect(() => { - setMounted(true); - }, []); - - function formatProtocol(protocol: string): string | null { - if (protocol === 'arcgis_dynamic_map_layer') { - return 'DynamicMapLayer'; - } - if (protocol === 'geo_json') { - return null; - } - if (protocol === 'tile_map_service') { - return 'Tms'; - } - if (protocol === 'arcgis_tiled_map_layer') { - return 'TiledMapLayer'; - } - if (protocol === 'arcgis_feature_layer') { - return 'FeatureLayer'; - } - if (protocol === 'arcgis_image_map_layer') { - return 'ImageMapLayer'; - } - if (protocol === 'iiif_image') { - return 'Iiif'; - } - if (protocol === 'open_index_map') { - return 'IndexMap'; - } - if (protocol === 'xyz_tiles') { - return 'Xyz'; - } - if (protocol === 'tile_json') { - return 'Tilejson'; - } - return titleize(protocol); - } - - const isWmsItem = protocol === 'wms'; - - switch (viewerType) { - case 'mirador': { - // IMPORTANT: Mirador must not be allowed to leak global styles/scripts into the - // parent document (it has in practice). We sandbox it in an iframe, similar to - // how the oEmbed viewer embeds third-party content, so it can't clobber our app UI. - if (!mounted) { - return ( -
Loading viewer…
+ await import('ogm-viewer'); + const [{ OgmRecord }, { s: setOgmViewerAssetBase }] = await Promise.all( + [ + import('ogm-viewer/lib'), + import('ogm-viewer/components/p-BbMGvQFJ.js'), + ] ); - } - - // Mirador runs in a sandboxed iframe, so use an absolute URL for the manifest. - const pageOrigin = window.location.origin; - const manifestUrl = new URL(endpoint, pageOrigin).toString(); + setOgmViewerAssetBase('/ogm-viewer/'); + await customElements.whenDefined('ogm-viewer'); - const miradorUrl = new URL('/mirador', pageOrigin); - miradorUrl.searchParams.set('manifest', manifestUrl); + if (cancelled || !viewerElement) return; - return ( -