From fc939e72fedab77cb562f68240548fc582f34537 Mon Sep 17 00:00:00 2001 From: Kyle Barron Date: Wed, 28 Jan 2026 16:17:22 -0500 Subject: [PATCH 01/36] feat: Generic TileMatrixSet support in tileset --- .../src/cog-tile-matrix-set.ts | 2 - .../raster-tileset/raster-tile-traversal.ts | 61 +++++++------ .../src/raster-tileset/raster-tileset-2d.ts | 91 ++++++++++++++++++- .../src/raster-tileset/types.ts | 86 ++++++++---------- 4 files changed, 160 insertions(+), 80 deletions(-) diff --git a/packages/deck.gl-geotiff/src/cog-tile-matrix-set.ts b/packages/deck.gl-geotiff/src/cog-tile-matrix-set.ts index 20433cc..ef657f7 100644 --- a/packages/deck.gl-geotiff/src/cog-tile-matrix-set.ts +++ b/packages/deck.gl-geotiff/src/cog-tile-matrix-set.ts @@ -109,8 +109,6 @@ export async function parseCOGTileMatrixSet( boundingBox, wgsBounds: computeWgs84BoundingBox(boundingBox, projectToWgs84), tileMatrices, - projectToWgs84, - projectTo3857, }; } diff --git a/packages/deck.gl-raster/src/raster-tileset/raster-tile-traversal.ts b/packages/deck.gl-raster/src/raster-tileset/raster-tile-traversal.ts index 9251262..606261a 100644 --- a/packages/deck.gl-raster/src/raster-tileset/raster-tile-traversal.ts +++ b/packages/deck.gl-raster/src/raster-tileset/raster-tile-traversal.ts @@ -27,6 +27,8 @@ import { lngLatToWorld, worldToLngLat } from "@math.gl/web-mercator"; import type { Bounds, + CornerBounds, + ProjectionFunction, TileIndex, TileMatrix, TileMatrixSet, @@ -138,11 +140,22 @@ export class RasterTileNode { /** A cache of the children of this node. */ private _children?: RasterTileNode[] | null; - constructor(x: number, y: number, z: number, metadata: TileMatrixSet) { + private projectTo3857: ProjectionFunction; + + constructor( + x: number, + y: number, + z: number, + { + metadata, + projectTo3857, + }: { metadata: TileMatrixSet; projectTo3857: ProjectionFunction }, + ) { this.x = x; this.y = y; this.z = z; this.metadata = metadata; + this.projectTo3857 = projectTo3857; } /** Get overview info for this tile's z level */ @@ -188,9 +201,15 @@ export class RasterTileNode { const children: RasterTileNode[] = []; + const { metadata, projectTo3857 } = this; for (let y = minRow; y <= maxRow; y++) { for (let x = minCol; x <= maxCol; x++) { - children.push(new RasterTileNode(x, y, childZ, this.metadata)); + children.push( + new RasterTileNode(x, y, childZ, { + metadata, + projectTo3857, + }), + ); } } @@ -364,12 +383,9 @@ export class RasterTileNode { const [minX, minY, maxX, maxY] = bounds; const [tileMinX, tileMinY, tileMaxX, tileMaxY] = commonSpaceBounds; - // console.log("bounds:", bounds); - // console.log("tile bounds:", commonSpaceBounds); - const inside = tileMinX < maxX && tileMaxX > minX && tileMinY < maxY && tileMaxY > minY; - // console.log("insideBounds", inside); + return inside; } @@ -428,7 +444,7 @@ export class RasterTileNode { const refPointsEPSG3857 = sampleReferencePointsInEPSG3857( REF_POINTS_9, tileCrsBounds, - this.metadata.projectTo3857, + this.projectTo3857, ); const commonSpacePositions = refPointsEPSG3857.map((xy) => @@ -546,7 +562,7 @@ function computeProjectedTileBounds({ function sampleReferencePointsInEPSG3857( refPoints: [number, number][], tileBounds: [number, number, number, number], - projectTo3857: (xy: [number, number]) => [number, number], + projectTo3857: ProjectionFunction, ): [number, number][] { const [minX, minY, maxX, maxY] = tileBounds; const refPointPositions: [number, number][] = []; @@ -675,9 +691,11 @@ export function getTileIndices( viewport: Viewport; maxZ: number; zRange: ZRange | null; + projectTo3857: ProjectionFunction; + wgs84Bounds: CornerBounds; }, ): TileIndex[] { - const { viewport, maxZ, zRange } = opts; + const { viewport, maxZ, zRange, wgs84Bounds } = opts; // Only define `project` function for Globe viewports, same as upstream const project: ((xyz: number[]) => number[]) | null = @@ -723,7 +741,7 @@ export function getTileIndices( // minZ to 0 const minZ = 0; - const { lowerLeft, upperRight } = metadata.wgsBounds; + const { lowerLeft, upperRight } = wgs84Bounds; const [minLng, minLat] = lowerLeft; const [maxLng, maxLat] = upperRight; const bottomLeft = lngLatToWorld([minLng, minLat]); @@ -744,7 +762,12 @@ export function getTileIndices( const roots: RasterTileNode[] = []; for (let y = 0; y < rootMatrix.matrixHeight; y++) { for (let x = 0; x < rootMatrix.matrixWidth; x++) { - roots.push(new RasterTileNode(x, y, 0, metadata)); + roots.push( + new RasterTileNode(x, y, 0, { + metadata, + projectTo3857: opts.projectTo3857, + }), + ); } } @@ -759,9 +782,6 @@ export function getTileIndices( bounds, }; - // console.log("traversalParams", traversalParams); - // console.log("roots", roots); - for (const root of roots) { root.update(traversalParams); } @@ -800,19 +820,6 @@ function getMetersPerPixelAtBoundingVolume( return getMetersPerPixel(lat, zoom); } -// function getScreenMetersPerPixel(viewport: Viewport, center: Vector3): number { -// const lng -// const p0 = viewport.projectPosition(center); -// const p1 = viewport.projectPosition([ -// centerArray[0]! + 1, -// centerArray[1]!, -// centerArray[2]!, -// ]); - -// const pixelsPerMeter = Math.hypot(p1[0] - p0[0], p1[1] - p0[1]); -// return 1 / pixelsPerMeter; -// } - /** * Exports only for use in testing */ diff --git a/packages/deck.gl-raster/src/raster-tileset/raster-tileset-2d.ts b/packages/deck.gl-raster/src/raster-tileset/raster-tileset-2d.ts index c10e0b3..3b205fd 100644 --- a/packages/deck.gl-raster/src/raster-tileset/raster-tileset-2d.ts +++ b/packages/deck.gl-raster/src/raster-tileset/raster-tileset-2d.ts @@ -11,17 +11,46 @@ import { _Tileset2D as Tileset2D } from "@deck.gl/geo-layers"; import type { Matrix4 } from "@math.gl/core"; import { getTileIndices } from "./raster-tile-traversal"; -import type { Bounds, TileIndex, TileMatrixSet, ZRange } from "./types"; +import type { + Bounds, + CornerBounds, + Point, + ProjectionFunction, + TileIndex, + TileMatrixSet, + ZRange, +} from "./types"; /** * RasterTileset2D with proper frustum culling */ export class RasterTileset2D extends Tileset2D { private metadata: TileMatrixSet; - - constructor(metadata: TileMatrixSet, opts: Tileset2DProps) { + private wgs84Bounds: CornerBounds; + private projectToWgs84: ProjectionFunction; + private projectTo3857: ProjectionFunction; + + constructor( + opts: Tileset2DProps, + metadata: TileMatrixSet, + { + projectToWgs84, + projectTo3857, + }: { + projectToWgs84: ProjectionFunction; + projectTo3857: ProjectionFunction; + }, + ) { super(opts); this.metadata = metadata; + this.projectToWgs84 = projectToWgs84; + this.projectTo3857 = projectTo3857; + + this.wgs84Bounds = + metadata.wgsBounds || + projectBoundsToWgs84(metadata.boundingBox, projectToWgs84, { + densifyPts: 10, + }); } /** @@ -38,7 +67,6 @@ export class RasterTileset2D extends Tileset2D { modelMatrix?: Matrix4; modelMatrixInverse?: Matrix4; }): TileIndex[] { - // console.log("Called getTileIndices", opts); const maxAvailableZ = this.metadata.tileMatrices.length - 1; const maxZ = @@ -50,8 +78,10 @@ export class RasterTileset2D extends Tileset2D { viewport: opts.viewport, maxZ, zRange: opts.zRange ?? null, + wgs84Bounds: this.wgs84Bounds, + projectTo3857: this.projectTo3857, }); - // console.log("Visible tile indices:", tileIndices.length); + return tileIndices; } @@ -143,3 +173,54 @@ export class RasterTileset2D extends Tileset2D { }; } } + +function projectBoundsToWgs84( + bounds: CornerBounds, + projectToWgs84: ProjectionFunction, + { densifyPts }: { densifyPts: number }, +): CornerBounds { + const { lowerLeft, upperRight } = bounds; + + // Four corners of the bounding box + const corners: Point[] = [ + lowerLeft, + [upperRight[0], lowerLeft[1]], + upperRight, + [lowerLeft[0], upperRight[1]], + ]; + + // Densify edges: interpolate densifyPts points along each edge + const points: Point[] = []; + for (let i = 0; i < corners.length; i++) { + const from = corners[i]!; + const to = corners[(i + 1) % corners.length]!; + // Include the start corner and all intermediate points (end corner + // will be included as the start of the next edge) + for (let j = 0; j <= densifyPts; j++) { + const t = j / (densifyPts + 1); + points.push([ + from[0] + (to[0] - from[0]) * t, + from[1] + (to[1] - from[1]) * t, + ]); + } + } + + // Reproject all points to WGS84 and compute the bounding box + let wgsMinX = Infinity; + let wgsMinY = Infinity; + let wgsMaxX = -Infinity; + let wgsMaxY = -Infinity; + + for (const pt of points) { + const [lon, lat] = projectToWgs84(pt); + if (lon < wgsMinX) wgsMinX = lon; + if (lat < wgsMinY) wgsMinY = lat; + if (lon > wgsMaxX) wgsMaxX = lon; + if (lat > wgsMaxY) wgsMaxY = lat; + } + + return { + lowerLeft: [wgsMinX, wgsMinY], + upperRight: [wgsMaxX, wgsMaxY], + }; +} diff --git a/packages/deck.gl-raster/src/raster-tileset/types.ts b/packages/deck.gl-raster/src/raster-tileset/types.ts index c44c30b..59d144f 100644 --- a/packages/deck.gl-raster/src/raster-tileset/types.ts +++ b/packages/deck.gl-raster/src/raster-tileset/types.ts @@ -32,14 +32,22 @@ export type Point = [number, number]; type CRS = any; +export type ProjectionFunction = (point: Point) => Point; + /** - * Minimum bounding rectangle surrounding a 2D resource in the CRS indicated elsewhere + * Bounding box defined by two named corners */ -export interface TileMatrixSetBoundingBox { +export type CornerBounds = { lowerLeft: Point; upperRight: Point; +}; + +/** + * Minimum bounding rectangle surrounding a 2D resource in the CRS indicated elsewhere + */ +export type TileMatrixSetBoundingBox = CornerBounds & { crs?: CRS; -} +}; /** * Represents a single resolution level in a raster tileset. @@ -54,6 +62,12 @@ export interface TileMatrixSetBoundingBox { * This matches the natural ordering where z increases with detail. */ export type TileMatrix = { + /** + * Unique identifier for this tile matrix. + * + * The ID is typically a string representation of the overview level, + * where lower values correspond to coarser resolutions. + */ id: string; /** @@ -70,32 +84,23 @@ export type TileMatrix = { */ cellSize: number; - // /** - // * Overview index in the TileMatrixSet ordering. - // * - Index 0: Coarsest resolution (most zoomed out) - // * - Higher indices: Progressively finer resolution - // * - // * This is the index in the COGMetadata.overviews array and represents - // * the natural ordering from coarse to fine. - // * - // * Note: This is different from GeoTIFF's internal level numbering where - // * level 0 is the full resolution image. - // * - // * @example - // * // For a COG with 4 resolutions: - // * index: 0 // Coarsest: 1250x1000 pixels (8x downsampled) - // * index: 1 // Medium: 2500x2000 pixels (4x downsampled) - // * index: 2 // Fine: 5000x4000 pixels (2x downsampled) - // * index: 3 // Finest: 10000x8000 pixels (full resolution) - // */ - // z: number; + /** + * Indicates which corner of the tile matrix is the origin. + * + * Typically "upperLeft" for most raster datasets. + */ + cornerOfOrigin: "lowerLeft" | "upperLeft"; + /** + * Point of origin of this tile matrix in CRS coordinates. + */ pointOfOrigin: Point; /** * Width of each tile of this tile matrix in pixels. */ tileWidth: number; + /** * Height of each tile of this tile matrix in pixels. */ @@ -129,26 +134,6 @@ export type TileMatrix = { */ matrixHeight: number; - // /** - // * Downsampling scale factor relative to full resolution (finest level). - // * - // * Indicates how much this overview is downsampled compared to the finest resolution. - // * - Scale factor of 1: Full resolution (finest level) - // * - Scale factor of 2: Half resolution - // * - Scale factor of 4: Quarter resolution - // * - Scale factor of 8: Eighth resolution (coarsest in this example) - // * - // * Common pattern: Each overview is 2x downsampled from the next finer level, - // * so scale factors are powers of 2: 8, 4, 2, 1 (from coarsest to finest) - // * - // * @example - // * scaleFactor: 8 // z=0: 1250x1000 (8x downsampled from finest) - // * scaleFactor: 4 // z=1: 2500x2000 (4x downsampled) - // * scaleFactor: 2 // z=2: 5000x4000 (2x downsampled) - // * scaleFactor: 1 // z=3: 10000x8000 (full resolution) - // */ - // scaleFactor: number; - /** * Affine geotransform for this overview level. * @@ -182,13 +167,25 @@ export type TileMatrixSet = { * Title of this tile matrix set, normally used for display to a human */ title?: string; + /** * Brief narrative description of this tile matrix set, normally available for display to a human */ description?: string; + + /** + * Coordinate Reference System of this tile matrix set. + */ crs: CRS; + /** + * Bounding box of this TMS. + * + * The TileMatrixSetBoundingBox can contain its own CRS, which may differ + * from the overall TileMatrixSet CRS. + */ boundingBox?: TileMatrixSetBoundingBox; + /** * Describes scale levels and its tile matrices */ @@ -197,10 +194,7 @@ export type TileMatrixSet = { /** * Bounding box of this TMS in WGS84 lon/lat. */ - wgsBounds: TileMatrixSetBoundingBox; - - projectToWgs84: (point: [number, number]) => [number, number]; - projectTo3857: (point: [number, number]) => [number, number]; + wgsBounds?: TileMatrixSetBoundingBox; }; /** From 3ef994071dd625c8a289707985ff0d6d142896e7 Mon Sep 17 00:00:00 2001 From: Kyle Barron Date: Thu, 5 Feb 2026 10:01:01 -0500 Subject: [PATCH 02/36] add to package.json --- package.json | 3 ++- packages/deck.gl-geotiff/package.json | 1 + packages/deck.gl-raster/package.json | 3 ++- pnpm-lock.yaml | 13 +++++++++++++ 4 files changed, 18 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 9bff987..78f6fe0 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "@deck.gl/layers": "9.2.6", "@deck.gl/mapbox": "9.2.6", "@deck.gl/mesh-layers": "9.2.6", + "@developmentseed/morecantile": "0.1.1", "@luma.gl/constants": "9.2.6", "@luma.gl/core": "9.2.6", "@luma.gl/engine": "9.2.6", @@ -43,4 +44,4 @@ "node": "24.11.1", "pnpm": "10.25.0" } -} +} \ No newline at end of file diff --git a/packages/deck.gl-geotiff/package.json b/packages/deck.gl-geotiff/package.json index 63fed09..d1bf49f 100644 --- a/packages/deck.gl-geotiff/package.json +++ b/packages/deck.gl-geotiff/package.json @@ -47,6 +47,7 @@ }, "dependencies": { "@developmentseed/deck.gl-raster": "workspace:^", + "@developmentseed/morecantile": "^0.1.1", "@developmentseed/raster-reproject": "workspace:^", "flatbush": "^4.5.0", "geotiff": "2.1.3", diff --git a/packages/deck.gl-raster/package.json b/packages/deck.gl-raster/package.json index b001ad9..4913c37 100644 --- a/packages/deck.gl-raster/package.json +++ b/packages/deck.gl-raster/package.json @@ -60,6 +60,7 @@ "@luma.gl/shadertools": "^9.2.6" }, "dependencies": { + "@developmentseed/morecantile": "^0.1.1", "@developmentseed/raster-reproject": "workspace:^", "@math.gl/core": "^4.1.0", "@math.gl/culling": "^4.1.0", @@ -68,4 +69,4 @@ "volta": { "extends": "../../package.json" } -} +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 99b39f0..eaf8cfd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,6 +10,7 @@ overrides: '@deck.gl/layers': 9.2.6 '@deck.gl/mapbox': 9.2.6 '@deck.gl/mesh-layers': 9.2.6 + '@developmentseed/morecantile': 0.1.1 '@luma.gl/constants': 9.2.6 '@luma.gl/core': 9.2.6 '@luma.gl/engine': 9.2.6 @@ -243,6 +244,9 @@ importers: '@developmentseed/deck.gl-raster': specifier: workspace:^ version: link:../deck.gl-raster + '@developmentseed/morecantile': + specifier: 0.1.1 + version: 0.1.1 '@developmentseed/raster-reproject': specifier: workspace:^ version: link:../raster-reproject @@ -286,6 +290,9 @@ importers: '@deck.gl/mesh-layers': specifier: 9.2.6 version: 9.2.6(@deck.gl/core@9.2.6)(@loaders.gl/core@4.3.4)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/gltf@9.2.6(@luma.gl/constants@9.2.6)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)) + '@developmentseed/morecantile': + specifier: 0.1.1 + version: 0.1.1 '@developmentseed/raster-reproject': specifier: workspace:^ version: link:../raster-reproject @@ -592,6 +599,10 @@ packages: '@luma.gl/gltf': 9.2.6 '@luma.gl/shadertools': 9.2.6 + '@developmentseed/morecantile@0.1.1': + resolution: {integrity: sha512-FtRxhWUv3E42YRST0UcIuDVOUQXf6GRIh0Vv4pvSxW8+ozZ5QmXuiVSma4A/yS3FPs/k2D0MgwNO0aRqsLXm+w==} + engines: {node: '>=18'} + '@esbuild/aix-ppc64@0.27.2': resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==} engines: {node: '>=18'} @@ -2610,6 +2621,8 @@ snapshots: transitivePeerDependencies: - '@loaders.gl/core' + '@developmentseed/morecantile@0.1.1': {} + '@esbuild/aix-ppc64@0.27.2': optional: true From b3dd27f4a5393a2d53b05be68b9bd235bdf0673d Mon Sep 17 00:00:00 2001 From: Kyle Barron Date: Thu, 5 Feb 2026 10:02:01 -0500 Subject: [PATCH 03/36] update types to use new morecantile imports --- packages/deck.gl-geotiff/src/cog-layer.ts | 7 +- .../src/cog-tile-matrix-set.ts | 50 +-- packages/deck.gl-raster/src/index.ts | 5 - .../src/raster-tileset/index.ts | 1 - .../raster-tileset/raster-tile-traversal.ts | 3 +- .../src/raster-tileset/raster-tileset-2d.ts | 2 +- .../src/raster-tileset/types.ts | 294 +++++++++--------- 7 files changed, 156 insertions(+), 206 deletions(-) diff --git a/packages/deck.gl-geotiff/src/cog-layer.ts b/packages/deck.gl-geotiff/src/cog-layer.ts index 0e481c8..a0b49e6 100644 --- a/packages/deck.gl-geotiff/src/cog-layer.ts +++ b/packages/deck.gl-geotiff/src/cog-layer.ts @@ -13,12 +13,9 @@ import type { } from "@deck.gl/geo-layers"; import { TileLayer } from "@deck.gl/geo-layers"; import { PathLayer } from "@deck.gl/layers"; -import type { - RasterModule, - TileMatrix, - TileMatrixSet, -} from "@developmentseed/deck.gl-raster"; +import type { RasterModule } from "@developmentseed/deck.gl-raster"; import { RasterLayer, RasterTileset2D } from "@developmentseed/deck.gl-raster"; +import type { TileMatrix, TileMatrixSet } from "@developmentseed/morecantile"; import type { ReprojectionFns } from "@developmentseed/raster-reproject"; import type { Device } from "@luma.gl/core"; import type { BaseClient, GeoTIFF, GeoTIFFImage, Pool } from "geotiff"; diff --git a/packages/deck.gl-geotiff/src/cog-tile-matrix-set.ts b/packages/deck.gl-geotiff/src/cog-tile-matrix-set.ts index ef657f7..9af63af 100644 --- a/packages/deck.gl-geotiff/src/cog-tile-matrix-set.ts +++ b/packages/deck.gl-geotiff/src/cog-tile-matrix-set.ts @@ -1,8 +1,9 @@ import type { + BoundingBox, TileMatrix, TileMatrixSet, - TileMatrixSetBoundingBox, -} from "@developmentseed/deck.gl-raster"; +} from "@developmentseed/morecantile"; +import { metersPerUnit } from "@developmentseed/morecantile"; import type { GeoTIFF, GeoTIFFImage } from "geotiff"; import proj4, { type ProjectionDefinition } from "proj4"; import Ellipsoid from "./ellipsoids.js"; @@ -112,47 +113,6 @@ export async function parseCOGTileMatrixSet( }; } -/** - * Coefficient to convert the coordinate reference system (CRS) - * units into meters (metersPerUnit). - * - * From note g in http://docs.opengeospatial.org/is/17-083r2/17-083r2.html#table_2: - * - * > If the CRS uses meters as units of measure for the horizontal dimensions, - * > then metersPerUnit=1; if it has degrees, then metersPerUnit=2pa/360 - * > (a is the Earth maximum radius of the ellipsoid). - * - * If `crsUnit` is provided, it takes precedence over the unit defined in the - * CRS. This exists because sometimes the parsed CRS from - * `geotiff-geokeys-to-proj4` doesn't have a unit defined. - */ -// https://github.com/developmentseed/morecantile/blob/7c95a11c491303700d6e33e9c1607f2719584dec/morecantile/utils.py#L67-L90 -function metersPerUnit( - parsedCrs: ProjectionDefinition, - crsUnit?: SupportedCrsUnit, -): number { - const unit = (crsUnit || parsedCrs.units)?.toLowerCase(); - switch (unit) { - case "m": - case "metre": - case "meter": - case "meters": - return 1; - case "foot": - return 0.3048; - case "us survey foot": - return 1200 / 3937; - } - - if (unit === "degree") { - // 2 * π * ellipsoid semi-major-axis / 360 - const { a } = Ellipsoid[parsedCrs.ellps as keyof typeof Ellipsoid]; - return (2 * Math.PI * a) / 360; - } - - throw new Error(`Unsupported CRS units: ${unit}`); -} - /** * Create tile matrix for COG overview */ @@ -213,9 +173,9 @@ function createOverviewTileMatrix({ } function computeWgs84BoundingBox( - boundingBox: TileMatrixSetBoundingBox, + boundingBox: BoundingBox, projectToWgs84: (point: [number, number]) => [number, number], -): TileMatrixSetBoundingBox { +): BoundingBox { const lowerLeftWgs84 = projectToWgs84(boundingBox.lowerLeft); const lowerRightWgs84 = projectToWgs84([ boundingBox.upperRight[0], diff --git a/packages/deck.gl-raster/src/index.ts b/packages/deck.gl-raster/src/index.ts index 1189835..e556932 100644 --- a/packages/deck.gl-raster/src/index.ts +++ b/packages/deck.gl-raster/src/index.ts @@ -2,11 +2,6 @@ export type { RasterModule } from "./gpu-modules/types.js"; export type { RasterLayerProps } from "./raster-layer.js"; export { RasterLayer } from "./raster-layer.js"; export { RasterTileset2D } from "./raster-tileset/index.js"; -export type { - TileMatrix, - TileMatrixSet, - TileMatrixSetBoundingBox, -} from "./raster-tileset/types.js"; import { __TEST_EXPORTS as traversalTestExports } from "./raster-tileset/raster-tile-traversal.js"; diff --git a/packages/deck.gl-raster/src/raster-tileset/index.ts b/packages/deck.gl-raster/src/raster-tileset/index.ts index d19311b..41d75f8 100644 --- a/packages/deck.gl-raster/src/raster-tileset/index.ts +++ b/packages/deck.gl-raster/src/raster-tileset/index.ts @@ -1,2 +1 @@ export { RasterTileset2D } from "./raster-tileset-2d.js"; -export type { TileMatrix, TileMatrixSet } from "./types.js"; diff --git a/packages/deck.gl-raster/src/raster-tileset/raster-tile-traversal.ts b/packages/deck.gl-raster/src/raster-tileset/raster-tile-traversal.ts index 606261a..f1c0da9 100644 --- a/packages/deck.gl-raster/src/raster-tileset/raster-tile-traversal.ts +++ b/packages/deck.gl-raster/src/raster-tileset/raster-tile-traversal.ts @@ -17,6 +17,7 @@ import type { Viewport } from "@deck.gl/core"; import { _GlobeViewport, assert } from "@deck.gl/core"; +import type { TileMatrix, TileMatrixSet } from "@developmentseed/morecantile"; import type { OrientedBoundingBox } from "@math.gl/culling"; import { CullingVolume, @@ -30,8 +31,6 @@ import type { CornerBounds, ProjectionFunction, TileIndex, - TileMatrix, - TileMatrixSet, ZRange, } from "./types.js"; diff --git a/packages/deck.gl-raster/src/raster-tileset/raster-tileset-2d.ts b/packages/deck.gl-raster/src/raster-tileset/raster-tileset-2d.ts index 3b205fd..b9fe237 100644 --- a/packages/deck.gl-raster/src/raster-tileset/raster-tileset-2d.ts +++ b/packages/deck.gl-raster/src/raster-tileset/raster-tileset-2d.ts @@ -8,6 +8,7 @@ import type { Viewport } from "@deck.gl/core"; import type { _Tileset2DProps as Tileset2DProps } from "@deck.gl/geo-layers"; import { _Tileset2D as Tileset2D } from "@deck.gl/geo-layers"; +import type { TileMatrixSet } from "@developmentseed/morecantile"; import type { Matrix4 } from "@math.gl/core"; import { getTileIndices } from "./raster-tile-traversal"; @@ -17,7 +18,6 @@ import type { Point, ProjectionFunction, TileIndex, - TileMatrixSet, ZRange, } from "./types"; diff --git a/packages/deck.gl-raster/src/raster-tileset/types.ts b/packages/deck.gl-raster/src/raster-tileset/types.ts index 59d144f..71652ea 100644 --- a/packages/deck.gl-raster/src/raster-tileset/types.ts +++ b/packages/deck.gl-raster/src/raster-tileset/types.ts @@ -49,153 +49,153 @@ export type TileMatrixSetBoundingBox = CornerBounds & { crs?: CRS; }; -/** - * Represents a single resolution level in a raster tileset. - * - * COGs contain multiple resolution levels (overviews) for efficient - * visualization at different zoom levels. - * - * IMPORTANT: Overviews are ordered according to TileMatrixSet specification: - * - Index 0: Coarsest resolution (most zoomed out) - * - Index N: Finest resolution (most zoomed in) - * - * This matches the natural ordering where z increases with detail. - */ -export type TileMatrix = { - /** - * Unique identifier for this tile matrix. - * - * The ID is typically a string representation of the overview level, - * where lower values correspond to coarser resolutions. - */ - id: string; - - /** - * Scale denominator of this tile matrix. - * - * Defined as cellSize (meters per pixel) * meters per unit / 0.00028 - */ - scaleDenominator: number; - - /** - * Cell size of this tile matrix. - * - * CRS units per pixel (not necessarily meters). - */ - cellSize: number; - - /** - * Indicates which corner of the tile matrix is the origin. - * - * Typically "upperLeft" for most raster datasets. - */ - cornerOfOrigin: "lowerLeft" | "upperLeft"; - - /** - * Point of origin of this tile matrix in CRS coordinates. - */ - pointOfOrigin: Point; - - /** - * Width of each tile of this tile matrix in pixels. - */ - tileWidth: number; - - /** - * Height of each tile of this tile matrix in pixels. - */ - tileHeight: number; - - /** - * Number of tiles in the X (horizontal) direction at this overview level. - * - * Calculated as: Math.ceil(width / tileWidth) - * - * @example - * // If tileWidth = 512: - * tilesX: 3 // z=0: ceil(1250 / 512) - * tilesX: 5 // z=1: ceil(2500 / 512) - * tilesX: 10 // z=2: ceil(5000 / 512) - * tilesX: 20 // z=3: ceil(10000 / 512) - */ - matrixWidth: number; - - /** - * Number of tiles in the Y (vertical) direction at this overview level. - * - * Calculated as: Math.ceil(height / tileHeight) - * - * @example - * // If tileHeight = 512: - * tilesY: 2 // z=0: ceil(1000 / 512) - * tilesY: 4 // z=1: ceil(2000 / 512) - * tilesY: 8 // z=2: ceil(4000 / 512) - * tilesY: 16 // z=3: ceil(8000 / 512) - */ - matrixHeight: number; - - /** - * Affine geotransform for this overview level. - * - * Uses Python `affine` package ordering (NOT GDAL ordering): - * [a, b, c, d, e, f] where: - * - x_geo = a * col + b * row + c - * - y_geo = d * col + e * row + f - * - * Parameters: - * - a: pixel width (x resolution) - * - b: row rotation (typically 0) - * - c: x-coordinate of upper-left corner of the upper-left pixel - * - d: column rotation (typically 0) - * - e: pixel height (y resolution, typically negative) - * - f: y-coordinate of upper-left corner of the upper-left pixel - * - * @example - * // For a UTM image with 30m pixels: - * [30, 0, 440720, 0, -30, 3751320] - * // x_geo = 30 * col + 440720 - * // y_geo = -30 * row + 3751320 - */ - geotransform: [number, number, number, number, number, number]; -}; - -/** - * COG Metadata extracted from GeoTIFF - */ -export type TileMatrixSet = { - /** - * Title of this tile matrix set, normally used for display to a human - */ - title?: string; - - /** - * Brief narrative description of this tile matrix set, normally available for display to a human - */ - description?: string; - - /** - * Coordinate Reference System of this tile matrix set. - */ - crs: CRS; - - /** - * Bounding box of this TMS. - * - * The TileMatrixSetBoundingBox can contain its own CRS, which may differ - * from the overall TileMatrixSet CRS. - */ - boundingBox?: TileMatrixSetBoundingBox; - - /** - * Describes scale levels and its tile matrices - */ - tileMatrices: TileMatrix[]; - - /** - * Bounding box of this TMS in WGS84 lon/lat. - */ - wgsBounds?: TileMatrixSetBoundingBox; -}; +// /** +// * Represents a single resolution level in a raster tileset. +// * +// * COGs contain multiple resolution levels (overviews) for efficient +// * visualization at different zoom levels. +// * +// * IMPORTANT: Overviews are ordered according to TileMatrixSet specification: +// * - Index 0: Coarsest resolution (most zoomed out) +// * - Index N: Finest resolution (most zoomed in) +// * +// * This matches the natural ordering where z increases with detail. +// */ +// export type TileMatrix = { +// /** +// * Unique identifier for this tile matrix. +// * +// * The ID is typically a string representation of the overview level, +// * where lower values correspond to coarser resolutions. +// */ +// id: string; + +// /** +// * Scale denominator of this tile matrix. +// * +// * Defined as cellSize (meters per pixel) * meters per unit / 0.00028 +// */ +// scaleDenominator: number; + +// /** +// * Cell size of this tile matrix. +// * +// * CRS units per pixel (not necessarily meters). +// */ +// cellSize: number; + +// /** +// * Indicates which corner of the tile matrix is the origin. +// * +// * Typically "upperLeft" for most raster datasets. +// */ +// cornerOfOrigin: "lowerLeft" | "upperLeft"; + +// /** +// * Point of origin of this tile matrix in CRS coordinates. +// */ +// pointOfOrigin: Point; + +// /** +// * Width of each tile of this tile matrix in pixels. +// */ +// tileWidth: number; + +// /** +// * Height of each tile of this tile matrix in pixels. +// */ +// tileHeight: number; + +// /** +// * Number of tiles in the X (horizontal) direction at this overview level. +// * +// * Calculated as: Math.ceil(width / tileWidth) +// * +// * @example +// * // If tileWidth = 512: +// * tilesX: 3 // z=0: ceil(1250 / 512) +// * tilesX: 5 // z=1: ceil(2500 / 512) +// * tilesX: 10 // z=2: ceil(5000 / 512) +// * tilesX: 20 // z=3: ceil(10000 / 512) +// */ +// matrixWidth: number; + +// /** +// * Number of tiles in the Y (vertical) direction at this overview level. +// * +// * Calculated as: Math.ceil(height / tileHeight) +// * +// * @example +// * // If tileHeight = 512: +// * tilesY: 2 // z=0: ceil(1000 / 512) +// * tilesY: 4 // z=1: ceil(2000 / 512) +// * tilesY: 8 // z=2: ceil(4000 / 512) +// * tilesY: 16 // z=3: ceil(8000 / 512) +// */ +// matrixHeight: number; + +// /** +// * Affine geotransform for this overview level. +// * +// * Uses Python `affine` package ordering (NOT GDAL ordering): +// * [a, b, c, d, e, f] where: +// * - x_geo = a * col + b * row + c +// * - y_geo = d * col + e * row + f +// * +// * Parameters: +// * - a: pixel width (x resolution) +// * - b: row rotation (typically 0) +// * - c: x-coordinate of upper-left corner of the upper-left pixel +// * - d: column rotation (typically 0) +// * - e: pixel height (y resolution, typically negative) +// * - f: y-coordinate of upper-left corner of the upper-left pixel +// * +// * @example +// * // For a UTM image with 30m pixels: +// * [30, 0, 440720, 0, -30, 3751320] +// * // x_geo = 30 * col + 440720 +// * // y_geo = -30 * row + 3751320 +// */ +// geotransform: [number, number, number, number, number, number]; +// }; + +// /** +// * COG Metadata extracted from GeoTIFF +// */ +// export type TileMatrixSet = { +// /** +// * Title of this tile matrix set, normally used for display to a human +// */ +// title?: string; + +// /** +// * Brief narrative description of this tile matrix set, normally available for display to a human +// */ +// description?: string; + +// /** +// * Coordinate Reference System of this tile matrix set. +// */ +// crs: CRS; + +// /** +// * Bounding box of this TMS. +// * +// * The TileMatrixSetBoundingBox can contain its own CRS, which may differ +// * from the overall TileMatrixSet CRS. +// */ +// boundingBox?: TileMatrixSetBoundingBox; + +// /** +// * Describes scale levels and its tile matrices +// */ +// tileMatrices: TileMatrix[]; + +// /** +// * Bounding box of this TMS in WGS84 lon/lat. +// */ +// wgsBounds?: TileMatrixSetBoundingBox; +// }; /** * Raster Tile Index From 7547caf152c08958d2099f2f00c2410adb9a0e53 Mon Sep 17 00:00:00 2001 From: Kyle Barron Date: Wed, 11 Feb 2026 17:50:59 -0500 Subject: [PATCH 04/36] Rename RasterTileset2D to TMSTileset2D --- packages/deck.gl-geotiff/src/cog-layer.ts | 6 +++--- packages/deck.gl-raster/src/index.ts | 2 +- packages/deck.gl-raster/src/raster-tileset/index.ts | 2 +- .../src/raster-tileset/raster-tileset-2d.ts | 8 +++++--- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/packages/deck.gl-geotiff/src/cog-layer.ts b/packages/deck.gl-geotiff/src/cog-layer.ts index a0b49e6..20ad97f 100644 --- a/packages/deck.gl-geotiff/src/cog-layer.ts +++ b/packages/deck.gl-geotiff/src/cog-layer.ts @@ -14,7 +14,7 @@ import type { import { TileLayer } from "@deck.gl/geo-layers"; import { PathLayer } from "@deck.gl/layers"; import type { RasterModule } from "@developmentseed/deck.gl-raster"; -import { RasterLayer, RasterTileset2D } from "@developmentseed/deck.gl-raster"; +import { RasterLayer, TMSTileset2D } from "@developmentseed/deck.gl-raster"; import type { TileMatrix, TileMatrixSet } from "@developmentseed/morecantile"; import type { ReprojectionFns } from "@developmentseed/raster-reproject"; import type { Device } from "@luma.gl/core"; @@ -411,7 +411,7 @@ export class COGLayer< images: GeoTIFFImage[], ): TileLayer { // Create a factory class that wraps COGTileset2D with the metadata - class RasterTileset2DFactory extends RasterTileset2D { + class TMSTileset2DFactory extends TMSTileset2D { constructor(opts: Tileset2DProps) { super(metadata, opts); } @@ -419,7 +419,7 @@ export class COGLayer< return new TileLayer>({ id: `cog-tile-layer-${this.id}`, - TilesetClass: RasterTileset2DFactory, + TilesetClass: TMSTileset2DFactory, getTileData: async (tile) => this._getTileData(tile, images, metadata), renderSubLayers: (props) => this._renderSubLayers( diff --git a/packages/deck.gl-raster/src/index.ts b/packages/deck.gl-raster/src/index.ts index e556932..a194f7b 100644 --- a/packages/deck.gl-raster/src/index.ts +++ b/packages/deck.gl-raster/src/index.ts @@ -1,7 +1,7 @@ export type { RasterModule } from "./gpu-modules/types.js"; export type { RasterLayerProps } from "./raster-layer.js"; export { RasterLayer } from "./raster-layer.js"; -export { RasterTileset2D } from "./raster-tileset/index.js"; +export { TMSTileset2D } from "./raster-tileset/index.js"; import { __TEST_EXPORTS as traversalTestExports } from "./raster-tileset/raster-tile-traversal.js"; diff --git a/packages/deck.gl-raster/src/raster-tileset/index.ts b/packages/deck.gl-raster/src/raster-tileset/index.ts index 41d75f8..1dc8e12 100644 --- a/packages/deck.gl-raster/src/raster-tileset/index.ts +++ b/packages/deck.gl-raster/src/raster-tileset/index.ts @@ -1 +1 @@ -export { RasterTileset2D } from "./raster-tileset-2d.js"; +export { TMSTileset2D } from "./raster-tileset-2d.js"; diff --git a/packages/deck.gl-raster/src/raster-tileset/raster-tileset-2d.ts b/packages/deck.gl-raster/src/raster-tileset/raster-tileset-2d.ts index b9fe237..becfc59 100644 --- a/packages/deck.gl-raster/src/raster-tileset/raster-tileset-2d.ts +++ b/packages/deck.gl-raster/src/raster-tileset/raster-tileset-2d.ts @@ -1,5 +1,5 @@ /** - * RasterTileset2D - Improved Implementation with Frustum Culling + * TMSTileset2D - Improved Implementation with Frustum Culling * * This version properly implements frustum culling and bounding volume calculations * following the pattern from deck.gl's OSM tile indexing. @@ -22,9 +22,11 @@ import type { } from "./types"; /** - * RasterTileset2D with proper frustum culling + * A generic tileset implementation organized according to the OGC + * [TileMatrixSet](https://docs.ogc.org/is/17-083r4/17-083r4.html) + * specification. */ -export class RasterTileset2D extends Tileset2D { +export class TMSTileset2D extends Tileset2D { private metadata: TileMatrixSet; private wgs84Bounds: CornerBounds; private projectToWgs84: ProjectionFunction; From ef47f068e2dd29a31bffcbeef171a7ff7381df6a Mon Sep 17 00:00:00 2001 From: Kyle Barron Date: Mon, 16 Feb 2026 16:59:01 -0500 Subject: [PATCH 05/36] update lockfile --- pnpm-lock.yaml | 5288 +++++++++++++++++------------------------------- 1 file changed, 1900 insertions(+), 3388 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 878432d..e4a6f37 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,26 +1,27 @@ -lockfileVersion: "9.0" +lockfileVersion: '9.0' settings: autoInstallPeers: true excludeLinksFromLockfile: false overrides: - "@deck.gl/core": 9.2.7 - "@deck.gl/geo-layers": 9.2.7 - "@deck.gl/layers": 9.2.7 - "@deck.gl/mapbox": 9.2.7 - "@deck.gl/mesh-layers": 9.2.7 - "@luma.gl/constants": 9.2.6 - "@luma.gl/core": 9.2.6 - "@luma.gl/engine": 9.2.6 - "@luma.gl/gltf": 9.2.6 - "@luma.gl/shadertools": 9.2.6 - "@luma.gl/webgl": 9.2.6 + '@deck.gl/core': 9.2.7 + '@deck.gl/geo-layers': 9.2.7 + '@deck.gl/layers': 9.2.7 + '@deck.gl/mapbox': 9.2.7 + '@deck.gl/mesh-layers': 9.2.7 + '@luma.gl/constants': 9.2.6 + '@luma.gl/core': 9.2.6 + '@luma.gl/engine': 9.2.6 + '@luma.gl/gltf': 9.2.6 + '@luma.gl/shadertools': 9.2.6 + '@luma.gl/webgl': 9.2.6 importers: + .: devDependencies: - "@biomejs/biome": + '@biomejs/biome': specifier: ^2.3.13 version: 2.3.13 publint: @@ -35,31 +36,31 @@ importers: examples/cog-basic: dependencies: - "@deck.gl/core": + '@deck.gl/core': specifier: 9.2.7 version: 9.2.7 - "@deck.gl/geo-layers": + '@deck.gl/geo-layers': specifier: 9.2.7 version: 9.2.7(@deck.gl/core@9.2.7)(@deck.gl/extensions@9.2.5(@deck.gl/core@9.2.7)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6))))(@deck.gl/layers@9.2.7(@deck.gl/core@9.2.7)(@loaders.gl/core@4.3.4)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6))))(@deck.gl/mesh-layers@9.2.7(@deck.gl/core@9.2.7)(@loaders.gl/core@4.3.4)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/gltf@9.2.6(@luma.gl/constants@9.2.6)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@loaders.gl/core@4.3.4)(@luma.gl/constants@9.2.6)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6))) - "@deck.gl/layers": + '@deck.gl/layers': specifier: 9.2.7 version: 9.2.7(@deck.gl/core@9.2.7)(@loaders.gl/core@4.3.4)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6))) - "@deck.gl/mapbox": + '@deck.gl/mapbox': specifier: 9.2.7 version: 9.2.7(@deck.gl/core@9.2.7)(@luma.gl/constants@9.2.6)(@luma.gl/core@9.2.6)(@math.gl/web-mercator@4.1.0) - "@deck.gl/mesh-layers": + '@deck.gl/mesh-layers': specifier: 9.2.7 version: 9.2.7(@deck.gl/core@9.2.7)(@loaders.gl/core@4.3.4)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/gltf@9.2.6(@luma.gl/constants@9.2.6)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)) - "@developmentseed/deck.gl-geotiff": + '@developmentseed/deck.gl-geotiff': specifier: workspace:^ version: link:../../packages/deck.gl-geotiff - "@developmentseed/deck.gl-raster": + '@developmentseed/deck.gl-raster': specifier: workspace:^ version: link:../../packages/deck.gl-raster - "@luma.gl/core": + '@luma.gl/core': specifier: 9.2.6 version: 9.2.6 - "@luma.gl/shadertools": + '@luma.gl/shadertools': specifier: 9.2.6 version: 9.2.6(@luma.gl/core@9.2.6) geotiff: @@ -84,13 +85,13 @@ importers: specifier: ^8.1.0 version: 8.1.0(maplibre-gl@5.17.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) devDependencies: - "@types/react": + '@types/react': specifier: ^19.2.10 version: 19.2.10 - "@types/react-dom": + '@types/react-dom': specifier: ^19.2.3 version: 19.2.3(@types/react@19.2.10) - "@vitejs/plugin-react": + '@vitejs/plugin-react': specifier: ^5.1.2 version: 5.1.2(vite@7.3.1(@types/node@25.1.0)(tsx@4.21.0)) gh-pages: @@ -102,31 +103,31 @@ importers: examples/land-cover: dependencies: - "@deck.gl/core": + '@deck.gl/core': specifier: 9.2.7 version: 9.2.7 - "@deck.gl/geo-layers": + '@deck.gl/geo-layers': specifier: 9.2.7 version: 9.2.7(@deck.gl/core@9.2.7)(@deck.gl/extensions@9.2.5(@deck.gl/core@9.2.7)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6))))(@deck.gl/layers@9.2.7(@deck.gl/core@9.2.7)(@loaders.gl/core@4.3.4)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6))))(@deck.gl/mesh-layers@9.2.7(@deck.gl/core@9.2.7)(@loaders.gl/core@4.3.4)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/gltf@9.2.6(@luma.gl/constants@9.2.6)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@loaders.gl/core@4.3.4)(@luma.gl/constants@9.2.6)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6))) - "@deck.gl/layers": + '@deck.gl/layers': specifier: 9.2.7 version: 9.2.7(@deck.gl/core@9.2.7)(@loaders.gl/core@4.3.4)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6))) - "@deck.gl/mapbox": + '@deck.gl/mapbox': specifier: 9.2.7 version: 9.2.7(@deck.gl/core@9.2.7)(@luma.gl/constants@9.2.6)(@luma.gl/core@9.2.6)(@math.gl/web-mercator@4.1.0) - "@deck.gl/mesh-layers": + '@deck.gl/mesh-layers': specifier: 9.2.7 version: 9.2.7(@deck.gl/core@9.2.7)(@loaders.gl/core@4.3.4)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/gltf@9.2.6(@luma.gl/constants@9.2.6)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)) - "@developmentseed/deck.gl-geotiff": + '@developmentseed/deck.gl-geotiff': specifier: workspace:^ version: link:../../packages/deck.gl-geotiff - "@developmentseed/deck.gl-raster": + '@developmentseed/deck.gl-raster': specifier: workspace:^ version: link:../../packages/deck.gl-raster - "@luma.gl/core": + '@luma.gl/core': specifier: 9.2.6 version: 9.2.6 - "@luma.gl/shadertools": + '@luma.gl/shadertools': specifier: 9.2.6 version: 9.2.6(@luma.gl/core@9.2.6) geotiff: @@ -151,13 +152,13 @@ importers: specifier: ^8.1.0 version: 8.1.0(maplibre-gl@5.17.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) devDependencies: - "@types/react": + '@types/react': specifier: ^19.2.10 version: 19.2.10 - "@types/react-dom": + '@types/react-dom': specifier: ^19.2.3 version: 19.2.3(@types/react@19.2.10) - "@vitejs/plugin-react": + '@vitejs/plugin-react': specifier: ^5.1.2 version: 5.1.2(vite@7.3.1(@types/node@25.1.0)(tsx@4.21.0)) gh-pages: @@ -169,25 +170,25 @@ importers: examples/naip-mosaic: dependencies: - "@deck.gl/core": + '@deck.gl/core': specifier: 9.2.7 version: 9.2.7 - "@deck.gl/layers": + '@deck.gl/layers': specifier: 9.2.7 version: 9.2.7(@deck.gl/core@9.2.7)(@loaders.gl/core@4.3.4)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6))) - "@deck.gl/mapbox": + '@deck.gl/mapbox': specifier: 9.2.7 version: 9.2.7(@deck.gl/core@9.2.7)(@luma.gl/constants@9.2.6)(@luma.gl/core@9.2.6)(@math.gl/web-mercator@4.1.0) - "@developmentseed/deck.gl-geotiff": + '@developmentseed/deck.gl-geotiff': specifier: workspace:^ version: link:../../packages/deck.gl-geotiff - "@developmentseed/deck.gl-raster": + '@developmentseed/deck.gl-raster': specifier: workspace:^ version: link:../../packages/deck.gl-raster - "@luma.gl/core": + '@luma.gl/core': specifier: 9.2.6 version: 9.2.6 - "@luma.gl/shadertools": + '@luma.gl/shadertools': specifier: 9.2.6 version: 9.2.6(@luma.gl/core@9.2.6) geotiff: @@ -209,13 +210,13 @@ importers: specifier: ^8.1.0 version: 8.1.0(maplibre-gl@5.17.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) devDependencies: - "@types/react": + '@types/react': specifier: ^19.2.10 version: 19.2.10 - "@types/react-dom": + '@types/react-dom': specifier: ^19.2.3 version: 19.2.3(@types/react@19.2.10) - "@vitejs/plugin-react": + '@vitejs/plugin-react': specifier: ^5.1.2 version: 5.1.2(vite@7.3.1(@types/node@25.1.0)(tsx@4.21.0)) gh-pages: @@ -227,7 +228,7 @@ importers: packages/affine: devDependencies: - "@types/node": + '@types/node': specifier: ^25.1.0 version: 25.1.0 jsdom: @@ -242,28 +243,28 @@ importers: packages/deck.gl-geotiff: dependencies: - "@deck.gl/core": + '@deck.gl/core': specifier: 9.2.7 version: 9.2.7 - "@deck.gl/geo-layers": + '@deck.gl/geo-layers': specifier: 9.2.7 version: 9.2.7(@deck.gl/core@9.2.7)(@deck.gl/extensions@9.2.5(@deck.gl/core@9.2.7)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6))))(@deck.gl/layers@9.2.7(@deck.gl/core@9.2.7)(@loaders.gl/core@4.3.4)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6))))(@deck.gl/mesh-layers@9.2.7(@deck.gl/core@9.2.7)(@loaders.gl/core@4.3.4)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/gltf@9.2.6(@luma.gl/constants@9.2.6)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@loaders.gl/core@4.3.4)(@luma.gl/constants@9.2.6)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6))) - "@deck.gl/layers": + '@deck.gl/layers': specifier: 9.2.7 version: 9.2.7(@deck.gl/core@9.2.7)(@loaders.gl/core@4.3.4)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6))) - "@deck.gl/mesh-layers": + '@deck.gl/mesh-layers': specifier: 9.2.7 version: 9.2.7(@deck.gl/core@9.2.7)(@loaders.gl/core@4.3.4)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/gltf@9.2.6(@luma.gl/constants@9.2.6)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)) - "@developmentseed/deck.gl-raster": + '@developmentseed/deck.gl-raster': specifier: workspace:^ version: link:../deck.gl-raster - "@developmentseed/morecantile": - specifier: 0.1.1 + '@developmentseed/morecantile': + specifier: ^0.1.1 version: 0.1.1 - "@developmentseed/raster-reproject": + '@developmentseed/raster-reproject': specifier: workspace:^ version: link:../raster-reproject - "@luma.gl/core": + '@luma.gl/core': specifier: 9.2.6 version: 9.2.6 flatbush: @@ -276,7 +277,7 @@ importers: specifier: ^2.20.2 version: 2.20.2 devDependencies: - "@types/node": + '@types/node': specifier: ^25.1.0 version: 25.1.0 jsdom: @@ -291,38 +292,41 @@ importers: packages/deck.gl-raster: dependencies: - "@deck.gl/core": + '@deck.gl/core': specifier: 9.2.7 version: 9.2.7 - "@deck.gl/geo-layers": + '@deck.gl/geo-layers': specifier: 9.2.7 version: 9.2.7(@deck.gl/core@9.2.7)(@deck.gl/extensions@9.2.5(@deck.gl/core@9.2.7)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6))))(@deck.gl/layers@9.2.7(@deck.gl/core@9.2.7)(@loaders.gl/core@4.3.4)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6))))(@deck.gl/mesh-layers@9.2.7(@deck.gl/core@9.2.7)(@loaders.gl/core@4.3.4)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/gltf@9.2.6(@luma.gl/constants@9.2.6)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@loaders.gl/core@4.3.4)(@luma.gl/constants@9.2.6)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6))) - "@deck.gl/layers": + '@deck.gl/layers': specifier: 9.2.7 version: 9.2.7(@deck.gl/core@9.2.7)(@loaders.gl/core@4.3.4)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6))) - "@deck.gl/mesh-layers": + '@deck.gl/mesh-layers': specifier: 9.2.7 version: 9.2.7(@deck.gl/core@9.2.7)(@loaders.gl/core@4.3.4)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/gltf@9.2.6(@luma.gl/constants@9.2.6)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)) - "@developmentseed/raster-reproject": + '@developmentseed/morecantile': + specifier: ^0.1.1 + version: 0.1.1 + '@developmentseed/raster-reproject': specifier: workspace:^ version: link:../raster-reproject - "@math.gl/core": + '@math.gl/core': specifier: ^4.1.0 version: 4.1.0 - "@math.gl/culling": + '@math.gl/culling': specifier: ^4.1.0 version: 4.1.0 - "@math.gl/web-mercator": + '@math.gl/web-mercator': specifier: ^4.1.0 version: 4.1.0 devDependencies: - "@luma.gl/core": + '@luma.gl/core': specifier: 9.2.6 version: 9.2.6 - "@luma.gl/shadertools": + '@luma.gl/shadertools': specifier: 9.2.6 version: 9.2.6(@luma.gl/core@9.2.6) - "@types/node": + '@types/node': specifier: ^25.1.0 version: 25.1.0 jsdom: @@ -337,10 +341,10 @@ importers: packages/deck.gl-zarr: dependencies: - "@developmentseed/deck.gl-raster": + '@developmentseed/deck.gl-raster': specifier: workspace:^ version: link:../deck.gl-raster - "@developmentseed/raster-reproject": + '@developmentseed/raster-reproject': specifier: workspace:^ version: link:../raster-reproject proj4: @@ -350,7 +354,7 @@ importers: specifier: ^0.6.1 version: 0.6.1 devDependencies: - "@types/node": + '@types/node': specifier: ^25.1.0 version: 25.1.0 jsdom: @@ -365,23 +369,23 @@ importers: packages/geotiff: dependencies: - "@cogeotiff/core": + '@cogeotiff/core': specifier: ^9.1.2 version: 9.1.2 - "@developmentseed/affine": + '@developmentseed/affine': specifier: workspace:^ version: link:../affine - "@developmentseed/morecantile": + '@developmentseed/morecantile': specifier: workspace:^ version: link:../morecantile uuid: specifier: ^13.0.0 version: 13.0.0 devDependencies: - "@chunkd/source-file": + '@chunkd/source-file': specifier: ^11.0.1 version: 11.0.1 - "@types/node": + '@types/node': specifier: ^25.1.0 version: 25.1.0 lerc: @@ -399,7 +403,7 @@ importers: packages/morecantile: devDependencies: - "@types/node": + '@types/node': specifier: ^25.1.0 version: 25.1.0 jsdom: @@ -420,7 +424,7 @@ importers: packages/raster-reproject: devDependencies: - "@types/node": + '@types/node': specifier: ^25.1.0 version: 25.1.0 jsdom: @@ -437,1661 +441,1011 @@ importers: version: 4.0.18(@types/node@25.1.0)(happy-dom@20.0.11)(jsdom@27.4.0)(tsx@4.21.0) packages: - "@acemir/cssom@0.9.30": - resolution: - { - integrity: sha512-9CnlMCI0LmCIq0olalQqdWrJHPzm0/tw3gzOA9zJSgvFX7Xau3D24mAGa4BtwxwY69nsuJW6kQqqCzf/mEcQgg==, - } - - "@apidevtools/json-schema-ref-parser@11.9.3": - resolution: - { - integrity: sha512-60vepv88RwcJtSHrD6MjIL6Ta3SOYbgfnkHb+ppAVK+o9mXprRtulx7VlRl3lN3bbvysAfCS7WMVfhUYemB0IQ==, - } - engines: { node: ">= 16" } - - "@asamuzakjp/css-color@4.1.1": - resolution: - { - integrity: sha512-B0Hv6G3gWGMn0xKJ0txEi/jM5iFpT3MfDxmhZFb4W047GvytCf1DHQ1D69W3zHI4yWe2aTZAA0JnbMZ7Xc8DuQ==, - } - - "@asamuzakjp/dom-selector@6.7.6": - resolution: - { - integrity: sha512-hBaJER6A9MpdG3WgdlOolHmbOYvSk46y7IQN/1+iqiCuUu6iWdQrs9DGKF8ocqsEqWujWf/V7b7vaDgiUmIvUg==, - } - - "@asamuzakjp/nwsapi@2.3.9": - resolution: - { - integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==, - } - - "@babel/code-frame@7.27.1": - resolution: - { - integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==, - } - engines: { node: ">=6.9.0" } - - "@babel/compat-data@7.28.5": - resolution: - { - integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==, - } - engines: { node: ">=6.9.0" } - - "@babel/core@7.28.5": - resolution: - { - integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==, - } - engines: { node: ">=6.9.0" } - - "@babel/generator@7.28.5": - resolution: - { - integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==, - } - engines: { node: ">=6.9.0" } - - "@babel/helper-compilation-targets@7.27.2": - resolution: - { - integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==, - } - engines: { node: ">=6.9.0" } - - "@babel/helper-globals@7.28.0": - resolution: - { - integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==, - } - engines: { node: ">=6.9.0" } - - "@babel/helper-module-imports@7.27.1": - resolution: - { - integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==, - } - engines: { node: ">=6.9.0" } - - "@babel/helper-module-transforms@7.28.3": - resolution: - { - integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==, - } - engines: { node: ">=6.9.0" } + + '@acemir/cssom@0.9.30': + resolution: {integrity: sha512-9CnlMCI0LmCIq0olalQqdWrJHPzm0/tw3gzOA9zJSgvFX7Xau3D24mAGa4BtwxwY69nsuJW6kQqqCzf/mEcQgg==} + + '@apidevtools/json-schema-ref-parser@11.9.3': + resolution: {integrity: sha512-60vepv88RwcJtSHrD6MjIL6Ta3SOYbgfnkHb+ppAVK+o9mXprRtulx7VlRl3lN3bbvysAfCS7WMVfhUYemB0IQ==} + engines: {node: '>= 16'} + + '@asamuzakjp/css-color@4.1.1': + resolution: {integrity: sha512-B0Hv6G3gWGMn0xKJ0txEi/jM5iFpT3MfDxmhZFb4W047GvytCf1DHQ1D69W3zHI4yWe2aTZAA0JnbMZ7Xc8DuQ==} + + '@asamuzakjp/dom-selector@6.7.6': + resolution: {integrity: sha512-hBaJER6A9MpdG3WgdlOolHmbOYvSk46y7IQN/1+iqiCuUu6iWdQrs9DGKF8ocqsEqWujWf/V7b7vaDgiUmIvUg==} + + '@asamuzakjp/nwsapi@2.3.9': + resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==} + + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.28.5': + resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.28.5': + resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.28.5': + resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.28.3': + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} + engines: {node: '>=6.9.0'} peerDependencies: - "@babel/core": ^7.0.0 - - "@babel/helper-plugin-utils@7.27.1": - resolution: - { - integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==, - } - engines: { node: ">=6.9.0" } - - "@babel/helper-string-parser@7.27.1": - resolution: - { - integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==, - } - engines: { node: ">=6.9.0" } - - "@babel/helper-validator-identifier@7.28.5": - resolution: - { - integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==, - } - engines: { node: ">=6.9.0" } - - "@babel/helper-validator-option@7.27.1": - resolution: - { - integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==, - } - engines: { node: ">=6.9.0" } - - "@babel/helpers@7.28.4": - resolution: - { - integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==, - } - engines: { node: ">=6.9.0" } - - "@babel/parser@7.28.5": - resolution: - { - integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==, - } - engines: { node: ">=6.0.0" } + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.28.4': + resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.28.5': + resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} + engines: {node: '>=6.0.0'} hasBin: true - "@babel/plugin-transform-react-jsx-self@7.27.1": - resolution: - { - integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==, - } - engines: { node: ">=6.9.0" } + '@babel/plugin-transform-react-jsx-self@7.27.1': + resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} + engines: {node: '>=6.9.0'} peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/plugin-transform-react-jsx-source@7.27.1": - resolution: - { - integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==, - } - engines: { node: ">=6.9.0" } + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.27.1': + resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} + engines: {node: '>=6.9.0'} peerDependencies: - "@babel/core": ^7.0.0-0 - - "@babel/template@7.27.2": - resolution: - { - integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==, - } - engines: { node: ">=6.9.0" } - - "@babel/traverse@7.28.5": - resolution: - { - integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==, - } - engines: { node: ">=6.9.0" } - - "@babel/types@7.28.5": - resolution: - { - integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==, - } - engines: { node: ">=6.9.0" } - - "@biomejs/biome@2.3.13": - resolution: - { - integrity: sha512-Fw7UsV0UAtWIBIm0M7g5CRerpu1eKyKAXIazzxhbXYUyMkwNrkX/KLkGI7b+uVDQ5cLUMfOC9vR60q9IDYDstA==, - } - engines: { node: ">=14.21.3" } + '@babel/core': ^7.0.0-0 + + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.28.5': + resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.28.5': + resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} + engines: {node: '>=6.9.0'} + + '@biomejs/biome@2.3.13': + resolution: {integrity: sha512-Fw7UsV0UAtWIBIm0M7g5CRerpu1eKyKAXIazzxhbXYUyMkwNrkX/KLkGI7b+uVDQ5cLUMfOC9vR60q9IDYDstA==} + engines: {node: '>=14.21.3'} hasBin: true - "@biomejs/cli-darwin-arm64@2.3.13": - resolution: - { - integrity: sha512-0OCwP0/BoKzyJHnFdaTk/i7hIP9JHH9oJJq6hrSCPmJPo8JWcJhprK4gQlhFzrwdTBAW4Bjt/RmCf3ZZe59gwQ==, - } - engines: { node: ">=14.21.3" } + '@biomejs/cli-darwin-arm64@2.3.13': + resolution: {integrity: sha512-0OCwP0/BoKzyJHnFdaTk/i7hIP9JHH9oJJq6hrSCPmJPo8JWcJhprK4gQlhFzrwdTBAW4Bjt/RmCf3ZZe59gwQ==} + engines: {node: '>=14.21.3'} cpu: [arm64] os: [darwin] - "@biomejs/cli-darwin-x64@2.3.13": - resolution: - { - integrity: sha512-AGr8OoemT/ejynbIu56qeil2+F2WLkIjn2d8jGK1JkchxnMUhYOfnqc9sVzcRxpG9Ycvw4weQ5sprRvtb7Yhcw==, - } - engines: { node: ">=14.21.3" } + '@biomejs/cli-darwin-x64@2.3.13': + resolution: {integrity: sha512-AGr8OoemT/ejynbIu56qeil2+F2WLkIjn2d8jGK1JkchxnMUhYOfnqc9sVzcRxpG9Ycvw4weQ5sprRvtb7Yhcw==} + engines: {node: '>=14.21.3'} cpu: [x64] os: [darwin] - "@biomejs/cli-linux-arm64-musl@2.3.13": - resolution: - { - integrity: sha512-TUdDCSY+Eo/EHjhJz7P2GnWwfqet+lFxBZzGHldrvULr59AgahamLs/N85SC4+bdF86EhqDuuw9rYLvLFWWlXA==, - } - engines: { node: ">=14.21.3" } + '@biomejs/cli-linux-arm64-musl@2.3.13': + resolution: {integrity: sha512-TUdDCSY+Eo/EHjhJz7P2GnWwfqet+lFxBZzGHldrvULr59AgahamLs/N85SC4+bdF86EhqDuuw9rYLvLFWWlXA==} + engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - "@biomejs/cli-linux-arm64@2.3.13": - resolution: - { - integrity: sha512-xvOiFkrDNu607MPMBUQ6huHmBG1PZLOrqhtK6pXJW3GjfVqJg0Z/qpTdhXfcqWdSZHcT+Nct2fOgewZvytESkw==, - } - engines: { node: ">=14.21.3" } + '@biomejs/cli-linux-arm64@2.3.13': + resolution: {integrity: sha512-xvOiFkrDNu607MPMBUQ6huHmBG1PZLOrqhtK6pXJW3GjfVqJg0Z/qpTdhXfcqWdSZHcT+Nct2fOgewZvytESkw==} + engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - "@biomejs/cli-linux-x64-musl@2.3.13": - resolution: - { - integrity: sha512-0bdwFVSbbM//Sds6OjtnmQGp4eUjOTt6kHvR/1P0ieR9GcTUAlPNvPC3DiavTqq302W34Ae2T6u5VVNGuQtGlQ==, - } - engines: { node: ">=14.21.3" } + '@biomejs/cli-linux-x64-musl@2.3.13': + resolution: {integrity: sha512-0bdwFVSbbM//Sds6OjtnmQGp4eUjOTt6kHvR/1P0ieR9GcTUAlPNvPC3DiavTqq302W34Ae2T6u5VVNGuQtGlQ==} + engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - "@biomejs/cli-linux-x64@2.3.13": - resolution: - { - integrity: sha512-s+YsZlgiXNq8XkgHs6xdvKDFOj/bwTEevqEY6rC2I3cBHbxXYU1LOZstH3Ffw9hE5tE1sqT7U23C00MzkXztMw==, - } - engines: { node: ">=14.21.3" } + '@biomejs/cli-linux-x64@2.3.13': + resolution: {integrity: sha512-s+YsZlgiXNq8XkgHs6xdvKDFOj/bwTEevqEY6rC2I3cBHbxXYU1LOZstH3Ffw9hE5tE1sqT7U23C00MzkXztMw==} + engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - "@biomejs/cli-win32-arm64@2.3.13": - resolution: - { - integrity: sha512-QweDxY89fq0VvrxME+wS/BXKmqMrOTZlN9SqQ79kQSIc3FrEwvW/PvUegQF6XIVaekncDykB5dzPqjbwSKs9DA==, - } - engines: { node: ">=14.21.3" } + '@biomejs/cli-win32-arm64@2.3.13': + resolution: {integrity: sha512-QweDxY89fq0VvrxME+wS/BXKmqMrOTZlN9SqQ79kQSIc3FrEwvW/PvUegQF6XIVaekncDykB5dzPqjbwSKs9DA==} + engines: {node: '>=14.21.3'} cpu: [arm64] os: [win32] - "@biomejs/cli-win32-x64@2.3.13": - resolution: - { - integrity: sha512-trDw2ogdM2lyav9WFQsdsfdVy1dvZALymRpgmWsvSez0BJzBjulhOT/t+wyKeh3pZWvwP3VMs1SoOKwO3wecMQ==, - } - engines: { node: ">=14.21.3" } + '@biomejs/cli-win32-x64@2.3.13': + resolution: {integrity: sha512-trDw2ogdM2lyav9WFQsdsfdVy1dvZALymRpgmWsvSez0BJzBjulhOT/t+wyKeh3pZWvwP3VMs1SoOKwO3wecMQ==} + engines: {node: '>=14.21.3'} cpu: [x64] os: [win32] - "@chunkd/source-file@11.0.1": - resolution: - { - integrity: sha512-9DoA1djozuDpUklg0CRj/GBEJzvZeqwr1EIOTcEr3igDAf+UZ3y3lOgUaIWuNeATbwQ7Pdml2S6SLLAdAe45wQ==, - } - engines: { node: ">=16.0.0" } - - "@chunkd/source@11.1.0": - resolution: - { - integrity: sha512-3BcrHK4XDm3t4vDx1OisgcOZ05+EarEqwaGVIL7IMHUmkXwN/Aprlnr7aVP3BYcltgcCcfMd1pXQicbSrP563g==, - } - engines: { node: ">=16.0.0" } - - "@cogeotiff/core@9.1.2": - resolution: - { - integrity: sha512-m1F9glmz8zxxfDyqVnOQibF/uIZciequ1576zy6FG1rCcXVtLhE3qERT1GcS79K/dKvf+B+imgEmV2qfl6TdJQ==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } - - "@csstools/color-helpers@5.1.0": - resolution: - { - integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==, - } - engines: { node: ">=18" } - - "@csstools/css-calc@2.1.4": - resolution: - { - integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==, - } - engines: { node: ">=18" } + '@chunkd/source-file@11.0.1': + resolution: {integrity: sha512-9DoA1djozuDpUklg0CRj/GBEJzvZeqwr1EIOTcEr3igDAf+UZ3y3lOgUaIWuNeATbwQ7Pdml2S6SLLAdAe45wQ==} + engines: {node: '>=16.0.0'} + + '@chunkd/source@11.1.0': + resolution: {integrity: sha512-3BcrHK4XDm3t4vDx1OisgcOZ05+EarEqwaGVIL7IMHUmkXwN/Aprlnr7aVP3BYcltgcCcfMd1pXQicbSrP563g==} + engines: {node: '>=16.0.0'} + + '@cogeotiff/core@9.1.2': + resolution: {integrity: sha512-m1F9glmz8zxxfDyqVnOQibF/uIZciequ1576zy6FG1rCcXVtLhE3qERT1GcS79K/dKvf+B+imgEmV2qfl6TdJQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + '@csstools/color-helpers@5.1.0': + resolution: {integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==} + engines: {node: '>=18'} + + '@csstools/css-calc@2.1.4': + resolution: {integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==} + engines: {node: '>=18'} peerDependencies: - "@csstools/css-parser-algorithms": ^3.0.5 - "@csstools/css-tokenizer": ^3.0.4 - - "@csstools/css-color-parser@3.1.0": - resolution: - { - integrity: sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==, - } - engines: { node: ">=18" } + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-color-parser@3.1.0': + resolution: {integrity: sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==} + engines: {node: '>=18'} peerDependencies: - "@csstools/css-parser-algorithms": ^3.0.5 - "@csstools/css-tokenizer": ^3.0.4 - - "@csstools/css-parser-algorithms@3.0.5": - resolution: - { - integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==, - } - engines: { node: ">=18" } + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-parser-algorithms@3.0.5': + resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} + engines: {node: '>=18'} peerDependencies: - "@csstools/css-tokenizer": ^3.0.4 - - "@csstools/css-syntax-patches-for-csstree@1.0.22": - resolution: - { - integrity: sha512-qBcx6zYlhleiFfdtzkRgwNC7VVoAwfK76Vmsw5t+PbvtdknO9StgRk7ROvq9so1iqbdW4uLIDAsXRsTfUrIoOw==, - } - engines: { node: ">=18" } - - "@csstools/css-tokenizer@3.0.4": - resolution: - { - integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==, - } - engines: { node: ">=18" } - - "@deck.gl/core@9.2.7": - resolution: - { - integrity: sha512-mltYFDC2dMtAZPkAaVIadccbM3iy9jjnhLa5obFnWzPtXyc1UBr7OW50Cjy0IlQmAsgDI2BATzcw5a/p4zU8zw==, - } - - "@deck.gl/extensions@9.2.5": - resolution: - { - integrity: sha512-GJRPmG+GD1tdblpplQlb4jlNywRb8aQYPEowPLKxglXSGRzgpOrqJYI1PcJhCowdL7/S8bCY1ay8nkXE3gRsgw==, - } + '@csstools/css-tokenizer': ^3.0.4 + + '@csstools/css-syntax-patches-for-csstree@1.0.22': + resolution: {integrity: sha512-qBcx6zYlhleiFfdtzkRgwNC7VVoAwfK76Vmsw5t+PbvtdknO9StgRk7ROvq9so1iqbdW4uLIDAsXRsTfUrIoOw==} + engines: {node: '>=18'} + + '@csstools/css-tokenizer@3.0.4': + resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} + engines: {node: '>=18'} + + '@deck.gl/core@9.2.7': + resolution: {integrity: sha512-mltYFDC2dMtAZPkAaVIadccbM3iy9jjnhLa5obFnWzPtXyc1UBr7OW50Cjy0IlQmAsgDI2BATzcw5a/p4zU8zw==} + + '@deck.gl/extensions@9.2.5': + resolution: {integrity: sha512-GJRPmG+GD1tdblpplQlb4jlNywRb8aQYPEowPLKxglXSGRzgpOrqJYI1PcJhCowdL7/S8bCY1ay8nkXE3gRsgw==} peerDependencies: - "@deck.gl/core": 9.2.7 - "@luma.gl/core": 9.2.6 - "@luma.gl/engine": 9.2.6 - - "@deck.gl/geo-layers@9.2.7": - resolution: - { - integrity: sha512-DiEfsmWrW0EIM44FdwzdPAjUr8a8IPelpkt2fPvrgmaS0OSZFB1PkJWLmM3hoYO8mH0vuD0YL//m+Pvtw3bGSw==, - } + '@deck.gl/core': 9.2.7 + '@luma.gl/core': 9.2.6 + '@luma.gl/engine': 9.2.6 + + '@deck.gl/geo-layers@9.2.7': + resolution: {integrity: sha512-DiEfsmWrW0EIM44FdwzdPAjUr8a8IPelpkt2fPvrgmaS0OSZFB1PkJWLmM3hoYO8mH0vuD0YL//m+Pvtw3bGSw==} peerDependencies: - "@deck.gl/core": 9.2.7 - "@deck.gl/extensions": ~9.2.0 - "@deck.gl/layers": 9.2.7 - "@deck.gl/mesh-layers": 9.2.7 - "@loaders.gl/core": ^4.3.4 - "@luma.gl/core": 9.2.6 - "@luma.gl/engine": 9.2.6 - - "@deck.gl/layers@9.2.7": - resolution: - { - integrity: sha512-oGRv3s+i+Rq4qQFTfdCBx2S650K4p0gGS/bPYpURCXW0a0LQBHqN8AkKbhdos7b7Lawp1iMwkIggBZSZaNkyXg==, - } + '@deck.gl/core': 9.2.7 + '@deck.gl/extensions': ~9.2.0 + '@deck.gl/layers': 9.2.7 + '@deck.gl/mesh-layers': 9.2.7 + '@loaders.gl/core': ^4.3.4 + '@luma.gl/core': 9.2.6 + '@luma.gl/engine': 9.2.6 + + '@deck.gl/layers@9.2.7': + resolution: {integrity: sha512-oGRv3s+i+Rq4qQFTfdCBx2S650K4p0gGS/bPYpURCXW0a0LQBHqN8AkKbhdos7b7Lawp1iMwkIggBZSZaNkyXg==} peerDependencies: - "@deck.gl/core": 9.2.7 - "@loaders.gl/core": ^4.3.4 - "@luma.gl/core": 9.2.6 - "@luma.gl/engine": 9.2.6 - - "@deck.gl/mapbox@9.2.7": - resolution: - { - integrity: sha512-kcTMavoM9RqGbDXg78U/DGlR3dCQMR5+9ctc83qy0aNP57zQ62okomnq9DVCfxvcQjYb1uMqAt3HaBespInRcA==, - } + '@deck.gl/core': 9.2.7 + '@loaders.gl/core': ^4.3.4 + '@luma.gl/core': 9.2.6 + '@luma.gl/engine': 9.2.6 + + '@deck.gl/mapbox@9.2.7': + resolution: {integrity: sha512-kcTMavoM9RqGbDXg78U/DGlR3dCQMR5+9ctc83qy0aNP57zQ62okomnq9DVCfxvcQjYb1uMqAt3HaBespInRcA==} peerDependencies: - "@deck.gl/core": 9.2.7 - "@luma.gl/constants": 9.2.6 - "@luma.gl/core": 9.2.6 - "@math.gl/web-mercator": ^4.1.0 - - "@deck.gl/mesh-layers@9.2.7": - resolution: - { - integrity: sha512-EpWHJ3GaCXELCsYRlabvkXxtgLQwOZYU8YPOmlKUYf+/410B2D89oNGtJinRcfM1/T9TBelBS9CHMYsL1tv9cA==, - } + '@deck.gl/core': 9.2.7 + '@luma.gl/constants': 9.2.6 + '@luma.gl/core': 9.2.6 + '@math.gl/web-mercator': ^4.1.0 + + '@deck.gl/mesh-layers@9.2.7': + resolution: {integrity: sha512-EpWHJ3GaCXELCsYRlabvkXxtgLQwOZYU8YPOmlKUYf+/410B2D89oNGtJinRcfM1/T9TBelBS9CHMYsL1tv9cA==} peerDependencies: - "@deck.gl/core": 9.2.7 - "@luma.gl/core": 9.2.6 - "@luma.gl/engine": 9.2.6 - "@luma.gl/gltf": 9.2.6 - "@luma.gl/shadertools": 9.2.6 - - "@developmentseed/morecantile@0.1.1": - resolution: - { - integrity: sha512-FtRxhWUv3E42YRST0UcIuDVOUQXf6GRIh0Vv4pvSxW8+ozZ5QmXuiVSma4A/yS3FPs/k2D0MgwNO0aRqsLXm+w==, - } - engines: { node: ">=18" } - - "@esbuild/aix-ppc64@0.27.2": - resolution: - { - integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==, - } - engines: { node: ">=18" } + '@deck.gl/core': 9.2.7 + '@luma.gl/core': 9.2.6 + '@luma.gl/engine': 9.2.6 + '@luma.gl/gltf': 9.2.6 + '@luma.gl/shadertools': 9.2.6 + + '@developmentseed/morecantile@0.1.1': + resolution: {integrity: sha512-FtRxhWUv3E42YRST0UcIuDVOUQXf6GRIh0Vv4pvSxW8+ozZ5QmXuiVSma4A/yS3FPs/k2D0MgwNO0aRqsLXm+w==} + engines: {node: '>=18'} + + '@esbuild/aix-ppc64@0.27.2': + resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==} + engines: {node: '>=18'} cpu: [ppc64] os: [aix] - "@esbuild/android-arm64@0.27.2": - resolution: - { - integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==, - } - engines: { node: ">=18" } + '@esbuild/android-arm64@0.27.2': + resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==} + engines: {node: '>=18'} cpu: [arm64] os: [android] - "@esbuild/android-arm@0.27.2": - resolution: - { - integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==, - } - engines: { node: ">=18" } + '@esbuild/android-arm@0.27.2': + resolution: {integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==} + engines: {node: '>=18'} cpu: [arm] os: [android] - "@esbuild/android-x64@0.27.2": - resolution: - { - integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==, - } - engines: { node: ">=18" } + '@esbuild/android-x64@0.27.2': + resolution: {integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==} + engines: {node: '>=18'} cpu: [x64] os: [android] - "@esbuild/darwin-arm64@0.27.2": - resolution: - { - integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==, - } - engines: { node: ">=18" } + '@esbuild/darwin-arm64@0.27.2': + resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==} + engines: {node: '>=18'} cpu: [arm64] os: [darwin] - "@esbuild/darwin-x64@0.27.2": - resolution: - { - integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==, - } - engines: { node: ">=18" } + '@esbuild/darwin-x64@0.27.2': + resolution: {integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==} + engines: {node: '>=18'} cpu: [x64] os: [darwin] - "@esbuild/freebsd-arm64@0.27.2": - resolution: - { - integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==, - } - engines: { node: ">=18" } + '@esbuild/freebsd-arm64@0.27.2': + resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==} + engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - "@esbuild/freebsd-x64@0.27.2": - resolution: - { - integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==, - } - engines: { node: ">=18" } + '@esbuild/freebsd-x64@0.27.2': + resolution: {integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==} + engines: {node: '>=18'} cpu: [x64] os: [freebsd] - "@esbuild/linux-arm64@0.27.2": - resolution: - { - integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==, - } - engines: { node: ">=18" } + '@esbuild/linux-arm64@0.27.2': + resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==} + engines: {node: '>=18'} cpu: [arm64] os: [linux] - "@esbuild/linux-arm@0.27.2": - resolution: - { - integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==, - } - engines: { node: ">=18" } + '@esbuild/linux-arm@0.27.2': + resolution: {integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==} + engines: {node: '>=18'} cpu: [arm] os: [linux] - "@esbuild/linux-ia32@0.27.2": - resolution: - { - integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==, - } - engines: { node: ">=18" } + '@esbuild/linux-ia32@0.27.2': + resolution: {integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==} + engines: {node: '>=18'} cpu: [ia32] os: [linux] - "@esbuild/linux-loong64@0.27.2": - resolution: - { - integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==, - } - engines: { node: ">=18" } + '@esbuild/linux-loong64@0.27.2': + resolution: {integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==} + engines: {node: '>=18'} cpu: [loong64] os: [linux] - "@esbuild/linux-mips64el@0.27.2": - resolution: - { - integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==, - } - engines: { node: ">=18" } + '@esbuild/linux-mips64el@0.27.2': + resolution: {integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==} + engines: {node: '>=18'} cpu: [mips64el] os: [linux] - "@esbuild/linux-ppc64@0.27.2": - resolution: - { - integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==, - } - engines: { node: ">=18" } + '@esbuild/linux-ppc64@0.27.2': + resolution: {integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==} + engines: {node: '>=18'} cpu: [ppc64] os: [linux] - "@esbuild/linux-riscv64@0.27.2": - resolution: - { - integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==, - } - engines: { node: ">=18" } + '@esbuild/linux-riscv64@0.27.2': + resolution: {integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==} + engines: {node: '>=18'} cpu: [riscv64] os: [linux] - "@esbuild/linux-s390x@0.27.2": - resolution: - { - integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==, - } - engines: { node: ">=18" } + '@esbuild/linux-s390x@0.27.2': + resolution: {integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==} + engines: {node: '>=18'} cpu: [s390x] os: [linux] - "@esbuild/linux-x64@0.27.2": - resolution: - { - integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==, - } - engines: { node: ">=18" } + '@esbuild/linux-x64@0.27.2': + resolution: {integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==} + engines: {node: '>=18'} cpu: [x64] os: [linux] - "@esbuild/netbsd-arm64@0.27.2": - resolution: - { - integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==, - } - engines: { node: ">=18" } + '@esbuild/netbsd-arm64@0.27.2': + resolution: {integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==} + engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - "@esbuild/netbsd-x64@0.27.2": - resolution: - { - integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==, - } - engines: { node: ">=18" } + '@esbuild/netbsd-x64@0.27.2': + resolution: {integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==} + engines: {node: '>=18'} cpu: [x64] os: [netbsd] - "@esbuild/openbsd-arm64@0.27.2": - resolution: - { - integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==, - } - engines: { node: ">=18" } + '@esbuild/openbsd-arm64@0.27.2': + resolution: {integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==} + engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - "@esbuild/openbsd-x64@0.27.2": - resolution: - { - integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==, - } - engines: { node: ">=18" } + '@esbuild/openbsd-x64@0.27.2': + resolution: {integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==} + engines: {node: '>=18'} cpu: [x64] os: [openbsd] - "@esbuild/openharmony-arm64@0.27.2": - resolution: - { - integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==, - } - engines: { node: ">=18" } + '@esbuild/openharmony-arm64@0.27.2': + resolution: {integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==} + engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - "@esbuild/sunos-x64@0.27.2": - resolution: - { - integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==, - } - engines: { node: ">=18" } + '@esbuild/sunos-x64@0.27.2': + resolution: {integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==} + engines: {node: '>=18'} cpu: [x64] os: [sunos] - "@esbuild/win32-arm64@0.27.2": - resolution: - { - integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==, - } - engines: { node: ">=18" } + '@esbuild/win32-arm64@0.27.2': + resolution: {integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==} + engines: {node: '>=18'} cpu: [arm64] os: [win32] - "@esbuild/win32-ia32@0.27.2": - resolution: - { - integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==, - } - engines: { node: ">=18" } + '@esbuild/win32-ia32@0.27.2': + resolution: {integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==} + engines: {node: '>=18'} cpu: [ia32] os: [win32] - "@esbuild/win32-x64@0.27.2": - resolution: - { - integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==, - } - engines: { node: ">=18" } + '@esbuild/win32-x64@0.27.2': + resolution: {integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==} + engines: {node: '>=18'} cpu: [x64] os: [win32] - "@exodus/bytes@1.8.0": - resolution: - { - integrity: sha512-8JPn18Bcp8Uo1T82gR8lh2guEOa5KKU/IEKvvdp0sgmi7coPBWf1Doi1EXsGZb2ehc8ym/StJCjffYV+ne7sXQ==, - } - engines: { node: ^20.19.0 || ^22.12.0 || >=24.0.0 } + '@exodus/bytes@1.8.0': + resolution: {integrity: sha512-8JPn18Bcp8Uo1T82gR8lh2guEOa5KKU/IEKvvdp0sgmi7coPBWf1Doi1EXsGZb2ehc8ym/StJCjffYV+ne7sXQ==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: - "@exodus/crypto": ^1.0.0-rc.4 + '@exodus/crypto': ^1.0.0-rc.4 peerDependenciesMeta: - "@exodus/crypto": + '@exodus/crypto': optional: true - "@jridgewell/gen-mapping@0.3.13": - resolution: - { - integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==, - } - - "@jridgewell/remapping@2.3.5": - resolution: - { - integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==, - } - - "@jridgewell/resolve-uri@3.1.2": - resolution: - { - integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==, - } - engines: { node: ">=6.0.0" } - - "@jridgewell/sourcemap-codec@1.5.5": - resolution: - { - integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==, - } - - "@jridgewell/trace-mapping@0.3.31": - resolution: - { - integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==, - } - - "@jsdevtools/ono@7.1.3": - resolution: - { - integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==, - } - - "@loaders.gl/3d-tiles@4.3.4": - resolution: - { - integrity: sha512-JQ3y3p/KlZP7lfobwON5t7H9WinXEYTvuo3SRQM8TBKhM+koEYZhvI2GwzoXx54MbBbY+s3fm1dq5UAAmaTsZw==, - } + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@jsdevtools/ono@7.1.3': + resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} + + '@loaders.gl/3d-tiles@4.3.4': + resolution: {integrity: sha512-JQ3y3p/KlZP7lfobwON5t7H9WinXEYTvuo3SRQM8TBKhM+koEYZhvI2GwzoXx54MbBbY+s3fm1dq5UAAmaTsZw==} peerDependencies: - "@loaders.gl/core": ^4.3.0 + '@loaders.gl/core': ^4.3.0 - "@loaders.gl/compression@4.3.4": - resolution: - { - integrity: sha512-+o+5JqL9Sx8UCwdc2MTtjQiUHYQGJALHbYY/3CT+b9g/Emzwzez2Ggk9U9waRfdHiBCzEgRBivpWZEOAtkimXQ==, - } + '@loaders.gl/compression@4.3.4': + resolution: {integrity: sha512-+o+5JqL9Sx8UCwdc2MTtjQiUHYQGJALHbYY/3CT+b9g/Emzwzez2Ggk9U9waRfdHiBCzEgRBivpWZEOAtkimXQ==} peerDependencies: - "@loaders.gl/core": ^4.3.0 - - "@loaders.gl/core@4.3.4": - resolution: - { - integrity: sha512-cG0C5fMZ1jyW6WCsf4LoHGvaIAJCEVA/ioqKoYRwoSfXkOf+17KupK1OUQyUCw5XoRn+oWA1FulJQOYlXnb9Gw==, - } - - "@loaders.gl/crypto@4.3.4": - resolution: - { - integrity: sha512-3VS5FgB44nLOlAB9Q82VOQnT1IltwfRa1miE0mpHCe1prYu1M/dMnEyynusbrsp+eDs3EKbxpguIS9HUsFu5dQ==, - } + '@loaders.gl/core': ^4.3.0 + + '@loaders.gl/core@4.3.4': + resolution: {integrity: sha512-cG0C5fMZ1jyW6WCsf4LoHGvaIAJCEVA/ioqKoYRwoSfXkOf+17KupK1OUQyUCw5XoRn+oWA1FulJQOYlXnb9Gw==} + + '@loaders.gl/crypto@4.3.4': + resolution: {integrity: sha512-3VS5FgB44nLOlAB9Q82VOQnT1IltwfRa1miE0mpHCe1prYu1M/dMnEyynusbrsp+eDs3EKbxpguIS9HUsFu5dQ==} peerDependencies: - "@loaders.gl/core": ^4.3.0 + '@loaders.gl/core': ^4.3.0 - "@loaders.gl/draco@4.3.4": - resolution: - { - integrity: sha512-4Lx0rKmYENGspvcgV5XDpFD9o+NamXoazSSl9Oa3pjVVjo+HJuzCgrxTQYD/3JvRrolW/QRehZeWD/L/cEC6mw==, - } + '@loaders.gl/draco@4.3.4': + resolution: {integrity: sha512-4Lx0rKmYENGspvcgV5XDpFD9o+NamXoazSSl9Oa3pjVVjo+HJuzCgrxTQYD/3JvRrolW/QRehZeWD/L/cEC6mw==} peerDependencies: - "@loaders.gl/core": ^4.3.0 + '@loaders.gl/core': ^4.3.0 - "@loaders.gl/gis@4.3.4": - resolution: - { - integrity: sha512-8xub38lSWW7+ZXWuUcggk7agRHJUy6RdipLNKZ90eE0ZzLNGDstGD1qiBwkvqH0AkG+uz4B7Kkiptyl7w2Oa6g==, - } + '@loaders.gl/gis@4.3.4': + resolution: {integrity: sha512-8xub38lSWW7+ZXWuUcggk7agRHJUy6RdipLNKZ90eE0ZzLNGDstGD1qiBwkvqH0AkG+uz4B7Kkiptyl7w2Oa6g==} peerDependencies: - "@loaders.gl/core": ^4.3.0 + '@loaders.gl/core': ^4.3.0 - "@loaders.gl/gltf@4.3.4": - resolution: - { - integrity: sha512-EiUTiLGMfukLd9W98wMpKmw+hVRhQ0dJ37wdlXK98XPeGGB+zTQxCcQY+/BaMhsSpYt/OOJleHhTfwNr8RgzRg==, - } + '@loaders.gl/gltf@4.3.4': + resolution: {integrity: sha512-EiUTiLGMfukLd9W98wMpKmw+hVRhQ0dJ37wdlXK98XPeGGB+zTQxCcQY+/BaMhsSpYt/OOJleHhTfwNr8RgzRg==} peerDependencies: - "@loaders.gl/core": ^4.3.0 + '@loaders.gl/core': ^4.3.0 - "@loaders.gl/images@4.3.4": - resolution: - { - integrity: sha512-qgc33BaNsqN9cWa/xvcGvQ50wGDONgQQdzHCKDDKhV2w/uptZoR5iofJfuG8UUV2vUMMd82Uk9zbopRx2rS4Ag==, - } + '@loaders.gl/images@4.3.4': + resolution: {integrity: sha512-qgc33BaNsqN9cWa/xvcGvQ50wGDONgQQdzHCKDDKhV2w/uptZoR5iofJfuG8UUV2vUMMd82Uk9zbopRx2rS4Ag==} peerDependencies: - "@loaders.gl/core": ^4.3.0 + '@loaders.gl/core': ^4.3.0 - "@loaders.gl/loader-utils@4.3.4": - resolution: - { - integrity: sha512-tjMZvlKQSaMl2qmYTAxg+ySR6zd6hQn5n3XaU8+Ehp90TD3WzxvDKOMNDqOa72fFmIV+KgPhcmIJTpq4lAdC4Q==, - } + '@loaders.gl/loader-utils@4.3.4': + resolution: {integrity: sha512-tjMZvlKQSaMl2qmYTAxg+ySR6zd6hQn5n3XaU8+Ehp90TD3WzxvDKOMNDqOa72fFmIV+KgPhcmIJTpq4lAdC4Q==} peerDependencies: - "@loaders.gl/core": ^4.3.0 + '@loaders.gl/core': ^4.3.0 - "@loaders.gl/math@4.3.4": - resolution: - { - integrity: sha512-UJrlHys1fp9EUO4UMnqTCqvKvUjJVCbYZ2qAKD7tdGzHJYT8w/nsP7f/ZOYFc//JlfC3nq+5ogvmdpq2pyu3TA==, - } + '@loaders.gl/math@4.3.4': + resolution: {integrity: sha512-UJrlHys1fp9EUO4UMnqTCqvKvUjJVCbYZ2qAKD7tdGzHJYT8w/nsP7f/ZOYFc//JlfC3nq+5ogvmdpq2pyu3TA==} peerDependencies: - "@loaders.gl/core": ^4.3.0 + '@loaders.gl/core': ^4.3.0 - "@loaders.gl/mvt@4.3.4": - resolution: - { - integrity: sha512-9DrJX8RQf14htNtxsPIYvTso5dUce9WaJCWCIY/79KYE80Be6dhcEYMknxBS4w3+PAuImaAe66S5xo9B7Erm5A==, - } + '@loaders.gl/mvt@4.3.4': + resolution: {integrity: sha512-9DrJX8RQf14htNtxsPIYvTso5dUce9WaJCWCIY/79KYE80Be6dhcEYMknxBS4w3+PAuImaAe66S5xo9B7Erm5A==} peerDependencies: - "@loaders.gl/core": ^4.3.0 + '@loaders.gl/core': ^4.3.0 - "@loaders.gl/schema@4.3.4": - resolution: - { - integrity: sha512-1YTYoatgzr/6JTxqBLwDiD3AVGwQZheYiQwAimWdRBVB0JAzych7s1yBuE0CVEzj4JDPKOzVAz8KnU1TiBvJGw==, - } + '@loaders.gl/schema@4.3.4': + resolution: {integrity: sha512-1YTYoatgzr/6JTxqBLwDiD3AVGwQZheYiQwAimWdRBVB0JAzych7s1yBuE0CVEzj4JDPKOzVAz8KnU1TiBvJGw==} peerDependencies: - "@loaders.gl/core": ^4.3.0 + '@loaders.gl/core': ^4.3.0 - "@loaders.gl/terrain@4.3.4": - resolution: - { - integrity: sha512-JszbRJGnxL5Fh82uA2U8HgjlsIpzYoCNNjy3cFsgCaxi4/dvjz3BkLlBilR7JlbX8Ka+zlb4GAbDDChiXLMJ/g==, - } + '@loaders.gl/terrain@4.3.4': + resolution: {integrity: sha512-JszbRJGnxL5Fh82uA2U8HgjlsIpzYoCNNjy3cFsgCaxi4/dvjz3BkLlBilR7JlbX8Ka+zlb4GAbDDChiXLMJ/g==} peerDependencies: - "@loaders.gl/core": ^4.3.0 + '@loaders.gl/core': ^4.3.0 - "@loaders.gl/textures@4.3.4": - resolution: - { - integrity: sha512-arWIDjlE7JaDS6v9by7juLfxPGGnjT9JjleaXx3wq/PTp+psLOpGUywHXm38BNECos3MFEQK3/GFShWI+/dWPw==, - } + '@loaders.gl/textures@4.3.4': + resolution: {integrity: sha512-arWIDjlE7JaDS6v9by7juLfxPGGnjT9JjleaXx3wq/PTp+psLOpGUywHXm38BNECos3MFEQK3/GFShWI+/dWPw==} peerDependencies: - "@loaders.gl/core": ^4.3.0 + '@loaders.gl/core': ^4.3.0 - "@loaders.gl/tiles@4.3.4": - resolution: - { - integrity: sha512-oC0zJfyvGox6Ag9ABF8fxOkx9yEFVyzTa9ryHXl2BqLiQoR1v3p+0tIJcEbh5cnzHfoTZzUis1TEAZluPRsHBQ==, - } + '@loaders.gl/tiles@4.3.4': + resolution: {integrity: sha512-oC0zJfyvGox6Ag9ABF8fxOkx9yEFVyzTa9ryHXl2BqLiQoR1v3p+0tIJcEbh5cnzHfoTZzUis1TEAZluPRsHBQ==} peerDependencies: - "@loaders.gl/core": ^4.3.0 + '@loaders.gl/core': ^4.3.0 - "@loaders.gl/wms@4.3.4": - resolution: - { - integrity: sha512-yXF0wuYzJUdzAJQrhLIua6DnjOiBJusaY1j8gpvuH1VYs3mzvWlIRuZKeUd9mduQZKK88H2IzHZbj2RGOauq4w==, - } + '@loaders.gl/wms@4.3.4': + resolution: {integrity: sha512-yXF0wuYzJUdzAJQrhLIua6DnjOiBJusaY1j8gpvuH1VYs3mzvWlIRuZKeUd9mduQZKK88H2IzHZbj2RGOauq4w==} peerDependencies: - "@loaders.gl/core": ^4.3.0 + '@loaders.gl/core': ^4.3.0 - "@loaders.gl/worker-utils@4.3.4": - resolution: - { - integrity: sha512-EbsszrASgT85GH3B7jkx7YXfQyIYo/rlobwMx6V3ewETapPUwdSAInv+89flnk5n2eu2Lpdeh+2zS6PvqbL2RA==, - } + '@loaders.gl/worker-utils@4.3.4': + resolution: {integrity: sha512-EbsszrASgT85GH3B7jkx7YXfQyIYo/rlobwMx6V3ewETapPUwdSAInv+89flnk5n2eu2Lpdeh+2zS6PvqbL2RA==} peerDependencies: - "@loaders.gl/core": ^4.3.0 + '@loaders.gl/core': ^4.3.0 - "@loaders.gl/xml@4.3.4": - resolution: - { - integrity: sha512-p+y/KskajsvyM3a01BwUgjons/j/dUhniqd5y1p6keLOuwoHlY/TfTKd+XluqfyP14vFrdAHCZTnFCWLblN10w==, - } + '@loaders.gl/xml@4.3.4': + resolution: {integrity: sha512-p+y/KskajsvyM3a01BwUgjons/j/dUhniqd5y1p6keLOuwoHlY/TfTKd+XluqfyP14vFrdAHCZTnFCWLblN10w==} peerDependencies: - "@loaders.gl/core": ^4.3.0 + '@loaders.gl/core': ^4.3.0 - "@loaders.gl/zip@4.3.4": - resolution: - { - integrity: sha512-bHY4XdKYJm3vl9087GMoxnUqSURwTxPPh6DlAGOmz6X9Mp3JyWuA2gk3tQ1UIuInfjXKph3WAUfGe6XRIs1sfw==, - } + '@loaders.gl/zip@4.3.4': + resolution: {integrity: sha512-bHY4XdKYJm3vl9087GMoxnUqSURwTxPPh6DlAGOmz6X9Mp3JyWuA2gk3tQ1UIuInfjXKph3WAUfGe6XRIs1sfw==} peerDependencies: - "@loaders.gl/core": ^4.3.0 - - "@luma.gl/constants@9.2.6": - resolution: - { - integrity: sha512-rvFFrJuSm5JIWbDHFuR4Q2s4eudO3Ggsv0TsGKn9eqvO7bBiPm/ANugHredvh3KviEyYuMZZxtfJvBdr3kzldg==, - } - - "@luma.gl/core@9.2.6": - resolution: - { - integrity: sha512-d8KcH8ZZcjDAodSN/G2nueA9YE2X8kMz7Q0OxDGpCww6to1MZXM3Ydate/Jqsb5DDKVgUF6yD6RL8P5jOki9Yw==, - } - - "@luma.gl/engine@9.2.6": - resolution: - { - integrity: sha512-1AEDs2AUqOWh7Wl4onOhXmQF+Rz1zNdPXF+Kxm4aWl92RQ42Sh2CmTvRt2BJku83VQ91KFIEm/v3qd3Urzf+Uw==, - } + '@loaders.gl/core': ^4.3.0 + + '@luma.gl/constants@9.2.6': + resolution: {integrity: sha512-rvFFrJuSm5JIWbDHFuR4Q2s4eudO3Ggsv0TsGKn9eqvO7bBiPm/ANugHredvh3KviEyYuMZZxtfJvBdr3kzldg==} + + '@luma.gl/core@9.2.6': + resolution: {integrity: sha512-d8KcH8ZZcjDAodSN/G2nueA9YE2X8kMz7Q0OxDGpCww6to1MZXM3Ydate/Jqsb5DDKVgUF6yD6RL8P5jOki9Yw==} + + '@luma.gl/engine@9.2.6': + resolution: {integrity: sha512-1AEDs2AUqOWh7Wl4onOhXmQF+Rz1zNdPXF+Kxm4aWl92RQ42Sh2CmTvRt2BJku83VQ91KFIEm/v3qd3Urzf+Uw==} peerDependencies: - "@luma.gl/core": 9.2.6 - "@luma.gl/shadertools": 9.2.6 - - "@luma.gl/gltf@9.2.6": - resolution: - { - integrity: sha512-is3YkiGsWqWTmwldMz6PRaIUleufQfUKYjJTKpsF5RS1OnN+xdAO0mJq5qJTtOQpppWAU0VrmDFEVZ6R3qvm0A==, - } + '@luma.gl/core': 9.2.6 + '@luma.gl/shadertools': 9.2.6 + + '@luma.gl/gltf@9.2.6': + resolution: {integrity: sha512-is3YkiGsWqWTmwldMz6PRaIUleufQfUKYjJTKpsF5RS1OnN+xdAO0mJq5qJTtOQpppWAU0VrmDFEVZ6R3qvm0A==} peerDependencies: - "@luma.gl/constants": 9.2.6 - "@luma.gl/core": 9.2.6 - "@luma.gl/engine": 9.2.6 - "@luma.gl/shadertools": 9.2.6 - - "@luma.gl/shadertools@9.2.6": - resolution: - { - integrity: sha512-4+uUbynqPUra9d/z1nQChyHmhLgmKfSMjS7kOwLB6exSnhKnpHL3+Hu9fv55qyaX50nGH3oHawhGtJ6RRvu65w==, - } + '@luma.gl/constants': 9.2.6 + '@luma.gl/core': 9.2.6 + '@luma.gl/engine': 9.2.6 + '@luma.gl/shadertools': 9.2.6 + + '@luma.gl/shadertools@9.2.6': + resolution: {integrity: sha512-4+uUbynqPUra9d/z1nQChyHmhLgmKfSMjS7kOwLB6exSnhKnpHL3+Hu9fv55qyaX50nGH3oHawhGtJ6RRvu65w==} peerDependencies: - "@luma.gl/core": 9.2.6 + '@luma.gl/core': 9.2.6 - "@luma.gl/webgl@9.2.6": - resolution: - { - integrity: sha512-NGBTdxJMk7j8Ygr1zuTyAvr1Tw+EpupMIQo7RelFjEsZXg6pujFqiDMM+rgxex8voCeuhWBJc7Rs+MoSqd46UQ==, - } + '@luma.gl/webgl@9.2.6': + resolution: {integrity: sha512-NGBTdxJMk7j8Ygr1zuTyAvr1Tw+EpupMIQo7RelFjEsZXg6pujFqiDMM+rgxex8voCeuhWBJc7Rs+MoSqd46UQ==} peerDependencies: - "@luma.gl/core": 9.2.6 + '@luma.gl/core': 9.2.6 - "@mapbox/geojson-rewind@0.5.2": - resolution: - { - integrity: sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA==, - } + '@mapbox/geojson-rewind@0.5.2': + resolution: {integrity: sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA==} hasBin: true - "@mapbox/jsonlint-lines-primitives@2.0.2": - resolution: - { - integrity: sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==, - } - engines: { node: ">= 0.6" } - - "@mapbox/martini@0.2.0": - resolution: - { - integrity: sha512-7hFhtkb0KTLEls+TRw/rWayq5EeHtTaErgm/NskVoXmtgAQu/9D299aeyj6mzAR/6XUnYRp2lU+4IcrYRFjVsQ==, - } - - "@mapbox/point-geometry@0.1.0": - resolution: - { - integrity: sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==, - } - - "@mapbox/point-geometry@1.1.0": - resolution: - { - integrity: sha512-YGcBz1cg4ATXDCM/71L9xveh4dynfGmcLDqufR+nQQy3fKwsAZsWd/x4621/6uJaeB9mwOHE6hPeDgXz9uViUQ==, - } - - "@mapbox/tiny-sdf@2.0.7": - resolution: - { - integrity: sha512-25gQLQMcpivjOSA40g3gO6qgiFPDpWRoMfd+G/GoppPIeP6JDaMMkMrEJnMZhKyyS6iKwVt5YKu02vCUyJM3Ug==, - } - - "@mapbox/unitbezier@0.0.1": - resolution: - { - integrity: sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw==, - } - - "@mapbox/vector-tile@1.3.1": - resolution: - { - integrity: sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==, - } - - "@mapbox/vector-tile@2.0.4": - resolution: - { - integrity: sha512-AkOLcbgGTdXScosBWwmmD7cDlvOjkg/DetGva26pIRiZPdeJYjYKarIlb4uxVzi6bwHO6EWH82eZ5Nuv4T5DUg==, - } - - "@mapbox/whoots-js@3.1.0": - resolution: - { - integrity: sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==, - } - engines: { node: ">=6.0.0" } - - "@maplibre/geojson-vt@5.0.4": - resolution: - { - integrity: sha512-KGg9sma45S+stfH9vPCJk1J0lSDLWZgCT9Y8u8qWZJyjFlP8MNP1WGTxIMYJZjDvVT3PDn05kN1C95Sut1HpgQ==, - } - - "@maplibre/maplibre-gl-style-spec@19.3.3": - resolution: - { - integrity: sha512-cOZZOVhDSulgK0meTsTkmNXb1ahVvmTmWmfx9gRBwc6hq98wS9JP35ESIoNq3xqEan+UN+gn8187Z6E4NKhLsw==, - } + '@mapbox/jsonlint-lines-primitives@2.0.2': + resolution: {integrity: sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==} + engines: {node: '>= 0.6'} + + '@mapbox/martini@0.2.0': + resolution: {integrity: sha512-7hFhtkb0KTLEls+TRw/rWayq5EeHtTaErgm/NskVoXmtgAQu/9D299aeyj6mzAR/6XUnYRp2lU+4IcrYRFjVsQ==} + + '@mapbox/point-geometry@0.1.0': + resolution: {integrity: sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==} + + '@mapbox/point-geometry@1.1.0': + resolution: {integrity: sha512-YGcBz1cg4ATXDCM/71L9xveh4dynfGmcLDqufR+nQQy3fKwsAZsWd/x4621/6uJaeB9mwOHE6hPeDgXz9uViUQ==} + + '@mapbox/tiny-sdf@2.0.7': + resolution: {integrity: sha512-25gQLQMcpivjOSA40g3gO6qgiFPDpWRoMfd+G/GoppPIeP6JDaMMkMrEJnMZhKyyS6iKwVt5YKu02vCUyJM3Ug==} + + '@mapbox/unitbezier@0.0.1': + resolution: {integrity: sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw==} + + '@mapbox/vector-tile@1.3.1': + resolution: {integrity: sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==} + + '@mapbox/vector-tile@2.0.4': + resolution: {integrity: sha512-AkOLcbgGTdXScosBWwmmD7cDlvOjkg/DetGva26pIRiZPdeJYjYKarIlb4uxVzi6bwHO6EWH82eZ5Nuv4T5DUg==} + + '@mapbox/whoots-js@3.1.0': + resolution: {integrity: sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==} + engines: {node: '>=6.0.0'} + + '@maplibre/geojson-vt@5.0.4': + resolution: {integrity: sha512-KGg9sma45S+stfH9vPCJk1J0lSDLWZgCT9Y8u8qWZJyjFlP8MNP1WGTxIMYJZjDvVT3PDn05kN1C95Sut1HpgQ==} + + '@maplibre/maplibre-gl-style-spec@19.3.3': + resolution: {integrity: sha512-cOZZOVhDSulgK0meTsTkmNXb1ahVvmTmWmfx9gRBwc6hq98wS9JP35ESIoNq3xqEan+UN+gn8187Z6E4NKhLsw==} hasBin: true - "@maplibre/maplibre-gl-style-spec@24.4.1": - resolution: - { - integrity: sha512-UKhA4qv1h30XT768ccSv5NjNCX+dgfoq2qlLVmKejspPcSQTYD4SrVucgqegmYcKcmwf06wcNAa/kRd0NHWbUg==, - } + '@maplibre/maplibre-gl-style-spec@24.4.1': + resolution: {integrity: sha512-UKhA4qv1h30XT768ccSv5NjNCX+dgfoq2qlLVmKejspPcSQTYD4SrVucgqegmYcKcmwf06wcNAa/kRd0NHWbUg==} hasBin: true - "@maplibre/mlt@1.1.2": - resolution: - { - integrity: sha512-SQKdJ909VGROkA6ovJgtHNs9YXV4YXUPS+VaZ50I2Mt951SLlUm2Cv34x5Xwc1HiFlsd3h2Yrs5cn7xzqBmENw==, - } - - "@maplibre/vt-pbf@4.2.1": - resolution: - { - integrity: sha512-IxZBGq/+9cqf2qdWlFuQ+ZfoMhWpxDUGQZ/poPHOJBvwMUT1GuxLo6HgYTou+xxtsOsjfbcjI8PZaPCtmt97rA==, - } - - "@math.gl/core@4.1.0": - resolution: - { - integrity: sha512-FrdHBCVG3QdrworwrUSzXIaK+/9OCRLscxI2OUy6sLOHyHgBMyfnEGs99/m3KNvs+95BsnQLWklVfpKfQzfwKA==, - } - - "@math.gl/culling@4.1.0": - resolution: - { - integrity: sha512-jFmjFEACnP9kVl8qhZxFNhCyd47qPfSVmSvvjR0/dIL6R9oD5zhR1ub2gN16eKDO/UM7JF9OHKU3EBIfeR7gtg==, - } - - "@math.gl/geospatial@4.1.0": - resolution: - { - integrity: sha512-BzsUhpVvnmleyYF6qdqJIip6FtIzJmnWuPTGhlBuPzh7VBHLonCFSPtQpbkRuoyAlbSyaGXcVt6p6lm9eK2vtg==, - } - - "@math.gl/polygon@4.1.0": - resolution: - { - integrity: sha512-YA/9PzaCRHbIP5/0E9uTYrqe+jsYTQoqoDWhf6/b0Ixz8bPZBaGDEafLg3z7ffBomZLacUty9U3TlPjqMtzPjA==, - } - - "@math.gl/sun@4.1.0": - resolution: - { - integrity: sha512-i3q6OCBLSZ5wgZVhXg+X7gsjY/TUtuFW/2KBiq/U1ypLso3S4sEykoU/MGjxUv1xiiGtr+v8TeMbO1OBIh/HmA==, - } - - "@math.gl/types@4.1.0": - resolution: - { - integrity: sha512-clYZdHcmRvMzVK5fjeDkQlHUzXQSNdZ7s4xOqC3nJPgz4C/TZkUecTo9YS4PruZqtDda/ag4erndP0MIn40dGA==, - } - - "@math.gl/web-mercator@4.1.0": - resolution: - { - integrity: sha512-HZo3vO5GCMkXJThxRJ5/QYUYRr3XumfT8CzNNCwoJfinxy5NtKUd7dusNTXn7yJ40UoB8FMIwkVwNlqaiRZZAw==, - } - - "@nodelib/fs.scandir@2.1.5": - resolution: - { - integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, - } - engines: { node: ">= 8" } - - "@nodelib/fs.stat@2.0.5": - resolution: - { - integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, - } - engines: { node: ">= 8" } - - "@nodelib/fs.walk@1.2.8": - resolution: - { - integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, - } - engines: { node: ">= 8" } - - "@petamoriken/float16@3.9.3": - resolution: - { - integrity: sha512-8awtpHXCx/bNpFt4mt2xdkgtgVvKqty8VbjHI/WWWQuEw+KLzFot3f4+LkQY9YmOtq7A5GdOnqoIC8Pdygjk2g==, - } - - "@probe.gl/env@4.1.0": - resolution: - { - integrity: sha512-5ac2Jm2K72VCs4eSMsM7ykVRrV47w32xOGMvcgqn8vQdEMF9PRXyBGYEV9YbqRKWNKpNKmQJVi4AHM/fkCxs9w==, - } - - "@probe.gl/log@4.1.0": - resolution: - { - integrity: sha512-r4gRReNY6f+OZEMgfWEXrAE2qJEt8rX0HsDJQXUBMoc+5H47bdB7f/5HBHAmapK8UydwPKL9wCDoS22rJ0yq7Q==, - } - - "@probe.gl/stats@4.1.0": - resolution: - { - integrity: sha512-EI413MkWKBDVNIfLdqbeNSJTs7ToBz/KVGkwi3D+dQrSIkRI2IYbWGAU3xX+D6+CI4ls8ehxMhNpUVMaZggDvQ==, - } - - "@publint/pack@0.1.3": - resolution: - { - integrity: sha512-dHDWeutAerz+Z2wFYAce7Y51vd4rbLBfUh0BNnyul4xKoVsPUVJBrOAFsJvtvYBwGFJSqKsxyyHf/7evZ8+Q5Q==, - } - engines: { node: ">=18" } - - "@rolldown/pluginutils@1.0.0-beta.53": - resolution: - { - integrity: sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==, - } - - "@rollup/rollup-android-arm-eabi@4.54.0": - resolution: - { - integrity: sha512-OywsdRHrFvCdvsewAInDKCNyR3laPA2mc9bRYJ6LBp5IyvF3fvXbbNR0bSzHlZVFtn6E0xw2oZlyjg4rKCVcng==, - } + '@maplibre/mlt@1.1.2': + resolution: {integrity: sha512-SQKdJ909VGROkA6ovJgtHNs9YXV4YXUPS+VaZ50I2Mt951SLlUm2Cv34x5Xwc1HiFlsd3h2Yrs5cn7xzqBmENw==} + + '@maplibre/vt-pbf@4.2.1': + resolution: {integrity: sha512-IxZBGq/+9cqf2qdWlFuQ+ZfoMhWpxDUGQZ/poPHOJBvwMUT1GuxLo6HgYTou+xxtsOsjfbcjI8PZaPCtmt97rA==} + + '@math.gl/core@4.1.0': + resolution: {integrity: sha512-FrdHBCVG3QdrworwrUSzXIaK+/9OCRLscxI2OUy6sLOHyHgBMyfnEGs99/m3KNvs+95BsnQLWklVfpKfQzfwKA==} + + '@math.gl/culling@4.1.0': + resolution: {integrity: sha512-jFmjFEACnP9kVl8qhZxFNhCyd47qPfSVmSvvjR0/dIL6R9oD5zhR1ub2gN16eKDO/UM7JF9OHKU3EBIfeR7gtg==} + + '@math.gl/geospatial@4.1.0': + resolution: {integrity: sha512-BzsUhpVvnmleyYF6qdqJIip6FtIzJmnWuPTGhlBuPzh7VBHLonCFSPtQpbkRuoyAlbSyaGXcVt6p6lm9eK2vtg==} + + '@math.gl/polygon@4.1.0': + resolution: {integrity: sha512-YA/9PzaCRHbIP5/0E9uTYrqe+jsYTQoqoDWhf6/b0Ixz8bPZBaGDEafLg3z7ffBomZLacUty9U3TlPjqMtzPjA==} + + '@math.gl/sun@4.1.0': + resolution: {integrity: sha512-i3q6OCBLSZ5wgZVhXg+X7gsjY/TUtuFW/2KBiq/U1ypLso3S4sEykoU/MGjxUv1xiiGtr+v8TeMbO1OBIh/HmA==} + + '@math.gl/types@4.1.0': + resolution: {integrity: sha512-clYZdHcmRvMzVK5fjeDkQlHUzXQSNdZ7s4xOqC3nJPgz4C/TZkUecTo9YS4PruZqtDda/ag4erndP0MIn40dGA==} + + '@math.gl/web-mercator@4.1.0': + resolution: {integrity: sha512-HZo3vO5GCMkXJThxRJ5/QYUYRr3XumfT8CzNNCwoJfinxy5NtKUd7dusNTXn7yJ40UoB8FMIwkVwNlqaiRZZAw==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@petamoriken/float16@3.9.3': + resolution: {integrity: sha512-8awtpHXCx/bNpFt4mt2xdkgtgVvKqty8VbjHI/WWWQuEw+KLzFot3f4+LkQY9YmOtq7A5GdOnqoIC8Pdygjk2g==} + + '@probe.gl/env@4.1.0': + resolution: {integrity: sha512-5ac2Jm2K72VCs4eSMsM7ykVRrV47w32xOGMvcgqn8vQdEMF9PRXyBGYEV9YbqRKWNKpNKmQJVi4AHM/fkCxs9w==} + + '@probe.gl/log@4.1.0': + resolution: {integrity: sha512-r4gRReNY6f+OZEMgfWEXrAE2qJEt8rX0HsDJQXUBMoc+5H47bdB7f/5HBHAmapK8UydwPKL9wCDoS22rJ0yq7Q==} + + '@probe.gl/stats@4.1.0': + resolution: {integrity: sha512-EI413MkWKBDVNIfLdqbeNSJTs7ToBz/KVGkwi3D+dQrSIkRI2IYbWGAU3xX+D6+CI4ls8ehxMhNpUVMaZggDvQ==} + + '@publint/pack@0.1.3': + resolution: {integrity: sha512-dHDWeutAerz+Z2wFYAce7Y51vd4rbLBfUh0BNnyul4xKoVsPUVJBrOAFsJvtvYBwGFJSqKsxyyHf/7evZ8+Q5Q==} + engines: {node: '>=18'} + + '@rolldown/pluginutils@1.0.0-beta.53': + resolution: {integrity: sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==} + + '@rollup/rollup-android-arm-eabi@4.54.0': + resolution: {integrity: sha512-OywsdRHrFvCdvsewAInDKCNyR3laPA2mc9bRYJ6LBp5IyvF3fvXbbNR0bSzHlZVFtn6E0xw2oZlyjg4rKCVcng==} cpu: [arm] os: [android] - "@rollup/rollup-android-arm-eabi@4.57.1": - resolution: - { - integrity: sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==, - } + '@rollup/rollup-android-arm-eabi@4.57.1': + resolution: {integrity: sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==} cpu: [arm] os: [android] - "@rollup/rollup-android-arm64@4.54.0": - resolution: - { - integrity: sha512-Skx39Uv+u7H224Af+bDgNinitlmHyQX1K/atIA32JP3JQw6hVODX5tkbi2zof/E69M1qH2UoN3Xdxgs90mmNYw==, - } + '@rollup/rollup-android-arm64@4.54.0': + resolution: {integrity: sha512-Skx39Uv+u7H224Af+bDgNinitlmHyQX1K/atIA32JP3JQw6hVODX5tkbi2zof/E69M1qH2UoN3Xdxgs90mmNYw==} cpu: [arm64] os: [android] - "@rollup/rollup-android-arm64@4.57.1": - resolution: - { - integrity: sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==, - } + '@rollup/rollup-android-arm64@4.57.1': + resolution: {integrity: sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==} cpu: [arm64] os: [android] - "@rollup/rollup-darwin-arm64@4.54.0": - resolution: - { - integrity: sha512-k43D4qta/+6Fq+nCDhhv9yP2HdeKeP56QrUUTW7E6PhZP1US6NDqpJj4MY0jBHlJivVJD5P8NxrjuobZBJTCRw==, - } + '@rollup/rollup-darwin-arm64@4.54.0': + resolution: {integrity: sha512-k43D4qta/+6Fq+nCDhhv9yP2HdeKeP56QrUUTW7E6PhZP1US6NDqpJj4MY0jBHlJivVJD5P8NxrjuobZBJTCRw==} cpu: [arm64] os: [darwin] - "@rollup/rollup-darwin-arm64@4.57.1": - resolution: - { - integrity: sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==, - } + '@rollup/rollup-darwin-arm64@4.57.1': + resolution: {integrity: sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==} cpu: [arm64] os: [darwin] - "@rollup/rollup-darwin-x64@4.54.0": - resolution: - { - integrity: sha512-cOo7biqwkpawslEfox5Vs8/qj83M/aZCSSNIWpVzfU2CYHa2G3P1UN5WF01RdTHSgCkri7XOlTdtk17BezlV3A==, - } + '@rollup/rollup-darwin-x64@4.54.0': + resolution: {integrity: sha512-cOo7biqwkpawslEfox5Vs8/qj83M/aZCSSNIWpVzfU2CYHa2G3P1UN5WF01RdTHSgCkri7XOlTdtk17BezlV3A==} cpu: [x64] os: [darwin] - "@rollup/rollup-darwin-x64@4.57.1": - resolution: - { - integrity: sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==, - } + '@rollup/rollup-darwin-x64@4.57.1': + resolution: {integrity: sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==} cpu: [x64] os: [darwin] - "@rollup/rollup-freebsd-arm64@4.54.0": - resolution: - { - integrity: sha512-miSvuFkmvFbgJ1BevMa4CPCFt5MPGw094knM64W9I0giUIMMmRYcGW/JWZDriaw/k1kOBtsWh1z6nIFV1vPNtA==, - } + '@rollup/rollup-freebsd-arm64@4.54.0': + resolution: {integrity: sha512-miSvuFkmvFbgJ1BevMa4CPCFt5MPGw094knM64W9I0giUIMMmRYcGW/JWZDriaw/k1kOBtsWh1z6nIFV1vPNtA==} cpu: [arm64] os: [freebsd] - "@rollup/rollup-freebsd-arm64@4.57.1": - resolution: - { - integrity: sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==, - } + '@rollup/rollup-freebsd-arm64@4.57.1': + resolution: {integrity: sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==} cpu: [arm64] os: [freebsd] - "@rollup/rollup-freebsd-x64@4.54.0": - resolution: - { - integrity: sha512-KGXIs55+b/ZfZsq9aR026tmr/+7tq6VG6MsnrvF4H8VhwflTIuYh+LFUlIsRdQSgrgmtM3fVATzEAj4hBQlaqQ==, - } + '@rollup/rollup-freebsd-x64@4.54.0': + resolution: {integrity: sha512-KGXIs55+b/ZfZsq9aR026tmr/+7tq6VG6MsnrvF4H8VhwflTIuYh+LFUlIsRdQSgrgmtM3fVATzEAj4hBQlaqQ==} cpu: [x64] os: [freebsd] - "@rollup/rollup-freebsd-x64@4.57.1": - resolution: - { - integrity: sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==, - } + '@rollup/rollup-freebsd-x64@4.57.1': + resolution: {integrity: sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==} cpu: [x64] os: [freebsd] - "@rollup/rollup-linux-arm-gnueabihf@4.54.0": - resolution: - { - integrity: sha512-EHMUcDwhtdRGlXZsGSIuXSYwD5kOT9NVnx9sqzYiwAc91wfYOE1g1djOEDseZJKKqtHAHGwnGPQu3kytmfaXLQ==, - } + '@rollup/rollup-linux-arm-gnueabihf@4.54.0': + resolution: {integrity: sha512-EHMUcDwhtdRGlXZsGSIuXSYwD5kOT9NVnx9sqzYiwAc91wfYOE1g1djOEDseZJKKqtHAHGwnGPQu3kytmfaXLQ==} cpu: [arm] os: [linux] - "@rollup/rollup-linux-arm-gnueabihf@4.57.1": - resolution: - { - integrity: sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==, - } + '@rollup/rollup-linux-arm-gnueabihf@4.57.1': + resolution: {integrity: sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==} cpu: [arm] os: [linux] - "@rollup/rollup-linux-arm-musleabihf@4.54.0": - resolution: - { - integrity: sha512-+pBrqEjaakN2ySv5RVrj/qLytYhPKEUwk+e3SFU5jTLHIcAtqh2rLrd/OkbNuHJpsBgxsD8ccJt5ga/SeG0JmA==, - } + '@rollup/rollup-linux-arm-musleabihf@4.54.0': + resolution: {integrity: sha512-+pBrqEjaakN2ySv5RVrj/qLytYhPKEUwk+e3SFU5jTLHIcAtqh2rLrd/OkbNuHJpsBgxsD8ccJt5ga/SeG0JmA==} cpu: [arm] os: [linux] - "@rollup/rollup-linux-arm-musleabihf@4.57.1": - resolution: - { - integrity: sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==, - } + '@rollup/rollup-linux-arm-musleabihf@4.57.1': + resolution: {integrity: sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==} cpu: [arm] os: [linux] - "@rollup/rollup-linux-arm64-gnu@4.54.0": - resolution: - { - integrity: sha512-NSqc7rE9wuUaRBsBp5ckQ5CVz5aIRKCwsoa6WMF7G01sX3/qHUw/z4pv+D+ahL1EIKy6Enpcnz1RY8pf7bjwng==, - } + '@rollup/rollup-linux-arm64-gnu@4.54.0': + resolution: {integrity: sha512-NSqc7rE9wuUaRBsBp5ckQ5CVz5aIRKCwsoa6WMF7G01sX3/qHUw/z4pv+D+ahL1EIKy6Enpcnz1RY8pf7bjwng==} cpu: [arm64] os: [linux] - "@rollup/rollup-linux-arm64-gnu@4.57.1": - resolution: - { - integrity: sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==, - } + '@rollup/rollup-linux-arm64-gnu@4.57.1': + resolution: {integrity: sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==} cpu: [arm64] os: [linux] - "@rollup/rollup-linux-arm64-musl@4.54.0": - resolution: - { - integrity: sha512-gr5vDbg3Bakga5kbdpqx81m2n9IX8M6gIMlQQIXiLTNeQW6CucvuInJ91EuCJ/JYvc+rcLLsDFcfAD1K7fMofg==, - } + '@rollup/rollup-linux-arm64-musl@4.54.0': + resolution: {integrity: sha512-gr5vDbg3Bakga5kbdpqx81m2n9IX8M6gIMlQQIXiLTNeQW6CucvuInJ91EuCJ/JYvc+rcLLsDFcfAD1K7fMofg==} cpu: [arm64] os: [linux] - "@rollup/rollup-linux-arm64-musl@4.57.1": - resolution: - { - integrity: sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==, - } + '@rollup/rollup-linux-arm64-musl@4.57.1': + resolution: {integrity: sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==} cpu: [arm64] os: [linux] - "@rollup/rollup-linux-loong64-gnu@4.54.0": - resolution: - { - integrity: sha512-gsrtB1NA3ZYj2vq0Rzkylo9ylCtW/PhpLEivlgWe0bpgtX5+9j9EZa0wtZiCjgu6zmSeZWyI/e2YRX1URozpIw==, - } + '@rollup/rollup-linux-loong64-gnu@4.54.0': + resolution: {integrity: sha512-gsrtB1NA3ZYj2vq0Rzkylo9ylCtW/PhpLEivlgWe0bpgtX5+9j9EZa0wtZiCjgu6zmSeZWyI/e2YRX1URozpIw==} cpu: [loong64] os: [linux] - "@rollup/rollup-linux-loong64-gnu@4.57.1": - resolution: - { - integrity: sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==, - } + '@rollup/rollup-linux-loong64-gnu@4.57.1': + resolution: {integrity: sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==} cpu: [loong64] os: [linux] - "@rollup/rollup-linux-loong64-musl@4.57.1": - resolution: - { - integrity: sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==, - } + '@rollup/rollup-linux-loong64-musl@4.57.1': + resolution: {integrity: sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==} cpu: [loong64] os: [linux] - "@rollup/rollup-linux-ppc64-gnu@4.54.0": - resolution: - { - integrity: sha512-y3qNOfTBStmFNq+t4s7Tmc9hW2ENtPg8FeUD/VShI7rKxNW7O4fFeaYbMsd3tpFlIg1Q8IapFgy7Q9i2BqeBvA==, - } + '@rollup/rollup-linux-ppc64-gnu@4.54.0': + resolution: {integrity: sha512-y3qNOfTBStmFNq+t4s7Tmc9hW2ENtPg8FeUD/VShI7rKxNW7O4fFeaYbMsd3tpFlIg1Q8IapFgy7Q9i2BqeBvA==} cpu: [ppc64] os: [linux] - "@rollup/rollup-linux-ppc64-gnu@4.57.1": - resolution: - { - integrity: sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==, - } + '@rollup/rollup-linux-ppc64-gnu@4.57.1': + resolution: {integrity: sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==} cpu: [ppc64] os: [linux] - "@rollup/rollup-linux-ppc64-musl@4.57.1": - resolution: - { - integrity: sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==, - } + '@rollup/rollup-linux-ppc64-musl@4.57.1': + resolution: {integrity: sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==} cpu: [ppc64] os: [linux] - "@rollup/rollup-linux-riscv64-gnu@4.54.0": - resolution: - { - integrity: sha512-89sepv7h2lIVPsFma8iwmccN7Yjjtgz0Rj/Ou6fEqg3HDhpCa+Et+YSufy27i6b0Wav69Qv4WBNl3Rs6pwhebQ==, - } + '@rollup/rollup-linux-riscv64-gnu@4.54.0': + resolution: {integrity: sha512-89sepv7h2lIVPsFma8iwmccN7Yjjtgz0Rj/Ou6fEqg3HDhpCa+Et+YSufy27i6b0Wav69Qv4WBNl3Rs6pwhebQ==} cpu: [riscv64] os: [linux] - "@rollup/rollup-linux-riscv64-gnu@4.57.1": - resolution: - { - integrity: sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==, - } + '@rollup/rollup-linux-riscv64-gnu@4.57.1': + resolution: {integrity: sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==} cpu: [riscv64] os: [linux] - "@rollup/rollup-linux-riscv64-musl@4.54.0": - resolution: - { - integrity: sha512-ZcU77ieh0M2Q8Ur7D5X7KvK+UxbXeDHwiOt/CPSBTI1fBmeDMivW0dPkdqkT4rOgDjrDDBUed9x4EgraIKoR2A==, - } + '@rollup/rollup-linux-riscv64-musl@4.54.0': + resolution: {integrity: sha512-ZcU77ieh0M2Q8Ur7D5X7KvK+UxbXeDHwiOt/CPSBTI1fBmeDMivW0dPkdqkT4rOgDjrDDBUed9x4EgraIKoR2A==} cpu: [riscv64] os: [linux] - "@rollup/rollup-linux-riscv64-musl@4.57.1": - resolution: - { - integrity: sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==, - } + '@rollup/rollup-linux-riscv64-musl@4.57.1': + resolution: {integrity: sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==} cpu: [riscv64] os: [linux] - "@rollup/rollup-linux-s390x-gnu@4.54.0": - resolution: - { - integrity: sha512-2AdWy5RdDF5+4YfG/YesGDDtbyJlC9LHmL6rZw6FurBJ5n4vFGupsOBGfwMRjBYH7qRQowT8D/U4LoSvVwOhSQ==, - } + '@rollup/rollup-linux-s390x-gnu@4.54.0': + resolution: {integrity: sha512-2AdWy5RdDF5+4YfG/YesGDDtbyJlC9LHmL6rZw6FurBJ5n4vFGupsOBGfwMRjBYH7qRQowT8D/U4LoSvVwOhSQ==} cpu: [s390x] os: [linux] - "@rollup/rollup-linux-s390x-gnu@4.57.1": - resolution: - { - integrity: sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==, - } + '@rollup/rollup-linux-s390x-gnu@4.57.1': + resolution: {integrity: sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==} cpu: [s390x] os: [linux] - "@rollup/rollup-linux-x64-gnu@4.54.0": - resolution: - { - integrity: sha512-WGt5J8Ij/rvyqpFexxk3ffKqqbLf9AqrTBbWDk7ApGUzaIs6V+s2s84kAxklFwmMF/vBNGrVdYgbblCOFFezMQ==, - } + '@rollup/rollup-linux-x64-gnu@4.54.0': + resolution: {integrity: sha512-WGt5J8Ij/rvyqpFexxk3ffKqqbLf9AqrTBbWDk7ApGUzaIs6V+s2s84kAxklFwmMF/vBNGrVdYgbblCOFFezMQ==} cpu: [x64] os: [linux] - "@rollup/rollup-linux-x64-gnu@4.57.1": - resolution: - { - integrity: sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==, - } + '@rollup/rollup-linux-x64-gnu@4.57.1': + resolution: {integrity: sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==} cpu: [x64] os: [linux] - "@rollup/rollup-linux-x64-musl@4.54.0": - resolution: - { - integrity: sha512-JzQmb38ATzHjxlPHuTH6tE7ojnMKM2kYNzt44LO/jJi8BpceEC8QuXYA908n8r3CNuG/B3BV8VR3Hi1rYtmPiw==, - } + '@rollup/rollup-linux-x64-musl@4.54.0': + resolution: {integrity: sha512-JzQmb38ATzHjxlPHuTH6tE7ojnMKM2kYNzt44LO/jJi8BpceEC8QuXYA908n8r3CNuG/B3BV8VR3Hi1rYtmPiw==} cpu: [x64] os: [linux] - "@rollup/rollup-linux-x64-musl@4.57.1": - resolution: - { - integrity: sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==, - } + '@rollup/rollup-linux-x64-musl@4.57.1': + resolution: {integrity: sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==} cpu: [x64] os: [linux] - "@rollup/rollup-openbsd-x64@4.57.1": - resolution: - { - integrity: sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==, - } + '@rollup/rollup-openbsd-x64@4.57.1': + resolution: {integrity: sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==} cpu: [x64] os: [openbsd] - "@rollup/rollup-openharmony-arm64@4.54.0": - resolution: - { - integrity: sha512-huT3fd0iC7jigGh7n3q/+lfPcXxBi+om/Rs3yiFxjvSxbSB6aohDFXbWvlspaqjeOh+hx7DDHS+5Es5qRkWkZg==, - } + '@rollup/rollup-openharmony-arm64@4.54.0': + resolution: {integrity: sha512-huT3fd0iC7jigGh7n3q/+lfPcXxBi+om/Rs3yiFxjvSxbSB6aohDFXbWvlspaqjeOh+hx7DDHS+5Es5qRkWkZg==} cpu: [arm64] os: [openharmony] - "@rollup/rollup-openharmony-arm64@4.57.1": - resolution: - { - integrity: sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==, - } + '@rollup/rollup-openharmony-arm64@4.57.1': + resolution: {integrity: sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==} cpu: [arm64] os: [openharmony] - "@rollup/rollup-win32-arm64-msvc@4.54.0": - resolution: - { - integrity: sha512-c2V0W1bsKIKfbLMBu/WGBz6Yci8nJ/ZJdheE0EwB73N3MvHYKiKGs3mVilX4Gs70eGeDaMqEob25Tw2Gb9Nqyw==, - } + '@rollup/rollup-win32-arm64-msvc@4.54.0': + resolution: {integrity: sha512-c2V0W1bsKIKfbLMBu/WGBz6Yci8nJ/ZJdheE0EwB73N3MvHYKiKGs3mVilX4Gs70eGeDaMqEob25Tw2Gb9Nqyw==} cpu: [arm64] os: [win32] - "@rollup/rollup-win32-arm64-msvc@4.57.1": - resolution: - { - integrity: sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==, - } + '@rollup/rollup-win32-arm64-msvc@4.57.1': + resolution: {integrity: sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==} cpu: [arm64] os: [win32] - "@rollup/rollup-win32-ia32-msvc@4.54.0": - resolution: - { - integrity: sha512-woEHgqQqDCkAzrDhvDipnSirm5vxUXtSKDYTVpZG3nUdW/VVB5VdCYA2iReSj/u3yCZzXID4kuKG7OynPnB3WQ==, - } + '@rollup/rollup-win32-ia32-msvc@4.54.0': + resolution: {integrity: sha512-woEHgqQqDCkAzrDhvDipnSirm5vxUXtSKDYTVpZG3nUdW/VVB5VdCYA2iReSj/u3yCZzXID4kuKG7OynPnB3WQ==} cpu: [ia32] os: [win32] - "@rollup/rollup-win32-ia32-msvc@4.57.1": - resolution: - { - integrity: sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==, - } + '@rollup/rollup-win32-ia32-msvc@4.57.1': + resolution: {integrity: sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==} cpu: [ia32] os: [win32] - "@rollup/rollup-win32-x64-gnu@4.54.0": - resolution: - { - integrity: sha512-dzAc53LOuFvHwbCEOS0rPbXp6SIhAf2txMP5p6mGyOXXw5mWY8NGGbPMPrs4P1WItkfApDathBj/NzMLUZ9rtQ==, - } + '@rollup/rollup-win32-x64-gnu@4.54.0': + resolution: {integrity: sha512-dzAc53LOuFvHwbCEOS0rPbXp6SIhAf2txMP5p6mGyOXXw5mWY8NGGbPMPrs4P1WItkfApDathBj/NzMLUZ9rtQ==} cpu: [x64] os: [win32] - "@rollup/rollup-win32-x64-gnu@4.57.1": - resolution: - { - integrity: sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==, - } + '@rollup/rollup-win32-x64-gnu@4.57.1': + resolution: {integrity: sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==} cpu: [x64] os: [win32] - "@rollup/rollup-win32-x64-msvc@4.54.0": - resolution: - { - integrity: sha512-hYT5d3YNdSh3mbCU1gwQyPgQd3T2ne0A3KG8KSBdav5TiBg6eInVmV+TeR5uHufiIgSFg0XsOWGW5/RhNcSvPg==, - } + '@rollup/rollup-win32-x64-msvc@4.54.0': + resolution: {integrity: sha512-hYT5d3YNdSh3mbCU1gwQyPgQd3T2ne0A3KG8KSBdav5TiBg6eInVmV+TeR5uHufiIgSFg0XsOWGW5/RhNcSvPg==} cpu: [x64] os: [win32] - "@rollup/rollup-win32-x64-msvc@4.57.1": - resolution: - { - integrity: sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==, - } + '@rollup/rollup-win32-x64-msvc@4.57.1': + resolution: {integrity: sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==} cpu: [x64] os: [win32] - "@standard-schema/spec@1.1.0": - resolution: - { - integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==, - } - - "@turf/boolean-clockwise@5.1.5": - resolution: - { - integrity: sha512-FqbmEEOJ4rU4/2t7FKx0HUWmjFEVqR+NJrFP7ymGSjja2SQ7Q91nnBihGuT+yuHHl6ElMjQ3ttsB/eTmyCycxA==, - } - - "@turf/clone@5.1.5": - resolution: - { - integrity: sha512-//pITsQ8xUdcQ9pVb4JqXiSqG4dos5Q9N4sYFoWghX21tfOV2dhc5TGqYOhnHrQS7RiKQL1vQ48kIK34gQ5oRg==, - } - - "@turf/helpers@5.1.5": - resolution: - { - integrity: sha512-/lF+JR+qNDHZ8bF9d+Cp58nxtZWJ3sqFe6n3u3Vpj+/0cqkjk4nXKYBSY0azm+GIYB5mWKxUXvuP/m0ZnKj1bw==, - } - - "@turf/invariant@5.2.0": - resolution: - { - integrity: sha512-28RCBGvCYsajVkw2EydpzLdcYyhSA77LovuOvgCJplJWaNVyJYH6BOR3HR9w50MEkPqb/Vc/jdo6I6ermlRtQA==, - } - - "@turf/meta@5.2.0": - resolution: - { - integrity: sha512-ZjQ3Ii62X9FjnK4hhdsbT+64AYRpaI8XMBMcyftEOGSmPMUVnkbvuv3C9geuElAXfQU7Zk1oWGOcrGOD9zr78Q==, - } - - "@turf/rewind@5.1.5": - resolution: - { - integrity: sha512-Gdem7JXNu+G4hMllQHXRFRihJl3+pNl7qY+l4qhQFxq+hiU1cQoVFnyoleIqWKIrdK/i2YubaSwc3SCM7N5mMw==, - } - - "@types/babel__core@7.20.5": - resolution: - { - integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==, - } - - "@types/babel__generator@7.27.0": - resolution: - { - integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==, - } - - "@types/babel__template@7.4.4": - resolution: - { - integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==, - } - - "@types/babel__traverse@7.28.0": - resolution: - { - integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==, - } - - "@types/brotli@1.3.4": - resolution: - { - integrity: sha512-cKYjgaS2DMdCKF7R0F5cgx1nfBYObN2ihIuPGQ4/dlIY6RpV7OWNwe9L8V4tTVKL2eZqOkNM9FM/rgTvLf4oXw==, - } - - "@types/chai@5.2.3": - resolution: - { - integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==, - } - - "@types/crypto-js@4.2.2": - resolution: - { - integrity: sha512-sDOLlVbHhXpAUAL0YHDUUwDZf3iN4Bwi4W6a0W0b+QcAezUbRtH4FVb+9J4h+XFPW7l/gQ9F8qC7P+Ec4k8QVQ==, - } - - "@types/deep-eql@4.0.2": - resolution: - { - integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==, - } - - "@types/estree@1.0.8": - resolution: - { - integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==, - } - - "@types/geojson@7946.0.16": - resolution: - { - integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==, - } - - "@types/json-schema@7.0.15": - resolution: - { - integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==, - } - - "@types/lodash@4.17.23": - resolution: - { - integrity: sha512-RDvF6wTulMPjrNdCoYRC8gNR880JNGT8uB+REUpC2Ns4pRqQJhGz90wh7rgdXDPpCczF3VGktDuFGVnz8zP7HA==, - } - - "@types/node@20.19.30": - resolution: - { - integrity: sha512-WJtwWJu7UdlvzEAUm484QNg5eAoq5QR08KDNx7g45Usrs2NtOPiX8ugDqmKdXkyL03rBqU5dYNYVQetEpBHq2g==, - } - - "@types/node@25.1.0": - resolution: - { - integrity: sha512-t7frlewr6+cbx+9Ohpl0NOTKXZNV9xHRmNOvql47BFJKcEG1CxtxlPEEe+gR9uhVWM4DwhnvTF110mIL4yP9RA==, - } - - "@types/offscreencanvas@2019.7.3": - resolution: - { - integrity: sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==, - } - - "@types/pako@1.0.7": - resolution: - { - integrity: sha512-YBtzT2ztNF6R/9+UXj2wTGFnC9NklAnASt3sC0h2m1bbH7G6FyBIkt4AN8ThZpNfxUo1b2iMVO0UawiJymEt8A==, - } - - "@types/react-dom@19.2.3": - resolution: - { - integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==, - } + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + + '@turf/boolean-clockwise@5.1.5': + resolution: {integrity: sha512-FqbmEEOJ4rU4/2t7FKx0HUWmjFEVqR+NJrFP7ymGSjja2SQ7Q91nnBihGuT+yuHHl6ElMjQ3ttsB/eTmyCycxA==} + + '@turf/clone@5.1.5': + resolution: {integrity: sha512-//pITsQ8xUdcQ9pVb4JqXiSqG4dos5Q9N4sYFoWghX21tfOV2dhc5TGqYOhnHrQS7RiKQL1vQ48kIK34gQ5oRg==} + + '@turf/helpers@5.1.5': + resolution: {integrity: sha512-/lF+JR+qNDHZ8bF9d+Cp58nxtZWJ3sqFe6n3u3Vpj+/0cqkjk4nXKYBSY0azm+GIYB5mWKxUXvuP/m0ZnKj1bw==} + + '@turf/invariant@5.2.0': + resolution: {integrity: sha512-28RCBGvCYsajVkw2EydpzLdcYyhSA77LovuOvgCJplJWaNVyJYH6BOR3HR9w50MEkPqb/Vc/jdo6I6ermlRtQA==} + + '@turf/meta@5.2.0': + resolution: {integrity: sha512-ZjQ3Ii62X9FjnK4hhdsbT+64AYRpaI8XMBMcyftEOGSmPMUVnkbvuv3C9geuElAXfQU7Zk1oWGOcrGOD9zr78Q==} + + '@turf/rewind@5.1.5': + resolution: {integrity: sha512-Gdem7JXNu+G4hMllQHXRFRihJl3+pNl7qY+l4qhQFxq+hiU1cQoVFnyoleIqWKIrdK/i2YubaSwc3SCM7N5mMw==} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.28.0': + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + + '@types/brotli@1.3.4': + resolution: {integrity: sha512-cKYjgaS2DMdCKF7R0F5cgx1nfBYObN2ihIuPGQ4/dlIY6RpV7OWNwe9L8V4tTVKL2eZqOkNM9FM/rgTvLf4oXw==} + + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + + '@types/crypto-js@4.2.2': + resolution: {integrity: sha512-sDOLlVbHhXpAUAL0YHDUUwDZf3iN4Bwi4W6a0W0b+QcAezUbRtH4FVb+9J4h+XFPW7l/gQ9F8qC7P+Ec4k8QVQ==} + + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/geojson@7946.0.16': + resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/lodash@4.17.23': + resolution: {integrity: sha512-RDvF6wTulMPjrNdCoYRC8gNR880JNGT8uB+REUpC2Ns4pRqQJhGz90wh7rgdXDPpCczF3VGktDuFGVnz8zP7HA==} + + '@types/node@20.19.30': + resolution: {integrity: sha512-WJtwWJu7UdlvzEAUm484QNg5eAoq5QR08KDNx7g45Usrs2NtOPiX8ugDqmKdXkyL03rBqU5dYNYVQetEpBHq2g==} + + '@types/node@25.1.0': + resolution: {integrity: sha512-t7frlewr6+cbx+9Ohpl0NOTKXZNV9xHRmNOvql47BFJKcEG1CxtxlPEEe+gR9uhVWM4DwhnvTF110mIL4yP9RA==} + + '@types/offscreencanvas@2019.7.3': + resolution: {integrity: sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==} + + '@types/pako@1.0.7': + resolution: {integrity: sha512-YBtzT2ztNF6R/9+UXj2wTGFnC9NklAnASt3sC0h2m1bbH7G6FyBIkt4AN8ThZpNfxUo1b2iMVO0UawiJymEt8A==} + + '@types/react-dom@19.2.3': + resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} peerDependencies: - "@types/react": ^19.2.0 - - "@types/react@19.2.10": - resolution: - { - integrity: sha512-WPigyYuGhgZ/cTPRXB2EwUw+XvsRA3GqHlsP4qteqrnnjDrApbS7MxcGr/hke5iUoeB7E/gQtrs9I37zAJ0Vjw==, - } - - "@types/supercluster@7.1.3": - resolution: - { - integrity: sha512-Z0pOY34GDFl3Q6hUFYf3HkTwKEE02e7QgtJppBt+beEAxnyOpJua+voGFvxINBHa06GwLFFym7gRPY2SiKIfIA==, - } - - "@types/whatwg-mimetype@3.0.2": - resolution: - { - integrity: sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==, - } - - "@vis.gl/react-mapbox@8.1.0": - resolution: - { - integrity: sha512-FwvH822oxEjWYOr+pP2L8hpv+7cZB2UsQbHHHT0ryrkvvqzmTgt7qHDhamv0EobKw86e1I+B4ojENdJ5G5BkyQ==, - } + '@types/react': ^19.2.0 + + '@types/react@19.2.10': + resolution: {integrity: sha512-WPigyYuGhgZ/cTPRXB2EwUw+XvsRA3GqHlsP4qteqrnnjDrApbS7MxcGr/hke5iUoeB7E/gQtrs9I37zAJ0Vjw==} + + '@types/supercluster@7.1.3': + resolution: {integrity: sha512-Z0pOY34GDFl3Q6hUFYf3HkTwKEE02e7QgtJppBt+beEAxnyOpJua+voGFvxINBHa06GwLFFym7gRPY2SiKIfIA==} + + '@types/whatwg-mimetype@3.0.2': + resolution: {integrity: sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==} + + '@vis.gl/react-mapbox@8.1.0': + resolution: {integrity: sha512-FwvH822oxEjWYOr+pP2L8hpv+7cZB2UsQbHHHT0ryrkvvqzmTgt7qHDhamv0EobKw86e1I+B4ojENdJ5G5BkyQ==} peerDependencies: - mapbox-gl: ">=3.5.0" - react: ">=16.3.0" - react-dom: ">=16.3.0" + mapbox-gl: '>=3.5.0' + react: '>=16.3.0' + react-dom: '>=16.3.0' peerDependenciesMeta: mapbox-gl: optional: true - "@vis.gl/react-maplibre@8.1.0": - resolution: - { - integrity: sha512-PkAK/gp3mUfhCLhUuc+4gc3PN9zCtVGxTF2hB6R5R5yYUw+hdg84OZ770U5MU4tPMTCG6fbduExuIW6RRKN6qQ==, - } + '@vis.gl/react-maplibre@8.1.0': + resolution: {integrity: sha512-PkAK/gp3mUfhCLhUuc+4gc3PN9zCtVGxTF2hB6R5R5yYUw+hdg84OZ770U5MU4tPMTCG6fbduExuIW6RRKN6qQ==} peerDependencies: - maplibre-gl: ">=4.0.0" - react: ">=16.3.0" - react-dom: ">=16.3.0" + maplibre-gl: '>=4.0.0' + react: '>=16.3.0' + react-dom: '>=16.3.0' peerDependenciesMeta: maplibre-gl: optional: true - "@vitejs/plugin-react@5.1.2": - resolution: - { - integrity: sha512-EcA07pHJouywpzsoTUqNh5NwGayl2PPVEJKUSinGGSxFGYn+shYbqMGBg6FXDqgXum9Ou/ecb+411ssw8HImJQ==, - } - engines: { node: ^20.19.0 || >=22.12.0 } + '@vitejs/plugin-react@5.1.2': + resolution: {integrity: sha512-EcA07pHJouywpzsoTUqNh5NwGayl2PPVEJKUSinGGSxFGYn+shYbqMGBg6FXDqgXum9Ou/ecb+411ssw8HImJQ==} + engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 - "@vitest/expect@4.0.18": - resolution: - { - integrity: sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==, - } - - "@vitest/mocker@4.0.18": - resolution: - { - integrity: sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==, - } + '@vitest/expect@4.0.18': + resolution: {integrity: sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==} + + '@vitest/mocker@4.0.18': + resolution: {integrity: sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==} peerDependencies: msw: ^2.4.9 vite: ^6.0.0 || ^7.0.0-0 @@ -2101,451 +1455,250 @@ packages: vite: optional: true - "@vitest/pretty-format@4.0.18": - resolution: - { - integrity: sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==, - } - - "@vitest/runner@4.0.18": - resolution: - { - integrity: sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==, - } - - "@vitest/snapshot@4.0.18": - resolution: - { - integrity: sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==, - } - - "@vitest/spy@4.0.18": - resolution: - { - integrity: sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==, - } - - "@vitest/utils@4.0.18": - resolution: - { - integrity: sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==, - } - - "@zarrita/storage@0.1.4": - resolution: - { - integrity: sha512-qURfJAQcQGRfDQ4J9HaCjGaj3jlJKc66bnRk6G/IeLUsM7WKyG7Bzsuf1EZurSXyc0I4LVcu6HaeQQ4d3kZ16g==, - } + '@vitest/pretty-format@4.0.18': + resolution: {integrity: sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==} + + '@vitest/runner@4.0.18': + resolution: {integrity: sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==} + + '@vitest/snapshot@4.0.18': + resolution: {integrity: sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==} + + '@vitest/spy@4.0.18': + resolution: {integrity: sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==} + + '@vitest/utils@4.0.18': + resolution: {integrity: sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==} + + '@zarrita/storage@0.1.4': + resolution: {integrity: sha512-qURfJAQcQGRfDQ4J9HaCjGaj3jlJKc66bnRk6G/IeLUsM7WKyG7Bzsuf1EZurSXyc0I4LVcu6HaeQQ4d3kZ16g==} a5-js@0.5.0: - resolution: - { - integrity: sha512-VAw19sWdYadhdovb0ViOIi1SdKx6H6LwcGMRFKwMfgL5gcmL/1fKJHfgsNgNaJ7xC/eEyjs6VK+VVd4N0a+peg==, - } + resolution: {integrity: sha512-VAw19sWdYadhdovb0ViOIi1SdKx6H6LwcGMRFKwMfgL5gcmL/1fKJHfgsNgNaJ7xC/eEyjs6VK+VVd4N0a+peg==} acorn@8.15.0: - resolution: - { - integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==, - } - engines: { node: ">=0.4.0" } + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} hasBin: true agent-base@7.1.4: - resolution: - { - integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==, - } - engines: { node: ">= 14" } + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} any-promise@1.3.0: - resolution: - { - integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==, - } + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} argparse@1.0.10: - resolution: - { - integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==, - } + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} argparse@2.0.1: - resolution: - { - integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, - } + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} arr-union@3.1.0: - resolution: - { - integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} + engines: {node: '>=0.10.0'} array-union@2.1.0: - resolution: - { - integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} assertion-error@2.0.1: - resolution: - { - integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} assign-symbols@1.0.0: - resolution: - { - integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} + engines: {node: '>=0.10.0'} async@3.2.6: - resolution: - { - integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==, - } + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} base64-js@1.5.1: - resolution: - { - integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, - } + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} baseline-browser-mapping@2.9.11: - resolution: - { - integrity: sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==, - } + resolution: {integrity: sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==} hasBin: true bidi-js@1.0.3: - resolution: - { - integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==, - } + resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} braces@3.0.3: - resolution: - { - integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} brotli@1.3.3: - resolution: - { - integrity: sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==, - } + resolution: {integrity: sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==} browserslist@4.28.1: - resolution: - { - integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==, - } - engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } + resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true buf-compare@1.0.1: - resolution: - { - integrity: sha512-Bvx4xH00qweepGc43xFvMs5BKASXTbHaHm6+kDYIK9p/4iFwjATQkmPKHQSgJZzKbAymhztRbXUf1Nqhzl73/Q==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-Bvx4xH00qweepGc43xFvMs5BKASXTbHaHm6+kDYIK9p/4iFwjATQkmPKHQSgJZzKbAymhztRbXUf1Nqhzl73/Q==} + engines: {node: '>=0.10.0'} bundle-require@5.1.0: - resolution: - { - integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} peerDependencies: - esbuild: ">=0.18" + esbuild: '>=0.18' bytewise-core@1.2.3: - resolution: - { - integrity: sha512-nZD//kc78OOxeYtRlVk8/zXqTB4gf/nlguL1ggWA8FuchMyOxcyHR4QPQZMUmA7czC+YnaBrPUCubqAWe50DaA==, - } + resolution: {integrity: sha512-nZD//kc78OOxeYtRlVk8/zXqTB4gf/nlguL1ggWA8FuchMyOxcyHR4QPQZMUmA7czC+YnaBrPUCubqAWe50DaA==} bytewise@1.1.0: - resolution: - { - integrity: sha512-rHuuseJ9iQ0na6UDhnrRVDh8YnWVlU6xM3VH6q/+yHDeUH2zIhUzP+2/h3LIrhLDBtTqzWpE3p3tP/boefskKQ==, - } + resolution: {integrity: sha512-rHuuseJ9iQ0na6UDhnrRVDh8YnWVlU6xM3VH6q/+yHDeUH2zIhUzP+2/h3LIrhLDBtTqzWpE3p3tP/boefskKQ==} cac@6.7.14: - resolution: - { - integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} caniuse-lite@1.0.30001762: - resolution: - { - integrity: sha512-PxZwGNvH7Ak8WX5iXzoK1KPZttBXNPuaOvI2ZYU7NrlM+d9Ov+TUvlLOBNGzVXAntMSMMlJPd+jY6ovrVjSmUw==, - } + resolution: {integrity: sha512-PxZwGNvH7Ak8WX5iXzoK1KPZttBXNPuaOvI2ZYU7NrlM+d9Ov+TUvlLOBNGzVXAntMSMMlJPd+jY6ovrVjSmUw==} chai@6.2.2: - resolution: - { - integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} + engines: {node: '>=18'} charenc@0.0.2: - resolution: - { - integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==, - } + resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} chokidar@4.0.3: - resolution: - { - integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==, - } - engines: { node: ">= 14.16.0" } + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} commander@13.1.0: - resolution: - { - integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} + engines: {node: '>=18'} commander@4.1.1: - resolution: - { - integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==, - } - engines: { node: ">= 6" } + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} commondir@1.0.1: - resolution: - { - integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==, - } + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} confbox@0.1.8: - resolution: - { - integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==, - } + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} consola@3.4.2: - resolution: - { - integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==, - } - engines: { node: ^14.18.0 || >=16.10.0 } + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} + engines: {node: ^14.18.0 || >=16.10.0} convert-source-map@2.0.0: - resolution: - { - integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==, - } + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} core-assert@0.2.1: - resolution: - { - integrity: sha512-IG97qShIP+nrJCXMCgkNZgH7jZQ4n8RpPyPeXX++T6avR/KhLhgLiHKoEn5Rc1KjfycSfA9DMa6m+4C4eguHhw==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-IG97qShIP+nrJCXMCgkNZgH7jZQ4n8RpPyPeXX++T6avR/KhLhgLiHKoEn5Rc1KjfycSfA9DMa6m+4C4eguHhw==} + engines: {node: '>=0.10.0'} core-util-is@1.0.3: - resolution: - { - integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==, - } + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} crypt@0.0.2: - resolution: - { - integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==, - } + resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} css-tree@3.1.0: - resolution: - { - integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==, - } - engines: { node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0 } + resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} cssstyle@5.3.6: - resolution: - { - integrity: sha512-legscpSpgSAeGEe0TNcai97DKt9Vd9AsAdOL7Uoetb52Ar/8eJm3LIa39qpv8wWzLFlNG4vVvppQM+teaMPj3A==, - } - engines: { node: ">=20" } + resolution: {integrity: sha512-legscpSpgSAeGEe0TNcai97DKt9Vd9AsAdOL7Uoetb52Ar/8eJm3LIa39qpv8wWzLFlNG4vVvppQM+teaMPj3A==} + engines: {node: '>=20'} csstype@3.2.3: - resolution: - { - integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==, - } + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} data-urls@6.0.0: - resolution: - { - integrity: sha512-BnBS08aLUM+DKamupXs3w2tJJoqU+AkaE/+6vQxi/G/DPmIZFJJp9Dkb1kM03AZx8ADehDUZgsNxju3mPXZYIA==, - } - engines: { node: ">=20" } + resolution: {integrity: sha512-BnBS08aLUM+DKamupXs3w2tJJoqU+AkaE/+6vQxi/G/DPmIZFJJp9Dkb1kM03AZx8ADehDUZgsNxju3mPXZYIA==} + engines: {node: '>=20'} debug@4.4.3: - resolution: - { - integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==, - } - engines: { node: ">=6.0" } + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} peerDependencies: - supports-color: "*" + supports-color: '*' peerDependenciesMeta: supports-color: optional: true decimal.js@10.6.0: - resolution: - { - integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==, - } + resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} deep-strict-equal@0.2.0: - resolution: - { - integrity: sha512-3daSWyvZ/zwJvuMGlzG1O+Ow0YSadGfb3jsh9xoCutv2tWyB9dA4YvR9L9/fSdDZa2dByYQe+TqapSGUrjnkoA==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-3daSWyvZ/zwJvuMGlzG1O+Ow0YSadGfb3jsh9xoCutv2tWyB9dA4YvR9L9/fSdDZa2dByYQe+TqapSGUrjnkoA==} + engines: {node: '>=0.10.0'} dir-glob@3.0.1: - resolution: - { - integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} draco3d@1.5.7: - resolution: - { - integrity: sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ==, - } + resolution: {integrity: sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ==} earcut@2.2.4: - resolution: - { - integrity: sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==, - } + resolution: {integrity: sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==} earcut@3.0.2: - resolution: - { - integrity: sha512-X7hshQbLyMJ/3RPhyObLARM2sNxxmRALLKx1+NVFFnQ9gKzmCrxm9+uLIAdBcvc8FNLpctqlQ2V6AE92Ol9UDQ==, - } + resolution: {integrity: sha512-X7hshQbLyMJ/3RPhyObLARM2sNxxmRALLKx1+NVFFnQ9gKzmCrxm9+uLIAdBcvc8FNLpctqlQ2V6AE92Ol9UDQ==} electron-to-chromium@1.5.267: - resolution: - { - integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==, - } + resolution: {integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==} email-addresses@5.0.0: - resolution: - { - integrity: sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw==, - } + resolution: {integrity: sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw==} entities@6.0.1: - resolution: - { - integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==, - } - engines: { node: ">=0.12" } + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} es-module-lexer@1.7.0: - resolution: - { - integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==, - } + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} esbuild@0.27.2: - resolution: - { - integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==} + engines: {node: '>=18'} hasBin: true escalade@3.2.0: - resolution: - { - integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} escape-string-regexp@1.0.5: - resolution: - { - integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==, - } - engines: { node: ">=0.8.0" } + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} estree-walker@3.0.3: - resolution: - { - integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==, - } + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} expect-type@1.3.0: - resolution: - { - integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==, - } - engines: { node: ">=12.0.0" } + resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} + engines: {node: '>=12.0.0'} extend-shallow@2.0.1: - resolution: - { - integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} extend-shallow@3.0.2: - resolution: - { - integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} + engines: {node: '>=0.10.0'} fast-glob@3.3.3: - resolution: - { - integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==, - } - engines: { node: ">=8.6.0" } + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} fast-xml-parser@4.5.3: - resolution: - { - integrity: sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==, - } + resolution: {integrity: sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==} hasBin: true fastq@1.20.1: - resolution: - { - integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==, - } + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} fdir@6.5.0: - resolution: - { - integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==, - } - engines: { node: ">=12.0.0" } + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -2553,326 +1706,182 @@ packages: optional: true fflate@0.7.4: - resolution: - { - integrity: sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw==, - } + resolution: {integrity: sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw==} fflate@0.8.2: - resolution: - { - integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==, - } + resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} filename-reserved-regex@2.0.0: - resolution: - { - integrity: sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==} + engines: {node: '>=4'} filenamify@4.3.0: - resolution: - { - integrity: sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==} + engines: {node: '>=8'} fill-range@7.1.1: - resolution: - { - integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} find-cache-dir@3.3.2: - resolution: - { - integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} + engines: {node: '>=8'} find-up@4.1.0: - resolution: - { - integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} fix-dts-default-cjs-exports@1.0.1: - resolution: - { - integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==, - } + resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==} flatbush@4.5.0: - resolution: - { - integrity: sha512-K7JSilGr4lySRLdJqKY45fu0m/dIs6YAAu/ESqdMsnW3pI0m3gpa6oRc6NDXW161Ov9+rIQjsuyOt5ObdIfgwg==, - } + resolution: {integrity: sha512-K7JSilGr4lySRLdJqKY45fu0m/dIs6YAAu/ESqdMsnW3pI0m3gpa6oRc6NDXW161Ov9+rIQjsuyOt5ObdIfgwg==} flatqueue@3.0.0: - resolution: - { - integrity: sha512-y1deYaVt+lIc/d2uIcWDNd0CrdQTO5xoCjeFdhX0kSXvm2Acm0o+3bAOiYklTEoRyzwio3sv3/IiBZdusbAe2Q==, - } + resolution: {integrity: sha512-y1deYaVt+lIc/d2uIcWDNd0CrdQTO5xoCjeFdhX0kSXvm2Acm0o+3bAOiYklTEoRyzwio3sv3/IiBZdusbAe2Q==} fs-extra@11.3.3: - resolution: - { - integrity: sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==, - } - engines: { node: ">=14.14" } + resolution: {integrity: sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==} + engines: {node: '>=14.14'} fsevents@2.3.3: - resolution: - { - integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, - } - engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] gensync@1.0.0-beta.2: - resolution: - { - integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==, - } - engines: { node: ">=6.9.0" } + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} geotiff-geokeys-to-proj4@2024.4.13: - resolution: - { - integrity: sha512-Jgtm/lcPkgB44wCqQHaVQx5/fyhmiVDRUKQcI/vMolsED8/GRWBnn5qkQo/CgutQg9xkGzig21DY9Px9mFRdvg==, - } + resolution: {integrity: sha512-Jgtm/lcPkgB44wCqQHaVQx5/fyhmiVDRUKQcI/vMolsED8/GRWBnn5qkQo/CgutQg9xkGzig21DY9Px9mFRdvg==} geotiff@2.1.3: - resolution: - { - integrity: sha512-PT6uoF5a1+kbC3tHmZSUsLHBp2QJlHasxxxxPW47QIY1VBKpFB+FcDvX+MxER6UzgLQZ0xDzJ9s48B9JbOCTqA==, - } - engines: { node: ">=10.19" } + resolution: {integrity: sha512-PT6uoF5a1+kbC3tHmZSUsLHBp2QJlHasxxxxPW47QIY1VBKpFB+FcDvX+MxER6UzgLQZ0xDzJ9s48B9JbOCTqA==} + engines: {node: '>=10.19'} get-stream@6.0.1: - resolution: - { - integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} get-tsconfig@4.13.6: - resolution: - { - integrity: sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==, - } + resolution: {integrity: sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==} get-value@2.0.6: - resolution: - { - integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} + engines: {node: '>=0.10.0'} gh-pages@6.3.0: - resolution: - { - integrity: sha512-Ot5lU6jK0Eb+sszG8pciXdjMXdBJ5wODvgjR+imihTqsUWF2K6dJ9HST55lgqcs8wWcw6o6wAsUzfcYRhJPXbA==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-Ot5lU6jK0Eb+sszG8pciXdjMXdBJ5wODvgjR+imihTqsUWF2K6dJ9HST55lgqcs8wWcw6o6wAsUzfcYRhJPXbA==} + engines: {node: '>=10'} hasBin: true gl-matrix@3.4.4: - resolution: - { - integrity: sha512-latSnyDNt/8zYUB6VIJ6PCh2jBjJX6gnDsoCZ7LyW7GkqrD51EWwa9qCoGixj8YqBtETQK/xY7OmpTF8xz1DdQ==, - } + resolution: {integrity: sha512-latSnyDNt/8zYUB6VIJ6PCh2jBjJX6gnDsoCZ7LyW7GkqrD51EWwa9qCoGixj8YqBtETQK/xY7OmpTF8xz1DdQ==} glob-parent@5.1.2: - resolution: - { - integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, - } - engines: { node: ">= 6" } + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} globby@11.1.0: - resolution: - { - integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} graceful-fs@4.2.11: - resolution: - { - integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, - } + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} h3-js@4.4.0: - resolution: - { - integrity: sha512-DvJh07MhGgY2KcC4OeZc8SSyA+ZXpdvoh6uCzGpoKvWtZxJB+g6VXXC1+eWYkaMIsLz7J/ErhOalHCpcs1KYog==, - } - engines: { node: ">=4", npm: ">=3", yarn: ">=1.3.0" } + resolution: {integrity: sha512-DvJh07MhGgY2KcC4OeZc8SSyA+ZXpdvoh6uCzGpoKvWtZxJB+g6VXXC1+eWYkaMIsLz7J/ErhOalHCpcs1KYog==} + engines: {node: '>=4', npm: '>=3', yarn: '>=1.3.0'} happy-dom@20.0.11: - resolution: - { - integrity: sha512-QsCdAUHAmiDeKeaNojb1OHOPF7NjcWPBR7obdu3NwH2a/oyQaLg5d0aaCy/9My6CdPChYF07dvz5chaXBGaD4g==, - } - engines: { node: ">=20.0.0" } + resolution: {integrity: sha512-QsCdAUHAmiDeKeaNojb1OHOPF7NjcWPBR7obdu3NwH2a/oyQaLg5d0aaCy/9My6CdPChYF07dvz5chaXBGaD4g==} + engines: {node: '>=20.0.0'} html-encoding-sniffer@6.0.0: - resolution: - { - integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==, - } - engines: { node: ^20.19.0 || ^22.12.0 || >=24.0.0 } + resolution: {integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} http-proxy-agent@7.0.2: - resolution: - { - integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==, - } - engines: { node: ">= 14" } + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} https-proxy-agent@7.0.6: - resolution: - { - integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==, - } - engines: { node: ">= 14" } + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} ieee754@1.2.1: - resolution: - { - integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, - } + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} ignore@5.3.2: - resolution: - { - integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==, - } - engines: { node: ">= 4" } + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} image-size@0.7.5: - resolution: - { - integrity: sha512-Hiyv+mXHfFEP7LzUL/llg9RwFxxY+o9N3JVLIeG5E7iFIFAalxvRU9UZthBdYDEVnzHMgjnKJPPpay5BWf1g9g==, - } - engines: { node: ">=6.9.0" } + resolution: {integrity: sha512-Hiyv+mXHfFEP7LzUL/llg9RwFxxY+o9N3JVLIeG5E7iFIFAalxvRU9UZthBdYDEVnzHMgjnKJPPpay5BWf1g9g==} + engines: {node: '>=6.9.0'} hasBin: true immediate@3.0.6: - resolution: - { - integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==, - } + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} inherits@2.0.4: - resolution: - { - integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, - } + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} is-buffer@1.1.6: - resolution: - { - integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==, - } + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} is-error@2.2.2: - resolution: - { - integrity: sha512-IOQqts/aHWbiisY5DuPJQ0gcbvaLFCa7fBa9xoLfxBZvQ+ZI/Zh9xoI7Gk+G64N0FdK4AbibytHht2tWgpJWLg==, - } + resolution: {integrity: sha512-IOQqts/aHWbiisY5DuPJQ0gcbvaLFCa7fBa9xoLfxBZvQ+ZI/Zh9xoI7Gk+G64N0FdK4AbibytHht2tWgpJWLg==} is-extendable@0.1.1: - resolution: - { - integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} is-extendable@1.0.1: - resolution: - { - integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} + engines: {node: '>=0.10.0'} is-extglob@2.1.1: - resolution: - { - integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} is-glob@4.0.3: - resolution: - { - integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} is-number@7.0.0: - resolution: - { - integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, - } - engines: { node: ">=0.12.0" } + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} is-plain-object@2.0.4: - resolution: - { - integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} is-potential-custom-element-name@1.0.1: - resolution: - { - integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==, - } + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} isarray@1.0.0: - resolution: - { - integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==, - } + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} isobject@3.0.1: - resolution: - { - integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} joycon@3.1.1: - resolution: - { - integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==, - } - engines: { node: ">=10" } + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} js-tokens@4.0.0: - resolution: - { - integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, - } + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} js-yaml@4.1.1: - resolution: - { - integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==, - } + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true jsdom@27.4.0: - resolution: - { - integrity: sha512-mjzqwWRD9Y1J1KUi7W97Gja1bwOOM5Ug0EZ6UDK3xS7j7mndrkwozHtSblfomlzyB4NepioNt+B2sOSzczVgtQ==, - } - engines: { node: ^20.19.0 || ^22.12.0 || >=24.0.0 } + resolution: {integrity: sha512-mjzqwWRD9Y1J1KUi7W97Gja1bwOOM5Ug0EZ6UDK3xS7j7mndrkwozHtSblfomlzyB4NepioNt+B2sOSzczVgtQ==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: canvas: ^3.0.0 peerDependenciesMeta: @@ -2880,416 +1889,227 @@ packages: optional: true jsesc@3.1.0: - resolution: - { - integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} hasBin: true json-schema-to-typescript@15.0.4: - resolution: - { - integrity: sha512-Su9oK8DR4xCmDsLlyvadkXzX6+GGXJpbhwoLtOGArAG61dvbW4YQmSEno2y66ahpIdmLMg6YUf/QHLgiwvkrHQ==, - } - engines: { node: ">=16.0.0" } + resolution: {integrity: sha512-Su9oK8DR4xCmDsLlyvadkXzX6+GGXJpbhwoLtOGArAG61dvbW4YQmSEno2y66ahpIdmLMg6YUf/QHLgiwvkrHQ==} + engines: {node: '>=16.0.0'} hasBin: true json-stringify-pretty-compact@3.0.0: - resolution: - { - integrity: sha512-Rc2suX5meI0S3bfdZuA7JMFBGkJ875ApfVyq2WHELjBiiG22My/l7/8zPpH/CfFVQHuVLd8NLR0nv6vi0BYYKA==, - } + resolution: {integrity: sha512-Rc2suX5meI0S3bfdZuA7JMFBGkJ875ApfVyq2WHELjBiiG22My/l7/8zPpH/CfFVQHuVLd8NLR0nv6vi0BYYKA==} json-stringify-pretty-compact@4.0.0: - resolution: - { - integrity: sha512-3CNZ2DnrpByG9Nqj6Xo8vqbjT4F6N+tb4Gb28ESAZjYZ5yqvmc56J+/kuIwkaAMOyblTQhUW7PxMkUb8Q36N3Q==, - } + resolution: {integrity: sha512-3CNZ2DnrpByG9Nqj6Xo8vqbjT4F6N+tb4Gb28ESAZjYZ5yqvmc56J+/kuIwkaAMOyblTQhUW7PxMkUb8Q36N3Q==} json5@2.2.3: - resolution: - { - integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} hasBin: true jsonfile@6.2.0: - resolution: - { - integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==, - } + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} jszip@3.10.1: - resolution: - { - integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==, - } + resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} kdbush@4.0.2: - resolution: - { - integrity: sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA==, - } + resolution: {integrity: sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA==} ktx-parse@0.7.1: - resolution: - { - integrity: sha512-FeA3g56ksdFNwjXJJsc1CCc7co+AJYDp6ipIp878zZ2bU8kWROatLYf39TQEd4/XRSUvBXovQ8gaVKWPXsCLEQ==, - } + resolution: {integrity: sha512-FeA3g56ksdFNwjXJJsc1CCc7co+AJYDp6ipIp878zZ2bU8kWROatLYf39TQEd4/XRSUvBXovQ8gaVKWPXsCLEQ==} lerc@3.0.0: - resolution: - { - integrity: sha512-Rm4J/WaHhRa93nCN2mwWDZFoRVF18G1f47C+kvQWyHGEZxFpTUi73p7lMVSAndyxGt6lJ2/CFbOcf9ra5p8aww==, - } + resolution: {integrity: sha512-Rm4J/WaHhRa93nCN2mwWDZFoRVF18G1f47C+kvQWyHGEZxFpTUi73p7lMVSAndyxGt6lJ2/CFbOcf9ra5p8aww==} lerc@4.0.4: - resolution: - { - integrity: sha512-nHZH+ffiGPkgKUQtiZrljGUGV2GddvPcVTV5E345ZFncbKz+/rBIjDPrSxkiqW0EAtg1Jw7qAgRdaCwV+95Fow==, - } + resolution: {integrity: sha512-nHZH+ffiGPkgKUQtiZrljGUGV2GddvPcVTV5E345ZFncbKz+/rBIjDPrSxkiqW0EAtg1Jw7qAgRdaCwV+95Fow==} lie@3.3.0: - resolution: - { - integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==, - } + resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} lilconfig@3.1.3: - resolution: - { - integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==, - } - engines: { node: ">=14" } + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} lines-and-columns@1.2.4: - resolution: - { - integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==, - } + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} load-tsconfig@0.2.5: - resolution: - { - integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} locate-path@5.0.0: - resolution: - { - integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} lodash@4.17.23: - resolution: - { - integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==, - } + resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} long@3.2.0: - resolution: - { - integrity: sha512-ZYvPPOMqUwPoDsbJaR10iQJYnMuZhRTvHYl62ErLIEX7RgFlziSBUUvrt3OVfc47QlHHpzPZYP17g3Fv7oeJkg==, - } - engines: { node: ">=0.6" } + resolution: {integrity: sha512-ZYvPPOMqUwPoDsbJaR10iQJYnMuZhRTvHYl62ErLIEX7RgFlziSBUUvrt3OVfc47QlHHpzPZYP17g3Fv7oeJkg==} + engines: {node: '>=0.6'} long@5.3.2: - resolution: - { - integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==, - } + resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} lru-cache@11.2.4: - resolution: - { - integrity: sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==, - } - engines: { node: 20 || >=22 } + resolution: {integrity: sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==} + engines: {node: 20 || >=22} lru-cache@5.1.1: - resolution: - { - integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==, - } + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} lz4js@0.2.0: - resolution: - { - integrity: sha512-gY2Ia9Lm7Ep8qMiuGRhvUq0Q7qUereeldZPP1PMEJxPtEWHJLqw9pgX68oHajBH0nzJK4MaZEA/YNV3jT8u8Bg==, - } + resolution: {integrity: sha512-gY2Ia9Lm7Ep8qMiuGRhvUq0Q7qUereeldZPP1PMEJxPtEWHJLqw9pgX68oHajBH0nzJK4MaZEA/YNV3jT8u8Bg==} lzo-wasm@0.0.4: - resolution: - { - integrity: sha512-VKlnoJRFrB8SdJhlVKvW5vI1gGwcZ+mvChEXcSX6r2xDNc/Q2FD9esfBmGCuPZdrJ1feO+YcVFd2PTk0c137Gw==, - } + resolution: {integrity: sha512-VKlnoJRFrB8SdJhlVKvW5vI1gGwcZ+mvChEXcSX6r2xDNc/Q2FD9esfBmGCuPZdrJ1feO+YcVFd2PTk0c137Gw==} magic-string@0.30.21: - resolution: - { - integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==, - } + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} make-dir@3.1.0: - resolution: - { - integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} maplibre-gl@5.17.0: - resolution: - { - integrity: sha512-gwS6NpXBfWD406dtT5YfEpl2hmpMm+wcPqf04UAez/TxY1OBjiMdK2ZoMGcNIlGHelKc4+Uet6zhDdDEnlJVHA==, - } - engines: { node: ">=16.14.0", npm: ">=8.1.0" } + resolution: {integrity: sha512-gwS6NpXBfWD406dtT5YfEpl2hmpMm+wcPqf04UAez/TxY1OBjiMdK2ZoMGcNIlGHelKc4+Uet6zhDdDEnlJVHA==} + engines: {node: '>=16.14.0', npm: '>=8.1.0'} md5@2.3.0: - resolution: - { - integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==, - } + resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} mdn-data@2.12.2: - resolution: - { - integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==, - } + resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} merge2@1.4.1: - resolution: - { - integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, - } - engines: { node: ">= 8" } + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} mgrs@1.0.0: - resolution: - { - integrity: sha512-awNbTOqCxK1DBGjalK3xqWIstBZgN6fxsMSiXLs9/spqWkF2pAhb2rrYCFSsr1/tT7PhcDGjZndG8SWYn0byYA==, - } + resolution: {integrity: sha512-awNbTOqCxK1DBGjalK3xqWIstBZgN6fxsMSiXLs9/spqWkF2pAhb2rrYCFSsr1/tT7PhcDGjZndG8SWYn0byYA==} micromatch@4.0.8: - resolution: - { - integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==, - } - engines: { node: ">=8.6" } + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} minimist@1.2.8: - resolution: - { - integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, - } + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} mjolnir.js@3.0.0: - resolution: - { - integrity: sha512-siX3YCG7N2HnmN1xMH3cK4JkUZJhbkhRFJL+G5N1vH0mh1t5088rJknIoqDFWDIU6NPGvRRgLnYW3ZHjSMEBLA==, - } + resolution: {integrity: sha512-siX3YCG7N2HnmN1xMH3cK4JkUZJhbkhRFJL+G5N1vH0mh1t5088rJknIoqDFWDIU6NPGvRRgLnYW3ZHjSMEBLA==} mlly@1.8.0: - resolution: - { - integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==, - } + resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} mri@1.2.0: - resolution: - { - integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==, - } - engines: { node: ">=4" } + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} ms@2.1.3: - resolution: - { - integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, - } + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} murmurhash-js@1.0.0: - resolution: - { - integrity: sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==, - } + resolution: {integrity: sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==} mz@2.7.0: - resolution: - { - integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==, - } + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} nanoid@3.3.11: - resolution: - { - integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==, - } - engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true node-releases@2.0.27: - resolution: - { - integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==, - } + resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} numcodecs@0.3.2: - resolution: - { - integrity: sha512-6YSPnmZgg0P87jnNhi3s+FVLOcIn3y+1CTIgUulA3IdASzK9fJM87sUFkpyA+be9GibGRaST2wCgkD+6U+fWKw==, - } + resolution: {integrity: sha512-6YSPnmZgg0P87jnNhi3s+FVLOcIn3y+1CTIgUulA3IdASzK9fJM87sUFkpyA+be9GibGRaST2wCgkD+6U+fWKw==} object-assign@4.1.1: - resolution: - { - integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} obug@2.1.1: - resolution: - { - integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==, - } + resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} p-limit@2.3.0: - resolution: - { - integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} p-locate@4.1.0: - resolution: - { - integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} p-try@2.2.0: - resolution: - { - integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} package-manager-detector@1.6.0: - resolution: - { - integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==, - } + resolution: {integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==} pako@1.0.11: - resolution: - { - integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==, - } + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} pako@2.1.0: - resolution: - { - integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==, - } + resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} parse-headers@2.0.6: - resolution: - { - integrity: sha512-Tz11t3uKztEW5FEVZnj1ox8GKblWn+PvHY9TmJV5Mll2uHEwRdR/5Li1OlXoECjLYkApdhWy44ocONwXLiKO5A==, - } + resolution: {integrity: sha512-Tz11t3uKztEW5FEVZnj1ox8GKblWn+PvHY9TmJV5Mll2uHEwRdR/5Li1OlXoECjLYkApdhWy44ocONwXLiKO5A==} parse5@8.0.0: - resolution: - { - integrity: sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==, - } + resolution: {integrity: sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==} path-exists@4.0.0: - resolution: - { - integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} path-type@4.0.0: - resolution: - { - integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} pathe@2.0.3: - resolution: - { - integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==, - } + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} pbf@3.3.0: - resolution: - { - integrity: sha512-XDF38WCH3z5OV/OVa8GKUNtLAyneuzbCisx7QUCF8Q6Nutx0WnJrQe5O+kOtBlLfRNUws98Y58Lblp+NJG5T4Q==, - } + resolution: {integrity: sha512-XDF38WCH3z5OV/OVa8GKUNtLAyneuzbCisx7QUCF8Q6Nutx0WnJrQe5O+kOtBlLfRNUws98Y58Lblp+NJG5T4Q==} hasBin: true pbf@4.0.1: - resolution: - { - integrity: sha512-SuLdBvS42z33m8ejRbInMapQe8n0D3vN/Xd5fmWM3tufNgRQFBpaW2YVJxQZV4iPNqb0vEFvssMEo5w9c6BTIA==, - } + resolution: {integrity: sha512-SuLdBvS42z33m8ejRbInMapQe8n0D3vN/Xd5fmWM3tufNgRQFBpaW2YVJxQZV4iPNqb0vEFvssMEo5w9c6BTIA==} hasBin: true picocolors@1.1.1: - resolution: - { - integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==, - } + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} picomatch@2.3.1: - resolution: - { - integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, - } - engines: { node: ">=8.6" } + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} picomatch@4.0.3: - resolution: - { - integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} pirates@4.0.7: - resolution: - { - integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==, - } - engines: { node: ">= 6" } + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} + engines: {node: '>= 6'} pkg-dir@4.2.0: - resolution: - { - integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} pkg-types@1.3.1: - resolution: - { - integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==, - } + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} postcss-load-config@6.0.1: - resolution: - { - integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==, - } - engines: { node: ">= 18" } + resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} + engines: {node: '>= 18'} peerDependencies: - jiti: ">=1.21.0" - postcss: ">=8.0.9" + jiti: '>=1.21.0' + postcss: '>=8.0.9' tsx: ^4.8.1 yaml: ^2.4.2 peerDependenciesMeta: @@ -3303,96 +2123,57 @@ packages: optional: true postcss@8.5.6: - resolution: - { - integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==, - } - engines: { node: ^10 || ^12 || >=14 } + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} potpack@2.1.0: - resolution: - { - integrity: sha512-pcaShQc1Shq0y+E7GqJqvZj8DTthWV1KeHGdi0Z6IAin2Oi3JnLCOfwnCo84qc+HAp52wT9nK9H7FAJp5a44GQ==, - } + resolution: {integrity: sha512-pcaShQc1Shq0y+E7GqJqvZj8DTthWV1KeHGdi0Z6IAin2Oi3JnLCOfwnCo84qc+HAp52wT9nK9H7FAJp5a44GQ==} prettier@3.8.1: - resolution: - { - integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==, - } - engines: { node: ">=14" } + resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} + engines: {node: '>=14'} hasBin: true process-nextick-args@2.0.1: - resolution: - { - integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==, - } + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} proj4@2.20.2: - resolution: - { - integrity: sha512-ipfBRfQly0HhHTO7hnC1GfaX8bvroO7VV4KH889ehmADSE8C/qzp2j+Jj6783S9Tj6c2qX/hhYm7oH0kgXzBAA==, - } + resolution: {integrity: sha512-ipfBRfQly0HhHTO7hnC1GfaX8bvroO7VV4KH889ehmADSE8C/qzp2j+Jj6783S9Tj6c2qX/hhYm7oH0kgXzBAA==} protocol-buffers-schema@3.6.0: - resolution: - { - integrity: sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==, - } + resolution: {integrity: sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==} publint@0.3.17: - resolution: - { - integrity: sha512-Q3NLegA9XM6usW+dYQRG1g9uEHiYUzcCVBJDJ7yMcWRqVU9LYZUWdqbwMZfmTCFC5PZLQpLAmhvRcQRl3exqkw==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-Q3NLegA9XM6usW+dYQRG1g9uEHiYUzcCVBJDJ7yMcWRqVU9LYZUWdqbwMZfmTCFC5PZLQpLAmhvRcQRl3exqkw==} + engines: {node: '>=18'} hasBin: true punycode@2.3.1: - resolution: - { - integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} queue-microtask@1.2.3: - resolution: - { - integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, - } + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} quick-lru@6.1.2: - resolution: - { - integrity: sha512-AAFUA5O1d83pIHEhJwWCq/RQcRukCkn/NSm2QsTEMle5f2hP0ChI2+3Xb051PZCkLryI/Ir1MVKviT2FIloaTQ==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-AAFUA5O1d83pIHEhJwWCq/RQcRukCkn/NSm2QsTEMle5f2hP0ChI2+3Xb051PZCkLryI/Ir1MVKviT2FIloaTQ==} + engines: {node: '>=12'} quickselect@3.0.0: - resolution: - { - integrity: sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g==, - } + resolution: {integrity: sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g==} react-dom@19.2.4: - resolution: - { - integrity: sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==, - } + resolution: {integrity: sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==} peerDependencies: react: ^19.2.4 react-map-gl@8.1.0: - resolution: - { - integrity: sha512-vDx/QXR3Tb+8/ap/z6gdMjJQ8ZEyaZf6+uMSPz7jhWF5VZeIsKsGfPvwHVPPwGF43Ryn+YR4bd09uEFNR5OPdg==, - } + resolution: {integrity: sha512-vDx/QXR3Tb+8/ap/z6gdMjJQ8ZEyaZf6+uMSPz7jhWF5VZeIsKsGfPvwHVPPwGF43Ryn+YR4bd09uEFNR5OPdg==} peerDependencies: - mapbox-gl: ">=1.13.0" - maplibre-gl: ">=1.13.0" - react: ">=16.3.0" - react-dom: ">=16.3.0" + mapbox-gl: '>=1.13.0' + maplibre-gl: '>=1.13.0' + react: '>=16.3.0' + react-dom: '>=16.3.0' peerDependenciesMeta: mapbox-gl: optional: true @@ -3400,392 +2181,221 @@ packages: optional: true react-refresh@0.18.0: - resolution: - { - integrity: sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==} + engines: {node: '>=0.10.0'} react@19.2.4: - resolution: - { - integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==} + engines: {node: '>=0.10.0'} readable-stream@2.3.8: - resolution: - { - integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==, - } + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} readdirp@4.1.2: - resolution: - { - integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==, - } - engines: { node: ">= 14.18.0" } + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} reference-spec-reader@0.2.0: - resolution: - { - integrity: sha512-q0mfCi5yZSSHXpCyxjgQeaORq3tvDsxDyzaadA/5+AbAUwRyRuuTh0aRQuE/vAOt/qzzxidJ5iDeu1cLHaNBlQ==, - } + resolution: {integrity: sha512-q0mfCi5yZSSHXpCyxjgQeaORq3tvDsxDyzaadA/5+AbAUwRyRuuTh0aRQuE/vAOt/qzzxidJ5iDeu1cLHaNBlQ==} require-from-string@2.0.2: - resolution: - { - integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} resolve-from@5.0.0: - resolution: - { - integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} resolve-pkg-maps@1.0.0: - resolution: - { - integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==, - } + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} resolve-protobuf-schema@2.1.0: - resolution: - { - integrity: sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==, - } + resolution: {integrity: sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==} reusify@1.1.0: - resolution: - { - integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==, - } - engines: { iojs: ">=1.0.0", node: ">=0.10.0" } + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} rollup@4.54.0: - resolution: - { - integrity: sha512-3nk8Y3a9Ea8szgKhinMlGMhGMw89mqule3KWczxhIzqudyHdCIOHw8WJlj/r329fACjKLEh13ZSk7oE22kyeIw==, - } - engines: { node: ">=18.0.0", npm: ">=8.0.0" } + resolution: {integrity: sha512-3nk8Y3a9Ea8szgKhinMlGMhGMw89mqule3KWczxhIzqudyHdCIOHw8WJlj/r329fACjKLEh13ZSk7oE22kyeIw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true rollup@4.57.1: - resolution: - { - integrity: sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==, - } - engines: { node: ">=18.0.0", npm: ">=8.0.0" } + resolution: {integrity: sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true run-parallel@1.2.0: - resolution: - { - integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, - } + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} rw@1.3.3: - resolution: - { - integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==, - } + resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} sade@1.8.1: - resolution: - { - integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==, - } - engines: { node: ">=6" } + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} safe-buffer@5.1.2: - resolution: - { - integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==, - } + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} saxes@6.0.0: - resolution: - { - integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==, - } - engines: { node: ">=v12.22.7" } + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} scheduler@0.27.0: - resolution: - { - integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==, - } + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} semver@6.3.1: - resolution: - { - integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==, - } + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true set-value@2.0.1: - resolution: - { - integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} + engines: {node: '>=0.10.0'} setimmediate@1.0.5: - resolution: - { - integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==, - } + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} siginfo@2.0.0: - resolution: - { - integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==, - } + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} slash@3.0.0: - resolution: - { - integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} snappyjs@0.6.1: - resolution: - { - integrity: sha512-YIK6I2lsH072UE0aOFxxY1dPDCS43I5ktqHpeAsuLNYWkE5pGxRGWfDM4/vSUfNzXjC1Ivzt3qx31PCLmc9yqg==, - } + resolution: {integrity: sha512-YIK6I2lsH072UE0aOFxxY1dPDCS43I5ktqHpeAsuLNYWkE5pGxRGWfDM4/vSUfNzXjC1Ivzt3qx31PCLmc9yqg==} sort-asc@0.2.0: - resolution: - { - integrity: sha512-umMGhjPeHAI6YjABoSTrFp2zaBtXBej1a0yKkuMUyjjqu6FJsTF+JYwCswWDg+zJfk/5npWUUbd33HH/WLzpaA==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-umMGhjPeHAI6YjABoSTrFp2zaBtXBej1a0yKkuMUyjjqu6FJsTF+JYwCswWDg+zJfk/5npWUUbd33HH/WLzpaA==} + engines: {node: '>=0.10.0'} sort-desc@0.2.0: - resolution: - { - integrity: sha512-NqZqyvL4VPW+RAxxXnB8gvE1kyikh8+pR+T+CXLksVRN9eiQqkQlPwqWYU0mF9Jm7UnctShlxLyAt1CaBOTL1w==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-NqZqyvL4VPW+RAxxXnB8gvE1kyikh8+pR+T+CXLksVRN9eiQqkQlPwqWYU0mF9Jm7UnctShlxLyAt1CaBOTL1w==} + engines: {node: '>=0.10.0'} sort-object@3.0.3: - resolution: - { - integrity: sha512-nK7WOY8jik6zaG9CRwZTaD5O7ETWDLZYMM12pqY8htll+7dYeqGfEUPcUBHOpSJg2vJOrvFIY2Dl5cX2ih1hAQ==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-nK7WOY8jik6zaG9CRwZTaD5O7ETWDLZYMM12pqY8htll+7dYeqGfEUPcUBHOpSJg2vJOrvFIY2Dl5cX2ih1hAQ==} + engines: {node: '>=0.10.0'} source-map-js@1.2.1: - resolution: - { - integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} source-map@0.7.6: - resolution: - { - integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==, - } - engines: { node: ">= 12" } + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} split-string@3.1.0: - resolution: - { - integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} + engines: {node: '>=0.10.0'} sprintf-js@1.0.3: - resolution: - { - integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==, - } + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} stackback@0.0.2: - resolution: - { - integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==, - } + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} std-env@3.10.0: - resolution: - { - integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==, - } + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} string_decoder@1.1.1: - resolution: - { - integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==, - } + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} strip-outer@1.0.1: - resolution: - { - integrity: sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==} + engines: {node: '>=0.10.0'} strnum@1.1.2: - resolution: - { - integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==, - } + resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==} sucrase@3.35.1: - resolution: - { - integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==, - } - engines: { node: ">=16 || 14 >=14.17" } + resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} + engines: {node: '>=16 || 14 >=14.17'} hasBin: true supercluster@8.0.1: - resolution: - { - integrity: sha512-IiOea5kJ9iqzD2t7QJq/cREyLHTtSmUT6gQsweojg9WH2sYJqZK9SswTu6jrscO6D1G5v5vYZ9ru/eq85lXeZQ==, - } + resolution: {integrity: sha512-IiOea5kJ9iqzD2t7QJq/cREyLHTtSmUT6gQsweojg9WH2sYJqZK9SswTu6jrscO6D1G5v5vYZ9ru/eq85lXeZQ==} symbol-tree@3.2.4: - resolution: - { - integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==, - } + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} texture-compressor@1.0.2: - resolution: - { - integrity: sha512-dStVgoaQ11mA5htJ+RzZ51ZxIZqNOgWKAIvtjLrW1AliQQLCmrDqNzQZ8Jh91YealQ95DXt4MEduLzJmbs6lig==, - } + resolution: {integrity: sha512-dStVgoaQ11mA5htJ+RzZ51ZxIZqNOgWKAIvtjLrW1AliQQLCmrDqNzQZ8Jh91YealQ95DXt4MEduLzJmbs6lig==} hasBin: true thenify-all@1.6.0: - resolution: - { - integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==, - } - engines: { node: ">=0.8" } + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} thenify@3.3.1: - resolution: - { - integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==, - } + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} tinybench@2.9.0: - resolution: - { - integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==, - } + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} tinyexec@0.3.2: - resolution: - { - integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==, - } + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} tinyexec@1.0.2: - resolution: - { - integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} + engines: {node: '>=18'} tinyglobby@0.2.15: - resolution: - { - integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==, - } - engines: { node: ">=12.0.0" } + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} tinyqueue@3.0.0: - resolution: - { - integrity: sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g==, - } + resolution: {integrity: sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g==} tinyrainbow@3.0.3: - resolution: - { - integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==, - } - engines: { node: ">=14.0.0" } + resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} + engines: {node: '>=14.0.0'} tldts-core@7.0.19: - resolution: - { - integrity: sha512-lJX2dEWx0SGH4O6p+7FPwYmJ/bu1JbcGJ8RLaG9b7liIgZ85itUVEPbMtWRVrde/0fnDPEPHW10ZsKW3kVsE9A==, - } + resolution: {integrity: sha512-lJX2dEWx0SGH4O6p+7FPwYmJ/bu1JbcGJ8RLaG9b7liIgZ85itUVEPbMtWRVrde/0fnDPEPHW10ZsKW3kVsE9A==} tldts@7.0.19: - resolution: - { - integrity: sha512-8PWx8tvC4jDB39BQw1m4x8y5MH1BcQ5xHeL2n7UVFulMPH/3Q0uiamahFJ3lXA0zO2SUyRXuVVbWSDmstlt9YA==, - } + resolution: {integrity: sha512-8PWx8tvC4jDB39BQw1m4x8y5MH1BcQ5xHeL2n7UVFulMPH/3Q0uiamahFJ3lXA0zO2SUyRXuVVbWSDmstlt9YA==} hasBin: true to-regex-range@5.0.1: - resolution: - { - integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, - } - engines: { node: ">=8.0" } + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} tough-cookie@6.0.0: - resolution: - { - integrity: sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==, - } - engines: { node: ">=16" } + resolution: {integrity: sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==} + engines: {node: '>=16'} tr46@6.0.0: - resolution: - { - integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==, - } - engines: { node: ">=20" } + resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==} + engines: {node: '>=20'} tree-kill@1.2.2: - resolution: - { - integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==, - } + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true trim-repeated@1.0.0: - resolution: - { - integrity: sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==} + engines: {node: '>=0.10.0'} ts-interface-checker@0.1.13: - resolution: - { - integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==, - } + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} tsup@8.5.1: - resolution: - { - integrity: sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing==} + engines: {node: '>=18'} hasBin: true peerDependencies: - "@microsoft/api-extractor": ^7.36.0 - "@swc/core": ^1 + '@microsoft/api-extractor': ^7.36.0 + '@swc/core': ^1 postcss: ^8.4.12 - typescript: ">=4.5.0" + typescript: '>=4.5.0' peerDependenciesMeta: - "@microsoft/api-extractor": + '@microsoft/api-extractor': optional: true - "@swc/core": + '@swc/core': optional: true postcss: optional: true @@ -3793,121 +2403,76 @@ packages: optional: true tsx@4.21.0: - resolution: - { - integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==, - } - engines: { node: ">=18.0.0" } + resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} + engines: {node: '>=18.0.0'} hasBin: true typescript@5.9.3: - resolution: - { - integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==, - } - engines: { node: ">=14.17" } + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} hasBin: true typewise-core@1.2.0: - resolution: - { - integrity: sha512-2SCC/WLzj2SbUwzFOzqMCkz5amXLlxtJqDKTICqg30x+2DZxcfZN2MvQZmGfXWKNWaKK9pBPsvkcwv8bF/gxKg==, - } + resolution: {integrity: sha512-2SCC/WLzj2SbUwzFOzqMCkz5amXLlxtJqDKTICqg30x+2DZxcfZN2MvQZmGfXWKNWaKK9pBPsvkcwv8bF/gxKg==} typewise@1.0.3: - resolution: - { - integrity: sha512-aXofE06xGhaQSPzt8hlTY+/YWQhm9P0jYUp1f2XtmW/3Bk0qzXcyFWAtPoo2uTGQj1ZwbDuSyuxicq+aDo8lCQ==, - } + resolution: {integrity: sha512-aXofE06xGhaQSPzt8hlTY+/YWQhm9P0jYUp1f2XtmW/3Bk0qzXcyFWAtPoo2uTGQj1ZwbDuSyuxicq+aDo8lCQ==} ufo@1.6.1: - resolution: - { - integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==, - } + resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} undici-types@6.21.0: - resolution: - { - integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==, - } + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} undici-types@7.16.0: - resolution: - { - integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==, - } + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} union-value@1.0.1: - resolution: - { - integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==, - } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} + engines: {node: '>=0.10.0'} universalify@2.0.1: - resolution: - { - integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==, - } - engines: { node: ">= 10.0.0" } + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} unzipit@1.4.3: - resolution: - { - integrity: sha512-gsq2PdJIWWGhx5kcdWStvNWit9FVdTewm4SEG7gFskWs+XCVaULt9+BwuoBtJiRE8eo3L1IPAOrbByNLtLtIlg==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-gsq2PdJIWWGhx5kcdWStvNWit9FVdTewm4SEG7gFskWs+XCVaULt9+BwuoBtJiRE8eo3L1IPAOrbByNLtLtIlg==} + engines: {node: '>=12'} update-browserslist-db@1.2.3: - resolution: - { - integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==, - } + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} hasBin: true peerDependencies: - browserslist: ">= 4.21.0" + browserslist: '>= 4.21.0' util-deprecate@1.0.2: - resolution: - { - integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, - } + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} uuid@13.0.0: - resolution: - { - integrity: sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==, - } + resolution: {integrity: sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==} hasBin: true uzip-module@1.0.3: - resolution: - { - integrity: sha512-AMqwWZaknLM77G+VPYNZLEruMGWGzyigPK3/Whg99B3S6vGHuqsyl5ZrOv1UUF3paGK1U6PM0cnayioaryg/fA==, - } + resolution: {integrity: sha512-AMqwWZaknLM77G+VPYNZLEruMGWGzyigPK3/Whg99B3S6vGHuqsyl5ZrOv1UUF3paGK1U6PM0cnayioaryg/fA==} vite@7.3.1: - resolution: - { - integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==, - } - engines: { node: ^20.19.0 || >=22.12.0 } + resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} + engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: - "@types/node": ^20.19.0 || >=22.12.0 - jiti: ">=1.21.0" + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' less: ^4.0.0 lightningcss: ^1.21.0 sass: ^1.70.0 sass-embedded: ^1.70.0 - stylus: ">=0.54.8" + stylus: '>=0.54.8' sugarss: ^5.0.0 terser: ^5.16.0 tsx: ^4.8.1 yaml: ^2.4.2 peerDependenciesMeta: - "@types/node": + '@types/node': optional: true jiti: optional: true @@ -3931,36 +2496,33 @@ packages: optional: true vitest@4.0.18: - resolution: - { - integrity: sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==, - } - engines: { node: ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==} + engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: - "@edge-runtime/vm": "*" - "@opentelemetry/api": ^1.9.0 - "@types/node": ^20.0.0 || ^22.0.0 || >=24.0.0 - "@vitest/browser-playwright": 4.0.18 - "@vitest/browser-preview": 4.0.18 - "@vitest/browser-webdriverio": 4.0.18 - "@vitest/ui": 4.0.18 - happy-dom: "*" - jsdom: "*" + '@edge-runtime/vm': '*' + '@opentelemetry/api': ^1.9.0 + '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 4.0.18 + '@vitest/browser-preview': 4.0.18 + '@vitest/browser-webdriverio': 4.0.18 + '@vitest/ui': 4.0.18 + happy-dom: '*' + jsdom: '*' peerDependenciesMeta: - "@edge-runtime/vm": + '@edge-runtime/vm': optional: true - "@opentelemetry/api": + '@opentelemetry/api': optional: true - "@types/node": + '@types/node': optional: true - "@vitest/browser-playwright": + '@vitest/browser-playwright': optional: true - "@vitest/browser-preview": + '@vitest/browser-preview': optional: true - "@vitest/browser-webdriverio": + '@vitest/browser-webdriverio': optional: true - "@vitest/ui": + '@vitest/ui': optional: true happy-dom: optional: true @@ -3968,75 +2530,45 @@ packages: optional: true w3c-xmlserializer@5.0.0: - resolution: - { - integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} web-worker@1.5.0: - resolution: - { - integrity: sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw==, - } + resolution: {integrity: sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw==} webidl-conversions@8.0.0: - resolution: - { - integrity: sha512-n4W4YFyz5JzOfQeA8oN7dUYpR+MBP3PIUsn2jLjWXwK5ASUzt0Jc/A5sAUZoCYFJRGF0FBKJ+1JjN43rNdsQzA==, - } - engines: { node: ">=20" } + resolution: {integrity: sha512-n4W4YFyz5JzOfQeA8oN7dUYpR+MBP3PIUsn2jLjWXwK5ASUzt0Jc/A5sAUZoCYFJRGF0FBKJ+1JjN43rNdsQzA==} + engines: {node: '>=20'} wgsl_reflect@1.2.3: - resolution: - { - integrity: sha512-BQWBIsOn411M+ffBxmA6QRLvAOVbuz3Uk4NusxnqC1H7aeQcVLhdA3k2k/EFFFtqVjhz3z7JOOZF1a9hj2tv4Q==, - } + resolution: {integrity: sha512-BQWBIsOn411M+ffBxmA6QRLvAOVbuz3Uk4NusxnqC1H7aeQcVLhdA3k2k/EFFFtqVjhz3z7JOOZF1a9hj2tv4Q==} whatwg-mimetype@3.0.0: - resolution: - { - integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==, - } - engines: { node: ">=12" } + resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} + engines: {node: '>=12'} whatwg-mimetype@4.0.0: - resolution: - { - integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} whatwg-url@15.1.0: - resolution: - { - integrity: sha512-2ytDk0kiEj/yu90JOAp44PVPUkO9+jVhyf+SybKlRHSDlvOOZhdPIrr7xTH64l4WixO2cP+wQIcgujkGBPPz6g==, - } - engines: { node: ">=20" } + resolution: {integrity: sha512-2ytDk0kiEj/yu90JOAp44PVPUkO9+jVhyf+SybKlRHSDlvOOZhdPIrr7xTH64l4WixO2cP+wQIcgujkGBPPz6g==} + engines: {node: '>=20'} why-is-node-running@2.3.0: - resolution: - { - integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==, - } - engines: { node: ">=8" } + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} hasBin: true wkt-parser@1.5.2: - resolution: - { - integrity: sha512-1ZUiV1FTwSiSrgWzV9KXJuOF2BVW91KY/mau04BhnmgOdroRQea7Q0s5TVqwGLm0D2tZwObd/tBYXW49sSxp3Q==, - } + resolution: {integrity: sha512-1ZUiV1FTwSiSrgWzV9KXJuOF2BVW91KY/mau04BhnmgOdroRQea7Q0s5TVqwGLm0D2tZwObd/tBYXW49sSxp3Q==} ws@8.18.3: - resolution: - { - integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==, - } - engines: { node: ">=10.0.0" } + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} + engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" + utf-8-validate: '>=5.0.2' peerDependenciesMeta: bufferutil: optional: true @@ -4044,95 +2576,75 @@ packages: optional: true xml-name-validator@5.0.0: - resolution: - { - integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==, - } - engines: { node: ">=18" } + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} xml-utils@1.10.2: - resolution: - { - integrity: sha512-RqM+2o1RYs6T8+3DzDSoTRAUfrvaejbVHcp3+thnAtDKo8LskR+HomLajEy5UjTz24rpka7AxVBRR3g2wTUkJA==, - } + resolution: {integrity: sha512-RqM+2o1RYs6T8+3DzDSoTRAUfrvaejbVHcp3+thnAtDKo8LskR+HomLajEy5UjTz24rpka7AxVBRR3g2wTUkJA==} xmlchars@2.2.0: - resolution: - { - integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==, - } + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} yallist@3.1.1: - resolution: - { - integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==, - } + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} zarrita@0.6.1: - resolution: - { - integrity: sha512-YOMTW8FT55Rz+vadTIZeOFZ/F2h4svKizyldvPtMYSxPgSNcRkOzkxCsWpIWlWzB1I/LmISmi0bEekOhLlI+Zw==, - } + resolution: {integrity: sha512-YOMTW8FT55Rz+vadTIZeOFZ/F2h4svKizyldvPtMYSxPgSNcRkOzkxCsWpIWlWzB1I/LmISmi0bEekOhLlI+Zw==} zstd-codec@0.1.5: - resolution: - { - integrity: sha512-v3fyjpK8S/dpY/X5WxqTK3IoCnp/ZOLxn144GZVlNUjtwAchzrVo03h+oMATFhCIiJ5KTr4V3vDQQYz4RU684g==, - } + resolution: {integrity: sha512-v3fyjpK8S/dpY/X5WxqTK3IoCnp/ZOLxn144GZVlNUjtwAchzrVo03h+oMATFhCIiJ5KTr4V3vDQQYz4RU684g==} zstddec@0.1.0: - resolution: - { - integrity: sha512-w2NTI8+3l3eeltKAdK8QpiLo/flRAr2p8AGeakfMZOXBxOg9HIu4LVDxBi81sYgVhFhdJjv1OrB5ssI8uFPoLg==, - } + resolution: {integrity: sha512-w2NTI8+3l3eeltKAdK8QpiLo/flRAr2p8AGeakfMZOXBxOg9HIu4LVDxBi81sYgVhFhdJjv1OrB5ssI8uFPoLg==} snapshots: - "@acemir/cssom@0.9.30": {} - "@apidevtools/json-schema-ref-parser@11.9.3": + '@acemir/cssom@0.9.30': {} + + '@apidevtools/json-schema-ref-parser@11.9.3': dependencies: - "@jsdevtools/ono": 7.1.3 - "@types/json-schema": 7.0.15 + '@jsdevtools/ono': 7.1.3 + '@types/json-schema': 7.0.15 js-yaml: 4.1.1 - "@asamuzakjp/css-color@4.1.1": + '@asamuzakjp/css-color@4.1.1': dependencies: - "@csstools/css-calc": 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - "@csstools/css-color-parser": 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - "@csstools/css-parser-algorithms": 3.0.5(@csstools/css-tokenizer@3.0.4) - "@csstools/css-tokenizer": 3.0.4 + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 lru-cache: 11.2.4 - "@asamuzakjp/dom-selector@6.7.6": + '@asamuzakjp/dom-selector@6.7.6': dependencies: - "@asamuzakjp/nwsapi": 2.3.9 + '@asamuzakjp/nwsapi': 2.3.9 bidi-js: 1.0.3 css-tree: 3.1.0 is-potential-custom-element-name: 1.0.1 lru-cache: 11.2.4 - "@asamuzakjp/nwsapi@2.3.9": {} + '@asamuzakjp/nwsapi@2.3.9': {} - "@babel/code-frame@7.27.1": + '@babel/code-frame@7.27.1': dependencies: - "@babel/helper-validator-identifier": 7.28.5 + '@babel/helper-validator-identifier': 7.28.5 js-tokens: 4.0.0 picocolors: 1.1.1 - "@babel/compat-data@7.28.5": {} + '@babel/compat-data@7.28.5': {} - "@babel/core@7.28.5": + '@babel/core@7.28.5': dependencies: - "@babel/code-frame": 7.27.1 - "@babel/generator": 7.28.5 - "@babel/helper-compilation-targets": 7.27.2 - "@babel/helper-module-transforms": 7.28.3(@babel/core@7.28.5) - "@babel/helpers": 7.28.4 - "@babel/parser": 7.28.5 - "@babel/template": 7.27.2 - "@babel/traverse": 7.28.5 - "@babel/types": 7.28.5 - "@jridgewell/remapping": 2.3.5 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) + '@babel/helpers': 7.28.4 + '@babel/parser': 7.28.5 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 debug: 4.4.3 gensync: 1.0.0-beta.2 @@ -4141,375 +2653,375 @@ snapshots: transitivePeerDependencies: - supports-color - "@babel/generator@7.28.5": + '@babel/generator@7.28.5': dependencies: - "@babel/parser": 7.28.5 - "@babel/types": 7.28.5 - "@jridgewell/gen-mapping": 0.3.13 - "@jridgewell/trace-mapping": 0.3.31 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 - "@babel/helper-compilation-targets@7.27.2": + '@babel/helper-compilation-targets@7.27.2': dependencies: - "@babel/compat-data": 7.28.5 - "@babel/helper-validator-option": 7.27.1 + '@babel/compat-data': 7.28.5 + '@babel/helper-validator-option': 7.27.1 browserslist: 4.28.1 lru-cache: 5.1.1 semver: 6.3.1 - "@babel/helper-globals@7.28.0": {} + '@babel/helper-globals@7.28.0': {} - "@babel/helper-module-imports@7.27.1": + '@babel/helper-module-imports@7.27.1': dependencies: - "@babel/traverse": 7.28.5 - "@babel/types": 7.28.5 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 transitivePeerDependencies: - supports-color - "@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)": + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)': dependencies: - "@babel/core": 7.28.5 - "@babel/helper-module-imports": 7.27.1 - "@babel/helper-validator-identifier": 7.28.5 - "@babel/traverse": 7.28.5 + '@babel/core': 7.28.5 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.28.5 transitivePeerDependencies: - supports-color - "@babel/helper-plugin-utils@7.27.1": {} + '@babel/helper-plugin-utils@7.27.1': {} - "@babel/helper-string-parser@7.27.1": {} + '@babel/helper-string-parser@7.27.1': {} - "@babel/helper-validator-identifier@7.28.5": {} + '@babel/helper-validator-identifier@7.28.5': {} - "@babel/helper-validator-option@7.27.1": {} + '@babel/helper-validator-option@7.27.1': {} - "@babel/helpers@7.28.4": + '@babel/helpers@7.28.4': dependencies: - "@babel/template": 7.27.2 - "@babel/types": 7.28.5 + '@babel/template': 7.27.2 + '@babel/types': 7.28.5 - "@babel/parser@7.28.5": + '@babel/parser@7.28.5': dependencies: - "@babel/types": 7.28.5 + '@babel/types': 7.28.5 - "@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.5)": + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.5)': dependencies: - "@babel/core": 7.28.5 - "@babel/helper-plugin-utils": 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 - "@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.5)": + '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.5)': dependencies: - "@babel/core": 7.28.5 - "@babel/helper-plugin-utils": 7.27.1 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 - "@babel/template@7.27.2": + '@babel/template@7.27.2': dependencies: - "@babel/code-frame": 7.27.1 - "@babel/parser": 7.28.5 - "@babel/types": 7.28.5 + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 - "@babel/traverse@7.28.5": + '@babel/traverse@7.28.5': dependencies: - "@babel/code-frame": 7.27.1 - "@babel/generator": 7.28.5 - "@babel/helper-globals": 7.28.0 - "@babel/parser": 7.28.5 - "@babel/template": 7.27.2 - "@babel/types": 7.28.5 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.5 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.5 + '@babel/template': 7.27.2 + '@babel/types': 7.28.5 debug: 4.4.3 transitivePeerDependencies: - supports-color - "@babel/types@7.28.5": + '@babel/types@7.28.5': dependencies: - "@babel/helper-string-parser": 7.27.1 - "@babel/helper-validator-identifier": 7.28.5 + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 - "@biomejs/biome@2.3.13": + '@biomejs/biome@2.3.13': optionalDependencies: - "@biomejs/cli-darwin-arm64": 2.3.13 - "@biomejs/cli-darwin-x64": 2.3.13 - "@biomejs/cli-linux-arm64": 2.3.13 - "@biomejs/cli-linux-arm64-musl": 2.3.13 - "@biomejs/cli-linux-x64": 2.3.13 - "@biomejs/cli-linux-x64-musl": 2.3.13 - "@biomejs/cli-win32-arm64": 2.3.13 - "@biomejs/cli-win32-x64": 2.3.13 - - "@biomejs/cli-darwin-arm64@2.3.13": + '@biomejs/cli-darwin-arm64': 2.3.13 + '@biomejs/cli-darwin-x64': 2.3.13 + '@biomejs/cli-linux-arm64': 2.3.13 + '@biomejs/cli-linux-arm64-musl': 2.3.13 + '@biomejs/cli-linux-x64': 2.3.13 + '@biomejs/cli-linux-x64-musl': 2.3.13 + '@biomejs/cli-win32-arm64': 2.3.13 + '@biomejs/cli-win32-x64': 2.3.13 + + '@biomejs/cli-darwin-arm64@2.3.13': optional: true - "@biomejs/cli-darwin-x64@2.3.13": + '@biomejs/cli-darwin-x64@2.3.13': optional: true - "@biomejs/cli-linux-arm64-musl@2.3.13": + '@biomejs/cli-linux-arm64-musl@2.3.13': optional: true - "@biomejs/cli-linux-arm64@2.3.13": + '@biomejs/cli-linux-arm64@2.3.13': optional: true - "@biomejs/cli-linux-x64-musl@2.3.13": + '@biomejs/cli-linux-x64-musl@2.3.13': optional: true - "@biomejs/cli-linux-x64@2.3.13": + '@biomejs/cli-linux-x64@2.3.13': optional: true - "@biomejs/cli-win32-arm64@2.3.13": + '@biomejs/cli-win32-arm64@2.3.13': optional: true - "@biomejs/cli-win32-x64@2.3.13": + '@biomejs/cli-win32-x64@2.3.13': optional: true - "@chunkd/source-file@11.0.1": + '@chunkd/source-file@11.0.1': dependencies: - "@chunkd/source": 11.1.0 + '@chunkd/source': 11.1.0 - "@chunkd/source@11.1.0": {} + '@chunkd/source@11.1.0': {} - "@cogeotiff/core@9.1.2": {} + '@cogeotiff/core@9.1.2': {} - "@csstools/color-helpers@5.1.0": {} + '@csstools/color-helpers@5.1.0': {} - "@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)": + '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': dependencies: - "@csstools/css-parser-algorithms": 3.0.5(@csstools/css-tokenizer@3.0.4) - "@csstools/css-tokenizer": 3.0.4 + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 - "@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)": + '@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': dependencies: - "@csstools/color-helpers": 5.1.0 - "@csstools/css-calc": 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - "@csstools/css-parser-algorithms": 3.0.5(@csstools/css-tokenizer@3.0.4) - "@csstools/css-tokenizer": 3.0.4 + '@csstools/color-helpers': 5.1.0 + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 - "@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)": + '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': dependencies: - "@csstools/css-tokenizer": 3.0.4 + '@csstools/css-tokenizer': 3.0.4 - "@csstools/css-syntax-patches-for-csstree@1.0.22": {} + '@csstools/css-syntax-patches-for-csstree@1.0.22': {} - "@csstools/css-tokenizer@3.0.4": {} + '@csstools/css-tokenizer@3.0.4': {} - "@deck.gl/core@9.2.7": + '@deck.gl/core@9.2.7': dependencies: - "@loaders.gl/core": 4.3.4 - "@loaders.gl/images": 4.3.4(@loaders.gl/core@4.3.4) - "@luma.gl/constants": 9.2.6 - "@luma.gl/core": 9.2.6 - "@luma.gl/engine": 9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)) - "@luma.gl/shadertools": 9.2.6(@luma.gl/core@9.2.6) - "@luma.gl/webgl": 9.2.6(@luma.gl/core@9.2.6) - "@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.0 - "@probe.gl/log": 4.1.0 - "@probe.gl/stats": 4.1.0 - "@types/offscreencanvas": 2019.7.3 + '@loaders.gl/core': 4.3.4 + '@loaders.gl/images': 4.3.4(@loaders.gl/core@4.3.4) + '@luma.gl/constants': 9.2.6 + '@luma.gl/core': 9.2.6 + '@luma.gl/engine': 9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)) + '@luma.gl/shadertools': 9.2.6(@luma.gl/core@9.2.6) + '@luma.gl/webgl': 9.2.6(@luma.gl/core@9.2.6) + '@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.0 + '@probe.gl/log': 4.1.0 + '@probe.gl/stats': 4.1.0 + '@types/offscreencanvas': 2019.7.3 gl-matrix: 3.4.4 mjolnir.js: 3.0.0 - "@deck.gl/extensions@9.2.5(@deck.gl/core@9.2.7)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))": - dependencies: - "@deck.gl/core": 9.2.7 - "@luma.gl/constants": 9.2.6 - "@luma.gl/core": 9.2.6 - "@luma.gl/engine": 9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)) - "@luma.gl/shadertools": 9.2.6(@luma.gl/core@9.2.6) - "@math.gl/core": 4.1.0 - - "@deck.gl/geo-layers@9.2.7(@deck.gl/core@9.2.7)(@deck.gl/extensions@9.2.5(@deck.gl/core@9.2.7)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6))))(@deck.gl/layers@9.2.7(@deck.gl/core@9.2.7)(@loaders.gl/core@4.3.4)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6))))(@deck.gl/mesh-layers@9.2.7(@deck.gl/core@9.2.7)(@loaders.gl/core@4.3.4)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/gltf@9.2.6(@luma.gl/constants@9.2.6)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@loaders.gl/core@4.3.4)(@luma.gl/constants@9.2.6)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))": - dependencies: - "@deck.gl/core": 9.2.7 - "@deck.gl/extensions": 9.2.5(@deck.gl/core@9.2.7)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6))) - "@deck.gl/layers": 9.2.7(@deck.gl/core@9.2.7)(@loaders.gl/core@4.3.4)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6))) - "@deck.gl/mesh-layers": 9.2.7(@deck.gl/core@9.2.7)(@loaders.gl/core@4.3.4)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/gltf@9.2.6(@luma.gl/constants@9.2.6)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)) - "@loaders.gl/3d-tiles": 4.3.4(@loaders.gl/core@4.3.4) - "@loaders.gl/core": 4.3.4 - "@loaders.gl/gis": 4.3.4(@loaders.gl/core@4.3.4) - "@loaders.gl/loader-utils": 4.3.4(@loaders.gl/core@4.3.4) - "@loaders.gl/mvt": 4.3.4(@loaders.gl/core@4.3.4) - "@loaders.gl/schema": 4.3.4(@loaders.gl/core@4.3.4) - "@loaders.gl/terrain": 4.3.4(@loaders.gl/core@4.3.4) - "@loaders.gl/tiles": 4.3.4(@loaders.gl/core@4.3.4) - "@loaders.gl/wms": 4.3.4(@loaders.gl/core@4.3.4) - "@luma.gl/core": 9.2.6 - "@luma.gl/engine": 9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)) - "@luma.gl/gltf": 9.2.6(@luma.gl/constants@9.2.6)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)) - "@luma.gl/shadertools": 9.2.6(@luma.gl/core@9.2.6) - "@math.gl/core": 4.1.0 - "@math.gl/culling": 4.1.0 - "@math.gl/web-mercator": 4.1.0 - "@types/geojson": 7946.0.16 + '@deck.gl/extensions@9.2.5(@deck.gl/core@9.2.7)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))': + dependencies: + '@deck.gl/core': 9.2.7 + '@luma.gl/constants': 9.2.6 + '@luma.gl/core': 9.2.6 + '@luma.gl/engine': 9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)) + '@luma.gl/shadertools': 9.2.6(@luma.gl/core@9.2.6) + '@math.gl/core': 4.1.0 + + '@deck.gl/geo-layers@9.2.7(@deck.gl/core@9.2.7)(@deck.gl/extensions@9.2.5(@deck.gl/core@9.2.7)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6))))(@deck.gl/layers@9.2.7(@deck.gl/core@9.2.7)(@loaders.gl/core@4.3.4)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6))))(@deck.gl/mesh-layers@9.2.7(@deck.gl/core@9.2.7)(@loaders.gl/core@4.3.4)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/gltf@9.2.6(@luma.gl/constants@9.2.6)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@loaders.gl/core@4.3.4)(@luma.gl/constants@9.2.6)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))': + dependencies: + '@deck.gl/core': 9.2.7 + '@deck.gl/extensions': 9.2.5(@deck.gl/core@9.2.7)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6))) + '@deck.gl/layers': 9.2.7(@deck.gl/core@9.2.7)(@loaders.gl/core@4.3.4)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6))) + '@deck.gl/mesh-layers': 9.2.7(@deck.gl/core@9.2.7)(@loaders.gl/core@4.3.4)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/gltf@9.2.6(@luma.gl/constants@9.2.6)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)) + '@loaders.gl/3d-tiles': 4.3.4(@loaders.gl/core@4.3.4) + '@loaders.gl/core': 4.3.4 + '@loaders.gl/gis': 4.3.4(@loaders.gl/core@4.3.4) + '@loaders.gl/loader-utils': 4.3.4(@loaders.gl/core@4.3.4) + '@loaders.gl/mvt': 4.3.4(@loaders.gl/core@4.3.4) + '@loaders.gl/schema': 4.3.4(@loaders.gl/core@4.3.4) + '@loaders.gl/terrain': 4.3.4(@loaders.gl/core@4.3.4) + '@loaders.gl/tiles': 4.3.4(@loaders.gl/core@4.3.4) + '@loaders.gl/wms': 4.3.4(@loaders.gl/core@4.3.4) + '@luma.gl/core': 9.2.6 + '@luma.gl/engine': 9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)) + '@luma.gl/gltf': 9.2.6(@luma.gl/constants@9.2.6)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)) + '@luma.gl/shadertools': 9.2.6(@luma.gl/core@9.2.6) + '@math.gl/core': 4.1.0 + '@math.gl/culling': 4.1.0 + '@math.gl/web-mercator': 4.1.0 + '@types/geojson': 7946.0.16 a5-js: 0.5.0 h3-js: 4.4.0 long: 3.2.0 transitivePeerDependencies: - - "@luma.gl/constants" - - "@deck.gl/layers@9.2.7(@deck.gl/core@9.2.7)(@loaders.gl/core@4.3.4)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))": - dependencies: - "@deck.gl/core": 9.2.7 - "@loaders.gl/core": 4.3.4 - "@loaders.gl/images": 4.3.4(@loaders.gl/core@4.3.4) - "@loaders.gl/schema": 4.3.4(@loaders.gl/core@4.3.4) - "@luma.gl/core": 9.2.6 - "@luma.gl/engine": 9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)) - "@luma.gl/shadertools": 9.2.6(@luma.gl/core@9.2.6) - "@mapbox/tiny-sdf": 2.0.7 - "@math.gl/core": 4.1.0 - "@math.gl/polygon": 4.1.0 - "@math.gl/web-mercator": 4.1.0 + - '@luma.gl/constants' + + '@deck.gl/layers@9.2.7(@deck.gl/core@9.2.7)(@loaders.gl/core@4.3.4)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))': + dependencies: + '@deck.gl/core': 9.2.7 + '@loaders.gl/core': 4.3.4 + '@loaders.gl/images': 4.3.4(@loaders.gl/core@4.3.4) + '@loaders.gl/schema': 4.3.4(@loaders.gl/core@4.3.4) + '@luma.gl/core': 9.2.6 + '@luma.gl/engine': 9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)) + '@luma.gl/shadertools': 9.2.6(@luma.gl/core@9.2.6) + '@mapbox/tiny-sdf': 2.0.7 + '@math.gl/core': 4.1.0 + '@math.gl/polygon': 4.1.0 + '@math.gl/web-mercator': 4.1.0 earcut: 2.2.4 - "@deck.gl/mapbox@9.2.7(@deck.gl/core@9.2.7)(@luma.gl/constants@9.2.6)(@luma.gl/core@9.2.6)(@math.gl/web-mercator@4.1.0)": + '@deck.gl/mapbox@9.2.7(@deck.gl/core@9.2.7)(@luma.gl/constants@9.2.6)(@luma.gl/core@9.2.6)(@math.gl/web-mercator@4.1.0)': dependencies: - "@deck.gl/core": 9.2.7 - "@luma.gl/constants": 9.2.6 - "@luma.gl/core": 9.2.6 - "@math.gl/web-mercator": 4.1.0 + '@deck.gl/core': 9.2.7 + '@luma.gl/constants': 9.2.6 + '@luma.gl/core': 9.2.6 + '@math.gl/web-mercator': 4.1.0 - "@deck.gl/mesh-layers@9.2.7(@deck.gl/core@9.2.7)(@loaders.gl/core@4.3.4)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/gltf@9.2.6(@luma.gl/constants@9.2.6)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6))": + '@deck.gl/mesh-layers@9.2.7(@deck.gl/core@9.2.7)(@loaders.gl/core@4.3.4)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/gltf@9.2.6(@luma.gl/constants@9.2.6)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6))': dependencies: - "@deck.gl/core": 9.2.7 - "@loaders.gl/gltf": 4.3.4(@loaders.gl/core@4.3.4) - "@loaders.gl/schema": 4.3.4(@loaders.gl/core@4.3.4) - "@luma.gl/core": 9.2.6 - "@luma.gl/engine": 9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)) - "@luma.gl/gltf": 9.2.6(@luma.gl/constants@9.2.6)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)) - "@luma.gl/shadertools": 9.2.6(@luma.gl/core@9.2.6) + '@deck.gl/core': 9.2.7 + '@loaders.gl/gltf': 4.3.4(@loaders.gl/core@4.3.4) + '@loaders.gl/schema': 4.3.4(@loaders.gl/core@4.3.4) + '@luma.gl/core': 9.2.6 + '@luma.gl/engine': 9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)) + '@luma.gl/gltf': 9.2.6(@luma.gl/constants@9.2.6)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)) + '@luma.gl/shadertools': 9.2.6(@luma.gl/core@9.2.6) transitivePeerDependencies: - - "@loaders.gl/core" + - '@loaders.gl/core' - "@developmentseed/morecantile@0.1.1": {} + '@developmentseed/morecantile@0.1.1': {} - "@esbuild/aix-ppc64@0.27.2": + '@esbuild/aix-ppc64@0.27.2': optional: true - "@esbuild/android-arm64@0.27.2": + '@esbuild/android-arm64@0.27.2': optional: true - "@esbuild/android-arm@0.27.2": + '@esbuild/android-arm@0.27.2': optional: true - "@esbuild/android-x64@0.27.2": + '@esbuild/android-x64@0.27.2': optional: true - "@esbuild/darwin-arm64@0.27.2": + '@esbuild/darwin-arm64@0.27.2': optional: true - "@esbuild/darwin-x64@0.27.2": + '@esbuild/darwin-x64@0.27.2': optional: true - "@esbuild/freebsd-arm64@0.27.2": + '@esbuild/freebsd-arm64@0.27.2': optional: true - "@esbuild/freebsd-x64@0.27.2": + '@esbuild/freebsd-x64@0.27.2': optional: true - "@esbuild/linux-arm64@0.27.2": + '@esbuild/linux-arm64@0.27.2': optional: true - "@esbuild/linux-arm@0.27.2": + '@esbuild/linux-arm@0.27.2': optional: true - "@esbuild/linux-ia32@0.27.2": + '@esbuild/linux-ia32@0.27.2': optional: true - "@esbuild/linux-loong64@0.27.2": + '@esbuild/linux-loong64@0.27.2': optional: true - "@esbuild/linux-mips64el@0.27.2": + '@esbuild/linux-mips64el@0.27.2': optional: true - "@esbuild/linux-ppc64@0.27.2": + '@esbuild/linux-ppc64@0.27.2': optional: true - "@esbuild/linux-riscv64@0.27.2": + '@esbuild/linux-riscv64@0.27.2': optional: true - "@esbuild/linux-s390x@0.27.2": + '@esbuild/linux-s390x@0.27.2': optional: true - "@esbuild/linux-x64@0.27.2": + '@esbuild/linux-x64@0.27.2': optional: true - "@esbuild/netbsd-arm64@0.27.2": + '@esbuild/netbsd-arm64@0.27.2': optional: true - "@esbuild/netbsd-x64@0.27.2": + '@esbuild/netbsd-x64@0.27.2': optional: true - "@esbuild/openbsd-arm64@0.27.2": + '@esbuild/openbsd-arm64@0.27.2': optional: true - "@esbuild/openbsd-x64@0.27.2": + '@esbuild/openbsd-x64@0.27.2': optional: true - "@esbuild/openharmony-arm64@0.27.2": + '@esbuild/openharmony-arm64@0.27.2': optional: true - "@esbuild/sunos-x64@0.27.2": + '@esbuild/sunos-x64@0.27.2': optional: true - "@esbuild/win32-arm64@0.27.2": + '@esbuild/win32-arm64@0.27.2': optional: true - "@esbuild/win32-ia32@0.27.2": + '@esbuild/win32-ia32@0.27.2': optional: true - "@esbuild/win32-x64@0.27.2": + '@esbuild/win32-x64@0.27.2': optional: true - "@exodus/bytes@1.8.0": {} + '@exodus/bytes@1.8.0': {} - "@jridgewell/gen-mapping@0.3.13": + '@jridgewell/gen-mapping@0.3.13': dependencies: - "@jridgewell/sourcemap-codec": 1.5.5 - "@jridgewell/trace-mapping": 0.3.31 + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 - "@jridgewell/remapping@2.3.5": + '@jridgewell/remapping@2.3.5': dependencies: - "@jridgewell/gen-mapping": 0.3.13 - "@jridgewell/trace-mapping": 0.3.31 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 - "@jridgewell/resolve-uri@3.1.2": {} + '@jridgewell/resolve-uri@3.1.2': {} - "@jridgewell/sourcemap-codec@1.5.5": {} + '@jridgewell/sourcemap-codec@1.5.5': {} - "@jridgewell/trace-mapping@0.3.31": + '@jridgewell/trace-mapping@0.3.31': dependencies: - "@jridgewell/resolve-uri": 3.1.2 - "@jridgewell/sourcemap-codec": 1.5.5 + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 - "@jsdevtools/ono@7.1.3": {} + '@jsdevtools/ono@7.1.3': {} - "@loaders.gl/3d-tiles@4.3.4(@loaders.gl/core@4.3.4)": + '@loaders.gl/3d-tiles@4.3.4(@loaders.gl/core@4.3.4)': dependencies: - "@loaders.gl/compression": 4.3.4(@loaders.gl/core@4.3.4) - "@loaders.gl/core": 4.3.4 - "@loaders.gl/crypto": 4.3.4(@loaders.gl/core@4.3.4) - "@loaders.gl/draco": 4.3.4(@loaders.gl/core@4.3.4) - "@loaders.gl/gltf": 4.3.4(@loaders.gl/core@4.3.4) - "@loaders.gl/images": 4.3.4(@loaders.gl/core@4.3.4) - "@loaders.gl/loader-utils": 4.3.4(@loaders.gl/core@4.3.4) - "@loaders.gl/math": 4.3.4(@loaders.gl/core@4.3.4) - "@loaders.gl/tiles": 4.3.4(@loaders.gl/core@4.3.4) - "@loaders.gl/zip": 4.3.4(@loaders.gl/core@4.3.4) - "@math.gl/core": 4.1.0 - "@math.gl/culling": 4.1.0 - "@math.gl/geospatial": 4.1.0 - "@probe.gl/log": 4.1.0 + '@loaders.gl/compression': 4.3.4(@loaders.gl/core@4.3.4) + '@loaders.gl/core': 4.3.4 + '@loaders.gl/crypto': 4.3.4(@loaders.gl/core@4.3.4) + '@loaders.gl/draco': 4.3.4(@loaders.gl/core@4.3.4) + '@loaders.gl/gltf': 4.3.4(@loaders.gl/core@4.3.4) + '@loaders.gl/images': 4.3.4(@loaders.gl/core@4.3.4) + '@loaders.gl/loader-utils': 4.3.4(@loaders.gl/core@4.3.4) + '@loaders.gl/math': 4.3.4(@loaders.gl/core@4.3.4) + '@loaders.gl/tiles': 4.3.4(@loaders.gl/core@4.3.4) + '@loaders.gl/zip': 4.3.4(@loaders.gl/core@4.3.4) + '@math.gl/core': 4.1.0 + '@math.gl/culling': 4.1.0 + '@math.gl/geospatial': 4.1.0 + '@probe.gl/log': 4.1.0 long: 5.3.2 - "@loaders.gl/compression@4.3.4(@loaders.gl/core@4.3.4)": + '@loaders.gl/compression@4.3.4(@loaders.gl/core@4.3.4)': dependencies: - "@loaders.gl/core": 4.3.4 - "@loaders.gl/loader-utils": 4.3.4(@loaders.gl/core@4.3.4) - "@loaders.gl/worker-utils": 4.3.4(@loaders.gl/core@4.3.4) - "@types/brotli": 1.3.4 - "@types/pako": 1.0.7 + '@loaders.gl/core': 4.3.4 + '@loaders.gl/loader-utils': 4.3.4(@loaders.gl/core@4.3.4) + '@loaders.gl/worker-utils': 4.3.4(@loaders.gl/core@4.3.4) + '@types/brotli': 1.3.4 + '@types/pako': 1.0.7 fflate: 0.7.4 lzo-wasm: 0.0.4 pako: 1.0.11 @@ -4519,608 +3031,608 @@ snapshots: lz4js: 0.2.0 zstd-codec: 0.1.5 - "@loaders.gl/core@4.3.4": + '@loaders.gl/core@4.3.4': dependencies: - "@loaders.gl/loader-utils": 4.3.4(@loaders.gl/core@4.3.4) - "@loaders.gl/schema": 4.3.4(@loaders.gl/core@4.3.4) - "@loaders.gl/worker-utils": 4.3.4(@loaders.gl/core@4.3.4) - "@probe.gl/log": 4.1.0 + '@loaders.gl/loader-utils': 4.3.4(@loaders.gl/core@4.3.4) + '@loaders.gl/schema': 4.3.4(@loaders.gl/core@4.3.4) + '@loaders.gl/worker-utils': 4.3.4(@loaders.gl/core@4.3.4) + '@probe.gl/log': 4.1.0 - "@loaders.gl/crypto@4.3.4(@loaders.gl/core@4.3.4)": + '@loaders.gl/crypto@4.3.4(@loaders.gl/core@4.3.4)': dependencies: - "@loaders.gl/core": 4.3.4 - "@loaders.gl/loader-utils": 4.3.4(@loaders.gl/core@4.3.4) - "@loaders.gl/worker-utils": 4.3.4(@loaders.gl/core@4.3.4) - "@types/crypto-js": 4.2.2 + '@loaders.gl/core': 4.3.4 + '@loaders.gl/loader-utils': 4.3.4(@loaders.gl/core@4.3.4) + '@loaders.gl/worker-utils': 4.3.4(@loaders.gl/core@4.3.4) + '@types/crypto-js': 4.2.2 - "@loaders.gl/draco@4.3.4(@loaders.gl/core@4.3.4)": + '@loaders.gl/draco@4.3.4(@loaders.gl/core@4.3.4)': dependencies: - "@loaders.gl/core": 4.3.4 - "@loaders.gl/loader-utils": 4.3.4(@loaders.gl/core@4.3.4) - "@loaders.gl/schema": 4.3.4(@loaders.gl/core@4.3.4) - "@loaders.gl/worker-utils": 4.3.4(@loaders.gl/core@4.3.4) + '@loaders.gl/core': 4.3.4 + '@loaders.gl/loader-utils': 4.3.4(@loaders.gl/core@4.3.4) + '@loaders.gl/schema': 4.3.4(@loaders.gl/core@4.3.4) + '@loaders.gl/worker-utils': 4.3.4(@loaders.gl/core@4.3.4) draco3d: 1.5.7 - "@loaders.gl/gis@4.3.4(@loaders.gl/core@4.3.4)": + '@loaders.gl/gis@4.3.4(@loaders.gl/core@4.3.4)': dependencies: - "@loaders.gl/core": 4.3.4 - "@loaders.gl/loader-utils": 4.3.4(@loaders.gl/core@4.3.4) - "@loaders.gl/schema": 4.3.4(@loaders.gl/core@4.3.4) - "@mapbox/vector-tile": 1.3.1 - "@math.gl/polygon": 4.1.0 + '@loaders.gl/core': 4.3.4 + '@loaders.gl/loader-utils': 4.3.4(@loaders.gl/core@4.3.4) + '@loaders.gl/schema': 4.3.4(@loaders.gl/core@4.3.4) + '@mapbox/vector-tile': 1.3.1 + '@math.gl/polygon': 4.1.0 pbf: 3.3.0 - "@loaders.gl/gltf@4.3.4(@loaders.gl/core@4.3.4)": + '@loaders.gl/gltf@4.3.4(@loaders.gl/core@4.3.4)': dependencies: - "@loaders.gl/core": 4.3.4 - "@loaders.gl/draco": 4.3.4(@loaders.gl/core@4.3.4) - "@loaders.gl/images": 4.3.4(@loaders.gl/core@4.3.4) - "@loaders.gl/loader-utils": 4.3.4(@loaders.gl/core@4.3.4) - "@loaders.gl/schema": 4.3.4(@loaders.gl/core@4.3.4) - "@loaders.gl/textures": 4.3.4(@loaders.gl/core@4.3.4) - "@math.gl/core": 4.1.0 + '@loaders.gl/core': 4.3.4 + '@loaders.gl/draco': 4.3.4(@loaders.gl/core@4.3.4) + '@loaders.gl/images': 4.3.4(@loaders.gl/core@4.3.4) + '@loaders.gl/loader-utils': 4.3.4(@loaders.gl/core@4.3.4) + '@loaders.gl/schema': 4.3.4(@loaders.gl/core@4.3.4) + '@loaders.gl/textures': 4.3.4(@loaders.gl/core@4.3.4) + '@math.gl/core': 4.1.0 - "@loaders.gl/images@4.3.4(@loaders.gl/core@4.3.4)": + '@loaders.gl/images@4.3.4(@loaders.gl/core@4.3.4)': dependencies: - "@loaders.gl/core": 4.3.4 - "@loaders.gl/loader-utils": 4.3.4(@loaders.gl/core@4.3.4) + '@loaders.gl/core': 4.3.4 + '@loaders.gl/loader-utils': 4.3.4(@loaders.gl/core@4.3.4) - "@loaders.gl/loader-utils@4.3.4(@loaders.gl/core@4.3.4)": + '@loaders.gl/loader-utils@4.3.4(@loaders.gl/core@4.3.4)': dependencies: - "@loaders.gl/core": 4.3.4 - "@loaders.gl/schema": 4.3.4(@loaders.gl/core@4.3.4) - "@loaders.gl/worker-utils": 4.3.4(@loaders.gl/core@4.3.4) - "@probe.gl/log": 4.1.0 - "@probe.gl/stats": 4.1.0 + '@loaders.gl/core': 4.3.4 + '@loaders.gl/schema': 4.3.4(@loaders.gl/core@4.3.4) + '@loaders.gl/worker-utils': 4.3.4(@loaders.gl/core@4.3.4) + '@probe.gl/log': 4.1.0 + '@probe.gl/stats': 4.1.0 - "@loaders.gl/math@4.3.4(@loaders.gl/core@4.3.4)": + '@loaders.gl/math@4.3.4(@loaders.gl/core@4.3.4)': dependencies: - "@loaders.gl/core": 4.3.4 - "@loaders.gl/images": 4.3.4(@loaders.gl/core@4.3.4) - "@loaders.gl/loader-utils": 4.3.4(@loaders.gl/core@4.3.4) - "@math.gl/core": 4.1.0 + '@loaders.gl/core': 4.3.4 + '@loaders.gl/images': 4.3.4(@loaders.gl/core@4.3.4) + '@loaders.gl/loader-utils': 4.3.4(@loaders.gl/core@4.3.4) + '@math.gl/core': 4.1.0 - "@loaders.gl/mvt@4.3.4(@loaders.gl/core@4.3.4)": + '@loaders.gl/mvt@4.3.4(@loaders.gl/core@4.3.4)': dependencies: - "@loaders.gl/core": 4.3.4 - "@loaders.gl/gis": 4.3.4(@loaders.gl/core@4.3.4) - "@loaders.gl/images": 4.3.4(@loaders.gl/core@4.3.4) - "@loaders.gl/loader-utils": 4.3.4(@loaders.gl/core@4.3.4) - "@loaders.gl/schema": 4.3.4(@loaders.gl/core@4.3.4) - "@math.gl/polygon": 4.1.0 - "@probe.gl/stats": 4.1.0 + '@loaders.gl/core': 4.3.4 + '@loaders.gl/gis': 4.3.4(@loaders.gl/core@4.3.4) + '@loaders.gl/images': 4.3.4(@loaders.gl/core@4.3.4) + '@loaders.gl/loader-utils': 4.3.4(@loaders.gl/core@4.3.4) + '@loaders.gl/schema': 4.3.4(@loaders.gl/core@4.3.4) + '@math.gl/polygon': 4.1.0 + '@probe.gl/stats': 4.1.0 pbf: 3.3.0 - "@loaders.gl/schema@4.3.4(@loaders.gl/core@4.3.4)": + '@loaders.gl/schema@4.3.4(@loaders.gl/core@4.3.4)': dependencies: - "@loaders.gl/core": 4.3.4 - "@types/geojson": 7946.0.16 + '@loaders.gl/core': 4.3.4 + '@types/geojson': 7946.0.16 - "@loaders.gl/terrain@4.3.4(@loaders.gl/core@4.3.4)": + '@loaders.gl/terrain@4.3.4(@loaders.gl/core@4.3.4)': dependencies: - "@loaders.gl/core": 4.3.4 - "@loaders.gl/images": 4.3.4(@loaders.gl/core@4.3.4) - "@loaders.gl/loader-utils": 4.3.4(@loaders.gl/core@4.3.4) - "@loaders.gl/schema": 4.3.4(@loaders.gl/core@4.3.4) - "@mapbox/martini": 0.2.0 + '@loaders.gl/core': 4.3.4 + '@loaders.gl/images': 4.3.4(@loaders.gl/core@4.3.4) + '@loaders.gl/loader-utils': 4.3.4(@loaders.gl/core@4.3.4) + '@loaders.gl/schema': 4.3.4(@loaders.gl/core@4.3.4) + '@mapbox/martini': 0.2.0 - "@loaders.gl/textures@4.3.4(@loaders.gl/core@4.3.4)": + '@loaders.gl/textures@4.3.4(@loaders.gl/core@4.3.4)': dependencies: - "@loaders.gl/core": 4.3.4 - "@loaders.gl/images": 4.3.4(@loaders.gl/core@4.3.4) - "@loaders.gl/loader-utils": 4.3.4(@loaders.gl/core@4.3.4) - "@loaders.gl/schema": 4.3.4(@loaders.gl/core@4.3.4) - "@loaders.gl/worker-utils": 4.3.4(@loaders.gl/core@4.3.4) - "@math.gl/types": 4.1.0 + '@loaders.gl/core': 4.3.4 + '@loaders.gl/images': 4.3.4(@loaders.gl/core@4.3.4) + '@loaders.gl/loader-utils': 4.3.4(@loaders.gl/core@4.3.4) + '@loaders.gl/schema': 4.3.4(@loaders.gl/core@4.3.4) + '@loaders.gl/worker-utils': 4.3.4(@loaders.gl/core@4.3.4) + '@math.gl/types': 4.1.0 ktx-parse: 0.7.1 texture-compressor: 1.0.2 - "@loaders.gl/tiles@4.3.4(@loaders.gl/core@4.3.4)": - dependencies: - "@loaders.gl/core": 4.3.4 - "@loaders.gl/loader-utils": 4.3.4(@loaders.gl/core@4.3.4) - "@loaders.gl/math": 4.3.4(@loaders.gl/core@4.3.4) - "@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.0 - - "@loaders.gl/wms@4.3.4(@loaders.gl/core@4.3.4)": - dependencies: - "@loaders.gl/core": 4.3.4 - "@loaders.gl/images": 4.3.4(@loaders.gl/core@4.3.4) - "@loaders.gl/loader-utils": 4.3.4(@loaders.gl/core@4.3.4) - "@loaders.gl/schema": 4.3.4(@loaders.gl/core@4.3.4) - "@loaders.gl/xml": 4.3.4(@loaders.gl/core@4.3.4) - "@turf/rewind": 5.1.5 + '@loaders.gl/tiles@4.3.4(@loaders.gl/core@4.3.4)': + dependencies: + '@loaders.gl/core': 4.3.4 + '@loaders.gl/loader-utils': 4.3.4(@loaders.gl/core@4.3.4) + '@loaders.gl/math': 4.3.4(@loaders.gl/core@4.3.4) + '@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.0 + + '@loaders.gl/wms@4.3.4(@loaders.gl/core@4.3.4)': + dependencies: + '@loaders.gl/core': 4.3.4 + '@loaders.gl/images': 4.3.4(@loaders.gl/core@4.3.4) + '@loaders.gl/loader-utils': 4.3.4(@loaders.gl/core@4.3.4) + '@loaders.gl/schema': 4.3.4(@loaders.gl/core@4.3.4) + '@loaders.gl/xml': 4.3.4(@loaders.gl/core@4.3.4) + '@turf/rewind': 5.1.5 deep-strict-equal: 0.2.0 - "@loaders.gl/worker-utils@4.3.4(@loaders.gl/core@4.3.4)": + '@loaders.gl/worker-utils@4.3.4(@loaders.gl/core@4.3.4)': dependencies: - "@loaders.gl/core": 4.3.4 + '@loaders.gl/core': 4.3.4 - "@loaders.gl/xml@4.3.4(@loaders.gl/core@4.3.4)": + '@loaders.gl/xml@4.3.4(@loaders.gl/core@4.3.4)': dependencies: - "@loaders.gl/core": 4.3.4 - "@loaders.gl/loader-utils": 4.3.4(@loaders.gl/core@4.3.4) - "@loaders.gl/schema": 4.3.4(@loaders.gl/core@4.3.4) + '@loaders.gl/core': 4.3.4 + '@loaders.gl/loader-utils': 4.3.4(@loaders.gl/core@4.3.4) + '@loaders.gl/schema': 4.3.4(@loaders.gl/core@4.3.4) fast-xml-parser: 4.5.3 - "@loaders.gl/zip@4.3.4(@loaders.gl/core@4.3.4)": + '@loaders.gl/zip@4.3.4(@loaders.gl/core@4.3.4)': dependencies: - "@loaders.gl/compression": 4.3.4(@loaders.gl/core@4.3.4) - "@loaders.gl/core": 4.3.4 - "@loaders.gl/crypto": 4.3.4(@loaders.gl/core@4.3.4) - "@loaders.gl/loader-utils": 4.3.4(@loaders.gl/core@4.3.4) + '@loaders.gl/compression': 4.3.4(@loaders.gl/core@4.3.4) + '@loaders.gl/core': 4.3.4 + '@loaders.gl/crypto': 4.3.4(@loaders.gl/core@4.3.4) + '@loaders.gl/loader-utils': 4.3.4(@loaders.gl/core@4.3.4) jszip: 3.10.1 md5: 2.3.0 - "@luma.gl/constants@9.2.6": {} + '@luma.gl/constants@9.2.6': {} - "@luma.gl/core@9.2.6": + '@luma.gl/core@9.2.6': dependencies: - "@math.gl/types": 4.1.0 - "@probe.gl/env": 4.1.0 - "@probe.gl/log": 4.1.0 - "@probe.gl/stats": 4.1.0 - "@types/offscreencanvas": 2019.7.3 + '@math.gl/types': 4.1.0 + '@probe.gl/env': 4.1.0 + '@probe.gl/log': 4.1.0 + '@probe.gl/stats': 4.1.0 + '@types/offscreencanvas': 2019.7.3 - "@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6))": + '@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6))': dependencies: - "@luma.gl/core": 9.2.6 - "@luma.gl/shadertools": 9.2.6(@luma.gl/core@9.2.6) - "@math.gl/core": 4.1.0 - "@math.gl/types": 4.1.0 - "@probe.gl/log": 4.1.0 - "@probe.gl/stats": 4.1.0 + '@luma.gl/core': 9.2.6 + '@luma.gl/shadertools': 9.2.6(@luma.gl/core@9.2.6) + '@math.gl/core': 4.1.0 + '@math.gl/types': 4.1.0 + '@probe.gl/log': 4.1.0 + '@probe.gl/stats': 4.1.0 - "@luma.gl/gltf@9.2.6(@luma.gl/constants@9.2.6)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6))": + '@luma.gl/gltf@9.2.6(@luma.gl/constants@9.2.6)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6))': dependencies: - "@loaders.gl/core": 4.3.4 - "@loaders.gl/gltf": 4.3.4(@loaders.gl/core@4.3.4) - "@loaders.gl/textures": 4.3.4(@loaders.gl/core@4.3.4) - "@luma.gl/constants": 9.2.6 - "@luma.gl/core": 9.2.6 - "@luma.gl/engine": 9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)) - "@luma.gl/shadertools": 9.2.6(@luma.gl/core@9.2.6) - "@math.gl/core": 4.1.0 + '@loaders.gl/core': 4.3.4 + '@loaders.gl/gltf': 4.3.4(@loaders.gl/core@4.3.4) + '@loaders.gl/textures': 4.3.4(@loaders.gl/core@4.3.4) + '@luma.gl/constants': 9.2.6 + '@luma.gl/core': 9.2.6 + '@luma.gl/engine': 9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)) + '@luma.gl/shadertools': 9.2.6(@luma.gl/core@9.2.6) + '@math.gl/core': 4.1.0 - "@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)": + '@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)': dependencies: - "@luma.gl/core": 9.2.6 - "@math.gl/core": 4.1.0 - "@math.gl/types": 4.1.0 + '@luma.gl/core': 9.2.6 + '@math.gl/core': 4.1.0 + '@math.gl/types': 4.1.0 wgsl_reflect: 1.2.3 - "@luma.gl/webgl@9.2.6(@luma.gl/core@9.2.6)": + '@luma.gl/webgl@9.2.6(@luma.gl/core@9.2.6)': dependencies: - "@luma.gl/constants": 9.2.6 - "@luma.gl/core": 9.2.6 - "@math.gl/types": 4.1.0 - "@probe.gl/env": 4.1.0 + '@luma.gl/constants': 9.2.6 + '@luma.gl/core': 9.2.6 + '@math.gl/types': 4.1.0 + '@probe.gl/env': 4.1.0 - "@mapbox/geojson-rewind@0.5.2": + '@mapbox/geojson-rewind@0.5.2': dependencies: get-stream: 6.0.1 minimist: 1.2.8 - "@mapbox/jsonlint-lines-primitives@2.0.2": {} + '@mapbox/jsonlint-lines-primitives@2.0.2': {} - "@mapbox/martini@0.2.0": {} + '@mapbox/martini@0.2.0': {} - "@mapbox/point-geometry@0.1.0": {} + '@mapbox/point-geometry@0.1.0': {} - "@mapbox/point-geometry@1.1.0": {} + '@mapbox/point-geometry@1.1.0': {} - "@mapbox/tiny-sdf@2.0.7": {} + '@mapbox/tiny-sdf@2.0.7': {} - "@mapbox/unitbezier@0.0.1": {} + '@mapbox/unitbezier@0.0.1': {} - "@mapbox/vector-tile@1.3.1": + '@mapbox/vector-tile@1.3.1': dependencies: - "@mapbox/point-geometry": 0.1.0 + '@mapbox/point-geometry': 0.1.0 - "@mapbox/vector-tile@2.0.4": + '@mapbox/vector-tile@2.0.4': dependencies: - "@mapbox/point-geometry": 1.1.0 - "@types/geojson": 7946.0.16 + '@mapbox/point-geometry': 1.1.0 + '@types/geojson': 7946.0.16 pbf: 4.0.1 - "@mapbox/whoots-js@3.1.0": {} + '@mapbox/whoots-js@3.1.0': {} - "@maplibre/geojson-vt@5.0.4": {} + '@maplibre/geojson-vt@5.0.4': {} - "@maplibre/maplibre-gl-style-spec@19.3.3": + '@maplibre/maplibre-gl-style-spec@19.3.3': dependencies: - "@mapbox/jsonlint-lines-primitives": 2.0.2 - "@mapbox/unitbezier": 0.0.1 + '@mapbox/jsonlint-lines-primitives': 2.0.2 + '@mapbox/unitbezier': 0.0.1 json-stringify-pretty-compact: 3.0.0 minimist: 1.2.8 rw: 1.3.3 sort-object: 3.0.3 - "@maplibre/maplibre-gl-style-spec@24.4.1": + '@maplibre/maplibre-gl-style-spec@24.4.1': dependencies: - "@mapbox/jsonlint-lines-primitives": 2.0.2 - "@mapbox/unitbezier": 0.0.1 + '@mapbox/jsonlint-lines-primitives': 2.0.2 + '@mapbox/unitbezier': 0.0.1 json-stringify-pretty-compact: 4.0.0 minimist: 1.2.8 quickselect: 3.0.0 rw: 1.3.3 tinyqueue: 3.0.0 - "@maplibre/mlt@1.1.2": + '@maplibre/mlt@1.1.2': dependencies: - "@mapbox/point-geometry": 1.1.0 + '@mapbox/point-geometry': 1.1.0 - "@maplibre/vt-pbf@4.2.1": + '@maplibre/vt-pbf@4.2.1': dependencies: - "@mapbox/point-geometry": 1.1.0 - "@mapbox/vector-tile": 2.0.4 - "@maplibre/geojson-vt": 5.0.4 - "@types/geojson": 7946.0.16 - "@types/supercluster": 7.1.3 + '@mapbox/point-geometry': 1.1.0 + '@mapbox/vector-tile': 2.0.4 + '@maplibre/geojson-vt': 5.0.4 + '@types/geojson': 7946.0.16 + '@types/supercluster': 7.1.3 pbf: 4.0.1 supercluster: 8.0.1 - "@math.gl/core@4.1.0": + '@math.gl/core@4.1.0': dependencies: - "@math.gl/types": 4.1.0 + '@math.gl/types': 4.1.0 - "@math.gl/culling@4.1.0": + '@math.gl/culling@4.1.0': dependencies: - "@math.gl/core": 4.1.0 - "@math.gl/types": 4.1.0 + '@math.gl/core': 4.1.0 + '@math.gl/types': 4.1.0 - "@math.gl/geospatial@4.1.0": + '@math.gl/geospatial@4.1.0': dependencies: - "@math.gl/core": 4.1.0 - "@math.gl/types": 4.1.0 + '@math.gl/core': 4.1.0 + '@math.gl/types': 4.1.0 - "@math.gl/polygon@4.1.0": + '@math.gl/polygon@4.1.0': dependencies: - "@math.gl/core": 4.1.0 + '@math.gl/core': 4.1.0 - "@math.gl/sun@4.1.0": {} + '@math.gl/sun@4.1.0': {} - "@math.gl/types@4.1.0": {} + '@math.gl/types@4.1.0': {} - "@math.gl/web-mercator@4.1.0": + '@math.gl/web-mercator@4.1.0': dependencies: - "@math.gl/core": 4.1.0 + '@math.gl/core': 4.1.0 - "@nodelib/fs.scandir@2.1.5": + '@nodelib/fs.scandir@2.1.5': dependencies: - "@nodelib/fs.stat": 2.0.5 + '@nodelib/fs.stat': 2.0.5 run-parallel: 1.2.0 - "@nodelib/fs.stat@2.0.5": {} + '@nodelib/fs.stat@2.0.5': {} - "@nodelib/fs.walk@1.2.8": + '@nodelib/fs.walk@1.2.8': dependencies: - "@nodelib/fs.scandir": 2.1.5 + '@nodelib/fs.scandir': 2.1.5 fastq: 1.20.1 - "@petamoriken/float16@3.9.3": {} + '@petamoriken/float16@3.9.3': {} - "@probe.gl/env@4.1.0": {} + '@probe.gl/env@4.1.0': {} - "@probe.gl/log@4.1.0": + '@probe.gl/log@4.1.0': dependencies: - "@probe.gl/env": 4.1.0 + '@probe.gl/env': 4.1.0 - "@probe.gl/stats@4.1.0": {} + '@probe.gl/stats@4.1.0': {} - "@publint/pack@0.1.3": {} + '@publint/pack@0.1.3': {} - "@rolldown/pluginutils@1.0.0-beta.53": {} + '@rolldown/pluginutils@1.0.0-beta.53': {} - "@rollup/rollup-android-arm-eabi@4.54.0": + '@rollup/rollup-android-arm-eabi@4.54.0': optional: true - "@rollup/rollup-android-arm-eabi@4.57.1": + '@rollup/rollup-android-arm-eabi@4.57.1': optional: true - "@rollup/rollup-android-arm64@4.54.0": + '@rollup/rollup-android-arm64@4.54.0': optional: true - "@rollup/rollup-android-arm64@4.57.1": + '@rollup/rollup-android-arm64@4.57.1': optional: true - "@rollup/rollup-darwin-arm64@4.54.0": + '@rollup/rollup-darwin-arm64@4.54.0': optional: true - "@rollup/rollup-darwin-arm64@4.57.1": + '@rollup/rollup-darwin-arm64@4.57.1': optional: true - "@rollup/rollup-darwin-x64@4.54.0": + '@rollup/rollup-darwin-x64@4.54.0': optional: true - "@rollup/rollup-darwin-x64@4.57.1": + '@rollup/rollup-darwin-x64@4.57.1': optional: true - "@rollup/rollup-freebsd-arm64@4.54.0": + '@rollup/rollup-freebsd-arm64@4.54.0': optional: true - "@rollup/rollup-freebsd-arm64@4.57.1": + '@rollup/rollup-freebsd-arm64@4.57.1': optional: true - "@rollup/rollup-freebsd-x64@4.54.0": + '@rollup/rollup-freebsd-x64@4.54.0': optional: true - "@rollup/rollup-freebsd-x64@4.57.1": + '@rollup/rollup-freebsd-x64@4.57.1': optional: true - "@rollup/rollup-linux-arm-gnueabihf@4.54.0": + '@rollup/rollup-linux-arm-gnueabihf@4.54.0': optional: true - "@rollup/rollup-linux-arm-gnueabihf@4.57.1": + '@rollup/rollup-linux-arm-gnueabihf@4.57.1': optional: true - "@rollup/rollup-linux-arm-musleabihf@4.54.0": + '@rollup/rollup-linux-arm-musleabihf@4.54.0': optional: true - "@rollup/rollup-linux-arm-musleabihf@4.57.1": + '@rollup/rollup-linux-arm-musleabihf@4.57.1': optional: true - "@rollup/rollup-linux-arm64-gnu@4.54.0": + '@rollup/rollup-linux-arm64-gnu@4.54.0': optional: true - "@rollup/rollup-linux-arm64-gnu@4.57.1": + '@rollup/rollup-linux-arm64-gnu@4.57.1': optional: true - "@rollup/rollup-linux-arm64-musl@4.54.0": + '@rollup/rollup-linux-arm64-musl@4.54.0': optional: true - "@rollup/rollup-linux-arm64-musl@4.57.1": + '@rollup/rollup-linux-arm64-musl@4.57.1': optional: true - "@rollup/rollup-linux-loong64-gnu@4.54.0": + '@rollup/rollup-linux-loong64-gnu@4.54.0': optional: true - "@rollup/rollup-linux-loong64-gnu@4.57.1": + '@rollup/rollup-linux-loong64-gnu@4.57.1': optional: true - "@rollup/rollup-linux-loong64-musl@4.57.1": + '@rollup/rollup-linux-loong64-musl@4.57.1': optional: true - "@rollup/rollup-linux-ppc64-gnu@4.54.0": + '@rollup/rollup-linux-ppc64-gnu@4.54.0': optional: true - "@rollup/rollup-linux-ppc64-gnu@4.57.1": + '@rollup/rollup-linux-ppc64-gnu@4.57.1': optional: true - "@rollup/rollup-linux-ppc64-musl@4.57.1": + '@rollup/rollup-linux-ppc64-musl@4.57.1': optional: true - "@rollup/rollup-linux-riscv64-gnu@4.54.0": + '@rollup/rollup-linux-riscv64-gnu@4.54.0': optional: true - "@rollup/rollup-linux-riscv64-gnu@4.57.1": + '@rollup/rollup-linux-riscv64-gnu@4.57.1': optional: true - "@rollup/rollup-linux-riscv64-musl@4.54.0": + '@rollup/rollup-linux-riscv64-musl@4.54.0': optional: true - "@rollup/rollup-linux-riscv64-musl@4.57.1": + '@rollup/rollup-linux-riscv64-musl@4.57.1': optional: true - "@rollup/rollup-linux-s390x-gnu@4.54.0": + '@rollup/rollup-linux-s390x-gnu@4.54.0': optional: true - "@rollup/rollup-linux-s390x-gnu@4.57.1": + '@rollup/rollup-linux-s390x-gnu@4.57.1': optional: true - "@rollup/rollup-linux-x64-gnu@4.54.0": + '@rollup/rollup-linux-x64-gnu@4.54.0': optional: true - "@rollup/rollup-linux-x64-gnu@4.57.1": + '@rollup/rollup-linux-x64-gnu@4.57.1': optional: true - "@rollup/rollup-linux-x64-musl@4.54.0": + '@rollup/rollup-linux-x64-musl@4.54.0': optional: true - "@rollup/rollup-linux-x64-musl@4.57.1": + '@rollup/rollup-linux-x64-musl@4.57.1': optional: true - "@rollup/rollup-openbsd-x64@4.57.1": + '@rollup/rollup-openbsd-x64@4.57.1': optional: true - "@rollup/rollup-openharmony-arm64@4.54.0": + '@rollup/rollup-openharmony-arm64@4.54.0': optional: true - "@rollup/rollup-openharmony-arm64@4.57.1": + '@rollup/rollup-openharmony-arm64@4.57.1': optional: true - "@rollup/rollup-win32-arm64-msvc@4.54.0": + '@rollup/rollup-win32-arm64-msvc@4.54.0': optional: true - "@rollup/rollup-win32-arm64-msvc@4.57.1": + '@rollup/rollup-win32-arm64-msvc@4.57.1': optional: true - "@rollup/rollup-win32-ia32-msvc@4.54.0": + '@rollup/rollup-win32-ia32-msvc@4.54.0': optional: true - "@rollup/rollup-win32-ia32-msvc@4.57.1": + '@rollup/rollup-win32-ia32-msvc@4.57.1': optional: true - "@rollup/rollup-win32-x64-gnu@4.54.0": + '@rollup/rollup-win32-x64-gnu@4.54.0': optional: true - "@rollup/rollup-win32-x64-gnu@4.57.1": + '@rollup/rollup-win32-x64-gnu@4.57.1': optional: true - "@rollup/rollup-win32-x64-msvc@4.54.0": + '@rollup/rollup-win32-x64-msvc@4.54.0': optional: true - "@rollup/rollup-win32-x64-msvc@4.57.1": + '@rollup/rollup-win32-x64-msvc@4.57.1': optional: true - "@standard-schema/spec@1.1.0": {} + '@standard-schema/spec@1.1.0': {} - "@turf/boolean-clockwise@5.1.5": + '@turf/boolean-clockwise@5.1.5': dependencies: - "@turf/helpers": 5.1.5 - "@turf/invariant": 5.2.0 + '@turf/helpers': 5.1.5 + '@turf/invariant': 5.2.0 - "@turf/clone@5.1.5": + '@turf/clone@5.1.5': dependencies: - "@turf/helpers": 5.1.5 + '@turf/helpers': 5.1.5 - "@turf/helpers@5.1.5": {} + '@turf/helpers@5.1.5': {} - "@turf/invariant@5.2.0": + '@turf/invariant@5.2.0': dependencies: - "@turf/helpers": 5.1.5 + '@turf/helpers': 5.1.5 - "@turf/meta@5.2.0": + '@turf/meta@5.2.0': dependencies: - "@turf/helpers": 5.1.5 + '@turf/helpers': 5.1.5 - "@turf/rewind@5.1.5": + '@turf/rewind@5.1.5': dependencies: - "@turf/boolean-clockwise": 5.1.5 - "@turf/clone": 5.1.5 - "@turf/helpers": 5.1.5 - "@turf/invariant": 5.2.0 - "@turf/meta": 5.2.0 + '@turf/boolean-clockwise': 5.1.5 + '@turf/clone': 5.1.5 + '@turf/helpers': 5.1.5 + '@turf/invariant': 5.2.0 + '@turf/meta': 5.2.0 - "@types/babel__core@7.20.5": + '@types/babel__core@7.20.5': dependencies: - "@babel/parser": 7.28.5 - "@babel/types": 7.28.5 - "@types/babel__generator": 7.27.0 - "@types/babel__template": 7.4.4 - "@types/babel__traverse": 7.28.0 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + '@types/babel__generator': 7.27.0 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.28.0 - "@types/babel__generator@7.27.0": + '@types/babel__generator@7.27.0': dependencies: - "@babel/types": 7.28.5 + '@babel/types': 7.28.5 - "@types/babel__template@7.4.4": + '@types/babel__template@7.4.4': dependencies: - "@babel/parser": 7.28.5 - "@babel/types": 7.28.5 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 - "@types/babel__traverse@7.28.0": + '@types/babel__traverse@7.28.0': dependencies: - "@babel/types": 7.28.5 + '@babel/types': 7.28.5 - "@types/brotli@1.3.4": + '@types/brotli@1.3.4': dependencies: - "@types/node": 25.1.0 + '@types/node': 25.1.0 - "@types/chai@5.2.3": + '@types/chai@5.2.3': dependencies: - "@types/deep-eql": 4.0.2 + '@types/deep-eql': 4.0.2 assertion-error: 2.0.1 - "@types/crypto-js@4.2.2": {} + '@types/crypto-js@4.2.2': {} - "@types/deep-eql@4.0.2": {} + '@types/deep-eql@4.0.2': {} - "@types/estree@1.0.8": {} + '@types/estree@1.0.8': {} - "@types/geojson@7946.0.16": {} + '@types/geojson@7946.0.16': {} - "@types/json-schema@7.0.15": {} + '@types/json-schema@7.0.15': {} - "@types/lodash@4.17.23": {} + '@types/lodash@4.17.23': {} - "@types/node@20.19.30": + '@types/node@20.19.30': dependencies: undici-types: 6.21.0 optional: true - "@types/node@25.1.0": + '@types/node@25.1.0': dependencies: undici-types: 7.16.0 - "@types/offscreencanvas@2019.7.3": {} + '@types/offscreencanvas@2019.7.3': {} - "@types/pako@1.0.7": {} + '@types/pako@1.0.7': {} - "@types/react-dom@19.2.3(@types/react@19.2.10)": + '@types/react-dom@19.2.3(@types/react@19.2.10)': dependencies: - "@types/react": 19.2.10 + '@types/react': 19.2.10 - "@types/react@19.2.10": + '@types/react@19.2.10': dependencies: csstype: 3.2.3 - "@types/supercluster@7.1.3": + '@types/supercluster@7.1.3': dependencies: - "@types/geojson": 7946.0.16 + '@types/geojson': 7946.0.16 - "@types/whatwg-mimetype@3.0.2": + '@types/whatwg-mimetype@3.0.2': optional: true - "@vis.gl/react-mapbox@8.1.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)": + '@vis.gl/react-mapbox@8.1.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - "@vis.gl/react-maplibre@8.1.0(maplibre-gl@5.17.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)": + '@vis.gl/react-maplibre@8.1.0(maplibre-gl@5.17.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - "@maplibre/maplibre-gl-style-spec": 19.3.3 + '@maplibre/maplibre-gl-style-spec': 19.3.3 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) optionalDependencies: maplibre-gl: 5.17.0 - "@vitejs/plugin-react@5.1.2(vite@7.3.1(@types/node@25.1.0)(tsx@4.21.0))": + '@vitejs/plugin-react@5.1.2(vite@7.3.1(@types/node@25.1.0)(tsx@4.21.0))': dependencies: - "@babel/core": 7.28.5 - "@babel/plugin-transform-react-jsx-self": 7.27.1(@babel/core@7.28.5) - "@babel/plugin-transform-react-jsx-source": 7.27.1(@babel/core@7.28.5) - "@rolldown/pluginutils": 1.0.0-beta.53 - "@types/babel__core": 7.20.5 + '@babel/core': 7.28.5 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.5) + '@rolldown/pluginutils': 1.0.0-beta.53 + '@types/babel__core': 7.20.5 react-refresh: 0.18.0 vite: 7.3.1(@types/node@25.1.0)(tsx@4.21.0) transitivePeerDependencies: - supports-color - "@vitest/expect@4.0.18": + '@vitest/expect@4.0.18': dependencies: - "@standard-schema/spec": 1.1.0 - "@types/chai": 5.2.3 - "@vitest/spy": 4.0.18 - "@vitest/utils": 4.0.18 + '@standard-schema/spec': 1.1.0 + '@types/chai': 5.2.3 + '@vitest/spy': 4.0.18 + '@vitest/utils': 4.0.18 chai: 6.2.2 tinyrainbow: 3.0.3 - "@vitest/mocker@4.0.18(vite@7.3.1(@types/node@25.1.0)(tsx@4.21.0))": + '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@25.1.0)(tsx@4.21.0))': dependencies: - "@vitest/spy": 4.0.18 + '@vitest/spy': 4.0.18 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: vite: 7.3.1(@types/node@25.1.0)(tsx@4.21.0) - "@vitest/pretty-format@4.0.18": + '@vitest/pretty-format@4.0.18': dependencies: tinyrainbow: 3.0.3 - "@vitest/runner@4.0.18": + '@vitest/runner@4.0.18': dependencies: - "@vitest/utils": 4.0.18 + '@vitest/utils': 4.0.18 pathe: 2.0.3 - "@vitest/snapshot@4.0.18": + '@vitest/snapshot@4.0.18': dependencies: - "@vitest/pretty-format": 4.0.18 + '@vitest/pretty-format': 4.0.18 magic-string: 0.30.21 pathe: 2.0.3 - "@vitest/spy@4.0.18": {} + '@vitest/spy@4.0.18': {} - "@vitest/utils@4.0.18": + '@vitest/utils@4.0.18': dependencies: - "@vitest/pretty-format": 4.0.18 + '@vitest/pretty-format': 4.0.18 tinyrainbow: 3.0.3 - "@zarrita/storage@0.1.4": + '@zarrita/storage@0.1.4': dependencies: reference-spec-reader: 0.2.0 unzipit: 1.4.3 @@ -5233,8 +3745,8 @@ snapshots: cssstyle@5.3.6: dependencies: - "@asamuzakjp/css-color": 4.1.1 - "@csstools/css-syntax-patches-for-csstree": 1.0.22 + '@asamuzakjp/css-color': 4.1.1 + '@csstools/css-syntax-patches-for-csstree': 1.0.22 css-tree: 3.1.0 lru-cache: 11.2.4 @@ -5275,32 +3787,32 @@ snapshots: esbuild@0.27.2: optionalDependencies: - "@esbuild/aix-ppc64": 0.27.2 - "@esbuild/android-arm": 0.27.2 - "@esbuild/android-arm64": 0.27.2 - "@esbuild/android-x64": 0.27.2 - "@esbuild/darwin-arm64": 0.27.2 - "@esbuild/darwin-x64": 0.27.2 - "@esbuild/freebsd-arm64": 0.27.2 - "@esbuild/freebsd-x64": 0.27.2 - "@esbuild/linux-arm": 0.27.2 - "@esbuild/linux-arm64": 0.27.2 - "@esbuild/linux-ia32": 0.27.2 - "@esbuild/linux-loong64": 0.27.2 - "@esbuild/linux-mips64el": 0.27.2 - "@esbuild/linux-ppc64": 0.27.2 - "@esbuild/linux-riscv64": 0.27.2 - "@esbuild/linux-s390x": 0.27.2 - "@esbuild/linux-x64": 0.27.2 - "@esbuild/netbsd-arm64": 0.27.2 - "@esbuild/netbsd-x64": 0.27.2 - "@esbuild/openbsd-arm64": 0.27.2 - "@esbuild/openbsd-x64": 0.27.2 - "@esbuild/openharmony-arm64": 0.27.2 - "@esbuild/sunos-x64": 0.27.2 - "@esbuild/win32-arm64": 0.27.2 - "@esbuild/win32-ia32": 0.27.2 - "@esbuild/win32-x64": 0.27.2 + '@esbuild/aix-ppc64': 0.27.2 + '@esbuild/android-arm': 0.27.2 + '@esbuild/android-arm64': 0.27.2 + '@esbuild/android-x64': 0.27.2 + '@esbuild/darwin-arm64': 0.27.2 + '@esbuild/darwin-x64': 0.27.2 + '@esbuild/freebsd-arm64': 0.27.2 + '@esbuild/freebsd-x64': 0.27.2 + '@esbuild/linux-arm': 0.27.2 + '@esbuild/linux-arm64': 0.27.2 + '@esbuild/linux-ia32': 0.27.2 + '@esbuild/linux-loong64': 0.27.2 + '@esbuild/linux-mips64el': 0.27.2 + '@esbuild/linux-ppc64': 0.27.2 + '@esbuild/linux-riscv64': 0.27.2 + '@esbuild/linux-s390x': 0.27.2 + '@esbuild/linux-x64': 0.27.2 + '@esbuild/netbsd-arm64': 0.27.2 + '@esbuild/netbsd-x64': 0.27.2 + '@esbuild/openbsd-arm64': 0.27.2 + '@esbuild/openbsd-x64': 0.27.2 + '@esbuild/openharmony-arm64': 0.27.2 + '@esbuild/sunos-x64': 0.27.2 + '@esbuild/win32-arm64': 0.27.2 + '@esbuild/win32-ia32': 0.27.2 + '@esbuild/win32-x64': 0.27.2 escalade@3.2.0: {} @@ -5308,7 +3820,7 @@ snapshots: estree-walker@3.0.3: dependencies: - "@types/estree": 1.0.8 + '@types/estree': 1.0.8 expect-type@1.3.0: {} @@ -5323,8 +3835,8 @@ snapshots: fast-glob@3.3.3: dependencies: - "@nodelib/fs.stat": 2.0.5 - "@nodelib/fs.walk": 1.2.8 + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 micromatch: 4.0.8 @@ -5395,7 +3907,7 @@ snapshots: geotiff@2.1.3: dependencies: - "@petamoriken/float16": 3.9.3 + '@petamoriken/float16': 3.9.3 lerc: 3.0.0 pako: 2.1.0 parse-headers: 2.0.6 @@ -5443,16 +3955,16 @@ snapshots: happy-dom@20.0.11: dependencies: - "@types/node": 20.19.30 - "@types/whatwg-mimetype": 3.0.2 + '@types/node': 20.19.30 + '@types/whatwg-mimetype': 3.0.2 whatwg-mimetype: 3.0.0 optional: true html-encoding-sniffer@6.0.0: dependencies: - "@exodus/bytes": 1.8.0 + '@exodus/bytes': 1.8.0 transitivePeerDependencies: - - "@exodus/crypto" + - '@exodus/crypto' http-proxy-agent@7.0.2: dependencies: @@ -5516,9 +4028,9 @@ snapshots: jsdom@27.4.0: dependencies: - "@acemir/cssom": 0.9.30 - "@asamuzakjp/dom-selector": 6.7.6 - "@exodus/bytes": 1.8.0 + '@acemir/cssom': 0.9.30 + '@asamuzakjp/dom-selector': 6.7.6 + '@exodus/bytes': 1.8.0 cssstyle: 5.3.6 data-urls: 6.0.0 decimal.js: 10.6.0 @@ -5537,7 +4049,7 @@ snapshots: ws: 8.18.3 xml-name-validator: 5.0.0 transitivePeerDependencies: - - "@exodus/crypto" + - '@exodus/crypto' - bufferutil - supports-color - utf-8-validate @@ -5546,9 +4058,9 @@ snapshots: json-schema-to-typescript@15.0.4: dependencies: - "@apidevtools/json-schema-ref-parser": 11.9.3 - "@types/json-schema": 7.0.15 - "@types/lodash": 4.17.23 + '@apidevtools/json-schema-ref-parser': 11.9.3 + '@types/json-schema': 7.0.15 + '@types/lodash': 4.17.23 is-glob: 4.0.3 js-yaml: 4.1.1 lodash: 4.17.23 @@ -5616,7 +4128,7 @@ snapshots: magic-string@0.30.21: dependencies: - "@jridgewell/sourcemap-codec": 1.5.5 + '@jridgewell/sourcemap-codec': 1.5.5 make-dir@3.1.0: dependencies: @@ -5624,19 +4136,19 @@ snapshots: maplibre-gl@5.17.0: dependencies: - "@mapbox/geojson-rewind": 0.5.2 - "@mapbox/jsonlint-lines-primitives": 2.0.2 - "@mapbox/point-geometry": 1.1.0 - "@mapbox/tiny-sdf": 2.0.7 - "@mapbox/unitbezier": 0.0.1 - "@mapbox/vector-tile": 2.0.4 - "@mapbox/whoots-js": 3.1.0 - "@maplibre/geojson-vt": 5.0.4 - "@maplibre/maplibre-gl-style-spec": 24.4.1 - "@maplibre/mlt": 1.1.2 - "@maplibre/vt-pbf": 4.2.1 - "@types/geojson": 7946.0.16 - "@types/supercluster": 7.1.3 + '@mapbox/geojson-rewind': 0.5.2 + '@mapbox/jsonlint-lines-primitives': 2.0.2 + '@mapbox/point-geometry': 1.1.0 + '@mapbox/tiny-sdf': 2.0.7 + '@mapbox/unitbezier': 0.0.1 + '@mapbox/vector-tile': 2.0.4 + '@mapbox/whoots-js': 3.1.0 + '@maplibre/geojson-vt': 5.0.4 + '@maplibre/maplibre-gl-style-spec': 24.4.1 + '@maplibre/mlt': 1.1.2 + '@maplibre/vt-pbf': 4.2.1 + '@types/geojson': 7946.0.16 + '@types/supercluster': 7.1.3 earcut: 3.0.2 gl-matrix: 3.4.4 kdbush: 4.0.2 @@ -5782,7 +4294,7 @@ snapshots: publint@0.3.17: dependencies: - "@publint/pack": 0.1.3 + '@publint/pack': 0.1.3 package-manager-detector: 1.6.0 picocolors: 1.1.1 sade: 1.8.1 @@ -5802,8 +4314,8 @@ snapshots: react-map-gl@8.1.0(maplibre-gl@5.17.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: - "@vis.gl/react-mapbox": 8.1.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - "@vis.gl/react-maplibre": 8.1.0(maplibre-gl@5.17.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@vis.gl/react-mapbox': 8.1.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@vis.gl/react-maplibre': 8.1.0(maplibre-gl@5.17.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) optionalDependencies: @@ -5841,61 +4353,61 @@ snapshots: rollup@4.54.0: dependencies: - "@types/estree": 1.0.8 + '@types/estree': 1.0.8 optionalDependencies: - "@rollup/rollup-android-arm-eabi": 4.54.0 - "@rollup/rollup-android-arm64": 4.54.0 - "@rollup/rollup-darwin-arm64": 4.54.0 - "@rollup/rollup-darwin-x64": 4.54.0 - "@rollup/rollup-freebsd-arm64": 4.54.0 - "@rollup/rollup-freebsd-x64": 4.54.0 - "@rollup/rollup-linux-arm-gnueabihf": 4.54.0 - "@rollup/rollup-linux-arm-musleabihf": 4.54.0 - "@rollup/rollup-linux-arm64-gnu": 4.54.0 - "@rollup/rollup-linux-arm64-musl": 4.54.0 - "@rollup/rollup-linux-loong64-gnu": 4.54.0 - "@rollup/rollup-linux-ppc64-gnu": 4.54.0 - "@rollup/rollup-linux-riscv64-gnu": 4.54.0 - "@rollup/rollup-linux-riscv64-musl": 4.54.0 - "@rollup/rollup-linux-s390x-gnu": 4.54.0 - "@rollup/rollup-linux-x64-gnu": 4.54.0 - "@rollup/rollup-linux-x64-musl": 4.54.0 - "@rollup/rollup-openharmony-arm64": 4.54.0 - "@rollup/rollup-win32-arm64-msvc": 4.54.0 - "@rollup/rollup-win32-ia32-msvc": 4.54.0 - "@rollup/rollup-win32-x64-gnu": 4.54.0 - "@rollup/rollup-win32-x64-msvc": 4.54.0 + '@rollup/rollup-android-arm-eabi': 4.54.0 + '@rollup/rollup-android-arm64': 4.54.0 + '@rollup/rollup-darwin-arm64': 4.54.0 + '@rollup/rollup-darwin-x64': 4.54.0 + '@rollup/rollup-freebsd-arm64': 4.54.0 + '@rollup/rollup-freebsd-x64': 4.54.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.54.0 + '@rollup/rollup-linux-arm-musleabihf': 4.54.0 + '@rollup/rollup-linux-arm64-gnu': 4.54.0 + '@rollup/rollup-linux-arm64-musl': 4.54.0 + '@rollup/rollup-linux-loong64-gnu': 4.54.0 + '@rollup/rollup-linux-ppc64-gnu': 4.54.0 + '@rollup/rollup-linux-riscv64-gnu': 4.54.0 + '@rollup/rollup-linux-riscv64-musl': 4.54.0 + '@rollup/rollup-linux-s390x-gnu': 4.54.0 + '@rollup/rollup-linux-x64-gnu': 4.54.0 + '@rollup/rollup-linux-x64-musl': 4.54.0 + '@rollup/rollup-openharmony-arm64': 4.54.0 + '@rollup/rollup-win32-arm64-msvc': 4.54.0 + '@rollup/rollup-win32-ia32-msvc': 4.54.0 + '@rollup/rollup-win32-x64-gnu': 4.54.0 + '@rollup/rollup-win32-x64-msvc': 4.54.0 fsevents: 2.3.3 rollup@4.57.1: dependencies: - "@types/estree": 1.0.8 + '@types/estree': 1.0.8 optionalDependencies: - "@rollup/rollup-android-arm-eabi": 4.57.1 - "@rollup/rollup-android-arm64": 4.57.1 - "@rollup/rollup-darwin-arm64": 4.57.1 - "@rollup/rollup-darwin-x64": 4.57.1 - "@rollup/rollup-freebsd-arm64": 4.57.1 - "@rollup/rollup-freebsd-x64": 4.57.1 - "@rollup/rollup-linux-arm-gnueabihf": 4.57.1 - "@rollup/rollup-linux-arm-musleabihf": 4.57.1 - "@rollup/rollup-linux-arm64-gnu": 4.57.1 - "@rollup/rollup-linux-arm64-musl": 4.57.1 - "@rollup/rollup-linux-loong64-gnu": 4.57.1 - "@rollup/rollup-linux-loong64-musl": 4.57.1 - "@rollup/rollup-linux-ppc64-gnu": 4.57.1 - "@rollup/rollup-linux-ppc64-musl": 4.57.1 - "@rollup/rollup-linux-riscv64-gnu": 4.57.1 - "@rollup/rollup-linux-riscv64-musl": 4.57.1 - "@rollup/rollup-linux-s390x-gnu": 4.57.1 - "@rollup/rollup-linux-x64-gnu": 4.57.1 - "@rollup/rollup-linux-x64-musl": 4.57.1 - "@rollup/rollup-openbsd-x64": 4.57.1 - "@rollup/rollup-openharmony-arm64": 4.57.1 - "@rollup/rollup-win32-arm64-msvc": 4.57.1 - "@rollup/rollup-win32-ia32-msvc": 4.57.1 - "@rollup/rollup-win32-x64-gnu": 4.57.1 - "@rollup/rollup-win32-x64-msvc": 4.57.1 + '@rollup/rollup-android-arm-eabi': 4.57.1 + '@rollup/rollup-android-arm64': 4.57.1 + '@rollup/rollup-darwin-arm64': 4.57.1 + '@rollup/rollup-darwin-x64': 4.57.1 + '@rollup/rollup-freebsd-arm64': 4.57.1 + '@rollup/rollup-freebsd-x64': 4.57.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.57.1 + '@rollup/rollup-linux-arm-musleabihf': 4.57.1 + '@rollup/rollup-linux-arm64-gnu': 4.57.1 + '@rollup/rollup-linux-arm64-musl': 4.57.1 + '@rollup/rollup-linux-loong64-gnu': 4.57.1 + '@rollup/rollup-linux-loong64-musl': 4.57.1 + '@rollup/rollup-linux-ppc64-gnu': 4.57.1 + '@rollup/rollup-linux-ppc64-musl': 4.57.1 + '@rollup/rollup-linux-riscv64-gnu': 4.57.1 + '@rollup/rollup-linux-riscv64-musl': 4.57.1 + '@rollup/rollup-linux-s390x-gnu': 4.57.1 + '@rollup/rollup-linux-x64-gnu': 4.57.1 + '@rollup/rollup-linux-x64-musl': 4.57.1 + '@rollup/rollup-openbsd-x64': 4.57.1 + '@rollup/rollup-openharmony-arm64': 4.57.1 + '@rollup/rollup-win32-arm64-msvc': 4.57.1 + '@rollup/rollup-win32-ia32-msvc': 4.57.1 + '@rollup/rollup-win32-x64-gnu': 4.57.1 + '@rollup/rollup-win32-x64-msvc': 4.57.1 fsevents: 2.3.3 run-parallel@1.2.0: @@ -5972,7 +4484,7 @@ snapshots: sucrase@3.35.1: dependencies: - "@jridgewell/gen-mapping": 0.3.13 + '@jridgewell/gen-mapping': 0.3.13 commander: 4.1.1 lines-and-columns: 1.2.4 mz: 2.7.0 @@ -6124,19 +4636,19 @@ snapshots: rollup: 4.57.1 tinyglobby: 0.2.15 optionalDependencies: - "@types/node": 25.1.0 + '@types/node': 25.1.0 fsevents: 2.3.3 tsx: 4.21.0 vitest@4.0.18(@types/node@25.1.0)(happy-dom@20.0.11)(jsdom@27.4.0)(tsx@4.21.0): dependencies: - "@vitest/expect": 4.0.18 - "@vitest/mocker": 4.0.18(vite@7.3.1(@types/node@25.1.0)(tsx@4.21.0)) - "@vitest/pretty-format": 4.0.18 - "@vitest/runner": 4.0.18 - "@vitest/snapshot": 4.0.18 - "@vitest/spy": 4.0.18 - "@vitest/utils": 4.0.18 + '@vitest/expect': 4.0.18 + '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@25.1.0)(tsx@4.21.0)) + '@vitest/pretty-format': 4.0.18 + '@vitest/runner': 4.0.18 + '@vitest/snapshot': 4.0.18 + '@vitest/spy': 4.0.18 + '@vitest/utils': 4.0.18 es-module-lexer: 1.7.0 expect-type: 1.3.0 magic-string: 0.30.21 @@ -6151,7 +4663,7 @@ snapshots: vite: 7.3.1(@types/node@25.1.0)(tsx@4.21.0) why-is-node-running: 2.3.0 optionalDependencies: - "@types/node": 25.1.0 + '@types/node': 25.1.0 happy-dom: 20.0.11 jsdom: 27.4.0 transitivePeerDependencies: @@ -6206,7 +4718,7 @@ snapshots: zarrita@0.6.1: dependencies: - "@zarrita/storage": 0.1.4 + '@zarrita/storage': 0.1.4 numcodecs: 0.3.2 zstd-codec@0.1.5: From 35167e50f24b838569822b02205af15cb43fb989 Mon Sep 17 00:00:00 2001 From: Kyle Barron Date: Mon, 16 Feb 2026 16:59:50 -0500 Subject: [PATCH 06/36] diff --- packages/deck.gl-raster/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/deck.gl-raster/package.json b/packages/deck.gl-raster/package.json index 0770ab9..d0326fa 100644 --- a/packages/deck.gl-raster/package.json +++ b/packages/deck.gl-raster/package.json @@ -69,4 +69,4 @@ "volta": { "extends": "../../package.json" } -} \ No newline at end of file +} From fe418891eabfae3ca35e49956ab5118c9f8a0675 Mon Sep 17 00:00:00 2001 From: Kyle Barron Date: Tue, 17 Feb 2026 11:34:48 -0500 Subject: [PATCH 07/36] pin morecantile workspace --- packages/deck.gl-geotiff/package.json | 3 ++- packages/deck.gl-raster/package.json | 2 +- pnpm-lock.yaml | 17 +++++++---------- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/packages/deck.gl-geotiff/package.json b/packages/deck.gl-geotiff/package.json index 95f57cc..e758070 100644 --- a/packages/deck.gl-geotiff/package.json +++ b/packages/deck.gl-geotiff/package.json @@ -47,7 +47,8 @@ }, "dependencies": { "@developmentseed/deck.gl-raster": "workspace:^", - "@developmentseed/morecantile": "^0.1.1", + "@developmentseed/geotiff": "workspace:^", + "@developmentseed/morecantile": "workspace:^", "@developmentseed/raster-reproject": "workspace:^", "flatbush": "^4.5.0", "geotiff": "2.1.3", diff --git a/packages/deck.gl-raster/package.json b/packages/deck.gl-raster/package.json index d0326fa..30894de 100644 --- a/packages/deck.gl-raster/package.json +++ b/packages/deck.gl-raster/package.json @@ -60,7 +60,7 @@ "@luma.gl/shadertools": "^9.2.7" }, "dependencies": { - "@developmentseed/morecantile": "^0.1.1", + "@developmentseed/morecantile": "workspace:^", "@developmentseed/raster-reproject": "workspace:^", "@math.gl/core": "^4.1.0", "@math.gl/culling": "^4.1.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e4a6f37..048a38f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -258,9 +258,12 @@ importers: '@developmentseed/deck.gl-raster': specifier: workspace:^ version: link:../deck.gl-raster + '@developmentseed/geotiff': + specifier: workspace:^ + version: link:../geotiff '@developmentseed/morecantile': - specifier: ^0.1.1 - version: 0.1.1 + specifier: workspace:^ + version: link:../morecantile '@developmentseed/raster-reproject': specifier: workspace:^ version: link:../raster-reproject @@ -305,8 +308,8 @@ importers: specifier: 9.2.7 version: 9.2.7(@deck.gl/core@9.2.7)(@loaders.gl/core@4.3.4)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/gltf@9.2.6(@luma.gl/constants@9.2.6)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)) '@developmentseed/morecantile': - specifier: ^0.1.1 - version: 0.1.1 + specifier: workspace:^ + version: link:../morecantile '@developmentseed/raster-reproject': specifier: workspace:^ version: link:../raster-reproject @@ -684,10 +687,6 @@ packages: '@luma.gl/gltf': 9.2.6 '@luma.gl/shadertools': 9.2.6 - '@developmentseed/morecantile@0.1.1': - resolution: {integrity: sha512-FtRxhWUv3E42YRST0UcIuDVOUQXf6GRIh0Vv4pvSxW8+ozZ5QmXuiVSma4A/yS3FPs/k2D0MgwNO0aRqsLXm+w==} - engines: {node: '>=18'} - '@esbuild/aix-ppc64@0.27.2': resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==} engines: {node: '>=18'} @@ -2894,8 +2893,6 @@ snapshots: transitivePeerDependencies: - '@loaders.gl/core' - '@developmentseed/morecantile@0.1.1': {} - '@esbuild/aix-ppc64@0.27.2': optional: true From ab1983a3d1928d99b4ad8baf982ebee8f09bebb7 Mon Sep 17 00:00:00 2001 From: Kyle Barron Date: Tue, 17 Feb 2026 13:03:15 -0500 Subject: [PATCH 08/36] bump cog-layer to use our geotiff --- packages/deck.gl-geotiff/package.json | 4 +- packages/deck.gl-geotiff/src/cog-layer.ts | 236 +++++++++++----------- pnpm-lock.yaml | 6 + 3 files changed, 125 insertions(+), 121 deletions(-) diff --git a/packages/deck.gl-geotiff/package.json b/packages/deck.gl-geotiff/package.json index e758070..2560dd2 100644 --- a/packages/deck.gl-geotiff/package.json +++ b/packages/deck.gl-geotiff/package.json @@ -46,13 +46,15 @@ "vitest": "^4.0.18" }, "dependencies": { + "@cogeotiff/core": "^9.1.2", "@developmentseed/deck.gl-raster": "workspace:^", "@developmentseed/geotiff": "workspace:^", "@developmentseed/morecantile": "workspace:^", "@developmentseed/raster-reproject": "workspace:^", "flatbush": "^4.5.0", "geotiff": "2.1.3", - "proj4": "^2.20.2" + "proj4": "^2.20.2", + "wkt-parser": "^1.5.2" }, "peerDependencies": { "@deck.gl/core": "^9.2.7", diff --git a/packages/deck.gl-geotiff/src/cog-layer.ts b/packages/deck.gl-geotiff/src/cog-layer.ts index 20ad97f..9b3ecfa 100644 --- a/packages/deck.gl-geotiff/src/cog-layer.ts +++ b/packages/deck.gl-geotiff/src/cog-layer.ts @@ -15,22 +15,21 @@ import { TileLayer } from "@deck.gl/geo-layers"; import { PathLayer } from "@deck.gl/layers"; import type { RasterModule } from "@developmentseed/deck.gl-raster"; import { RasterLayer, TMSTileset2D } from "@developmentseed/deck.gl-raster"; -import type { TileMatrix, TileMatrixSet } from "@developmentseed/morecantile"; +import type { GeoTIFF, Overview } from "@developmentseed/geotiff"; +import { generateTileMatrixSet } from "@developmentseed/geotiff"; +import type { TileMatrixSet } from "@developmentseed/morecantile"; +import { tileTransform } from "@developmentseed/morecantile"; import type { ReprojectionFns } from "@developmentseed/raster-reproject"; import type { Device } from "@luma.gl/core"; -import type { BaseClient, GeoTIFF, GeoTIFFImage, Pool } from "geotiff"; import proj4 from "proj4"; -import { parseCOGTileMatrixSet } from "./cog-tile-matrix-set.js"; -import { - defaultPool, - fetchGeoTIFF, - getGeographicBounds, -} from "./geotiff/geotiff.js"; +import type { ProjectionDefinition } from "wkt-parser"; +import wktParser from "wkt-parser"; +import { fetchGeoTIFF, getGeographicBounds } from "./geotiff/geotiff.js"; import type { TextureDataT } from "./geotiff/render-pipeline.js"; import { inferRenderPipeline } from "./geotiff/render-pipeline.js"; import { fromGeoTransform } from "./geotiff-reprojection.js"; -import type { GeoKeysParser, ProjectionInfo } from "./proj.js"; -import { epsgIoGeoKeyParser } from "./proj.js"; +import type { EpsgResolver } from "./proj.js"; +import { epsgResolver } from "./proj.js"; /** * Minimum interface that **must** be returned from getTileData. @@ -56,7 +55,8 @@ export type GetTileDataOptions = { signal?: AbortSignal; /** The decoder pool to use. */ - pool: Pool; + // TODO: restore pool with new GeoTIFF backend + // pool: Pool; }; type GetTileDataResult = { @@ -76,17 +76,18 @@ export interface COGLayerProps * - An instance of GeoTIFF.js's GeoTIFF class * - An instance of GeoTIFF.js's BaseClient for custom fetching */ - geotiff: GeoTIFF | string | ArrayBuffer | Blob | BaseClient; + geotiff: GeoTIFF; /** - * A function callback for parsing GeoTIFF geo keys to a Proj4 compatible - * definition. + * A function callback for parsing numeric EPSG codes to projection + * information (as returned by `wkt-parser`). * - * By default, uses epsg.io to resolve EPSG codes found in the GeoTIFF. - * Alternatively, you may want to use `geotiff-geokeys-to-proj4`, which is - * more extensive but adds 1.5MB to your bundle size. + * The default implementation: + * - makes a request to epsg.io to resolve EPSG codes found in the GeoTIFF. + * - caches any previous requests + * - parses PROJJSON response with `wkt-parser` */ - geoKeysParser?: GeoKeysParser; + epsgResolver?: EpsgResolver; /** * GeoTIFF.js Pool for decoding image chunks. @@ -94,7 +95,7 @@ export interface COGLayerProps * If none is provided, a default Pool will be created and shared between all * COGLayer and GeoTIFFLayer instances. */ - pool?: Pool; + // pool?: Pool; /** * Maximum reprojection error in pixels for mesh refinement. @@ -113,7 +114,7 @@ export interface COGLayerProps * luma.gl, along with optional custom shaders for the RasterLayer. */ getTileData?: ( - image: GeoTIFFImage, + image: GeoTIFF | Overview, options: GetTileDataOptions, ) => Promise; @@ -149,7 +150,7 @@ export interface COGLayerProps onGeoTIFFLoad?: ( geotiff: GeoTIFF, options: { - projection: ProjectionInfo; + projection: ProjectionDefinition; /** * Bounds of the image in geographic coordinates (WGS84) [minLon, minLat, * maxLon, maxLat] @@ -173,7 +174,7 @@ export interface COGLayerProps } const defaultProps: Partial = { - geoKeysParser: epsgIoGeoKeyParser, + epsgResolver, debug: false, debugOpacity: 0.5, }; @@ -188,10 +189,11 @@ export class COGLayer< static override defaultProps = defaultProps; declare state: { - forwardReproject?: ReprojectionFns["forwardReproject"]; - inverseReproject?: ReprojectionFns["inverseReproject"]; - metadata?: TileMatrixSet; - images?: GeoTIFFImage[]; + geotiff: GeoTIFF; + forwardTo4326?: ReprojectionFns["forwardReproject"]; + inverseFrom4326?: ReprojectionFns["inverseReproject"]; + forwardTo3857?: ReprojectionFns["forwardReproject"]; + tms?: TileMatrixSet; defaultGetTileData?: COGLayerProps["getTileData"]; defaultRenderTile?: COGLayerProps["renderTile"]; }; @@ -215,32 +217,30 @@ export class COGLayer< async _parseGeoTIFF(): Promise { const geotiff = await fetchGeoTIFF(this.props.geotiff); - - const geoKeysParser = this.props.geoKeysParser!; - const metadata = await parseCOGTileMatrixSet(geotiff, geoKeysParser); - - const image = await geotiff.getImage(); - const imageCount = await geotiff.getImageCount(); - const images: GeoTIFFImage[] = []; - for (let imageIdx = 0; imageIdx < imageCount; imageIdx++) { - images.push(await geotiff.getImage(imageIdx)); - } - - const sourceProjection = await geoKeysParser(image.getGeoKeys()); - if (!sourceProjection) { - throw new Error( - "Could not determine source projection from GeoTIFF geo keys", - ); - } - - const converter = proj4(sourceProjection.def, "EPSG:4326"); - const forwardReproject = (x: number, y: number) => - converter.forward<[number, number]>([x, y], false); - const inverseReproject = (x: number, y: number) => - converter.inverse<[number, number]>([x, y], false); + const crs = geotiff.crs; + const sourceProjection = + typeof crs === "number" + ? await this.props.epsgResolver!(crs) + : wktParser(crs); + + const tms = generateTileMatrixSet(geotiff, sourceProjection); + + // @ts-expect-error - proj4 typings are incomplete and don't support + // wkt-parser input + const converter4326 = proj4(sourceProjection, "EPSG:4326"); + const forwardTo4326 = (x: number, y: number) => + converter4326.forward<[number, number]>([x, y], false); + const inverseFrom4326 = (x: number, y: number) => + converter4326.inverse<[number, number]>([x, y], false); + + // @ts-expect-error - proj4 typings are incomplete and don't support + // wkt-parser input + const converter3857 = proj4(sourceProjection, "EPSG:3857"); + const forwardTo3857 = (x: number, y: number) => + converter3857.forward<[number, number]>([x, y], false); if (this.props.onGeoTIFFLoad) { - const geographicBounds = getGeographicBounds(image, converter); + const geographicBounds = getGeographicBounds(geotiff, converter4326); this.props.onGeoTIFFLoad(geotiff, { projection: sourceProjection, geographicBounds, @@ -248,13 +248,14 @@ export class COGLayer< } const { getTileData: defaultGetTileData, renderTile: defaultRenderTile } = - inferRenderPipeline(image.fileDirectory, this.context.device); + inferRenderPipeline(geotiff, this.context.device); this.setState({ - metadata, - forwardReproject, - inverseReproject, - images, + geotiff, + tms, + forwardTo4326, + inverseFrom4326, + forwardTo3857, defaultGetTileData, defaultRenderTile, }); @@ -265,23 +266,30 @@ export class COGLayer< */ async _getTileData( tile: TileLoadProps, - images: GeoTIFFImage[], - metadata: TileMatrixSet, + geotiff: GeoTIFF, + tms: TileMatrixSet, ): Promise> { const { signal } = tile; const { x, y, z } = tile.index; // Select overview image - const geotiffImage = images[images.length - 1 - z]!; - const imageHeight = geotiffImage.getHeight(); - const imageWidth = geotiffImage.getWidth(); - - const tileMatrix = metadata.tileMatrices[z]!; + // If z=0, use the coarsest overview (which is the last in the array) + // If z=max, use the full-resolution image (which is the first in the array) + + // TODO: should be able to optimize this to not create the array + // Something like: + // const image = z === geotiff.overviews.length - 1 ? geotiff : + // geotiff.overviews[geotiff.overviews.length - 1 - z]!; + const images = [geotiff, ...geotiff.overviews]; + const image = images[images.length - 1 - z]!; + const imageHeight = image.height; + const imageWidth = image.width; + + const tileMatrix = tms.tileMatrices[z]!; const { tileWidth, tileHeight } = tileMatrix; - const tileGeotransform = computeTileGeotransform(x, y, tileMatrix); - const { forwardTransform, inverseTransform } = - fromGeoTransform(tileGeotransform); + const tileAffine = tileTransform(tileMatrix, { col: x, row: y }); + const { forwardTransform, inverseTransform } = fromGeoTransform(tileAffine); const window: [number, number, number, number] = [ x * tileWidth, @@ -299,11 +307,12 @@ export class COGLayer< ? AbortSignal.any([signal, this.props.signal]) : signal || this.props.signal; - const data = await getTileData(geotiffImage, { + const data = await getTileData(image, { device: this.context.device, window, signal: combinedSignal, - pool: this.props.pool || defaultPool(), + // TODO: restore pool + // pool: this.props.pool || defaultPool(), }); return { @@ -323,9 +332,9 @@ export class COGLayer< _offset: number; tile: Tile2DHeader>; }, - metadata: TileMatrixSet, - forwardReproject: ReprojectionFns["forwardReproject"], - inverseReproject: ReprojectionFns["inverseReproject"], + tms: TileMatrixSet, + forwardTo4326: ReprojectionFns["forwardReproject"], + inverseFrom4326: ReprojectionFns["inverseReproject"], ): Layer | LayersList | null { const { maxError, debug, debugOpacity } = this.props; const { tile } = props; @@ -352,8 +361,8 @@ export class COGLayer< reprojectionFns: { forwardTransform, inverseTransform, - forwardReproject, - inverseReproject, + forwardReproject: forwardTo4326, + inverseReproject: inverseFrom4326, }, debug, debugOpacity, @@ -367,17 +376,20 @@ export class COGLayer< // eslint-disable-next-line @typescript-eslint/no-explicit-any const projectedBounds = (tile as any)?.projectedBounds; - if (!projectedBounds || !metadata) { + if (!projectedBounds || !tms) { return []; } // Project bounds from image CRS to WGS84 const { topLeft, topRight, bottomLeft, bottomRight } = projectedBounds; - const topLeftWgs84 = metadata.projectToWgs84(topLeft); - const topRightWgs84 = metadata.projectToWgs84(topRight); - const bottomRightWgs84 = metadata.projectToWgs84(bottomRight); - const bottomLeftWgs84 = metadata.projectToWgs84(bottomLeft); + // TODO: improve typing of projectedBounds shape + console.log("projectedBounds", projectedBounds); + + const topLeftWgs84 = forwardTo4326(topLeft[0], topLeft[1]); + const topRightWgs84 = forwardTo4326(topRight[0], topRight[1]); + const bottomRightWgs84 = forwardTo4326(bottomRight[0], bottomRight[1]); + const bottomLeftWgs84 = forwardTo4326(bottomLeft[0], bottomLeft[1]); // Create a closed path around the tile bounds const path = [ @@ -404,37 +416,44 @@ export class COGLayer< return layers; } + /** Define the underlying deck.gl TileLayer. */ renderTileLayer( - metadata: TileMatrixSet, - forwardReproject: ReprojectionFns["forwardReproject"], - inverseReproject: ReprojectionFns["inverseReproject"], - images: GeoTIFFImage[], + tms: TileMatrixSet, + forwardTo4326: ReprojectionFns["forwardReproject"], + inverseFrom4326: ReprojectionFns["inverseReproject"], + forwardTo3857: ReprojectionFns["forwardReproject"], + geotiff: GeoTIFF, ): TileLayer { // Create a factory class that wraps COGTileset2D with the metadata class TMSTileset2DFactory extends TMSTileset2D { constructor(opts: Tileset2DProps) { - super(metadata, opts); + super(opts, tms, { + projectTo4326: forwardTo4326, + projectTo3857: forwardTo3857, + }); } } return new TileLayer>({ id: `cog-tile-layer-${this.id}`, TilesetClass: TMSTileset2DFactory, - getTileData: async (tile) => this._getTileData(tile, images, metadata), + getTileData: async (tile) => this._getTileData(tile, geotiff, tms), renderSubLayers: (props) => - this._renderSubLayers( - props, - metadata, - forwardReproject, - inverseReproject, - ), + this._renderSubLayers(props, tms, forwardTo4326, inverseFrom4326), }); } renderLayers() { - const { forwardReproject, inverseReproject, metadata, images } = this.state; - - if (!forwardReproject || !inverseReproject || !metadata || !images) { + const { forwardTo4326, inverseFrom4326, forwardTo3857, tms, geotiff } = + this.state; + + if ( + !forwardTo4326 || + !inverseFrom4326 || + !forwardTo3857 || + !tms || + !geotiff + ) { return null; } @@ -442,34 +461,11 @@ export class COGLayer< // nullable in any part of function scope, the tileset factory wrapper gives // a type error return this.renderTileLayer( - metadata, - forwardReproject, - inverseReproject, - images, + tms, + forwardTo4326, + inverseFrom4326, + forwardTo3857, + geotiff, ); } } - -/** - * Compute the affine geotransform for this tile. - * - * We need to offset the geotransform for the matrix level by the tile's pixel - * origin. - */ -function computeTileGeotransform( - x: number, - y: number, - tileMatrix: TileMatrix, -): [number, number, number, number, number, number] { - const { tileWidth, tileHeight } = tileMatrix; - - const xPixelOrigin = x * tileWidth; - const yPixelOrigin = y * tileHeight; - - const [a, b, c, d, e, f] = tileMatrix.geotransform; - - const xCoordOffset = a * xPixelOrigin + b * yPixelOrigin + c; - const yCoordOffset = d * xPixelOrigin + e * yPixelOrigin + f; - - return [a, b, xCoordOffset, d, e, yCoordOffset]; -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 048a38f..2fa1f09 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -243,6 +243,9 @@ importers: packages/deck.gl-geotiff: dependencies: + '@cogeotiff/core': + specifier: ^9.1.2 + version: 9.1.2 '@deck.gl/core': specifier: 9.2.7 version: 9.2.7 @@ -279,6 +282,9 @@ importers: proj4: specifier: ^2.20.2 version: 2.20.2 + wkt-parser: + specifier: ^1.5.2 + version: 1.5.2 devDependencies: '@types/node': specifier: ^25.1.0 From 9dcaffbbbd8c29b2922ba01eddfa598fe3f89796 Mon Sep 17 00:00:00 2001 From: Kyle Barron Date: Tue, 17 Feb 2026 13:04:27 -0500 Subject: [PATCH 09/36] update projection code --- packages/deck.gl-geotiff/src/ellipsoids.ts | 154 ------------------ .../src/geotiff-reprojection.ts | 75 +-------- packages/deck.gl-geotiff/src/proj.ts | 93 +++-------- packages/deck.gl-geotiff/src/wkt-parser.d.ts | 62 +++++++ 4 files changed, 87 insertions(+), 297 deletions(-) delete mode 100644 packages/deck.gl-geotiff/src/ellipsoids.ts create mode 100644 packages/deck.gl-geotiff/src/wkt-parser.d.ts diff --git a/packages/deck.gl-geotiff/src/ellipsoids.ts b/packages/deck.gl-geotiff/src/ellipsoids.ts deleted file mode 100644 index 48f73f4..0000000 --- a/packages/deck.gl-geotiff/src/ellipsoids.ts +++ /dev/null @@ -1,154 +0,0 @@ -/** - * Vendored and edited from proj4.js. - * - * In the implementation of metersPerUnit while generating a COG TileMatrixSet, - * we need to know the size of the semi major axis in the case the CRS is in - * degrees. - * - * https://github.com/proj4js/proj4js/blob/e90e5fa6872a1ffc40edb161cbeb4bd5e3bd9db5/lib/constants/Ellipsoid.js - */ - -const ellipsoids = { - MERIT: { - a: 6378137, - }, - SGS85: { - a: 6378136, - }, - GRS80: { - a: 6378137, - }, - IAU76: { - a: 6378140, - }, - airy: { - a: 6377563.396, - b: 6356256.91, - }, - APL4: { - a: 6378137, - }, - NWL9D: { - a: 6378145, - }, - mod_airy: { - a: 6377340.189, - b: 6356034.446, - }, - andrae: { - a: 6377104.43, - }, - aust_SA: { - a: 6378160, - }, - GRS67: { - a: 6378160, - }, - bessel: { - a: 6377397.155, - }, - bess_nam: { - a: 6377483.865, - }, - clrk66: { - a: 6378206.4, - b: 6356583.8, - }, - clrk80: { - a: 6378249.145, - }, - clrk80ign: { - a: 6378249.2, - b: 6356515, - }, - clrk58: { - a: 6378293.645208759, - }, - CPM: { - a: 6375738.7, - }, - delmbr: { - a: 6376428, - }, - engelis: { - a: 6378136.05, - }, - evrst30: { - a: 6377276.345, - }, - evrst48: { - a: 6377304.063, - }, - evrst56: { - a: 6377301.243, - }, - evrst69: { - a: 6377295.664, - }, - evrstSS: { - a: 6377298.556, - }, - fschr60: { - a: 6378166, - }, - fschr60m: { - a: 6378155, - }, - fschr68: { - a: 6378150, - }, - helmert: { - a: 6378200, - }, - hough: { - a: 6378270, - }, - intl: { - a: 6378388, - }, - kaula: { - a: 6378163, - }, - lerch: { - a: 6378139, - }, - mprts: { - a: 6397300, - }, - new_intl: { - a: 6378157.5, - b: 6356772.2, - }, - plessis: { - a: 6376523, - }, - krass: { - a: 6378245, - }, - SEasia: { - a: 6378155, - b: 6356773.3205, - }, - walbeck: { - a: 6376896, - b: 6355834.8467, - }, - WGS60: { - a: 6378165, - }, - WGS66: { - a: 6378145, - }, - WGS7: { - a: 6378135, - }, - WGS84: { - a: 6378137, - }, - sphere: { - a: 6370997, - b: 6370997, - }, -}; - -export default ellipsoids; diff --git a/packages/deck.gl-geotiff/src/geotiff-reprojection.ts b/packages/deck.gl-geotiff/src/geotiff-reprojection.ts index 379d0b9..9f830f4 100644 --- a/packages/deck.gl-geotiff/src/geotiff-reprojection.ts +++ b/packages/deck.gl-geotiff/src/geotiff-reprojection.ts @@ -10,79 +10,6 @@ import proj4 from "proj4"; import type { PROJJSONDefinition } from "proj4/dist/lib/core"; import type Projection from "proj4/dist/lib/Proj"; -export const OGC_84: PROJJSONDefinition = { - $schema: "https://proj.org/schemas/v0.7/projjson.schema.json", - type: "GeographicCRS", - name: "WGS 84 (CRS84)", - datum_ensemble: { - name: "World Geodetic System 1984 ensemble", - members: [ - { - name: "World Geodetic System 1984 (Transit)", - id: { authority: "EPSG", code: 1166 }, - }, - { - name: "World Geodetic System 1984 (G730)", - id: { authority: "EPSG", code: 1152 }, - }, - { - name: "World Geodetic System 1984 (G873)", - id: { authority: "EPSG", code: 1153 }, - }, - { - name: "World Geodetic System 1984 (G1150)", - id: { authority: "EPSG", code: 1154 }, - }, - { - name: "World Geodetic System 1984 (G1674)", - id: { authority: "EPSG", code: 1155 }, - }, - { - name: "World Geodetic System 1984 (G1762)", - id: { authority: "EPSG", code: 1156 }, - }, - { - name: "World Geodetic System 1984 (G2139)", - id: { authority: "EPSG", code: 1309 }, - }, - ], - ellipsoid: { - name: "WGS 84", - semi_major_axis: 6378137, - inverse_flattening: 298.257223563, - }, - accuracy: "2.0", - id: { authority: "EPSG", code: 6326 }, - }, - coordinate_system: { - subtype: "ellipsoidal", - axis: [ - { - name: "Geodetic longitude", - abbreviation: "Lon", - direction: "east", - unit: "degree", - }, - { - name: "Geodetic latitude", - abbreviation: "Lat", - direction: "north", - unit: "degree", - }, - ], - }, - scope: "Not known.", - area: "World.", - bbox: { - south_latitude: -90, - west_longitude: -180, - north_latitude: 90, - east_longitude: 180, - }, - // @ts-expect-error - proj4 types are incomplete - id: { authority: "OGC", code: "CRS84" }, -}; - // Derived from existing work here: // https://github.com/developmentseed/lonboard/blob/35a1f3d691604ad9e083bf10a4bfde4158171486/src/cog-tileset/claude-tileset-2d-improved.ts#L141 // @@ -90,7 +17,7 @@ export const OGC_84: PROJJSONDefinition = { export async function extractGeotiffReprojectors( tiff: GeoTIFF, sourceProjection: string | PROJJSONDefinition, - outputCrs: string | PROJJSONDefinition | Projection = OGC_84, + outputCrs: string | PROJJSONDefinition | Projection = "EPSG:4326", ): Promise { const image = await tiff.getImage(); diff --git a/packages/deck.gl-geotiff/src/proj.ts b/packages/deck.gl-geotiff/src/proj.ts index 95f00a5..077ad3b 100644 --- a/packages/deck.gl-geotiff/src/proj.ts +++ b/packages/deck.gl-geotiff/src/proj.ts @@ -1,82 +1,37 @@ -import type { ProjectionDefinition } from "proj4"; -import proj4 from "proj4"; -import type { PROJJSONDefinition } from "proj4/dist/lib/core"; - -export type SupportedCrsUnit = - | "m" - | "metre" - | "meter" - | "meters" - | "foot" - | "US survey foot" - | "degree"; - -export interface ProjectionInfo { - /** Proj4-compatible projection definition (PROJJSON or proj4 string) */ - def: string | PROJJSONDefinition; - /** A parsed projection definition */ - parsed: ProjectionDefinition; - /** Units of the coordinate system */ - coordinatesUnits: SupportedCrsUnit; -} - -export type GeoKeysParser = ( - geoKeys: Record, -) => Promise; +import type { ProjJson } from "@developmentseed/geotiff"; +import type { ProjectionDefinition } from "wkt-parser"; +import wktParser from "wkt-parser"; /** - * Get the Projection of a GeoTIFF - * - * The first `image` must be passed in, as only the top-level IFD contains geo - * keys. + * A global registry holding parsed projection definitions. */ -export async function epsgIoGeoKeyParser( - geoKeys: Record, -): Promise { - const projectionCode: number | null = - geoKeys.ProjectedCSTypeGeoKey || geoKeys.GeographicTypeGeoKey || null; +const PROJECTION_REGISTRY = new Map(); - const sourceProjection = await getProjjson(projectionCode); +export type EpsgResolver = (epsg: number) => Promise; - if (!sourceProjection) { - return null; +export async function epsgResolver(epsg: number) { + const key = `EPSG:${epsg}`; + // TODO: override global proj4 EPSG:4326 definition because it doesn't include + // semi major axis + const cachedProj = PROJECTION_REGISTRY.get(key); + if (cachedProj !== undefined) { + return cachedProj; } - const parsed = parseCrs(sourceProjection); - return { - def: sourceProjection, - parsed, - coordinatesUnits: parsed.units as SupportedCrsUnit, - }; + const projjson = await getProjjson(epsg); + const proj = wktParser(projjson); + PROJECTION_REGISTRY.set(key, proj); + + return proj; } /** Query epsg.io for the PROJJSON corresponding to the given EPSG code. */ -async function getProjjson(projectionCode: number | null) { - if (projectionCode === null) { - return null; +async function getProjjson(epsg: number): Promise { + const url = `https://epsg.io/${epsg}.json`; + const resp = await fetch(url); + if (!resp.ok) { + throw new Error(`Failed to fetch PROJJSON from ${url}`); } - const url = `https://epsg.io/${projectionCode}.json`; - const response = await fetch(url); - if (!response.ok) { - throw new Error(`Failed to fetch projection data from ${url}`); - } - const data = await response.json(); - return data; -} - -/** - * Parse a proj4-accepted input into a ProjectionDefinition - */ -export function parseCrs( - crs: string | PROJJSONDefinition, -): ProjectionDefinition { - // If you pass proj4.defs a projjson, it doesn't parse it; it just returns the - // input. - // - // Instead, you need to assign it to an alias and then retrieve it. - - const key = "__deck.gl-geotiff-internal__"; - proj4.defs(key, crs); - return proj4.defs(key); + return await resp.json(); } diff --git a/packages/deck.gl-geotiff/src/wkt-parser.d.ts b/packages/deck.gl-geotiff/src/wkt-parser.d.ts new file mode 100644 index 0000000..8573bd1 --- /dev/null +++ b/packages/deck.gl-geotiff/src/wkt-parser.d.ts @@ -0,0 +1,62 @@ +declare module "wkt-parser" { + import type { ProjJson } from "./crs.js"; + + export interface DatumDefinition { + /** The type of datum. */ + datum_type: number; + /** Semi-major axis of the ellipsoid. */ + a: number; + /** Semi-minor axis of the ellipsoid. */ + b: number; + /** Eccentricity squared of the ellipsoid. */ + es: number; + /** Second eccentricity squared of the ellipsoid. */ + ep2: number; + } + + export interface ProjectionDefinition { + title: string; + projName?: string; + ellps?: string; + datum?: DatumDefinition; + datumName?: string; + rf?: number; + lat0?: number; + lat1?: number; + lat2?: number; + lat_ts?: number; + long0?: number; + long1?: number; + long2?: number; + alpha?: number; + longc?: number; + x0?: number; + y0?: number; + k0?: number; + a?: number; + b?: number; + R_A?: true; + zone?: number; + utmSouth?: true; + datum_params?: string | number[]; + to_meter?: number; + units?: string; + from_greenwich?: number; + datumCode?: string; + nadgrids?: string; + axis?: string; + sphere?: boolean; + rectified_grid_angle?: number; + approx?: boolean; + over?: boolean; + projStr?: string; + } + + /** + * Parse a WKT string or PROJJSON object into a proj4-compatible projection + * definition. + */ + export default function wktParser( + input: string | ProjJson, + ): ProjectionDefinition; +} From 83260ee47b1f992759fe3713998307a118194ef9 Mon Sep 17 00:00:00 2001 From: Kyle Barron Date: Tue, 17 Feb 2026 13:31:15 -0500 Subject: [PATCH 10/36] update geotiff layer --- packages/deck.gl-geotiff/src/geotiff-layer.ts | 86 +++++++++---------- packages/deck.gl-geotiff/src/index.ts | 15 +--- 2 files changed, 46 insertions(+), 55 deletions(-) diff --git a/packages/deck.gl-geotiff/src/geotiff-layer.ts b/packages/deck.gl-geotiff/src/geotiff-layer.ts index cf7d7f4..49468c5 100644 --- a/packages/deck.gl-geotiff/src/geotiff-layer.ts +++ b/packages/deck.gl-geotiff/src/geotiff-layer.ts @@ -1,18 +1,15 @@ import type { CompositeLayerProps, UpdateParameters } from "@deck.gl/core"; import { CompositeLayer } from "@deck.gl/core"; import { RasterLayer } from "@developmentseed/deck.gl-raster"; +import type { GeoTIFF } from "@developmentseed/geotiff"; import type { ReprojectionFns } from "@developmentseed/raster-reproject"; -import type { BaseClient, GeoTIFF, Pool } from "geotiff"; import proj4 from "proj4"; -import { - defaultPool, - fetchGeoTIFF, - getGeographicBounds, - loadRgbImage, -} from "./geotiff/geotiff.js"; +import type { ProjectionDefinition } from "wkt-parser"; +import wktParser from "wkt-parser"; +import { fetchGeoTIFF, getGeographicBounds } from "./geotiff/geotiff.js"; import { extractGeotiffReprojectors } from "./geotiff-reprojection.js"; -import type { GeoKeysParser, ProjectionInfo } from "./proj.js"; -import { epsgIoGeoKeyParser } from "./proj.js"; +import type { EpsgResolver } from "./proj.js"; +import { epsgResolver } from "./proj.js"; export interface GeoTIFFLayerProps extends CompositeLayerProps { /** @@ -24,17 +21,19 @@ export interface GeoTIFFLayerProps extends CompositeLayerProps { * - An instance of GeoTIFF.js's GeoTIFF class * - An instance of GeoTIFF.js's BaseClient for custom fetching */ - geotiff: GeoTIFF | string | ArrayBuffer | Blob | BaseClient; + // TODO: restore support for string, ArrayBuffer, Blob + geotiff: GeoTIFF; /** - * A function callback for parsing GeoTIFF geo keys to a Proj4 compatible - * definition. + * A function callback for parsing numeric EPSG codes to projection + * information (as returned by `wkt-parser`). * - * By default, uses epsg.io to resolve EPSG codes found in the GeoTIFF. - * Alternatively, you may want to use `geotiff-geokeys-to-proj4`, which is - * more extensive but adds 1.5MB to your bundle size. + * The default implementation: + * - makes a request to epsg.io to resolve EPSG codes found in the GeoTIFF. + * - caches any previous requests + * - parses PROJJSON response with `wkt-parser` */ - geoKeysParser?: GeoKeysParser; + epsgResolver?: EpsgResolver; /** * GeoTIFF.js Pool for decoding image chunks. @@ -42,7 +41,8 @@ export interface GeoTIFFLayerProps extends CompositeLayerProps { * If none is provided, a default Pool will be created and shared between all * COGLayer and GeoTIFFLayer instances. */ - pool?: Pool; + // TODO: Restore a sort of worker pool with our geotiff implementation + // pool?: Pool; /** * Maximum reprojection error in pixels for mesh refinement. @@ -65,14 +65,11 @@ export interface GeoTIFFLayerProps extends CompositeLayerProps { /** * Called when the GeoTIFF metadata has been loaded and parsed. - * - * @param {GeoTIFF} geotiff - * @param {ProjectionInfo} projection */ onGeoTIFFLoad?: ( geotiff: GeoTIFF, options: { - projection: ProjectionInfo; + projection: ProjectionDefinition; /** * Bounds of the image in geographic coordinates (WGS84) [minLon, minLat, * maxLon, maxLat] @@ -88,7 +85,7 @@ export interface GeoTIFFLayerProps extends CompositeLayerProps { } const defaultProps = { - geoKeysParser: epsgIoGeoKeyParser, + epsgResolver, }; /** @@ -130,40 +127,41 @@ export class GeoTIFFLayer extends CompositeLayer { async _parseGeoTIFF(): Promise { const geotiff = await fetchGeoTIFF(this.props.geotiff); - const image = await geotiff.getImage(); - - const geoKeysParser = this.props.geoKeysParser!; - const sourceProjection = await geoKeysParser(image.getGeoKeys()); - if (!sourceProjection) { - throw new Error( - "Could not determine source projection from GeoTIFF geo keys", - ); - } + const crs = geotiff.crs; + const sourceProjection = + typeof crs === "number" + ? await this.props.epsgResolver!(crs) + : wktParser(crs); - const converter = proj4(sourceProjection.def, "EPSG:4326"); + // @ts-expect-error proj4 has incomplete types that don't support wkt-parser + // output + const converter = proj4(sourceProjection, "EPSG:4326"); if (this.props.onGeoTIFFLoad) { - const geographicBounds = getGeographicBounds(image, converter); + const geographicBounds = getGeographicBounds(geotiff, converter); this.props.onGeoTIFFLoad(geotiff, { projection: sourceProjection, geographicBounds, }); } + // biome-ignore lint/correctness/noUnusedVariables: not implemented const reprojectionFns = await extractGeotiffReprojectors( geotiff, - sourceProjection.def, + sourceProjection, ); - const { texture, height, width } = await loadRgbImage(image, { - pool: this.props.pool || defaultPool(), - }); - - this.setState({ - reprojectionFns, - imageData: texture, - height, - width, - }); + + // Our GeoTIFF implementation doesn't currently support reading the full + // image; it only supports reading tiles. + throw new Error("Loading GeoTIFF image data not yet implemented"); + // const { texture, height, width } = await loadRgbImage(image); + + // this.setState({ + // reprojectionFns, + // imageData: texture, + // height, + // width, + // }); } renderLayers() { diff --git a/packages/deck.gl-geotiff/src/index.ts b/packages/deck.gl-geotiff/src/index.ts index fe8e598..4674efb 100644 --- a/packages/deck.gl-geotiff/src/index.ts +++ b/packages/deck.gl-geotiff/src/index.ts @@ -1,14 +1,11 @@ export type { COGLayerProps } from "./cog-layer.js"; export { COGLayer } from "./cog-layer.js"; -export { parseCOGTileMatrixSet } from "./cog-tile-matrix-set.js"; export { loadRgbImage, parseColormap } from "./geotiff/geotiff.js"; export * as texture from "./geotiff/texture.js"; -export type { GeoTIFFLayerProps } from "./geotiff-layer.js"; -export { GeoTIFFLayer } from "./geotiff-layer.js"; -export { - extractGeotiffReprojectors, - fromGeoTransform, -} from "./geotiff-reprojection.js"; +// Don't export GeoTIFF Layer for now; nudge people towards COGLayer +// export type { GeoTIFFLayerProps } from "./geotiff-layer.js"; +// export { GeoTIFFLayer } from "./geotiff-layer.js"; +export { extractGeotiffReprojectors } from "./geotiff-reprojection.js"; export type { MosaicLayerProps } from "./mosaic-layer/mosaic-layer.js"; export { MosaicLayer } from "./mosaic-layer/mosaic-layer.js"; export { @@ -16,7 +13,3 @@ export { MosaicTileset2D, } from "./mosaic-layer/mosaic-tileset-2d"; export * as proj from "./proj.js"; - -import { __TEST_EXPORTS as cogTileMatrixSetTestExports } from "./cog-tile-matrix-set.js"; - -export const __TEST_EXPORTS = { ...cogTileMatrixSetTestExports }; From 15ceccca115469f3e8c34bd99c806fde41641184 Mon Sep 17 00:00:00 2001 From: Kyle Barron Date: Tue, 17 Feb 2026 13:31:32 -0500 Subject: [PATCH 11/36] standardize on a single affine implementation --- packages/affine/src/affine.ts | 6 ++- packages/deck.gl-geotiff/package.json | 1 + .../raster-reproject/src/affine/affine.ts | 51 ------------------- packages/raster-reproject/src/affine/index.ts | 2 - pnpm-lock.yaml | 3 ++ 5 files changed, 9 insertions(+), 54 deletions(-) delete mode 100644 packages/raster-reproject/src/affine/affine.ts delete mode 100644 packages/raster-reproject/src/affine/index.ts diff --git a/packages/affine/src/affine.ts b/packages/affine/src/affine.ts index b063ca2..53b96a1 100644 --- a/packages/affine/src/affine.ts +++ b/packages/affine/src/affine.ts @@ -81,7 +81,11 @@ export function invert([sa, sb, sc, sd, se, sf]: Affine): Affine { const rd = -sd * idet; const re = sa * idet; - return [ra, rb, -sc * ra - sf * rb, rd, re, -sc * rd - sf * re]; + // biome-ignore format: array + return [ + ra, rb, -sc * ra - sf * rb, + rd, re, -sc * rd - sf * re + ]; } /** Get the 'a' component of an Affine transform. */ diff --git a/packages/deck.gl-geotiff/package.json b/packages/deck.gl-geotiff/package.json index 2560dd2..9b3ae59 100644 --- a/packages/deck.gl-geotiff/package.json +++ b/packages/deck.gl-geotiff/package.json @@ -47,6 +47,7 @@ }, "dependencies": { "@cogeotiff/core": "^9.1.2", + "@developmentseed/affine": "workspace:^", "@developmentseed/deck.gl-raster": "workspace:^", "@developmentseed/geotiff": "workspace:^", "@developmentseed/morecantile": "workspace:^", diff --git a/packages/raster-reproject/src/affine/affine.ts b/packages/raster-reproject/src/affine/affine.ts deleted file mode 100644 index d455021..0000000 --- a/packages/raster-reproject/src/affine/affine.ts +++ /dev/null @@ -1,51 +0,0 @@ -export type GeoTransform = [number, number, number, number, number, number]; - -/** - * Find the inverse of this GeoTransform. - * - * Ported from rasterio/affine: - * https://github.com/rasterio/affine/blob/a7a916fc7012f8afeb6489246ada61a76ccb8bc7/src/affine.py#L671-L692 - * under the BSD-3-Clause License. - * - * @param {GeoTransform} gt Geotransform. - * - * @return {GeoTransform} Inverse of the geotransform. - */ -export function invertGeoTransform(gt: GeoTransform): GeoTransform { - if (isDegenerate(gt)) { - throw new Error("Cannot invert degenerate transform"); - } - - const idet = 1.0 / determinant(gt); - const [sa, sb, sc, sd, se, sf] = gt; - const ra = se * idet; - const rb = -sb * idet; - const rd = -sd * idet; - const re = sa * idet; - // biome-ignore format: array - return [ - ra, rb, -sc * ra - sf * rb, - rd, re, -sc * rd - sf * re, - ]; -} - -function isDegenerate(gt: GeoTransform): boolean { - return determinant(gt) === 0; -} - -function determinant(gt: GeoTransform): number { - const [a, b, _c, d, e, _f] = gt; - return a * e - b * d; -} - -/** - * Apply a GeoTransform to a coordinate. - */ -export function applyAffine( - x: number, - y: number, - gt: [number, number, number, number, number, number], -): [number, number] { - const [a, b, c, d, e, f] = gt; - return [a * x + b * y + c, d * x + e * y + f]; -} diff --git a/packages/raster-reproject/src/affine/index.ts b/packages/raster-reproject/src/affine/index.ts deleted file mode 100644 index 7a082af..0000000 --- a/packages/raster-reproject/src/affine/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export type { GeoTransform } from "./affine.js"; -export { applyAffine, invertGeoTransform } from "./affine.js"; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2fa1f09..b453168 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -258,6 +258,9 @@ importers: '@deck.gl/mesh-layers': specifier: 9.2.7 version: 9.2.7(@deck.gl/core@9.2.7)(@loaders.gl/core@4.3.4)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/gltf@9.2.6(@luma.gl/constants@9.2.6)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)) + '@developmentseed/affine': + specifier: workspace:^ + version: link:../affine '@developmentseed/deck.gl-raster': specifier: workspace:^ version: link:../deck.gl-raster From f1d65031b93563432780022af665328ff693cbfe Mon Sep 17 00:00:00 2001 From: Kyle Barron Date: Tue, 17 Feb 2026 13:32:51 -0500 Subject: [PATCH 12/36] cleanup --- packages/deck.gl-geotiff/src/cog-layer.ts | 9 +- .../src/geotiff-reprojection.ts | 82 +++--------------- .../deck.gl-geotiff/src/geotiff/geotiff.ts | 86 ++----------------- .../src/geotiff/render-pipeline.ts | 22 +++-- packages/deck.gl-geotiff/src/geotiff/types.ts | 19 ---- 5 files changed, 39 insertions(+), 179 deletions(-) diff --git a/packages/deck.gl-geotiff/src/cog-layer.ts b/packages/deck.gl-geotiff/src/cog-layer.ts index 9b3ecfa..4b68f12 100644 --- a/packages/deck.gl-geotiff/src/cog-layer.ts +++ b/packages/deck.gl-geotiff/src/cog-layer.ts @@ -27,7 +27,7 @@ import wktParser from "wkt-parser"; import { fetchGeoTIFF, getGeographicBounds } from "./geotiff/geotiff.js"; import type { TextureDataT } from "./geotiff/render-pipeline.js"; import { inferRenderPipeline } from "./geotiff/render-pipeline.js"; -import { fromGeoTransform } from "./geotiff-reprojection.js"; +import { fromAffine } from "./geotiff-reprojection.js"; import type { EpsgResolver } from "./proj.js"; import { epsgResolver } from "./proj.js"; @@ -76,6 +76,7 @@ export interface COGLayerProps * - An instance of GeoTIFF.js's GeoTIFF class * - An instance of GeoTIFF.js's BaseClient for custom fetching */ + // TODO: restore support for string, ArrayBuffer, Blob geotiff: GeoTIFF; /** @@ -95,6 +96,7 @@ export interface COGLayerProps * If none is provided, a default Pool will be created and shared between all * COGLayer and GeoTIFFLayer instances. */ + // TODO: Restore a sort of worker pool with our geotiff implementation // pool?: Pool; /** @@ -143,9 +145,6 @@ export interface COGLayerProps /** * Called when the GeoTIFF metadata has been loaded and parsed. - * - * @param {GeoTIFF} geotiff - * @param {ProjectionInfo} projection */ onGeoTIFFLoad?: ( geotiff: GeoTIFF, @@ -289,7 +288,7 @@ export class COGLayer< const { tileWidth, tileHeight } = tileMatrix; const tileAffine = tileTransform(tileMatrix, { col: x, row: y }); - const { forwardTransform, inverseTransform } = fromGeoTransform(tileAffine); + const { forwardTransform, inverseTransform } = fromAffine(tileAffine); const window: [number, number, number, number] = [ x * tileWidth, diff --git a/packages/deck.gl-geotiff/src/geotiff-reprojection.ts b/packages/deck.gl-geotiff/src/geotiff-reprojection.ts index 9f830f4..8125404 100644 --- a/packages/deck.gl-geotiff/src/geotiff-reprojection.ts +++ b/packages/deck.gl-geotiff/src/geotiff-reprojection.ts @@ -1,33 +1,28 @@ -/* eslint-env browser */ - +import * as affine from "@developmentseed/affine"; +import type { GeoTIFF } from "@developmentseed/geotiff"; import type { ReprojectionFns } from "@developmentseed/raster-reproject"; -import { - applyAffine, - invertGeoTransform, -} from "@developmentseed/raster-reproject/affine"; -import type { GeoTIFF, GeoTIFFImage } from "geotiff"; import proj4 from "proj4"; import type { PROJJSONDefinition } from "proj4/dist/lib/core"; import type Projection from "proj4/dist/lib/Proj"; +import type { ProjectionDefinition } from "wkt-parser"; // Derived from existing work here: // https://github.com/developmentseed/lonboard/blob/35a1f3d691604ad9e083bf10a4bfde4158171486/src/cog-tileset/claude-tileset-2d-improved.ts#L141 // // TODO: return a RasterReprojector instance, given the IFD and tile of interest? export async function extractGeotiffReprojectors( - tiff: GeoTIFF, - sourceProjection: string | PROJJSONDefinition, + geotiff: GeoTIFF, + sourceProjection: string | PROJJSONDefinition | ProjectionDefinition, outputCrs: string | PROJJSONDefinition | Projection = "EPSG:4326", ): Promise { - const image = await tiff.getImage(); - // Extract geotransform from full-resolution image // Only the top-level IFD has geo keys, so we'll derive overviews from this - const baseGeotransform = extractGeotransform(image); + const baseGeotransform = geotiff.transform; + // @ts-expect-error - proj4 type definitions are incomplete and don't include + // support for wkt-parser output const converter = proj4(sourceProjection, outputCrs); - const { forwardTransform, inverseTransform } = - fromGeoTransform(baseGeotransform); + const { forwardTransform, inverseTransform } = fromAffine(baseGeotransform); return { forwardTransform, @@ -39,66 +34,17 @@ export async function extractGeotiffReprojectors( }; } -export function fromGeoTransform( +export function fromAffine( geotransform: [number, number, number, number, number, number], ): { forwardTransform: (x: number, y: number) => [number, number]; inverseTransform: (x: number, y: number) => [number, number]; } { - const inverseGeotransform = invertGeoTransform(geotransform); + const inverseGeotransform = affine.invert(geotransform); return { - forwardTransform: (x: number, y: number) => applyAffine(x, y, geotransform), + forwardTransform: (x: number, y: number) => + affine.apply(geotransform, x, y), inverseTransform: (x: number, y: number) => - applyAffine(x, y, inverseGeotransform), + affine.apply(inverseGeotransform, x, y), }; } - -/** - * Extract affine geotransform from a GeoTIFF image. - * - * The first `image` must be passed in, as only the top-level IFD contains geo - * keys. - * - * Returns a 6-element array in Python `affine` package ordering: - * [a, b, c, d, e, f] where: - * - x_geo = a * col + b * row + c - * - y_geo = d * col + e * row + f - * - * This is NOT GDAL ordering, which is [c, a, b, f, d, e]. - */ -export function extractGeotransform( - image: GeoTIFFImage, -): [number, number, number, number, number, number] { - const origin = image.getOrigin(); - const resolution = image.getResolution(); - - // origin: [x, y, z] - // resolution: [x_res, y_res, z_res] - - // Check for rotation/skew in the file directory - const fileDirectory = image.getFileDirectory(); - const modelTransformation = fileDirectory.ModelTransformation; - - let b = 0; // row rotation - let d = 0; // column rotation - - if (modelTransformation && modelTransformation.length >= 16) { - // ModelTransformation is a 4x4 matrix in row-major order - // [0 1 2 3 ] [a b 0 c] - // [4 5 6 7 ] = [d e 0 f] - // [8 9 10 11] [0 0 1 0] - // [12 13 14 15] [0 0 0 1] - b = modelTransformation[1]; - d = modelTransformation[4]; - } - - // Return in affine package ordering: [a, b, c, d, e, f] - return [ - resolution[0]!, // a: pixel width - b, // b: row rotation - origin[0]!, // c: x origin - d, // d: column rotation - resolution[1]!, // e: pixel height (often negative) - origin[1]!, // f: y origin - ]; -} diff --git a/packages/deck.gl-geotiff/src/geotiff/geotiff.ts b/packages/deck.gl-geotiff/src/geotiff/geotiff.ts index 27a1698..9ca5f9d 100644 --- a/packages/deck.gl-geotiff/src/geotiff/geotiff.ts +++ b/packages/deck.gl-geotiff/src/geotiff/geotiff.ts @@ -1,14 +1,6 @@ // Utilities for interacting with geotiff.js. -import type { GeoTIFF, GeoTIFFImage, TypedArrayWithDimensions } from "geotiff"; -import { - BaseClient, - fromArrayBuffer, - fromBlob, - fromCustomClient, - fromUrl, - Pool, -} from "geotiff"; +import type { GeoTIFF, RasterArray } from "@developmentseed/geotiff"; import type { Converter } from "proj4"; /** @@ -19,34 +11,12 @@ type ReadRasterOptions = { window?: [number, number, number, number]; /** The optional decoder pool to use. */ - pool?: Pool; + // pool?: Pool; /** An AbortSignal that may be signalled if the request is to be aborted */ signal?: AbortSignal; }; -/** - * A default geotiff.js decoder pool instance. - * - * It will be created on first call of `defaultPool`. - */ -let DEFAULT_POOL: Pool | null = null; - -/** - * Retrieve the default geotiff.js decoder Pool. - * - * If a Pool has not yet been created, it will be created on first call. - * - * The Pool will be shared between all COGLayer and GeoTIFFLayer instances. - */ -export function defaultPool(): Pool { - if (DEFAULT_POOL === null) { - DEFAULT_POOL = new Pool(); - } - - return DEFAULT_POOL; -} - /** * Load an RGBA image from a GeoTIFFImage. */ @@ -80,7 +50,7 @@ export async function loadRgbImage( * Only supports input arrays with 3 (RGB) or 4 (RGBA) channels. If the input is * already RGBA, it is returned unchanged. */ -export function addAlphaChannel(rgbImage: TypedArrayWithDimensions): ImageData { +export function addAlphaChannel(rgbImage: RasterArray): ImageData { const { height, width } = rgbImage; if (rgbImage.length === height * width * 4) { @@ -136,27 +106,8 @@ export function parseColormap(cmap: Uint16Array): ImageData { return new ImageData(rgba, size, 1); } -export async function fetchGeoTIFF( - input: GeoTIFF | string | ArrayBuffer | Blob | BaseClient, -): Promise { - if (typeof input === "string") { - return fromUrl(input); - } - - if (input instanceof ArrayBuffer) { - return fromArrayBuffer(input); - } - - if (input instanceof Blob) { - return fromBlob(input); - } - - // TODO: instanceof may fail here if multiple versions of geotiff.js are - // present - if (input instanceof BaseClient) { - return fromCustomClient(input); - } - +// TODO: restore support for string, ArrayBuffer, Blob input +export async function fetchGeoTIFF(input: GeoTIFF): Promise { return input; } @@ -164,18 +115,12 @@ export async function fetchGeoTIFF( * Calculate the WGS84 bounding box of a GeoTIFF image */ export function getGeographicBounds( - image: GeoTIFFImage, + geotiff: GeoTIFF, converter: Converter, ): { west: number; south: number; east: number; north: number } { - const projectedBbox = image.getBoundingBox() as [ - number, - number, - number, - number, - ]; + const [minX, minY, maxX, maxY] = geotiff.bbox; // Reproject all four corners to handle rotation/skew - const [minX, minY, maxX, maxY] = projectedBbox; const corners: [number, number][] = [ converter.forward([minX, minY]), // bottom-left converter.forward([maxX, minY]), // bottom-right @@ -195,20 +140,3 @@ export function getGeographicBounds( // Return bounds in MapLibre format: [[west, south], [east, north]] return { west, south, east, north }; } - -/** Parse the GDAL_NODATA TIFF tag into a number. */ -export function parseGDALNoData( - GDAL_NODATA: string | undefined, -): number | null { - if (!GDAL_NODATA) { - return null; - } - - // Remove trailing null character if present - const noDataString = - GDAL_NODATA?.[GDAL_NODATA?.length - 1] === "\x00" - ? GDAL_NODATA.slice(0, -1) - : GDAL_NODATA; - - return noDataString?.length > 0 ? parseFloat(noDataString) : null; -} diff --git a/packages/deck.gl-geotiff/src/geotiff/render-pipeline.ts b/packages/deck.gl-geotiff/src/geotiff/render-pipeline.ts index f3650ec..f66a215 100644 --- a/packages/deck.gl-geotiff/src/geotiff/render-pipeline.ts +++ b/packages/deck.gl-geotiff/src/geotiff/render-pipeline.ts @@ -1,3 +1,5 @@ +import type { TiffImage } from "@cogeotiff/core"; +import { TiffTag } from "@cogeotiff/core"; import type { RasterModule } from "@developmentseed/deck.gl-raster/gpu-modules"; import { CMYKToRGB, @@ -7,12 +9,12 @@ import { FilterNoDataVal, YCbCrToRGB, } from "@developmentseed/deck.gl-raster/gpu-modules"; +import type { GeoTIFF } from "@developmentseed/geotiff"; import type { Device, SamplerProps, Texture } from "@luma.gl/core"; import type { GeoTIFFImage, TypedArrayWithDimensions } from "geotiff"; import type { COGLayerProps, GetTileDataOptions } from "../cog-layer"; -import { addAlphaChannel, parseColormap, parseGDALNoData } from "./geotiff"; +import { addAlphaChannel, parseColormap } from "./geotiff"; import { inferTextureFormat } from "./texture"; -import type { ImageFileDirectory } from "./types"; import { PhotometricInterpretationT } from "./types"; export type TextureDataT = { @@ -41,19 +43,22 @@ type UnresolvedRasterModule = }; export function inferRenderPipeline( - // TODO: narrow type to only used fields - ifd: ImageFileDirectory, + geotiff: GeoTIFF, device: Device, ): { getTileData: COGLayerProps["getTileData"]; renderTile: COGLayerProps["renderTile"]; } { - const { SampleFormat } = ifd; + const ifd = geotiff.image; + const SampleFormat = ifd.value(TiffTag.SampleFormat); + if (SampleFormat === null) { + throw new Error("SampleFormat tag is required to infer render pipeline"); + } switch (SampleFormat[0]) { // Unsigned integers case 1: - return createUnormPipeline(ifd, device); + return createUnormPipeline(geotiff, device); } throw new Error( @@ -65,12 +70,13 @@ export function inferRenderPipeline( * Create pipeline for visualizing unsigned-integer data. */ function createUnormPipeline( - ifd: ImageFileDirectory, + geotiff: GeoTIFF, device: Device, ): { getTileData: COGLayerProps["getTileData"]; renderTile: COGLayerProps["renderTile"]; } { + const ifd = geotiff.image; const { BitsPerSample, ColorMap, @@ -90,7 +96,7 @@ function createUnormPipeline( ]; // Add NoData filtering if GDAL_NODATA is defined - const noDataVal = parseGDALNoData(GDAL_NODATA); + const noDataVal = geotiff.nodata; if (noDataVal !== null) { // Since values are 0-1 for unorm textures, const noDataScaled = noDataVal / 255.0; diff --git a/packages/deck.gl-geotiff/src/geotiff/types.ts b/packages/deck.gl-geotiff/src/geotiff/types.ts index 995f19c..0347265 100644 --- a/packages/deck.gl-geotiff/src/geotiff/types.ts +++ b/packages/deck.gl-geotiff/src/geotiff/types.ts @@ -14,22 +14,3 @@ export enum PlanarConfigurationT { Chunky = 1, Planar = 2, } - -/** Improved typing for IFD. */ -export type ImageFileDirectory = { - BitsPerSample: Uint16Array; - ColorMap?: Uint16Array; - Compression: number; - /** GDAL NoData value as string. - * - */ - GDAL_NODATA?: string; - ImageLength: number; - ImageWidth: number; - PhotometricInterpretation: PhotometricInterpretationT; - /** Strip or tiled */ - PlanarConfiguration: PlanarConfigurationT; - SampleFormat: Uint16Array; - /** Number of bands */ - SamplesPerPixel: number; -}; From 79727cc6db5f339e203d32fa62c502065d9ffc38 Mon Sep 17 00:00:00 2001 From: Kyle Barron Date: Tue, 17 Feb 2026 13:33:15 -0500 Subject: [PATCH 13/36] remove second copy of generating tms --- .../src/cog-tile-matrix-set.ts | 167 ------------------ packages/geotiff/src/tile-matrix-set.ts | 17 +- 2 files changed, 12 insertions(+), 172 deletions(-) diff --git a/packages/deck.gl-geotiff/src/cog-tile-matrix-set.ts b/packages/deck.gl-geotiff/src/cog-tile-matrix-set.ts index 9af63af..162a6d3 100644 --- a/packages/deck.gl-geotiff/src/cog-tile-matrix-set.ts +++ b/packages/deck.gl-geotiff/src/cog-tile-matrix-set.ts @@ -6,172 +6,9 @@ import type { import { metersPerUnit } from "@developmentseed/morecantile"; import type { GeoTIFF, GeoTIFFImage } from "geotiff"; import proj4, { type ProjectionDefinition } from "proj4"; -import Ellipsoid from "./ellipsoids.js"; import { extractGeotransform } from "./geotiff-reprojection"; import type { GeoKeysParser, ProjectionInfo, SupportedCrsUnit } from "./proj"; -// 0.28 mm per pixel -// https://docs.ogc.org/is/17-083r4/17-083r4.html#toc15 -const SCREEN_PIXEL_SIZE = 0.00028; - -/** - * - * Ported from Vincent's work here: - * https://github.com/developmentseed/morecantile/pull/187/changes#diff-402eedddfa30af554d03750c8a82a09962b44b044976c321b774b484b98e8f48R665 - * - * @return {TileMatrixSet}[return description] - */ -export async function parseCOGTileMatrixSet( - tiff: GeoTIFF, - geoKeysParser: GeoKeysParser, -): Promise { - const fullResImage = await tiff.getImage(); - - if (!fullResImage.isTiled) { - throw new Error("COG TileMatrixSet requires a tiled GeoTIFF"); - } - - const imageCount = await tiff.getImageCount(); - const bbox = fullResImage.getBoundingBox(); - const fullImageWidth = fullResImage.getWidth(); - const fullImageHeight = fullResImage.getHeight(); - - const crs = await geoKeysParser(fullResImage.getGeoKeys()); - - if (crs === null) { - throw new Error( - "Could not determine coordinate reference system from GeoTIFF geo keys", - ); - } - - const projectToWgs84 = proj4(crs.def, "EPSG:4326").forward; - const projectTo3857 = proj4(crs.def, "EPSG:3857").forward; - - const boundingBox: TileMatrixSet["boundingBox"] = { - lowerLeft: [bbox[0]!, bbox[1]!], - upperRight: [bbox[2]!, bbox[3]!], - }; - - const transform = extractGeotransform(fullResImage); - - if (transform[1] !== 0 || transform[3] !== 0) { - // TileMatrixSet assumes orthogonal axes - throw new Error( - "COG TileMatrixSet with rotation/skewed geotransform is not supported", - ); - } - - const cellSize = Math.abs(transform[0]); - - const tileWidth = fullResImage.getTileWidth(); - const tileHeight = fullResImage.getTileHeight(); - - const tileMatrices: TileMatrix[] = [ - { - // Set as highest resolution / finest level - id: String(imageCount - 1), - scaleDenominator: - (cellSize * metersPerUnit(crs.parsed, crs.coordinatesUnits)) / - SCREEN_PIXEL_SIZE, - cellSize, - pointOfOrigin: [transform[2], transform[5]], - tileWidth: fullResImage.getTileWidth(), - tileHeight: fullResImage.getTileHeight(), - matrixWidth: Math.ceil(fullImageWidth / tileWidth), - matrixHeight: Math.ceil(fullImageHeight / tileHeight), - geotransform: transform, - }, - ]; - - // Starting from 1 to skip full res image - for (let imageIdx = 1; imageIdx < imageCount; imageIdx++) { - const image = await tiff.getImage(imageIdx); - - if (!image.isTiled) { - throw new Error("COG TileMatrixSet requires a tiled GeoTIFF"); - } - - const tileMatrix = createOverviewTileMatrix({ - id: String(imageCount - 1 - imageIdx), - image, - fullWidth: fullImageWidth, - fullHeight: fullImageHeight, - baseTransform: transform, - crs, - }); - tileMatrices.push(tileMatrix); - } - - // Reverse to have coarsest level first - tileMatrices.reverse(); - - return { - crs, - boundingBox, - wgsBounds: computeWgs84BoundingBox(boundingBox, projectToWgs84), - tileMatrices, - }; -} - -/** - * Create tile matrix for COG overview - */ -function createOverviewTileMatrix({ - id, - image, - fullWidth, - baseTransform, - crs, -}: { - id: string; - image: GeoTIFFImage; - fullWidth: number; - fullHeight: number; - baseTransform: [number, number, number, number, number, number]; - crs: ProjectionInfo; -}): TileMatrix { - const width = image.getWidth(); - const height = image.getHeight(); - - // For now, just use scaleX - // https://github.com/developmentseed/morecantile/pull/187/changes#r2621314673 - const scaleX = fullWidth / width; - - // const scaleY = fullHeight / height; - // if (Math.abs(scaleX - scaleY) > 1e-3) { - // throw new Error("Non-uniform overview scaling detected (X/Y differ)"); - // } - - const scale = scaleX; - - const geotransform: [number, number, number, number, number, number] = [ - baseTransform[0] * scale, - baseTransform[1] * scale, - baseTransform[2], // x origin stays the same - baseTransform[3] * scale, - baseTransform[4] * scale, - baseTransform[5], // y origin stays the same - ]; - const cellSize = Math.abs(geotransform[0]); - - const tileWidth = image.getTileWidth(); - const tileHeight = image.getTileHeight(); - - return { - id, - scaleDenominator: - (cellSize * metersPerUnit(crs.parsed, crs.coordinatesUnits)) / - SCREEN_PIXEL_SIZE, - cellSize, - pointOfOrigin: [geotransform[2], geotransform[5]], - tileWidth, - tileHeight, - matrixWidth: Math.ceil(width / tileWidth), - matrixHeight: Math.ceil(height / tileHeight), - geotransform, - }; -} - function computeWgs84BoundingBox( boundingBox: BoundingBox, projectToWgs84: (point: [number, number]) => [number, number], @@ -218,7 +55,3 @@ function computeWgs84BoundingBox( upperRight: [maxLon, maxLat], }; } - -export const __TEST_EXPORTS = { - metersPerUnit, -}; diff --git a/packages/geotiff/src/tile-matrix-set.ts b/packages/geotiff/src/tile-matrix-set.ts index 9e65fd0..8c140ee 100644 --- a/packages/geotiff/src/tile-matrix-set.ts +++ b/packages/geotiff/src/tile-matrix-set.ts @@ -90,6 +90,18 @@ export function generateTileMatrixSet( const bbox = geotiff.bbox; const tr = geotiff.transform; + // Full-resolution level is appended last. + if (!geotiff.isTiled) { + throw new Error("GeoTIFF must be tiled to generate a TMS."); + } + + if (tr[1] !== 0 || tr[3] !== 0) { + // TileMatrixSet assumes orthogonal axes + throw new Error( + "COG TileMatrixSet with rotation/skewed geotransform is not supported", + ); + } + // Perhaps we should allow metersPerUnit to take any string const crsUnit = crs.units as | "m" @@ -131,11 +143,6 @@ export function generateTileMatrixSet( ); } - // Full-resolution level is appended last. - if (!geotiff.isTiled) { - throw new Error("GeoTIFF must be tiled to generate a TMS."); - } - tileMatrices.push( buildTileMatrix( String(geotiff.overviews.length), From 1e87124d245bd514a27e4f9e829343ffb8cd7aa9 Mon Sep 17 00:00:00 2001 From: Kyle Barron Date: Tue, 17 Feb 2026 13:54:34 -0500 Subject: [PATCH 14/36] update raster tile traversal --- packages/deck.gl-raster/package.json | 1 + .../src/raster-tileset/raster-tileset-2d.ts | 77 ++++++++----------- .../src/raster-tileset/types.ts | 2 +- pnpm-lock.yaml | 3 + 4 files changed, 37 insertions(+), 46 deletions(-) diff --git a/packages/deck.gl-raster/package.json b/packages/deck.gl-raster/package.json index 30894de..7204f48 100644 --- a/packages/deck.gl-raster/package.json +++ b/packages/deck.gl-raster/package.json @@ -60,6 +60,7 @@ "@luma.gl/shadertools": "^9.2.7" }, "dependencies": { + "@developmentseed/affine": "workspace:^", "@developmentseed/morecantile": "workspace:^", "@developmentseed/raster-reproject": "workspace:^", "@math.gl/core": "^4.1.0", diff --git a/packages/deck.gl-raster/src/raster-tileset/raster-tileset-2d.ts b/packages/deck.gl-raster/src/raster-tileset/raster-tileset-2d.ts index becfc59..90231b5 100644 --- a/packages/deck.gl-raster/src/raster-tileset/raster-tileset-2d.ts +++ b/packages/deck.gl-raster/src/raster-tileset/raster-tileset-2d.ts @@ -8,7 +8,9 @@ import type { Viewport } from "@deck.gl/core"; import type { _Tileset2DProps as Tileset2DProps } from "@deck.gl/geo-layers"; import { _Tileset2D as Tileset2D } from "@deck.gl/geo-layers"; -import type { TileMatrixSet } from "@developmentseed/morecantile"; +import * as affine from "@developmentseed/affine"; +import type { BoundingBox, TileMatrixSet } from "@developmentseed/morecantile"; +import { tileTransform } from "@developmentseed/morecantile"; import type { Matrix4 } from "@math.gl/core"; import { getTileIndices } from "./raster-tile-traversal"; @@ -27,32 +29,34 @@ import type { * specification. */ export class TMSTileset2D extends Tileset2D { - private metadata: TileMatrixSet; + private tms: TileMatrixSet; private wgs84Bounds: CornerBounds; - private projectToWgs84: ProjectionFunction; private projectTo3857: ProjectionFunction; constructor( opts: Tileset2DProps, - metadata: TileMatrixSet, + tms: TileMatrixSet, { - projectToWgs84, + projectTo4326, projectTo3857, }: { - projectToWgs84: ProjectionFunction; + projectTo4326: ProjectionFunction; projectTo3857: ProjectionFunction; }, ) { super(opts); - this.metadata = metadata; - this.projectToWgs84 = projectToWgs84; + this.tms = tms; this.projectTo3857 = projectTo3857; - this.wgs84Bounds = - metadata.wgsBounds || - projectBoundsToWgs84(metadata.boundingBox, projectToWgs84, { - densifyPts: 10, - }); + if (!tms.boundingBox) { + throw new Error( + "Bounding Box inference not yet implemented; should be provided on TileMatrixSet", + ); + } + + this.wgs84Bounds = projectBoundsToWgs84(tms.boundingBox, projectTo4326, { + densifyPts: 10, + }); } /** @@ -69,14 +73,14 @@ export class TMSTileset2D extends Tileset2D { modelMatrix?: Matrix4; modelMatrixInverse?: Matrix4; }): TileIndex[] { - const maxAvailableZ = this.metadata.tileMatrices.length - 1; + const maxAvailableZ = this.tms.tileMatrices.length - 1; const maxZ = typeof opts.maxZoom === "number" ? Math.min(opts.maxZoom, maxAvailableZ) : maxAvailableZ; - const tileIndices = getTileIndices(this.metadata, { + const tileIndices = getTileIndices(this.tms, { viewport: opts.viewport, maxZ, zRange: opts.zRange ?? null, @@ -97,8 +101,8 @@ export class TMSTileset2D extends Tileset2D { return index; } - const currentOverview = this.metadata.tileMatrices[index.z]!; - const parentOverview = this.metadata.tileMatrices[index.z - 1]!; + const currentOverview = this.tms.tileMatrices[index.z]!; + const parentOverview = this.tms.tileMatrices[index.z - 1]!; const decimation = currentOverview.cellSize / parentOverview.cellSize; @@ -115,15 +119,10 @@ export class TMSTileset2D extends Tileset2D { override getTileMetadata(index: TileIndex): Record { const { x, y, z } = index; - const { tileMatrices } = this.metadata; + const { tileMatrices } = this.tms; const tileMatrix = tileMatrices[z]!; - const { geotransform, tileHeight, tileWidth } = tileMatrix; - - // Use geotransform to calculate tile bounds - // geotransform: [a, b, c, d, e, f] where: - // x_geo = a * col + b * row + c - // y_geo = d * col + e * row + f - const [a, b, c, d, e, f] = geotransform; + const { tileHeight, tileWidth } = tileMatrix; + const tileAffine = tileTransform(tileMatrix, { col: x, row: y }); // Calculate pixel coordinates for this tile's extent const pixelMinCol = x * tileWidth; @@ -132,22 +131,10 @@ export class TMSTileset2D extends Tileset2D { const pixelMaxRow = (y + 1) * tileHeight; // Calculate the four corners of the tile in geographic coordinates - const topLeft: [number, number] = [ - a * pixelMinCol + b * pixelMinRow + c, - d * pixelMinCol + e * pixelMinRow + f, - ]; - const topRight: [number, number] = [ - a * pixelMaxCol + b * pixelMinRow + c, - d * pixelMaxCol + e * pixelMinRow + f, - ]; - const bottomLeft: [number, number] = [ - a * pixelMinCol + b * pixelMaxRow + c, - d * pixelMinCol + e * pixelMaxRow + f, - ]; - const bottomRight: [number, number] = [ - a * pixelMaxCol + b * pixelMaxRow + c, - d * pixelMaxCol + e * pixelMaxRow + f, - ]; + const topLeft = affine.apply(tileAffine, pixelMinCol, pixelMinRow); + const topRight = affine.apply(tileAffine, pixelMaxCol, pixelMinRow); + const bottomLeft = affine.apply(tileAffine, pixelMinCol, pixelMaxRow); + const bottomRight = affine.apply(tileAffine, pixelMaxCol, pixelMaxRow); // Return the projected bounds as four corners // This preserves rotation/skew information @@ -177,8 +164,8 @@ export class TMSTileset2D extends Tileset2D { } function projectBoundsToWgs84( - bounds: CornerBounds, - projectToWgs84: ProjectionFunction, + bounds: BoundingBox, + projectTo4326: ProjectionFunction, { densifyPts }: { densifyPts: number }, ): CornerBounds { const { lowerLeft, upperRight } = bounds; @@ -213,8 +200,8 @@ function projectBoundsToWgs84( let wgsMaxX = -Infinity; let wgsMaxY = -Infinity; - for (const pt of points) { - const [lon, lat] = projectToWgs84(pt); + for (const [x, y] of points) { + const [lon, lat] = projectTo4326(x, y); if (lon < wgsMinX) wgsMinX = lon; if (lat < wgsMinY) wgsMinY = lat; if (lon > wgsMaxX) wgsMaxX = lon; diff --git a/packages/deck.gl-raster/src/raster-tileset/types.ts b/packages/deck.gl-raster/src/raster-tileset/types.ts index 71652ea..50221bc 100644 --- a/packages/deck.gl-raster/src/raster-tileset/types.ts +++ b/packages/deck.gl-raster/src/raster-tileset/types.ts @@ -32,7 +32,7 @@ export type Point = [number, number]; type CRS = any; -export type ProjectionFunction = (point: Point) => Point; +export type ProjectionFunction = (x: number, y: number) => Point; /** * Bounding box defined by two named corners diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b453168..525e070 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -316,6 +316,9 @@ importers: '@deck.gl/mesh-layers': specifier: 9.2.7 version: 9.2.7(@deck.gl/core@9.2.7)(@loaders.gl/core@4.3.4)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/gltf@9.2.6(@luma.gl/constants@9.2.6)(@luma.gl/core@9.2.6)(@luma.gl/engine@9.2.6(@luma.gl/core@9.2.6)(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)))(@luma.gl/shadertools@9.2.6(@luma.gl/core@9.2.6)) + '@developmentseed/affine': + specifier: workspace:^ + version: link:../affine '@developmentseed/morecantile': specifier: workspace:^ version: link:../morecantile From 97e0b460ec58f75a1b7ed19a72f4f71bc8ddf77b Mon Sep 17 00:00:00 2001 From: Kyle Barron Date: Tue, 17 Feb 2026 15:45:53 -0500 Subject: [PATCH 15/36] Add xy_bounds to morecantile --- packages/deck.gl-geotiff/package.json | 1 - packages/morecantile/package.json | 4 +- packages/morecantile/src/index.ts | 2 +- packages/morecantile/src/tile.ts | 64 +++++++++++++++++++++++++++ packages/morecantile/src/transform.ts | 24 +--------- packages/morecantile/src/utils.ts | 9 ++++ pnpm-lock.yaml | 7 +-- 7 files changed, 82 insertions(+), 29 deletions(-) create mode 100644 packages/morecantile/src/tile.ts diff --git a/packages/deck.gl-geotiff/package.json b/packages/deck.gl-geotiff/package.json index 9b3ae59..3378363 100644 --- a/packages/deck.gl-geotiff/package.json +++ b/packages/deck.gl-geotiff/package.json @@ -53,7 +53,6 @@ "@developmentseed/morecantile": "workspace:^", "@developmentseed/raster-reproject": "workspace:^", "flatbush": "^4.5.0", - "geotiff": "2.1.3", "proj4": "^2.20.2", "wkt-parser": "^1.5.2" }, diff --git a/packages/morecantile/package.json b/packages/morecantile/package.json index a82e6e3..3004203 100644 --- a/packages/morecantile/package.json +++ b/packages/morecantile/package.json @@ -45,7 +45,9 @@ "typescript": "^5.9.3", "vitest": "^4.0.18" }, - "dependencies": {}, + "dependencies": { + "@developmentseed/affine": "workspace:^" + }, "peerDependencies": {}, "volta": { "extends": "../../package.json" diff --git a/packages/morecantile/src/index.ts b/packages/morecantile/src/index.ts index 155e30d..c48db5d 100644 --- a/packages/morecantile/src/index.ts +++ b/packages/morecantile/src/index.ts @@ -1,4 +1,4 @@ -export type { Affine } from "./transform.js"; +export { xy_bounds } from "./tile.js"; export { matrixTransform, tileTransform } from "./transform.js"; export type { BoundingBox, diff --git a/packages/morecantile/src/tile.ts b/packages/morecantile/src/tile.ts new file mode 100644 index 0000000..f9d16af --- /dev/null +++ b/packages/morecantile/src/tile.ts @@ -0,0 +1,64 @@ +import * as affine from "@developmentseed/affine"; +import { tileTransform } from "./transform"; +import type { BoundingBox, TileMatrix, TileMatrixSet } from "./types"; +import { narrowTileMatrixSet } from "./utils"; + +/** + * Return the bounding box of the tile in the TMS's native coordinate reference + * system. + */ +export function xy_bounds( + matrix: TileMatrix, + tile: { x: number; y: number }, +): BoundingBox; +/** + * Return the bounding box of the tile in the TMS's native coordinate reference + * system. + */ +export function xy_bounds( + matrixSet: TileMatrixSet, + tile: { x: number; y: number; z: number }, +): BoundingBox; +export function xy_bounds( + input: TileMatrix | TileMatrixSet, + tile: { x: number; y: number; z?: number }, +): BoundingBox { + const tileMatrix = getTileMatrix(input, tile); + const { tileHeight, tileWidth } = tileMatrix; + const { x, y } = tile; + const tileAffine = tileTransform(tileMatrix, { col: x, row: y }); + + // Apply affine to local tile pixel corners (0,0) is the origin corner, + // (tileWidth, tileHeight) is the opposite corner. + const [x0, y0] = affine.apply(tileAffine, 0, 0); + const [x1, y1] = affine.apply(tileAffine, tileWidth, tileHeight); + + if (tileMatrix.cornerOfOrigin === "bottomLeft") { + // (x0, y0) is bottom-left, (x1, y1) is top-right + return { lowerLeft: [x0, y0], upperRight: [x1, y1] }; + } + + // topLeft (default): (x0, y0) is top-left, (x1, y1) is bottom-right + return { lowerLeft: [x0, y1], upperRight: [x1, y0] }; +} + +function getTileMatrix( + input: TileMatrix | TileMatrixSet, + tile: { x: number; y: number; z?: number }, +): TileMatrix { + if (narrowTileMatrixSet(input)) { + if (tile.z === undefined) { + throw new Error("Tile z level is required when input is a TileMatrixSet"); + } + const tileMatrix = input.tileMatrices[tile.z]; + if (!tileMatrix) { + throw new Error( + `Tile z level ${tile.z} is out of bounds for TileMatrixSet with ${input.tileMatrices.length} levels.`, + ); + } + + return tileMatrix; + } else { + return input; + } +} diff --git a/packages/morecantile/src/transform.ts b/packages/morecantile/src/transform.ts index 5ce94f5..1725dcf 100644 --- a/packages/morecantile/src/transform.ts +++ b/packages/morecantile/src/transform.ts @@ -1,28 +1,6 @@ +import type { Affine } from "@developmentseed/affine"; import type { TileMatrix } from "./types/index.js"; -/** - * A 2-D affine transform as a six-element tuple in row-major order: - * - * x_crs = a * col_px + b * row_px + c - * y_crs = d * col_px + e * row_px + f - * - * For the north-up, axis-aligned grids produced by OGC TileMatrices, - * b and d are always zero, but the type does not enforce that. - * - * Note: the meaning of the two output axes depends on the - * `orderedAxes` field of the parent TileMatrixSet, which these - * helpers do not consult. Axis 0 of pointOfOrigin is axis 0 of the - * transform output, whatever that axis happens to be. - */ -export type Affine = [ - a: number, - b: number, - c: number, - d: number, - e: number, - f: number, -]; - /** * Construct a single affine transform that maps pixel coordinates * within *any* tile of the matrix to CRS coordinates. diff --git a/packages/morecantile/src/utils.ts b/packages/morecantile/src/utils.ts index 4a00f1e..5f1395a 100644 --- a/packages/morecantile/src/utils.ts +++ b/packages/morecantile/src/utils.ts @@ -12,6 +12,9 @@ * @param semiMajorAxis - The semi-major axis of the ellipsoid, required if unit is 'degree'. * @returns The meters per unit conversion factor. */ + +import type { TileMatrix, TileMatrixSet } from "./types"; + // https://github.com/developmentseed/morecantile/blob/7c95a11c491303700d6e33e9c1607f2719584dec/morecantile/utils.py#L67-L90 export function metersPerUnit( unit: @@ -52,3 +55,9 @@ export function metersPerUnit( `Unsupported CRS units: ${unit} when computing metersPerUnit.`, ); } + +export function narrowTileMatrixSet( + obj: TileMatrix | TileMatrixSet, +): obj is TileMatrixSet { + return "tileMatrices" in obj; +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 525e070..f9d4f76 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -279,9 +279,6 @@ importers: flatbush: specifier: ^4.5.0 version: 4.5.0 - geotiff: - specifier: 2.1.3 - version: 2.1.3 proj4: specifier: ^2.20.2 version: 2.20.2 @@ -417,6 +414,10 @@ importers: version: 1.5.2 packages/morecantile: + dependencies: + '@developmentseed/affine': + specifier: workspace:^ + version: link:../affine devDependencies: '@types/node': specifier: ^25.1.0 From ac73a2026d422a7816db987e61360aab0fab0145 Mon Sep 17 00:00:00 2001 From: Kyle Barron Date: Tue, 17 Feb 2026 15:46:57 -0500 Subject: [PATCH 16/36] Use morecantile xy_bounds for raster tile traversal bounds --- packages/deck.gl-geotiff/src/cog-layer.ts | 7 +- .../raster-tileset/raster-tile-traversal.ts | 82 +++++-------------- 2 files changed, 24 insertions(+), 65 deletions(-) diff --git a/packages/deck.gl-geotiff/src/cog-layer.ts b/packages/deck.gl-geotiff/src/cog-layer.ts index 4b68f12..6fb2c7c 100644 --- a/packages/deck.gl-geotiff/src/cog-layer.ts +++ b/packages/deck.gl-geotiff/src/cog-layer.ts @@ -48,8 +48,11 @@ export type GetTileDataOptions = { /** The luma.gl Device */ device: Device; - /** the subset to read data from in pixels. */ - window?: [number, number, number, number]; + /** The x coordinate of the tile within the IFD. */ + x: number; + + /** The y coordinate of the tile within the IFD. */ + y: number; /** An AbortSignal that may be signalled if the request is to be aborted */ signal?: AbortSignal; diff --git a/packages/deck.gl-raster/src/raster-tileset/raster-tile-traversal.ts b/packages/deck.gl-raster/src/raster-tileset/raster-tile-traversal.ts index f1c0da9..fbcbe02 100644 --- a/packages/deck.gl-raster/src/raster-tileset/raster-tile-traversal.ts +++ b/packages/deck.gl-raster/src/raster-tileset/raster-tile-traversal.ts @@ -18,6 +18,7 @@ import type { Viewport } from "@deck.gl/core"; import { _GlobeViewport, assert } from "@deck.gl/core"; import type { TileMatrix, TileMatrixSet } from "@developmentseed/morecantile"; +import { xy_bounds } from "@developmentseed/morecantile"; import type { OrientedBoundingBox } from "@math.gl/culling"; import { CullingVolume, @@ -184,12 +185,9 @@ export class RasterTileNode { const childMatrix = this.metadata.tileMatrices[childZ]!; // Compute this tile's bounds in TMS' CRS - const parentBounds = computeProjectedTileBounds({ + const parentBounds = computeProjectedTileBounds(parentMatrix, { x: this.x, y: this.y, - transform: parentMatrix.geotransform, - tileWidth: parentMatrix.tileWidth, - tileHeight: parentMatrix.tileHeight, }); // Find overlapping child index range @@ -429,15 +427,11 @@ export class RasterTileNode { commonSpaceBounds: Bounds; } { const tileMatrix = this.tileMatrix; - const { tileWidth, tileHeight, geotransform } = tileMatrix; const [minZ, maxZ] = zRange; - const tileCrsBounds = computeProjectedTileBounds({ + const tileCrsBounds = computeProjectedTileBounds(tileMatrix, { x: this.x, y: this.y, - transform: geotransform, - tileWidth, - tileHeight, }); const refPointsEPSG3857 = sampleReferencePointsInEPSG3857( @@ -491,60 +485,22 @@ export class RasterTileNode { * * @return The bounding box as [minX, minY, maxX, maxY] in projected CRS. */ -function computeProjectedTileBounds({ - x, - y, - transform, - tileWidth, - tileHeight, -}: { - x: number; - y: number; - transform: [number, number, number, number, number, number]; - tileWidth: number; - tileHeight: number; -}): [number, number, number, number] { - // geotransform: [a, b, c, d, e, f] where: - // x_geo = a * col + b * row + c - // y_geo = d * col + e * row + f - const [a, b, c, d, e, f] = transform; - - // Currently only support non-rotated/non-skewed transforms - if (b !== 0 || d !== 0) { - throw new Error( - `Rotated/skewed geotransforms not yet supported (b=${b}, d=${d}). ` + - `Only north-up, non-rotated rasters are currently supported.`, - ); - } - - // Calculate pixel coordinates for this tile's extent - const pixelMinCol = x * tileWidth; - const pixelMinRow = y * tileHeight; - const pixelMaxCol = (x + 1) * tileWidth; - const pixelMaxRow = (y + 1) * tileHeight; - - // Convert pixel coordinates to geographic coordinates using geotransform - const minX = a * pixelMinCol + b * pixelMinRow + c; - const minY = d * pixelMinCol + e * pixelMinRow + f; - - const maxX = a * pixelMaxCol + b * pixelMaxRow + c; - const maxY = d * pixelMaxCol + e * pixelMaxRow + f; - - // Note: often `e` in the geotransform is negative (for a north up image when - // the origin is in the **top** left, then increasing the pixel row means - // going down in geospatial space), so maxY < minY - // - // We want to always return an axis-aligned bbox in the form of - // [minX, minY, maxX, maxY], so we need to swap if necessary. - // - // For now, we just use Math.min/Math.max to ensure correct ordering, but we - // could remove the min/max calls if we assume that `a` and `e` are always - // positive/negative respectively. +function computeProjectedTileBounds( + tileMatrix: TileMatrix, + { + x, + y, + }: { + x: number; + y: number; + }, +): [number, number, number, number] { + const bounds = xy_bounds(tileMatrix, { x, y }); return [ - Math.min(minX, maxX), - Math.min(minY, maxY), - Math.max(minX, maxX), - Math.max(minY, maxY), + bounds.lowerLeft[0], + bounds.lowerLeft[1], + bounds.upperRight[0], + bounds.upperRight[1], ]; } @@ -571,7 +527,7 @@ function sampleReferencePointsInEPSG3857( const geoY = minY + relY * (maxY - minY); // Reproject to Web Mercator (EPSG 3857) - const projected = projectTo3857([geoX, geoY]); + const projected = projectTo3857(geoX, geoY); refPointPositions.push(projected); } From 04b9374a7271c9275bf15780a3bd02f6769955c4 Mon Sep 17 00:00:00 2001 From: Kyle Barron Date: Tue, 17 Feb 2026 15:49:42 -0500 Subject: [PATCH 17/36] fix passing in x and y --- packages/deck.gl-geotiff/src/cog-layer.ts | 13 ++----------- packages/deck.gl-geotiff/src/geotiff-layer.ts | 1 + 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/packages/deck.gl-geotiff/src/cog-layer.ts b/packages/deck.gl-geotiff/src/cog-layer.ts index 6fb2c7c..7c2a018 100644 --- a/packages/deck.gl-geotiff/src/cog-layer.ts +++ b/packages/deck.gl-geotiff/src/cog-layer.ts @@ -284,22 +284,12 @@ export class COGLayer< // geotiff.overviews[geotiff.overviews.length - 1 - z]!; const images = [geotiff, ...geotiff.overviews]; const image = images[images.length - 1 - z]!; - const imageHeight = image.height; - const imageWidth = image.width; const tileMatrix = tms.tileMatrices[z]!; - const { tileWidth, tileHeight } = tileMatrix; const tileAffine = tileTransform(tileMatrix, { col: x, row: y }); const { forwardTransform, inverseTransform } = fromAffine(tileAffine); - const window: [number, number, number, number] = [ - x * tileWidth, - y * tileHeight, - Math.min((x + 1) * tileWidth, imageWidth), - Math.min((y + 1) * tileHeight, imageHeight), - ]; - const getTileData = this.props.getTileData || this.state.defaultGetTileData!; @@ -311,7 +301,8 @@ export class COGLayer< const data = await getTileData(image, { device: this.context.device, - window, + x, + y, signal: combinedSignal, // TODO: restore pool // pool: this.props.pool || defaultPool(), diff --git a/packages/deck.gl-geotiff/src/geotiff-layer.ts b/packages/deck.gl-geotiff/src/geotiff-layer.ts index 49468c5..71aecad 100644 --- a/packages/deck.gl-geotiff/src/geotiff-layer.ts +++ b/packages/deck.gl-geotiff/src/geotiff-layer.ts @@ -145,6 +145,7 @@ export class GeoTIFFLayer extends CompositeLayer { }); } + // @ts-expect-error unused variable // biome-ignore lint/correctness/noUnusedVariables: not implemented const reprojectionFns = await extractGeotiffReprojectors( geotiff, From 124e4fbc9b266dc78f39f7fd9adbb4de705e83c8 Mon Sep 17 00:00:00 2001 From: Kyle Barron Date: Tue, 17 Feb 2026 15:50:14 -0500 Subject: [PATCH 18/36] start updating render pipeline --- .../src/cog-tile-matrix-set.ts | 14 ++----- .../src/geotiff/render-pipeline.ts | 40 +++++++++---------- 2 files changed, 22 insertions(+), 32 deletions(-) diff --git a/packages/deck.gl-geotiff/src/cog-tile-matrix-set.ts b/packages/deck.gl-geotiff/src/cog-tile-matrix-set.ts index 162a6d3..70d7f89 100644 --- a/packages/deck.gl-geotiff/src/cog-tile-matrix-set.ts +++ b/packages/deck.gl-geotiff/src/cog-tile-matrix-set.ts @@ -1,15 +1,7 @@ -import type { - BoundingBox, - TileMatrix, - TileMatrixSet, -} from "@developmentseed/morecantile"; -import { metersPerUnit } from "@developmentseed/morecantile"; -import type { GeoTIFF, GeoTIFFImage } from "geotiff"; -import proj4, { type ProjectionDefinition } from "proj4"; -import { extractGeotransform } from "./geotiff-reprojection"; -import type { GeoKeysParser, ProjectionInfo, SupportedCrsUnit } from "./proj"; +import type { BoundingBox } from "@developmentseed/morecantile"; -function computeWgs84BoundingBox( +// TODO: deduplicate with similar functions in various places in this codebase +export function computeWgs84BoundingBox( boundingBox: BoundingBox, projectToWgs84: (point: [number, number]) => [number, number], ): BoundingBox { diff --git a/packages/deck.gl-geotiff/src/geotiff/render-pipeline.ts b/packages/deck.gl-geotiff/src/geotiff/render-pipeline.ts index f66a215..ebc972f 100644 --- a/packages/deck.gl-geotiff/src/geotiff/render-pipeline.ts +++ b/packages/deck.gl-geotiff/src/geotiff/render-pipeline.ts @@ -1,4 +1,3 @@ -import type { TiffImage } from "@cogeotiff/core"; import { TiffTag } from "@cogeotiff/core"; import type { RasterModule } from "@developmentseed/deck.gl-raster/gpu-modules"; import { @@ -9,9 +8,8 @@ import { FilterNoDataVal, YCbCrToRGB, } from "@developmentseed/deck.gl-raster/gpu-modules"; -import type { GeoTIFF } from "@developmentseed/geotiff"; +import type { GeoTIFF, Overview } from "@developmentseed/geotiff"; import type { Device, SamplerProps, Texture } from "@luma.gl/core"; -import type { GeoTIFFImage, TypedArrayWithDimensions } from "geotiff"; import type { COGLayerProps, GetTileDataOptions } from "../cog-layer"; import { addAlphaChannel, parseColormap } from "./geotiff"; import { inferTextureFormat } from "./texture"; @@ -96,10 +94,10 @@ function createUnormPipeline( ]; // Add NoData filtering if GDAL_NODATA is defined - const noDataVal = geotiff.nodata; - if (noDataVal !== null) { + const nodataVal = geotiff.nodata; + if (nodataVal !== null) { // Since values are 0-1 for unorm textures, - const noDataScaled = noDataVal / 255.0; + const noDataScaled = nodataVal / 255.0; renderPipeline.push({ module: FilterNoDataVal, @@ -129,26 +127,26 @@ function createUnormPipeline( }; const getTileData: COGLayerProps["getTileData"] = async ( - image: GeoTIFFImage, + image: GeoTIFF | Overview, options: GetTileDataOptions, ) => { - const { device } = options; - const mergedOptions = { - ...options, - interleave: true, - }; + const { device, x, y } = options; + // TODO: pass down signal + const tile = await image.fetchTile(x, y); + let { array } = tile; - let data: TypedArrayWithDimensions | ImageData = (await image.readRasters( - mergedOptions, - )) as TypedArrayWithDimensions; let numSamples = SamplesPerPixel; if (SamplesPerPixel === 3) { // WebGL2 doesn't have an RGB-only texture format; it requires RGBA. - data = addAlphaChannel(data); + array = addAlphaChannel(array); numSamples = 4; } + if (array.layout === "band-separate") { + throw new Error("Band-separate images not yet implemented."); + } + const textureFormat = inferTextureFormat( // Add one sample for added alpha channel numSamples, @@ -156,17 +154,17 @@ function createUnormPipeline( SampleFormat, ); const texture = device.createTexture({ - data, + data: array.data, format: textureFormat, - width: data.width, - height: data.height, + width: array.width, + height: array.height, sampler: samplerOptions, }); return { texture, - height: data.height, - width: data.width, + height: array.height, + width: array.width, }; }; const renderTile: COGLayerProps["renderTile"] = ( From 69e019c4e62bad8bd19a795b6836a77ac4e428b1 Mon Sep 17 00:00:00 2001 From: Kyle Barron Date: Tue, 17 Feb 2026 16:41:21 -0500 Subject: [PATCH 19/36] Cleanup with cached tags defined in geotiff --- .../src/cog-tile-matrix-set.ts | 49 ---------------- .../deck.gl-geotiff/src/geotiff/geotiff.ts | 43 +------------- .../src/geotiff/render-pipeline.ts | 58 +++++++++---------- .../deck.gl-geotiff/src/geotiff/texture.ts | 25 ++++---- packages/deck.gl-geotiff/src/geotiff/types.ts | 16 ----- packages/deck.gl-geotiff/src/index.ts | 2 +- packages/geotiff/src/geotiff.ts | 5 +- packages/geotiff/src/ifd.ts | 10 +++- 8 files changed, 53 insertions(+), 155 deletions(-) delete mode 100644 packages/deck.gl-geotiff/src/cog-tile-matrix-set.ts delete mode 100644 packages/deck.gl-geotiff/src/geotiff/types.ts diff --git a/packages/deck.gl-geotiff/src/cog-tile-matrix-set.ts b/packages/deck.gl-geotiff/src/cog-tile-matrix-set.ts deleted file mode 100644 index 70d7f89..0000000 --- a/packages/deck.gl-geotiff/src/cog-tile-matrix-set.ts +++ /dev/null @@ -1,49 +0,0 @@ -import type { BoundingBox } from "@developmentseed/morecantile"; - -// TODO: deduplicate with similar functions in various places in this codebase -export function computeWgs84BoundingBox( - boundingBox: BoundingBox, - projectToWgs84: (point: [number, number]) => [number, number], -): BoundingBox { - const lowerLeftWgs84 = projectToWgs84(boundingBox.lowerLeft); - const lowerRightWgs84 = projectToWgs84([ - boundingBox.upperRight[0], - boundingBox.lowerLeft[1], - ]); - const upperRightWgs84 = projectToWgs84(boundingBox.upperRight); - const upperLeftWgs84 = projectToWgs84([ - boundingBox.lowerLeft[0], - boundingBox.upperRight[1], - ]); - - // Compute min/max lat/lon - const minLon = Math.min( - lowerLeftWgs84[0], - lowerRightWgs84[0], - upperRightWgs84[0], - upperLeftWgs84[0], - ); - const maxLon = Math.max( - lowerLeftWgs84[0], - lowerRightWgs84[0], - upperRightWgs84[0], - upperLeftWgs84[0], - ); - const minLat = Math.min( - lowerLeftWgs84[1], - lowerRightWgs84[1], - upperRightWgs84[1], - upperLeftWgs84[1], - ); - const maxLat = Math.max( - lowerLeftWgs84[1], - lowerRightWgs84[1], - upperRightWgs84[1], - upperLeftWgs84[1], - ); - - return { - lowerLeft: [minLon, minLat], - upperRight: [maxLon, maxLat], - }; -} diff --git a/packages/deck.gl-geotiff/src/geotiff/geotiff.ts b/packages/deck.gl-geotiff/src/geotiff/geotiff.ts index 9ca5f9d..a11b2e2 100644 --- a/packages/deck.gl-geotiff/src/geotiff/geotiff.ts +++ b/packages/deck.gl-geotiff/src/geotiff/geotiff.ts @@ -3,54 +3,13 @@ import type { GeoTIFF, RasterArray } from "@developmentseed/geotiff"; import type { Converter } from "proj4"; -/** - * Options that may be passed when reading image data from geotiff.js - */ -type ReadRasterOptions = { - /** the subset to read data from in pixels. */ - window?: [number, number, number, number]; - - /** The optional decoder pool to use. */ - // pool?: Pool; - - /** An AbortSignal that may be signalled if the request is to be aborted */ - signal?: AbortSignal; -}; - -/** - * Load an RGBA image from a GeoTIFFImage. - */ -export async function loadRgbImage( - image: GeoTIFFImage, - options?: ReadRasterOptions, -): Promise<{ texture: ImageData; height: number; width: number }> { - const mergedOptions = { - ...options, - interleave: true, - enableAlpha: true, - }; - // Since we set interleave: true, the result is a single array with all - // samples, so we cast to TypedArrayWithDimensions - // https://github.com/geotiffjs/geotiff.js/issues/486 - const rgbImage = (await image.readRGB( - mergedOptions, - )) as TypedArrayWithDimensions; - const imageData = addAlphaChannel(rgbImage); - - return { - texture: imageData, - height: rgbImage.height, - width: rgbImage.width, - }; -} - /** * Add an alpha channel to an RGB image array. * * Only supports input arrays with 3 (RGB) or 4 (RGBA) channels. If the input is * already RGBA, it is returned unchanged. */ -export function addAlphaChannel(rgbImage: RasterArray): ImageData { +export function addAlphaChannel(rgbImage: RasterArray): RasterArray { const { height, width } = rgbImage; if (rgbImage.length === height * width * 4) { diff --git a/packages/deck.gl-geotiff/src/geotiff/render-pipeline.ts b/packages/deck.gl-geotiff/src/geotiff/render-pipeline.ts index ebc972f..52f1eca 100644 --- a/packages/deck.gl-geotiff/src/geotiff/render-pipeline.ts +++ b/packages/deck.gl-geotiff/src/geotiff/render-pipeline.ts @@ -1,4 +1,4 @@ -import { TiffTag } from "@cogeotiff/core"; +import { Photometric, TiffTag } from "@cogeotiff/core"; import type { RasterModule } from "@developmentseed/deck.gl-raster/gpu-modules"; import { CMYKToRGB, @@ -13,7 +13,6 @@ import type { Device, SamplerProps, Texture } from "@luma.gl/core"; import type { COGLayerProps, GetTileDataOptions } from "../cog-layer"; import { addAlphaChannel, parseColormap } from "./geotiff"; import { inferTextureFormat } from "./texture"; -import { PhotometricInterpretationT } from "./types"; export type TextureDataT = { height: number; @@ -74,15 +73,15 @@ function createUnormPipeline( getTileData: COGLayerProps["getTileData"]; renderTile: COGLayerProps["renderTile"]; } { - const ifd = geotiff.image; + const tags = geotiff.cachedTags; const { - BitsPerSample, - ColorMap, - GDAL_NODATA, - PhotometricInterpretation, - SampleFormat, - SamplesPerPixel, - } = ifd; + bitsPerSample, + colorMap, + photometric, + sampleFormat, + samplesPerPixel, + nodata, + } = tags; const renderPipeline: UnresolvedRasterModule[] = [ { @@ -93,11 +92,9 @@ function createUnormPipeline( }, ]; - // Add NoData filtering if GDAL_NODATA is defined - const nodataVal = geotiff.nodata; - if (nodataVal !== null) { + if (nodata !== null) { // Since values are 0-1 for unorm textures, - const noDataScaled = nodataVal / 255.0; + const noDataScaled = nodata / 255.0; renderPipeline.push({ module: FilterNoDataVal, @@ -106,9 +103,9 @@ function createUnormPipeline( } const toRGBModule = photometricInterpretationToRGB( - PhotometricInterpretation, + photometric, device, - ColorMap, + colorMap, ); if (toRGBModule) { renderPipeline.push(toRGBModule); @@ -116,7 +113,7 @@ function createUnormPipeline( // For palette images, use nearest-neighbor sampling const samplerOptions: SamplerProps = - PhotometricInterpretation === PhotometricInterpretationT.Palette + photometric === Photometric.Palette ? { magFilter: "nearest", minFilter: "nearest", @@ -135,9 +132,9 @@ function createUnormPipeline( const tile = await image.fetchTile(x, y); let { array } = tile; - let numSamples = SamplesPerPixel; + let numSamples = samplesPerPixel; - if (SamplesPerPixel === 3) { + if (samplesPerPixel === 3) { // WebGL2 doesn't have an RGB-only texture format; it requires RGBA. array = addAlphaChannel(array); numSamples = 4; @@ -150,8 +147,8 @@ function createUnormPipeline( const textureFormat = inferTextureFormat( // Add one sample for added alpha channel numSamples, - BitsPerSample, - SampleFormat, + bitsPerSample, + sampleFormat, ); const texture = device.createTexture({ data: array.data, @@ -177,14 +174,14 @@ function createUnormPipeline( } function photometricInterpretationToRGB( - PhotometricInterpretation: number, + photometric: Photometric, device: Device, ColorMap?: Uint16Array, ): RasterModule | null { - switch (PhotometricInterpretation) { - case PhotometricInterpretationT.RGB: + switch (photometric) { + case Photometric.Rgb: return null; - case PhotometricInterpretationT.Palette: { + case Photometric.Palette: { if (!ColorMap) { throw new Error( "ColorMap is required for PhotometricInterpretation Palette", @@ -211,22 +208,21 @@ function photometricInterpretationToRGB( }; } - case PhotometricInterpretationT.CMYK: + // Not sure why cogeotiff calls this "Separated", but it means CMYK + case Photometric.Separated: return { module: CMYKToRGB, }; - case PhotometricInterpretationT.YCbCr: + case Photometric.Ycbcr: return { module: YCbCrToRGB, }; - case PhotometricInterpretationT.CIELab: + case Photometric.Cielab: return { module: cieLabToRGB, }; default: - throw new Error( - `Unsupported PhotometricInterpretation ${PhotometricInterpretation}`, - ); + throw new Error(`Unsupported PhotometricInterpretation ${photometric}`); } } diff --git a/packages/deck.gl-geotiff/src/geotiff/texture.ts b/packages/deck.gl-geotiff/src/geotiff/texture.ts index 2c881c3..f54d896 100644 --- a/packages/deck.gl-geotiff/src/geotiff/texture.ts +++ b/packages/deck.gl-geotiff/src/geotiff/texture.ts @@ -1,22 +1,21 @@ -import type { TextureFormat, TextureProps } from "@luma.gl/core"; -import type { GeoTIFFImage, TypedArray } from "geotiff"; -import type { ImageFileDirectory } from "./types"; +import { SampleFormat } from "@cogeotiff/core"; +import type { GeoTIFF } from "@developmentseed/geotiff"; +import type { TextureFormat, TextureProps, TypedArray } from "@luma.gl/core"; /** * Infers texture properties from a GeoTIFF image and its associated data. */ export function createTextureProps( - image: GeoTIFFImage, + geotiff: GeoTIFF, data: TypedArray, options: { width: number; height: number }, ): TextureProps { - const ifd = image.getFileDirectory() as ImageFileDirectory; - const samplesPerPixel = ifd.SamplesPerPixel; + const { samplesPerPixel, bitsPerSample, sampleFormat } = geotiff.cachedTags; const textureFormat = inferTextureFormat( samplesPerPixel, - ifd.BitsPerSample, - ifd.SampleFormat, + bitsPerSample, + sampleFormat, ); return { @@ -33,7 +32,7 @@ export function createTextureProps( export function inferTextureFormat( samplesPerPixel: number, bitsPerSample: Uint16Array, - sampleFormat: Uint16Array, + sampleFormat: SampleFormat[], ): TextureFormat { const channelCount = verifySamplesPerPixel(samplesPerPixel); const bitWidth = verifyIdenticalBitsPerSample(bitsPerSample); @@ -94,7 +93,7 @@ function verifyIdenticalBitsPerSample(bitsPerSample: Uint16Array): BitWidth { /** * Map the geotiff tag SampleFormat to known kinds of scalars */ -function inferScalarKind(sampleFormat: Uint16Array): ScalarKind { +function inferScalarKind(sampleFormat: SampleFormat[]): ScalarKind { // Only support identical SampleFormats for all samples const first = sampleFormat[0]!; @@ -107,11 +106,11 @@ function inferScalarKind(sampleFormat: Uint16Array): ScalarKind { } switch (first) { - case 1: + case SampleFormat.Uint: return "unorm"; - case 2: + case SampleFormat.Int: return "sint"; - case 3: + case SampleFormat.Float: return "float"; default: throw new Error(`Unsupported SampleFormat ${sampleFormat}`); diff --git a/packages/deck.gl-geotiff/src/geotiff/types.ts b/packages/deck.gl-geotiff/src/geotiff/types.ts deleted file mode 100644 index 0347265..0000000 --- a/packages/deck.gl-geotiff/src/geotiff/types.ts +++ /dev/null @@ -1,16 +0,0 @@ -export enum PhotometricInterpretationT { - WhiteIsZero = 0, - BlackIsZero = 1, - RGB = 2, - Palette = 3, - TransparencyMask = 4, - CMYK = 5, - YCbCr = 6, - CIELab = 8, - ICCLab = 9, -} - -export enum PlanarConfigurationT { - Chunky = 1, - Planar = 2, -} diff --git a/packages/deck.gl-geotiff/src/index.ts b/packages/deck.gl-geotiff/src/index.ts index 4674efb..6af1f80 100644 --- a/packages/deck.gl-geotiff/src/index.ts +++ b/packages/deck.gl-geotiff/src/index.ts @@ -1,6 +1,6 @@ export type { COGLayerProps } from "./cog-layer.js"; export { COGLayer } from "./cog-layer.js"; -export { loadRgbImage, parseColormap } from "./geotiff/geotiff.js"; +export { parseColormap } from "./geotiff/geotiff.js"; export * as texture from "./geotiff/texture.js"; // Don't export GeoTIFF Layer for now; nudge people towards COGLayer // export type { GeoTIFFLayerProps } from "./geotiff-layer.js"; diff --git a/packages/geotiff/src/geotiff.ts b/packages/geotiff/src/geotiff.ts index 9a91051..185c581 100644 --- a/packages/geotiff/src/geotiff.ts +++ b/packages/geotiff/src/geotiff.ts @@ -4,7 +4,7 @@ import type { Affine } from "@developmentseed/affine"; import type { ProjJson } from "./crs.js"; import { crsFromGeoKeys } from "./crs.js"; import { fetchTile } from "./fetch.js"; -import type { GeoKeyDirectory } from "./ifd.js"; +import type { CachedTags, GeoKeyDirectory } from "./ifd.js"; import { extractGeoKeyDirectory } from "./ifd.js"; import { Overview } from "./overview.js"; import type { Tile } from "./tile.js"; @@ -30,6 +30,9 @@ export class GeoTIFF { /** A cached CRS value. */ private _crs?: number | ProjJson; + /** Cached TIFF tags that are pre-fetched when opening the GeoTIFF. */ + readonly cachedTags: CachedTags; + /** The underlying Tiff instance. */ readonly tiff: Tiff; diff --git a/packages/geotiff/src/ifd.ts b/packages/geotiff/src/ifd.ts index 13328f0..11ea568 100644 --- a/packages/geotiff/src/ifd.ts +++ b/packages/geotiff/src/ifd.ts @@ -6,14 +6,20 @@ import type { } from "@cogeotiff/core"; import { TiffTagGeo } from "@cogeotiff/core"; -/** Subset of TIFF tags that are pre-fetched in {@link TiffImage.init}. */ -export interface PreFetchedTags { +/** Subset of TIFF tags that we pre-fetch for easier visualization. */ +export interface CachedTags { + bitsPerSample: Uint16Array; + colorMap?: Uint16Array; // TiffTagType[TiffTag.ColorMap]; + nodata: number | null; compression: TiffTagType[TiffTag.Compression]; imageHeight: TiffTagType[TiffTag.ImageHeight]; imageWidth: TiffTagType[TiffTag.ImageWidth]; modelPixelScale?: TiffTagType[TiffTag.ModelPixelScale]; modelTiePoint?: TiffTagType[TiffTag.ModelTiePoint]; modelTransformation?: TiffTagType[TiffTag.ModelTransformation]; + photometric: TiffTagType[TiffTag.Photometric]; + sampleFormat: TiffTagType[TiffTag.SampleFormat]; + samplesPerPixel: number; // TiffTagType[TiffTag.SamplesPerPixel]; tileHeight?: TiffTagType[TiffTag.TileHeight]; tileWidth?: TiffTagType[TiffTag.TileWidth]; } From 0caee67cae59f55d0af007c7071d7230cb72fb71 Mon Sep 17 00:00:00 2001 From: Kyle Barron Date: Tue, 17 Feb 2026 17:01:35 -0500 Subject: [PATCH 20/36] prefetch useful geotiff tags for visualization --- packages/geotiff/src/geotiff.ts | 15 +++++++-- packages/geotiff/src/ifd.ts | 57 ++++++++++++++++++++++++--------- 2 files changed, 55 insertions(+), 17 deletions(-) diff --git a/packages/geotiff/src/geotiff.ts b/packages/geotiff/src/geotiff.ts index 185c581..4217d12 100644 --- a/packages/geotiff/src/geotiff.ts +++ b/packages/geotiff/src/geotiff.ts @@ -5,7 +5,7 @@ import type { ProjJson } from "./crs.js"; import { crsFromGeoKeys } from "./crs.js"; import { fetchTile } from "./fetch.js"; import type { CachedTags, GeoKeyDirectory } from "./ifd.js"; -import { extractGeoKeyDirectory } from "./ifd.js"; +import { extractGeoKeyDirectory, prefetchTags } from "./ifd.js"; import { Overview } from "./overview.js"; import type { Tile } from "./tile.js"; import { index, xy } from "./transform.js"; @@ -51,12 +51,14 @@ export class GeoTIFF { maskImage: TiffImage | null, gkd: GeoKeyDirectory, overviews: Overview[], + cachedTags: CachedTags, ) { this.tiff = tiff; this.image = image; this.maskImage = maskImage; this.gkd = gkd; this.overviews = overviews; + this.cachedTags = cachedTags; } /** @@ -118,9 +120,18 @@ export class GeoTIFF { return sb.width * sb.height - sa.width * sa.height; }); + const cachedTags = await prefetchTags(primaryImage); + // Two-phase construction: create the GeoTIFF first (with empty overviews), // then build Overviews that reference back to it. - const geotiff = new GeoTIFF(tiff, primaryImage, primaryMask, gkd, []); + const geotiff = new GeoTIFF( + tiff, + primaryImage, + primaryMask, + gkd, + [], + cachedTags, + ); const overviews: Overview[] = dataEntries.map(([key, dataImage]) => { const maskImage = maskIFDs.get(key) ?? null; diff --git a/packages/geotiff/src/ifd.ts b/packages/geotiff/src/ifd.ts index 11ea568..bbd1340 100644 --- a/packages/geotiff/src/ifd.ts +++ b/packages/geotiff/src/ifd.ts @@ -1,27 +1,54 @@ -import type { - TiffImage, - TiffTag, - TiffTagGeoType, - TiffTagType, -} from "@cogeotiff/core"; -import { TiffTagGeo } from "@cogeotiff/core"; +import type { TiffImage, TiffTagGeoType, TiffTagType } from "@cogeotiff/core"; +import { TiffTag, TiffTagGeo } from "@cogeotiff/core"; /** Subset of TIFF tags that we pre-fetch for easier visualization. */ export interface CachedTags { bitsPerSample: Uint16Array; colorMap?: Uint16Array; // TiffTagType[TiffTag.ColorMap]; - nodata: number | null; compression: TiffTagType[TiffTag.Compression]; - imageHeight: TiffTagType[TiffTag.ImageHeight]; - imageWidth: TiffTagType[TiffTag.ImageWidth]; - modelPixelScale?: TiffTagType[TiffTag.ModelPixelScale]; - modelTiePoint?: TiffTagType[TiffTag.ModelTiePoint]; - modelTransformation?: TiffTagType[TiffTag.ModelTransformation]; + nodata: number | null; photometric: TiffTagType[TiffTag.Photometric]; sampleFormat: TiffTagType[TiffTag.SampleFormat]; samplesPerPixel: number; // TiffTagType[TiffTag.SamplesPerPixel]; - tileHeight?: TiffTagType[TiffTag.TileHeight]; - tileWidth?: TiffTagType[TiffTag.TileWidth]; +} + +/** Pre-fetch TIFF tags for easier visualization. */ +export async function prefetchTags(image: TiffImage): Promise { + // Compression is pre-fetched in init + const compression = image.value(TiffTag.Compression); + if (compression === null) { + throw new Error("Compression tag should always exist."); + } + + const nodata = image.noData; + + const [bitsPerSample, colorMap, photometric, sampleFormat, samplesPerPixel] = + await Promise.all([ + image.fetch(TiffTag.BitsPerSample), + image.fetch(TiffTag.ColorMap), + image.fetch(TiffTag.Photometric), + image.fetch(TiffTag.SampleFormat), + image.fetch(TiffTag.SamplesPerPixel), + ]); + + if (bitsPerSample === null) { + throw new Error("BitsPerSample tag should always exist."); + } + + if (samplesPerPixel === null) { + throw new Error("SamplesPerPixel tag should always exist."); + } + + return { + bitsPerSample: new Uint16Array(bitsPerSample), + colorMap: colorMap ? new Uint16Array(colorMap as number[]) : undefined, + compression, + nodata, + photometric: photometric ?? 1, // Default to 1 (BlackIsZero) per spec + sampleFormat: sampleFormat ?? [1], // Default to 1 (unsigned int) per spec + // Waiting for release with https://github.com/blacha/cogeotiff/pull/1394 + samplesPerPixel: samplesPerPixel as number, + }; } /** From 8e2170094c260e68f96fe4247614e3e63f8ac845 Mon Sep 17 00:00:00 2001 From: Kyle Barron Date: Tue, 17 Feb 2026 17:03:58 -0500 Subject: [PATCH 21/36] fix addAlphaChanneel --- .../deck.gl-geotiff/src/geotiff/geotiff.ts | 33 +++++++++++++------ 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/packages/deck.gl-geotiff/src/geotiff/geotiff.ts b/packages/deck.gl-geotiff/src/geotiff/geotiff.ts index a11b2e2..3bb07fc 100644 --- a/packages/deck.gl-geotiff/src/geotiff/geotiff.ts +++ b/packages/deck.gl-geotiff/src/geotiff/geotiff.ts @@ -12,25 +12,38 @@ import type { Converter } from "proj4"; export function addAlphaChannel(rgbImage: RasterArray): RasterArray { const { height, width } = rgbImage; - if (rgbImage.length === height * width * 4) { + if (rgbImage.layout === "band-separate") { + // This should be pretty easy to do by just returning an additional array of + // 255s + // But not sure if we'll want to do that, because it's fine to upload 3 + // separate textures. + throw new Error("Band-separate images not yet implemented."); + } + + if (rgbImage.data.length === height * width * 4) { // Already has alpha channel - return new ImageData(new Uint8ClampedArray(rgbImage), width, height); - } else if (rgbImage.length === height * width * 3) { + return rgbImage; + } else if (rgbImage.data.length === height * width * 3) { // Need to add alpha channel - const rgbaLength = (rgbImage.length / 3) * 4; + const rgbaLength = (rgbImage.data.length / 3) * 4; const rgbaArray = new Uint8ClampedArray(rgbaLength); - for (let i = 0; i < rgbImage.length / 3; ++i) { - rgbaArray[i * 4] = rgbImage[i * 3]!; - rgbaArray[i * 4 + 1] = rgbImage[i * 3 + 1]!; - rgbaArray[i * 4 + 2] = rgbImage[i * 3 + 2]!; + for (let i = 0; i < rgbImage.data.length / 3; ++i) { + rgbaArray[i * 4] = rgbImage.data[i * 3]!; + rgbaArray[i * 4 + 1] = rgbImage.data[i * 3 + 1]!; + rgbaArray[i * 4 + 2] = rgbImage.data[i * 3 + 2]!; rgbaArray[i * 4 + 3] = 255; } - return new ImageData(rgbaArray, width, height); + return { + ...rgbImage, + // layout: "pixel-interleaved", + count: 4, + data: rgbaArray, + }; } else { throw new Error( - `Unexpected number of channels in raster data: ${rgbImage.length / (height * width)}`, + `Unexpected number of channels in raster data: ${rgbImage.data.length / (height * width)}`, ); } } From 37ebd52a2b7dcb2c0051ef8217ea9c445beae80b Mon Sep 17 00:00:00 2001 From: Kyle Barron Date: Tue, 17 Feb 2026 17:37:29 -0500 Subject: [PATCH 22/36] default handlers for url GeoTIFF input --- examples/cog-basic/package.json | 3 +- examples/cog-basic/src/App.tsx | 16 +------ packages/deck.gl-geotiff/package.json | 4 ++ packages/deck.gl-geotiff/src/cog-layer.ts | 3 +- packages/deck.gl-geotiff/src/geotiff-layer.ts | 3 +- .../deck.gl-geotiff/src/geotiff/geotiff.ts | 29 ++++++++++-- pnpm-lock.yaml | 45 ++++++++++++++++--- 7 files changed, 73 insertions(+), 30 deletions(-) diff --git a/examples/cog-basic/package.json b/examples/cog-basic/package.json index 63768fc..c1f2cba 100644 --- a/examples/cog-basic/package.json +++ b/examples/cog-basic/package.json @@ -14,12 +14,11 @@ "@deck.gl/layers": "^9.2.7", "@deck.gl/mapbox": "^9.2.7", "@deck.gl/mesh-layers": "^9.2.7", + "@developmentseed/geotiff": "workspace:^", "@developmentseed/deck.gl-geotiff": "workspace:^", "@developmentseed/deck.gl-raster": "workspace:^", "@luma.gl/core": "9.2.6", "@luma.gl/shadertools": "9.2.6", - "geotiff": "^2.1.3", - "geotiff-geokeys-to-proj4": "^2024.4.13", "maplibre-gl": "^5.17.0", "proj4": "^2.20.2", "react": "^19.2.4", diff --git a/examples/cog-basic/src/App.tsx b/examples/cog-basic/src/App.tsx index c0cabb1..e3482b9 100644 --- a/examples/cog-basic/src/App.tsx +++ b/examples/cog-basic/src/App.tsx @@ -1,7 +1,6 @@ import type { DeckProps } from "@deck.gl/core"; import { MapboxOverlay } from "@deck.gl/mapbox"; -import { COGLayer, proj } from "@developmentseed/deck.gl-geotiff"; -import { toProj4 } from "geotiff-geokeys-to-proj4"; +import { COGLayer } from "@developmentseed/deck.gl-geotiff"; import "maplibre-gl/dist/maplibre-gl.css"; import { useRef, useState } from "react"; import type { MapRef } from "react-map-gl/maplibre"; @@ -13,18 +12,6 @@ function DeckGLOverlay(props: DeckProps) { return null; } -async function geoKeysParser( - geoKeys: Record, -): Promise { - const projDefinition = toProj4(geoKeys as any); - - return { - def: projDefinition.proj4, - parsed: proj.parseCrs(projDefinition.proj4), - coordinatesUnits: projDefinition.coordinatesUnits as proj.SupportedCrsUnit, - }; -} - // const COG_URL = // "https://nz-imagery.s3-ap-southeast-2.amazonaws.com/new-zealand/new-zealand_2024-2025_10m/rgb/2193/CC11.tiff"; @@ -62,7 +49,6 @@ export default function App() { geotiff: COG_URL, debug, debugOpacity, - geoKeysParser, onGeoTIFFLoad: (tiff, options) => { (window as any).tiff = tiff; const { west, south, east, north } = options.geographicBounds; diff --git a/packages/deck.gl-geotiff/package.json b/packages/deck.gl-geotiff/package.json index 3378363..0b34c22 100644 --- a/packages/deck.gl-geotiff/package.json +++ b/packages/deck.gl-geotiff/package.json @@ -46,6 +46,10 @@ "vitest": "^4.0.18" }, "dependencies": { + "@chunkd/middleware": "^11.1.0", + "@chunkd/source": "^11.1.0", + "@chunkd/source-http": "^11.1.1", + "@chunkd/source-memory": "^11.0.2", "@cogeotiff/core": "^9.1.2", "@developmentseed/affine": "workspace:^", "@developmentseed/deck.gl-raster": "workspace:^", diff --git a/packages/deck.gl-geotiff/src/cog-layer.ts b/packages/deck.gl-geotiff/src/cog-layer.ts index 7c2a018..0c509f5 100644 --- a/packages/deck.gl-geotiff/src/cog-layer.ts +++ b/packages/deck.gl-geotiff/src/cog-layer.ts @@ -79,8 +79,7 @@ export interface COGLayerProps * - An instance of GeoTIFF.js's GeoTIFF class * - An instance of GeoTIFF.js's BaseClient for custom fetching */ - // TODO: restore support for string, ArrayBuffer, Blob - geotiff: GeoTIFF; + geotiff: GeoTIFF | string | URL | ArrayBuffer; /** * A function callback for parsing numeric EPSG codes to projection diff --git a/packages/deck.gl-geotiff/src/geotiff-layer.ts b/packages/deck.gl-geotiff/src/geotiff-layer.ts index 71aecad..ae8f63b 100644 --- a/packages/deck.gl-geotiff/src/geotiff-layer.ts +++ b/packages/deck.gl-geotiff/src/geotiff-layer.ts @@ -21,8 +21,7 @@ export interface GeoTIFFLayerProps extends CompositeLayerProps { * - An instance of GeoTIFF.js's GeoTIFF class * - An instance of GeoTIFF.js's BaseClient for custom fetching */ - // TODO: restore support for string, ArrayBuffer, Blob - geotiff: GeoTIFF; + geotiff: GeoTIFF | string | URL | ArrayBuffer; /** * A function callback for parsing numeric EPSG codes to projection diff --git a/packages/deck.gl-geotiff/src/geotiff/geotiff.ts b/packages/deck.gl-geotiff/src/geotiff/geotiff.ts index 3bb07fc..73e8fda 100644 --- a/packages/deck.gl-geotiff/src/geotiff/geotiff.ts +++ b/packages/deck.gl-geotiff/src/geotiff/geotiff.ts @@ -1,6 +1,11 @@ // Utilities for interacting with geotiff.js. -import type { GeoTIFF, RasterArray } from "@developmentseed/geotiff"; +import { SourceCache, SourceChunk } from "@chunkd/middleware"; +import { SourceView } from "@chunkd/source"; +import { SourceHttp } from "@chunkd/source-http"; +import { SourceMemory } from "@chunkd/source-memory"; +import type { RasterArray } from "@developmentseed/geotiff"; +import { GeoTIFF } from "@developmentseed/geotiff"; import type { Converter } from "proj4"; /** @@ -78,8 +83,26 @@ export function parseColormap(cmap: Uint16Array): ImageData { return new ImageData(rgba, size, 1); } -// TODO: restore support for string, ArrayBuffer, Blob input -export async function fetchGeoTIFF(input: GeoTIFF): Promise { +export async function fetchGeoTIFF( + input: GeoTIFF | string | URL | ArrayBuffer, +): Promise { + if (typeof input === "string" || input instanceof URL) { + // read files in 32KB chunks + const chunk = new SourceChunk({ size: 32 * 1024 }); + // 1MB cache for recently accessed chunks + const cache = new SourceCache({ size: 1024 * 1024 * 1024 }); + + const source = new SourceHttp(input); + const view = new SourceView(source, [chunk, cache]); + + return await GeoTIFF.create(view); + } + + if (input instanceof ArrayBuffer) { + const source = new SourceMemory("memory://input.tif", input); + return await GeoTIFF.create(source); + } + return input; } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f9d4f76..5edbb99 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -57,18 +57,15 @@ importers: '@developmentseed/deck.gl-raster': specifier: workspace:^ version: link:../../packages/deck.gl-raster + '@developmentseed/geotiff': + specifier: workspace:^ + version: link:../../packages/geotiff '@luma.gl/core': specifier: 9.2.6 version: 9.2.6 '@luma.gl/shadertools': specifier: 9.2.6 version: 9.2.6(@luma.gl/core@9.2.6) - geotiff: - specifier: ^2.1.3 - version: 2.1.3 - geotiff-geokeys-to-proj4: - specifier: ^2024.4.13 - version: 2024.4.13 maplibre-gl: specifier: ^5.17.0 version: 5.17.0 @@ -243,6 +240,18 @@ importers: packages/deck.gl-geotiff: dependencies: + '@chunkd/middleware': + specifier: ^11.1.0 + version: 11.1.0 + '@chunkd/source': + specifier: ^11.1.0 + version: 11.1.0 + '@chunkd/source-http': + specifier: ^11.1.1 + version: 11.1.1 + '@chunkd/source-memory': + specifier: ^11.0.2 + version: 11.0.2 '@cogeotiff/core': specifier: ^9.1.2 version: 9.1.2 @@ -610,10 +619,22 @@ packages: cpu: [x64] os: [win32] + '@chunkd/middleware@11.1.0': + resolution: {integrity: sha512-xLEoDWDG3djf/plcsEsm0q6eAD3fFC/nJ6QV9234a+DE4iN8xuaqdHqtk9CRC877YfCpWZ1RDw3T62OUeqyWqQ==} + engines: {node: '>=16.0.0'} + '@chunkd/source-file@11.0.1': resolution: {integrity: sha512-9DoA1djozuDpUklg0CRj/GBEJzvZeqwr1EIOTcEr3igDAf+UZ3y3lOgUaIWuNeATbwQ7Pdml2S6SLLAdAe45wQ==} engines: {node: '>=16.0.0'} + '@chunkd/source-http@11.1.1': + resolution: {integrity: sha512-cJPPYQ8JB9y+zWvv6NKOLdOp+jXYejTuzLa9bCtwFunlKML7a4PuOZVAQp8xlke6+HOq4w6Dzednq7mhgzHKaA==} + engines: {node: '>=18.0.0'} + + '@chunkd/source-memory@11.0.2': + resolution: {integrity: sha512-K2yJTvLv+Z49YKGz43Gb2Q1/6ARtnUUh9EgVgqKZS/Ce9ND9IXkgmfyrYShY2/d9iJ4B7Nq1LZIJubDBhoYtww==} + engines: {node: '>=16.0.0'} + '@chunkd/source@11.1.0': resolution: {integrity: sha512-3BcrHK4XDm3t4vDx1OisgcOZ05+EarEqwaGVIL7IMHUmkXwN/Aprlnr7aVP3BYcltgcCcfMd1pXQicbSrP563g==} engines: {node: '>=16.0.0'} @@ -2784,10 +2805,22 @@ snapshots: '@biomejs/cli-win32-x64@2.3.13': optional: true + '@chunkd/middleware@11.1.0': + dependencies: + '@chunkd/source': 11.1.0 + '@chunkd/source-file@11.0.1': dependencies: '@chunkd/source': 11.1.0 + '@chunkd/source-http@11.1.1': + dependencies: + '@chunkd/source': 11.1.0 + + '@chunkd/source-memory@11.0.2': + dependencies: + '@chunkd/source': 11.1.0 + '@chunkd/source@11.1.0': {} '@cogeotiff/core@9.1.2': {} From 133657f86ae1b7f06396990a572e8030f9784015 Mon Sep 17 00:00:00 2001 From: Kyle Barron Date: Tue, 17 Feb 2026 17:40:45 -0500 Subject: [PATCH 23/36] working example (if slow) --- examples/cog-basic/src/App.tsx | 8 ++++---- packages/geotiff/README.md | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/cog-basic/src/App.tsx b/examples/cog-basic/src/App.tsx index e3482b9..1727adb 100644 --- a/examples/cog-basic/src/App.tsx +++ b/examples/cog-basic/src/App.tsx @@ -12,14 +12,14 @@ function DeckGLOverlay(props: DeckProps) { return null; } -// const COG_URL = -// "https://nz-imagery.s3-ap-southeast-2.amazonaws.com/new-zealand/new-zealand_2024-2025_10m/rgb/2193/CC11.tiff"; +const COG_URL = + "https://nz-imagery.s3-ap-southeast-2.amazonaws.com/new-zealand/new-zealand_2024-2025_10m/rgb/2193/CC11.tiff"; // const COG_URL = // "https://ds-wheels.s3.us-east-1.amazonaws.com/m_4007307_sw_18_060_20220803.tif"; -const COG_URL = - "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/18/T/WL/2026/1/S2B_18TWL_20260101_0_L2A/TCI.tif"; +// const COG_URL = +// "https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/18/T/WL/2026/1/S2B_18TWL_20260101_0_L2A/TCI.tif"; // const COG_URL = // "https://ds-wheels.s3.us-east-1.amazonaws.com/Annual_NLCD_LndCov_2023_CU_C1V0.tif"; diff --git a/packages/geotiff/README.md b/packages/geotiff/README.md index 10b1b06..cdcd0c6 100644 --- a/packages/geotiff/README.md +++ b/packages/geotiff/README.md @@ -34,7 +34,7 @@ Until you try to load an image compressed with, say, [LERC], you don't pay for t [LERC]: https://github.com/Esri/lerc -### Transparent caching and chunking +### Full user control over caching and chunking There are a lot of great utilities in [`chunkd`](https://github.com/blacha/chunkd) that work out of the box here. From b5c9c0a3af788c27679353bcf694b5640777a6e0 Mon Sep 17 00:00:00 2001 From: Kyle Barron Date: Tue, 17 Feb 2026 17:47:45 -0500 Subject: [PATCH 24/36] add reference to tsconfig --- packages/deck.gl-geotiff/tsconfig.build.json | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/deck.gl-geotiff/tsconfig.build.json b/packages/deck.gl-geotiff/tsconfig.build.json index 86953b5..62ae0a9 100644 --- a/packages/deck.gl-geotiff/tsconfig.build.json +++ b/packages/deck.gl-geotiff/tsconfig.build.json @@ -8,6 +8,7 @@ "include": ["src/**/*"], "exclude": ["node_modules", "dist", "tests"], "references": [ + { "path": "../geotiff/tsconfig.build.json" }, { "path": "../raster-reproject/tsconfig.build.json" }, { "path": "../deck.gl-raster/tsconfig.build.json" } ] From b512ea258e736650b3b9c4058e82ab2ad24c3cbf Mon Sep 17 00:00:00 2001 From: Kyle Barron Date: Tue, 17 Feb 2026 17:51:34 -0500 Subject: [PATCH 25/36] fix test --- packages/raster-reproject/package.json | 1 + packages/raster-reproject/tests/example.test.ts | 17 +++++++---------- pnpm-lock.yaml | 3 +++ 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/packages/raster-reproject/package.json b/packages/raster-reproject/package.json index a7901bd..c9a5e35 100644 --- a/packages/raster-reproject/package.json +++ b/packages/raster-reproject/package.json @@ -44,6 +44,7 @@ "url": "git+https://github.com/developmentseed/deck.gl-raster.git" }, "devDependencies": { + "@developmentseed/affine": "workspace:^", "@types/node": "^25.1.0", "jsdom": "^27.4.0", "proj4": "^2.20.2", diff --git a/packages/raster-reproject/tests/example.test.ts b/packages/raster-reproject/tests/example.test.ts index ee28e05..db689ae 100644 --- a/packages/raster-reproject/tests/example.test.ts +++ b/packages/raster-reproject/tests/example.test.ts @@ -1,11 +1,8 @@ import { readFileSync, writeFileSync } from "node:fs"; import { dirname, join, resolve } from "node:path"; import { fileURLToPath } from "node:url"; +import * as affine from "@developmentseed/affine"; import { RasterReprojector } from "@developmentseed/raster-reproject"; -import { - applyAffine, - invertGeoTransform, -} from "@developmentseed/raster-reproject/affine"; import proj4 from "proj4"; import type { PROJJSONDefinition } from "proj4/dist/lib/core"; import { describe, it } from "vitest"; @@ -25,17 +22,18 @@ type FixtureJSON = { }; // Note: this is copied from deck.gl-geotiff -function fromGeoTransform( +function fromAffine( geotransform: [number, number, number, number, number, number], ): { forwardTransform: (x: number, y: number) => [number, number]; inverseTransform: (x: number, y: number) => [number, number]; } { - const inverseGeotransform = invertGeoTransform(geotransform); + const inverseGeotransform = affine.invert(geotransform); return { - forwardTransform: (x: number, y: number) => applyAffine(x, y, geotransform), + forwardTransform: (x: number, y: number) => + affine.apply(geotransform, x, y), inverseTransform: (x: number, y: number) => - applyAffine(x, y, inverseGeotransform), + affine.apply(inverseGeotransform, x, y), }; } @@ -66,8 +64,7 @@ function parseFixture(fixturePath: string): RasterReprojector { affineGeotransform = geotransform; } - const { inverseTransform, forwardTransform } = - fromGeoTransform(affineGeotransform); + const { inverseTransform, forwardTransform } = fromAffine(affineGeotransform); const converter = proj4(projjson || wkt2, "EPSG:4326"); const reprojectionFns = { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5edbb99..aa4c2bf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -449,6 +449,9 @@ importers: packages/raster-reproject: devDependencies: + '@developmentseed/affine': + specifier: workspace:^ + version: link:../affine '@types/node': specifier: ^25.1.0 version: 25.1.0 From f53b8759b248f111b978e5ff225ca11503c4f176 Mon Sep 17 00:00:00 2001 From: Kyle Barron Date: Tue, 17 Feb 2026 17:57:11 -0500 Subject: [PATCH 26/36] update render pipeline tests & remove mocked tests --- .../src/geotiff/render-pipeline.ts | 11 +- .../tests/render-pipeline.test.ts | 37 ++-- packages/geotiff/tests/geotiff.test.ts | 205 ------------------ packages/geotiff/tests/helpers.ts | 82 ------- packages/geotiff/tests/overview.test.ts | 26 --- 5 files changed, 25 insertions(+), 336 deletions(-) delete mode 100644 packages/geotiff/tests/geotiff.test.ts delete mode 100644 packages/geotiff/tests/overview.test.ts diff --git a/packages/deck.gl-geotiff/src/geotiff/render-pipeline.ts b/packages/deck.gl-geotiff/src/geotiff/render-pipeline.ts index 52f1eca..dca27f4 100644 --- a/packages/deck.gl-geotiff/src/geotiff/render-pipeline.ts +++ b/packages/deck.gl-geotiff/src/geotiff/render-pipeline.ts @@ -1,4 +1,4 @@ -import { Photometric, TiffTag } from "@cogeotiff/core"; +import { Photometric, SampleFormat } from "@cogeotiff/core"; import type { RasterModule } from "@developmentseed/deck.gl-raster/gpu-modules"; import { CMYKToRGB, @@ -46,15 +46,14 @@ export function inferRenderPipeline( getTileData: COGLayerProps["getTileData"]; renderTile: COGLayerProps["renderTile"]; } { - const ifd = geotiff.image; - const SampleFormat = ifd.value(TiffTag.SampleFormat); - if (SampleFormat === null) { + const { sampleFormat } = geotiff.cachedTags; + if (sampleFormat === null) { throw new Error("SampleFormat tag is required to infer render pipeline"); } - switch (SampleFormat[0]) { + switch (sampleFormat[0]) { // Unsigned integers - case 1: + case SampleFormat.Uint: return createUnormPipeline(geotiff, device); } diff --git a/packages/deck.gl-geotiff/tests/render-pipeline.test.ts b/packages/deck.gl-geotiff/tests/render-pipeline.test.ts index 11fab5f..20058b3 100644 --- a/packages/deck.gl-geotiff/tests/render-pipeline.test.ts +++ b/packages/deck.gl-geotiff/tests/render-pipeline.test.ts @@ -1,8 +1,9 @@ +import { Photometric, SampleFormat } from "@cogeotiff/core"; import type { RasterModule } from "@developmentseed/deck.gl-raster"; -import { globals } from "geotiff"; +import type { GeoTIFF } from "@developmentseed/geotiff"; import { describe, expect, it } from "vitest"; +import type { CachedTags } from "../../geotiff/dist/ifd"; import { inferRenderPipeline } from "../src/geotiff/render-pipeline"; -import type { ImageFileDirectory } from "../src/geotiff/types"; const MOCK_DEVICE = { createTexture: (x: any) => x, @@ -11,21 +12,20 @@ const MOCK_RENDER_TILE_DATA = { texture: {}, }; -// import {} from "@" type RelevantImageFileDirectory = Pick< - ImageFileDirectory, - | "BitsPerSample" - | "ColorMap" - | "GDAL_NODATA" - | "PhotometricInterpretation" - | "SampleFormat" - | "SamplesPerPixel" + CachedTags, + | "bitsPerSample" + | "colorMap" + | "nodata" + | "photometric" + | "sampleFormat" + | "samplesPerPixel" >; describe("land cover, single-band uint8", () => { const ifd: RelevantImageFileDirectory = { - BitsPerSample: new Uint16Array([8]), - ColorMap: new Uint16Array([ + bitsPerSample: new Uint16Array([8]), + colorMap: new Uint16Array([ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17990, 53713, 0, 0, 0, 0, 0, 0, 0, 0, 57054, 55769, 60395, 43947, 0, 0, 0, 0, 0, 0, 46003, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26728, 7196, 46517, 0, 0, 0, 0, 0, 0, 0, 0, 52428, 0, 0, 0, 0, 0, 0, @@ -61,14 +61,17 @@ describe("land cover, single-band uint8", () => { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ]), - GDAL_NODATA: "250\u0000", - PhotometricInterpretation: globals.photometricInterpretations.Palette, - SampleFormat: new Uint16Array([1]), - SamplesPerPixel: 1, + nodata: 250, + photometric: Photometric.Palette, + sampleFormat: [SampleFormat.Uint], + samplesPerPixel: 1, }; + const geotiff = { + cachedTags: ifd, + } as unknown as GeoTIFF; const { getTileData: _, renderTile } = inferRenderPipeline( - ifd as ImageFileDirectory, + geotiff, MOCK_DEVICE as any, ); const renderPipeline = renderTile( diff --git a/packages/geotiff/tests/geotiff.test.ts b/packages/geotiff/tests/geotiff.test.ts deleted file mode 100644 index 94dee3b..0000000 --- a/packages/geotiff/tests/geotiff.test.ts +++ /dev/null @@ -1,205 +0,0 @@ -import { Photometric, SubFileType } from "@cogeotiff/core"; -import { describe, expect, it } from "vitest"; -import { GeoTIFF, isMaskIfd } from "../src/geotiff.js"; -import { mockImage, mockTiff } from "./helpers.js"; - -describe("isMaskIfd", () => { - it("returns true for a mask IFD", () => { - const image = mockImage({ - width: 256, - height: 256, - subFileType: SubFileType.Mask, - photometric: Photometric.Mask, - }); - expect(isMaskIfd(image)).toBe(true); - }); - - it("returns false when SubFileType has no mask bit", () => { - const image = mockImage({ - width: 256, - height: 256, - subFileType: SubFileType.ReducedImage, - photometric: Photometric.Mask, - }); - expect(isMaskIfd(image)).toBe(false); - }); - - it("returns false when Photometric is not Mask", () => { - const image = mockImage({ - width: 256, - height: 256, - subFileType: SubFileType.Mask, - photometric: Photometric.MinIsBlack, - }); - expect(isMaskIfd(image)).toBe(false); - }); - - it("returns true when SubFileType combines ReducedImage + Mask bits", () => { - const image = mockImage({ - width: 256, - height: 256, - subFileType: SubFileType.ReducedImage | SubFileType.Mask, - photometric: Photometric.Mask, - }); - expect(isMaskIfd(image)).toBe(true); - }); - - it("returns false when SubFileType is absent (defaults to 0)", () => { - const image = mockImage({ - width: 256, - height: 256, - photometric: Photometric.Mask, - }); - expect(isMaskIfd(image)).toBe(false); - }); -}); - -describe("GeoTIFF", () => { - it("throws for empty TIFF", async () => { - const tiff = mockTiff([]); - await expect(GeoTIFF.fromTiff(tiff)).rejects.toThrow(/does not contain/); - }); - - it("creates a GeoTIFF from a single-image TIFF", async () => { - const primary = mockImage({ - width: 1000, - height: 1000, - origin: [0, 0, 0], - resolution: [1, -1, 0], - samplesPerPixel: 3, - }); - const tiff = mockTiff([primary]); - const geo = await GeoTIFF.fromTiff(tiff); - - expect(geo.width).toBe(1000); - expect(geo.height).toBe(1000); - expect(geo.count).toBe(3); - expect(geo.overviews).toHaveLength(0); - expect(geo.transform).toEqual([1, 0, 0, 0, -1, 0]); - }); - - it("classifies reduced-resolution IFDs as overviews", async () => { - const primary = mockImage({ - width: 1000, - height: 1000, - origin: [0, 0, 0], - resolution: [1, -1, 0], - }); - const ov1 = mockImage({ width: 500, height: 500 }); - const ov2 = mockImage({ width: 250, height: 250 }); - - const tiff = mockTiff([primary, ov1, ov2]); - const geo = await GeoTIFF.fromTiff(tiff); - - expect(geo.overviews).toHaveLength(2); - }); - - it("sorts overviews finest-to-coarsest", async () => { - const primary = mockImage({ - width: 1000, - height: 1000, - origin: [0, 0, 0], - resolution: [1, -1, 0], - }); - // Insert in reverse order - const small = mockImage({ width: 125, height: 125 }); - const medium = mockImage({ width: 250, height: 250 }); - const large = mockImage({ width: 500, height: 500 }); - - const tiff = mockTiff([primary, small, medium, large]); - const geo = await GeoTIFF.fromTiff(tiff); - - expect(geo.overviews).toHaveLength(3); - expect(geo.overviews[0]!.width).toBe(500); - expect(geo.overviews[1]!.width).toBe(250); - expect(geo.overviews[2]!.width).toBe(125); - }); - - it("separates mask IFDs from data IFDs", async () => { - const primary = mockImage({ - width: 1000, - height: 1000, - origin: [0, 0, 0], - resolution: [1, -1, 0], - }); - const ov = mockImage({ width: 500, height: 500 }); - const primaryMask = mockImage({ - width: 1000, - height: 1000, - subFileType: SubFileType.Mask, - photometric: Photometric.Mask, - }); - const ovMask = mockImage({ - width: 500, - height: 500, - subFileType: SubFileType.ReducedImage | SubFileType.Mask, - photometric: Photometric.Mask, - }); - - const tiff = mockTiff([primary, ov, primaryMask, ovMask]); - const geo = await GeoTIFF.fromTiff(tiff); - - // Only one data overview (the mask IFDs are paired, not listed as overviews) - expect(geo.overviews).toHaveLength(1); - expect(geo.overviews[0]!.maskImage).not.toBeNull(); - }); - - it("scales overview transforms correctly", async () => { - const primary = mockImage({ - width: 1000, - height: 1000, - origin: [100, 200, 0], - resolution: [0.01, -0.01, 0], - }); - const ov = mockImage({ width: 500, height: 500 }); - - const tiff = mockTiff([primary, ov]); - const geo = await GeoTIFF.fromTiff(tiff); - - const ovTransform = geo.overviews[0]!.transform; - // scale = 1000 / 500 = 2 - expect(ovTransform[0]).toBeCloseTo(0.02); // a * 2 - expect(ovTransform[4]).toBeCloseTo(-0.02); // e * 2 - // Origin unchanged - expect(ovTransform[2]).toBe(100); // c - expect(ovTransform[5]).toBe(200); // f - }); - - it("exposes nodata", async () => { - const primary = mockImage({ - width: 100, - height: 100, - origin: [0, 0, 0], - resolution: [1, -1, 0], - noData: -9999, - }); - const tiff = mockTiff([primary]); - const geo = await GeoTIFF.fromTiff(tiff); - expect(geo.nodata).toBe(-9999); - }); - - it("exposes bbox", async () => { - const primary = mockImage({ - width: 100, - height: 100, - origin: [0, 0, 0], - resolution: [1, -1, 0], - bbox: [-180, -90, 180, 90], - }); - const tiff = mockTiff([primary]); - const geo = await GeoTIFF.fromTiff(tiff); - expect(geo.bbox).toEqual([-180, -90, 180, 90]); - }); - - it("defaults count to 1 when SamplesPerPixel is absent", async () => { - const primary = mockImage({ - width: 100, - height: 100, - origin: [0, 0, 0], - resolution: [1, -1, 0], - }); - const tiff = mockTiff([primary]); - const geo = await GeoTIFF.fromTiff(tiff); - expect(geo.count).toBe(1); - }); -}); diff --git a/packages/geotiff/tests/helpers.ts b/packages/geotiff/tests/helpers.ts index ebf0b4a..1ffbfb4 100644 --- a/packages/geotiff/tests/helpers.ts +++ b/packages/geotiff/tests/helpers.ts @@ -1,7 +1,5 @@ import { resolve } from "node:path"; import { SourceFile } from "@chunkd/source-file"; -import type { Tiff, TiffImage } from "@cogeotiff/core"; -import { SampleFormat, TiffTag } from "@cogeotiff/core"; import { GeoTIFF } from "../src/geotiff.js"; // ── Fixture helpers ───────────────────────────────────────────────────── @@ -32,83 +30,3 @@ export async function loadGeoTIFF( const source = new SourceFile(path); return GeoTIFF.create(source); } - -// ── Mock helpers ──────────────────────────────────────────────────────── - -/** Create a mock TiffImage with configurable properties. */ -export function mockImage(opts: { - width: number; - height: number; - tileWidth?: number; - tileHeight?: number; - tiled?: boolean; - origin?: [number, number, number]; - resolution?: [number, number, number]; - subFileType?: number; - photometric?: number; - samplesPerPixel?: number; - noData?: number | null; - epsg?: number | null; - bbox?: [number, number, number, number]; - modelTransformation?: number[] | null; -}): TiffImage { - const tiled = opts.tiled ?? true; - const tags = new Map(); - - if (opts.subFileType != null) { - tags.set(TiffTag.SubFileType, opts.subFileType); - } - if (opts.photometric != null) { - tags.set(TiffTag.Photometric, opts.photometric); - } - if (opts.samplesPerPixel != null) { - tags.set(TiffTag.SamplesPerPixel, opts.samplesPerPixel); - } - if (opts.modelTransformation != null) { - tags.set(TiffTag.ModelTransformation, opts.modelTransformation); - } - - // Default SampleFormat and BitsPerSample so fetchTile works - if (!tags.has(TiffTag.SampleFormat)) { - tags.set(TiffTag.SampleFormat, [SampleFormat.Uint]); - } - if (!tags.has(TiffTag.BitsPerSample)) { - tags.set(TiffTag.BitsPerSample, [8]); - } - - return { - size: { width: opts.width, height: opts.height }, - tileSize: { - width: opts.tileWidth ?? 256, - height: opts.tileHeight ?? 256, - }, - isTiled: () => tiled, - origin: opts.origin ?? [0, 0, 0], - resolution: opts.resolution ?? [1, -1, 0], - noData: opts.noData ?? null, - epsg: opts.epsg ?? null, - bbox: opts.bbox ?? [0, 0, 100, 100], - init: async () => {}, - has: (tag: number) => tags.has(tag), - value: (tag: number) => { - if (tags.has(tag)) return tags.get(tag); - return null; - }, - valueGeo: () => null, - fetch: async (tag: number) => tags.get(tag) ?? null, - getTile: async (_x: number, _y: number) => ({ - bytes: new ArrayBuffer( - (opts.tileWidth ?? 256) * - (opts.tileHeight ?? 256) * - (opts.samplesPerPixel ?? 1), - ), - mimeType: "application/octet-stream", - compression: 1, // None - }), - } as unknown as TiffImage; -} - -/** Create a mock Tiff with the given images. */ -export function mockTiff(images: TiffImage[]): Tiff { - return { images } as unknown as Tiff; -} diff --git a/packages/geotiff/tests/overview.test.ts b/packages/geotiff/tests/overview.test.ts deleted file mode 100644 index 170e50f..0000000 --- a/packages/geotiff/tests/overview.test.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { describe, expect, it } from "vitest"; -import { GeoTIFF } from "../src/geotiff.js"; -import { mockImage, mockTiff } from "./helpers.js"; - -describe("Overview", () => { - it("computes scaled transform from parent", async () => { - const primary = mockImage({ - width: 1000, - height: 1000, - origin: [100, 200, 0], - resolution: [0.01, -0.01, 0], - }); - const ov = mockImage({ width: 500, height: 500 }); - - const tiff = mockTiff([primary, ov]); - const geo = await GeoTIFF.fromTiff(tiff); - - const ovTransform = geo.overviews[0]!.transform; - // scale = 1000 / 500 = 2 - expect(ovTransform[0]).toBeCloseTo(0.02); // a * 2 - expect(ovTransform[4]).toBeCloseTo(-0.02); // e * 2 - // Origin unchanged - expect(ovTransform[2]).toBe(100); // c - expect(ovTransform[5]).toBe(200); // f - }); -}); From 248f1f907885f3ffdbf7a96d6f27f28c42d34317 Mon Sep 17 00:00:00 2001 From: Kyle Barron Date: Tue, 17 Feb 2026 18:03:32 -0500 Subject: [PATCH 27/36] Move geotiff creation utilities into geotiff package --- packages/deck.gl-geotiff/package.json | 4 --- .../deck.gl-geotiff/src/geotiff/geotiff.ts | 17 ++--------- packages/geotiff/package.json | 4 +++ packages/geotiff/src/geotiff.ts | 28 +++++++++++++++++++ pnpm-lock.yaml | 24 ++++++++-------- 5 files changed, 46 insertions(+), 31 deletions(-) diff --git a/packages/deck.gl-geotiff/package.json b/packages/deck.gl-geotiff/package.json index 0b34c22..3378363 100644 --- a/packages/deck.gl-geotiff/package.json +++ b/packages/deck.gl-geotiff/package.json @@ -46,10 +46,6 @@ "vitest": "^4.0.18" }, "dependencies": { - "@chunkd/middleware": "^11.1.0", - "@chunkd/source": "^11.1.0", - "@chunkd/source-http": "^11.1.1", - "@chunkd/source-memory": "^11.0.2", "@cogeotiff/core": "^9.1.2", "@developmentseed/affine": "workspace:^", "@developmentseed/deck.gl-raster": "workspace:^", diff --git a/packages/deck.gl-geotiff/src/geotiff/geotiff.ts b/packages/deck.gl-geotiff/src/geotiff/geotiff.ts index 73e8fda..efcfcb2 100644 --- a/packages/deck.gl-geotiff/src/geotiff/geotiff.ts +++ b/packages/deck.gl-geotiff/src/geotiff/geotiff.ts @@ -1,9 +1,5 @@ // Utilities for interacting with geotiff.js. -import { SourceCache, SourceChunk } from "@chunkd/middleware"; -import { SourceView } from "@chunkd/source"; -import { SourceHttp } from "@chunkd/source-http"; -import { SourceMemory } from "@chunkd/source-memory"; import type { RasterArray } from "@developmentseed/geotiff"; import { GeoTIFF } from "@developmentseed/geotiff"; import type { Converter } from "proj4"; @@ -87,20 +83,11 @@ export async function fetchGeoTIFF( input: GeoTIFF | string | URL | ArrayBuffer, ): Promise { if (typeof input === "string" || input instanceof URL) { - // read files in 32KB chunks - const chunk = new SourceChunk({ size: 32 * 1024 }); - // 1MB cache for recently accessed chunks - const cache = new SourceCache({ size: 1024 * 1024 * 1024 }); - - const source = new SourceHttp(input); - const view = new SourceView(source, [chunk, cache]); - - return await GeoTIFF.create(view); + return await GeoTIFF.fromUrl(input); } if (input instanceof ArrayBuffer) { - const source = new SourceMemory("memory://input.tif", input); - return await GeoTIFF.create(source); + return await GeoTIFF.fromArrayBuffer(input); } return input; diff --git a/packages/geotiff/package.json b/packages/geotiff/package.json index ca195c0..6533963 100644 --- a/packages/geotiff/package.json +++ b/packages/geotiff/package.json @@ -46,6 +46,10 @@ "extends": "../../package.json" }, "dependencies": { + "@chunkd/middleware": "^11.1.0", + "@chunkd/source": "^11.1.0", + "@chunkd/source-http": "^11.1.1", + "@chunkd/source-memory": "^11.0.2", "@cogeotiff/core": "^9.1.2", "@developmentseed/affine": "workspace:^", "@developmentseed/morecantile": "workspace:^", diff --git a/packages/geotiff/src/geotiff.ts b/packages/geotiff/src/geotiff.ts index 4217d12..f696441 100644 --- a/packages/geotiff/src/geotiff.ts +++ b/packages/geotiff/src/geotiff.ts @@ -1,3 +1,8 @@ +import { SourceCache } from "@chunkd/middleware"; +import { SourceChunk } from "@chunkd/middleware/build/src/middleware/chunk.js"; +import { SourceView } from "@chunkd/source"; +import { SourceHttp } from "@chunkd/source-http"; +import { SourceMemory } from "@chunkd/source-memory"; import type { Source, TiffImage } from "@cogeotiff/core"; import { Photometric, SubFileType, Tiff, TiffTag } from "@cogeotiff/core"; import type { Affine } from "@developmentseed/affine"; @@ -144,6 +149,29 @@ export class GeoTIFF { return geotiff; } + static async fromArrayBuffer(input: ArrayBuffer): Promise { + const source = new SourceMemory("memory://input.tif", input); + return await GeoTIFF.create(source); + } + + static async fromUrl( + url: string | URL, + { + chunkSize = 32 * 1024, + cacheSize = 1024 * 1024 * 1024, + }: { chunkSize?: number; cacheSize?: number } = {}, + ): Promise { + // read files in chunks + const chunk = new SourceChunk({ size: chunkSize }); + // 1MB cache for recently accessed chunks + const cache = new SourceCache({ size: cacheSize }); + + const source = new SourceHttp(url); + const view = new SourceView(source, [chunk, cache]); + + return await GeoTIFF.create(view); + } + // ── Properties from the primary image ───────────────────────────────── /** diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index aa4c2bf..59d1280 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -240,18 +240,6 @@ importers: packages/deck.gl-geotiff: dependencies: - '@chunkd/middleware': - specifier: ^11.1.0 - version: 11.1.0 - '@chunkd/source': - specifier: ^11.1.0 - version: 11.1.0 - '@chunkd/source-http': - specifier: ^11.1.1 - version: 11.1.1 - '@chunkd/source-memory': - specifier: ^11.0.2 - version: 11.0.2 '@cogeotiff/core': specifier: ^9.1.2 version: 9.1.2 @@ -390,6 +378,18 @@ importers: packages/geotiff: dependencies: + '@chunkd/middleware': + specifier: ^11.1.0 + version: 11.1.0 + '@chunkd/source': + specifier: ^11.1.0 + version: 11.1.0 + '@chunkd/source-http': + specifier: ^11.1.1 + version: 11.1.1 + '@chunkd/source-memory': + specifier: ^11.0.2 + version: 11.0.2 '@cogeotiff/core': specifier: ^9.1.2 version: 9.1.2 From 0fa4f66110a67f7c6bcfa56a688805f8058af63a Mon Sep 17 00:00:00 2001 From: Kyle Barron Date: Tue, 17 Feb 2026 18:09:40 -0500 Subject: [PATCH 28/36] fix tests --- .../deck.gl-geotiff/tests/cog-tms.test.ts | 99 ------------------- .../geotiff/tests/tile-matrix-set.test.ts | 83 ++++++++++++++++ packages/morecantile/src/utils.ts | 2 +- packages/morecantile/tests/utils.test.ts | 13 +++ 4 files changed, 97 insertions(+), 100 deletions(-) delete mode 100644 packages/deck.gl-geotiff/tests/cog-tms.test.ts create mode 100644 packages/morecantile/tests/utils.test.ts diff --git a/packages/deck.gl-geotiff/tests/cog-tms.test.ts b/packages/deck.gl-geotiff/tests/cog-tms.test.ts deleted file mode 100644 index ee4f9c0..0000000 --- a/packages/deck.gl-geotiff/tests/cog-tms.test.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { fromUrl } from "geotiff"; -import { describe, expect, it } from "vitest"; -import { parseCOGTileMatrixSet, __TEST_EXPORTS as TestExports } from "../src"; -import { epsgIoGeoKeyParser } from "../src/proj"; - -describe("create TileMatrixSet from COG", () => { - it("creates TMS", async () => { - const url = - "https://ds-wheels.s3.us-east-1.amazonaws.com/m_4007307_sw_18_060_20220803.tif"; - - const tiff = await fromUrl(url); - const tms = await parseCOGTileMatrixSet(tiff, epsgIoGeoKeyParser); - - const expectedTileMatrices = [ - { - id: "0", - scaleDenominator: 68684.95742667928, - cellSize: 19.231788079470196, - pointOfOrigin: [647118, 4533600], - tileWidth: 512, - tileHeight: 512, - matrixWidth: 1, - matrixHeight: 1, - geotransform: [ - 19.231788079470196, 0, 647118, 0, -19.231788079470196, 4533600, - ], - }, - { - id: "1", - scaleDenominator: 34285.71428571429, - cellSize: 9.6, - pointOfOrigin: [647118, 4533600], - tileWidth: 512, - tileHeight: 512, - matrixWidth: 2, - matrixHeight: 2, - geotransform: [9.6, 0, 647118, 0, -9.6, 4533600], - }, - { - id: "2", - scaleDenominator: 17142.857142857145, - cellSize: 4.8, - pointOfOrigin: [647118, 4533600], - tileWidth: 512, - tileHeight: 512, - matrixWidth: 3, - matrixHeight: 4, - geotransform: [4.8, 0, 647118, 0, -4.8, 4533600], - }, - { - id: "3", - scaleDenominator: 8571.428571428572, - cellSize: 2.4, - pointOfOrigin: [647118, 4533600], - tileWidth: 512, - tileHeight: 512, - matrixWidth: 5, - matrixHeight: 7, - geotransform: [2.4, 0, 647118, 0, -2.4, 4533600], - }, - { - id: "4", - scaleDenominator: 4285.714285714286, - cellSize: 1.2, - pointOfOrigin: [647118, 4533600], - tileWidth: 512, - tileHeight: 512, - matrixWidth: 10, - matrixHeight: 13, - geotransform: [1.2, 0, 647118, 0, -1.2, 4533600], - }, - { - id: "5", - scaleDenominator: 2142.857142857143, - cellSize: 0.6, - pointOfOrigin: [647118, 4533600], - tileWidth: 512, - tileHeight: 512, - matrixWidth: 19, - matrixHeight: 25, - geotransform: [0.6, 0, 647118, 0, -0.6, 4533600], - }, - ]; - - expect(tms.tileMatrices).toStrictEqual(expectedTileMatrices); - }); -}); - -describe("metersPerUnit", () => { - it("handles lowercase us survey foot", () => { - // @ts-expect-error testing case insensitivity with standard casing - expect(TestExports.metersPerUnit({}, "us survey foot")).toBe(1200 / 3937); - }); - - it("handles mixed case US Survey Foot", () => { - // @ts-expect-error testing case insensitivity with non-standard casing - expect(TestExports.metersPerUnit({}, "US Survey Foot")).toBe(1200 / 3937); - }); -}); diff --git a/packages/geotiff/tests/tile-matrix-set.test.ts b/packages/geotiff/tests/tile-matrix-set.test.ts index 5cdfdb2..be5fb63 100644 --- a/packages/geotiff/tests/tile-matrix-set.test.ts +++ b/packages/geotiff/tests/tile-matrix-set.test.ts @@ -1,5 +1,6 @@ import { describe, expect, it } from "vitest"; import wktParser from "wkt-parser"; +import { GeoTIFF } from "../src/geotiff.js"; import { generateTileMatrixSet } from "../src/tile-matrix-set.js"; import { loadGeoTIFF } from "./helpers.js"; @@ -126,3 +127,85 @@ describe("test TMS", () => { ]); }); }); + +describe("create TileMatrixSet from COG", () => { + it("creates TMS", async () => { + const url = + "https://ds-wheels.s3.us-east-1.amazonaws.com/m_4007307_sw_18_060_20220803.tif"; + + const geotiff = await GeoTIFF.fromUrl(url); + + const tms = generateTileMatrixSet(geotiff, { units: "m" }); + + const expectedTileMatrices = [ + { + id: "0", + scaleDenominator: 68684.95742667928, + cellSize: 19.231788079470196, + pointOfOrigin: [647118, 4533600], + tileWidth: 512, + tileHeight: 512, + matrixWidth: 1, + matrixHeight: 1, + cornerOfOrigin: "topLeft", + }, + { + id: "1", + scaleDenominator: 34285.71428571429, + cellSize: 9.6, + pointOfOrigin: [647118, 4533600], + tileWidth: 512, + tileHeight: 512, + matrixWidth: 2, + matrixHeight: 2, + cornerOfOrigin: "topLeft", + }, + { + id: "2", + scaleDenominator: 17142.857142857145, + cellSize: 4.8, + pointOfOrigin: [647118, 4533600], + tileWidth: 512, + tileHeight: 512, + matrixWidth: 3, + matrixHeight: 4, + cornerOfOrigin: "topLeft", + }, + { + id: "3", + scaleDenominator: 8571.428571428572, + cellSize: 2.4, + pointOfOrigin: [647118, 4533600], + tileWidth: 512, + tileHeight: 512, + matrixWidth: 5, + matrixHeight: 7, + cornerOfOrigin: "topLeft", + }, + { + id: "4", + scaleDenominator: 4285.714285714286, + cellSize: 1.2, + pointOfOrigin: [647118, 4533600], + tileWidth: 512, + tileHeight: 512, + matrixWidth: 10, + matrixHeight: 13, + cornerOfOrigin: "topLeft", + }, + { + id: "5", + scaleDenominator: 2142.857142857143, + cellSize: 0.6, + pointOfOrigin: [647118, 4533600], + tileWidth: 512, + tileHeight: 512, + matrixWidth: 19, + matrixHeight: 25, + cornerOfOrigin: "topLeft", + }, + ]; + + expect(tms.tileMatrices).toStrictEqual(expectedTileMatrices); + }); +}); diff --git a/packages/morecantile/src/utils.ts b/packages/morecantile/src/utils.ts index 5f1395a..5e478ed 100644 --- a/packages/morecantile/src/utils.ts +++ b/packages/morecantile/src/utils.ts @@ -25,7 +25,7 @@ export function metersPerUnit( | "foot" | "us survey foot" | "degree", - { semiMajorAxis }: { semiMajorAxis?: number }, + { semiMajorAxis }: { semiMajorAxis?: number } = {}, ): number { unit = unit.toLowerCase() as typeof unit; switch (unit) { diff --git a/packages/morecantile/tests/utils.test.ts b/packages/morecantile/tests/utils.test.ts new file mode 100644 index 0000000..06d392a --- /dev/null +++ b/packages/morecantile/tests/utils.test.ts @@ -0,0 +1,13 @@ +import { describe, expect, it } from "vitest"; +import { metersPerUnit } from "../src"; + +describe("metersPerUnit", () => { + it("handles lowercase us survey foot", () => { + expect(metersPerUnit("us survey foot")).toBe(1200 / 3937); + }); + + it("handles mixed case US Survey Foot", () => { + // @ts-expect-error testing case insensitivity with non-standard casing + expect(metersPerUnit("US Survey Foot")).toBe(1200 / 3937); + }); +}); From 80879c40214d4daa8872df94fdc04be9bb7a5277 Mon Sep 17 00:00:00 2001 From: Kyle Barron Date: Tue, 17 Feb 2026 18:12:18 -0500 Subject: [PATCH 29/36] fix bundle --- packages/raster-reproject/package.json | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/raster-reproject/package.json b/packages/raster-reproject/package.json index c9a5e35..120c47e 100644 --- a/packages/raster-reproject/package.json +++ b/packages/raster-reproject/package.json @@ -9,10 +9,6 @@ ".": { "types": "./dist/index.d.ts", "default": "./dist/index.js" - }, - "./affine": { - "types": "./dist/affine/index.d.ts", - "default": "./dist/affine/index.js" } }, "sideEffects": false, From 2936a00a8e2a13b585ed71c11b5e67434350f891 Mon Sep 17 00:00:00 2001 From: Kyle Barron Date: Tue, 17 Feb 2026 18:52:48 -0500 Subject: [PATCH 30/36] small nits --- packages/deck.gl-geotiff/src/cog-layer.ts | 10 ++++++---- packages/deck.gl-geotiff/src/geotiff/geotiff.ts | 1 - tsconfig.json | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/packages/deck.gl-geotiff/src/cog-layer.ts b/packages/deck.gl-geotiff/src/cog-layer.ts index 0c509f5..575dab5 100644 --- a/packages/deck.gl-geotiff/src/cog-layer.ts +++ b/packages/deck.gl-geotiff/src/cog-layer.ts @@ -366,7 +366,12 @@ export class COGLayer< // Get projected bounds from tile data // getTileMetadata returns data that includes projectedBounds // eslint-disable-next-line @typescript-eslint/no-explicit-any - const projectedBounds = (tile as any)?.projectedBounds; + const projectedBounds: { + topLeft: [number, number]; + topRight: [number, number]; + bottomLeft: [number, number]; + bottomRight: [number, number]; + } = (tile as any)?.projectedBounds; if (!projectedBounds || !tms) { return []; @@ -375,9 +380,6 @@ export class COGLayer< // Project bounds from image CRS to WGS84 const { topLeft, topRight, bottomLeft, bottomRight } = projectedBounds; - // TODO: improve typing of projectedBounds shape - console.log("projectedBounds", projectedBounds); - const topLeftWgs84 = forwardTo4326(topLeft[0], topLeft[1]); const topRightWgs84 = forwardTo4326(topRight[0], topRight[1]); const bottomRightWgs84 = forwardTo4326(bottomRight[0], bottomRight[1]); diff --git a/packages/deck.gl-geotiff/src/geotiff/geotiff.ts b/packages/deck.gl-geotiff/src/geotiff/geotiff.ts index efcfcb2..58bd347 100644 --- a/packages/deck.gl-geotiff/src/geotiff/geotiff.ts +++ b/packages/deck.gl-geotiff/src/geotiff/geotiff.ts @@ -38,7 +38,6 @@ export function addAlphaChannel(rgbImage: RasterArray): RasterArray { return { ...rgbImage, - // layout: "pixel-interleaved", count: 4, data: rgbaArray, }; diff --git a/tsconfig.json b/tsconfig.json index 2bbec57..aa1013e 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -27,11 +27,11 @@ "files": [], "references": [ { "path": "packages/affine/tsconfig.build.json" }, - { "path": "packages/morecantile/tsconfig.build.json" }, { "path": "packages/deck.gl-geotiff/tsconfig.build.json" }, { "path": "packages/deck.gl-raster/tsconfig.build.json" }, { "path": "packages/deck.gl-zarr/tsconfig.build.json" }, { "path": "packages/geotiff/tsconfig.build.json" }, + { "path": "packages/morecantile/tsconfig.build.json" }, { "path": "packages/raster-reproject/tsconfig.build.json" } ] } From 4ae8589fcccb8bd0ecf490c9daa0b0342d7a12b0 Mon Sep 17 00:00:00 2001 From: Kyle Barron Date: Tue, 17 Feb 2026 18:55:07 -0500 Subject: [PATCH 31/36] Rename TMSTileset to TileMatrixSetTileset --- packages/deck.gl-geotiff/src/cog-layer.ts | 9 ++++++--- packages/deck.gl-raster/src/index.ts | 2 +- packages/deck.gl-raster/src/raster-tileset/index.ts | 2 +- .../src/raster-tileset/raster-tileset-2d.ts | 4 ++-- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/packages/deck.gl-geotiff/src/cog-layer.ts b/packages/deck.gl-geotiff/src/cog-layer.ts index 575dab5..47ae8f4 100644 --- a/packages/deck.gl-geotiff/src/cog-layer.ts +++ b/packages/deck.gl-geotiff/src/cog-layer.ts @@ -14,7 +14,10 @@ import type { import { TileLayer } from "@deck.gl/geo-layers"; import { PathLayer } from "@deck.gl/layers"; import type { RasterModule } from "@developmentseed/deck.gl-raster"; -import { RasterLayer, TMSTileset2D } from "@developmentseed/deck.gl-raster"; +import { + RasterLayer, + TileMatrixSetTileset, +} from "@developmentseed/deck.gl-raster"; import type { GeoTIFF, Overview } from "@developmentseed/geotiff"; import { generateTileMatrixSet } from "@developmentseed/geotiff"; import type { TileMatrixSet } from "@developmentseed/morecantile"; @@ -419,7 +422,7 @@ export class COGLayer< geotiff: GeoTIFF, ): TileLayer { // Create a factory class that wraps COGTileset2D with the metadata - class TMSTileset2DFactory extends TMSTileset2D { + class TileMatrixSetTilesetFactory extends TileMatrixSetTileset { constructor(opts: Tileset2DProps) { super(opts, tms, { projectTo4326: forwardTo4326, @@ -430,7 +433,7 @@ export class COGLayer< return new TileLayer>({ id: `cog-tile-layer-${this.id}`, - TilesetClass: TMSTileset2DFactory, + TilesetClass: TileMatrixSetTilesetFactory, getTileData: async (tile) => this._getTileData(tile, geotiff, tms), renderSubLayers: (props) => this._renderSubLayers(props, tms, forwardTo4326, inverseFrom4326), diff --git a/packages/deck.gl-raster/src/index.ts b/packages/deck.gl-raster/src/index.ts index a194f7b..f8127f4 100644 --- a/packages/deck.gl-raster/src/index.ts +++ b/packages/deck.gl-raster/src/index.ts @@ -1,7 +1,7 @@ export type { RasterModule } from "./gpu-modules/types.js"; export type { RasterLayerProps } from "./raster-layer.js"; export { RasterLayer } from "./raster-layer.js"; -export { TMSTileset2D } from "./raster-tileset/index.js"; +export { TileMatrixSetTileset } from "./raster-tileset/index.js"; import { __TEST_EXPORTS as traversalTestExports } from "./raster-tileset/raster-tile-traversal.js"; diff --git a/packages/deck.gl-raster/src/raster-tileset/index.ts b/packages/deck.gl-raster/src/raster-tileset/index.ts index 1dc8e12..f96ab6b 100644 --- a/packages/deck.gl-raster/src/raster-tileset/index.ts +++ b/packages/deck.gl-raster/src/raster-tileset/index.ts @@ -1 +1 @@ -export { TMSTileset2D } from "./raster-tileset-2d.js"; +export { TileMatrixSetTileset } from "./raster-tileset-2d.js"; diff --git a/packages/deck.gl-raster/src/raster-tileset/raster-tileset-2d.ts b/packages/deck.gl-raster/src/raster-tileset/raster-tileset-2d.ts index 90231b5..8d3a3b6 100644 --- a/packages/deck.gl-raster/src/raster-tileset/raster-tileset-2d.ts +++ b/packages/deck.gl-raster/src/raster-tileset/raster-tileset-2d.ts @@ -1,5 +1,5 @@ /** - * TMSTileset2D - Improved Implementation with Frustum Culling + * TileMatrixSetTileset - Improved Implementation with Frustum Culling * * This version properly implements frustum culling and bounding volume calculations * following the pattern from deck.gl's OSM tile indexing. @@ -28,7 +28,7 @@ import type { * [TileMatrixSet](https://docs.ogc.org/is/17-083r4/17-083r4.html) * specification. */ -export class TMSTileset2D extends Tileset2D { +export class TileMatrixSetTileset extends Tileset2D { private tms: TileMatrixSet; private wgs84Bounds: CornerBounds; private projectTo3857: ProjectionFunction; From 7f1ebb103a1daac5f8cec98309e0bf543404f8eb Mon Sep 17 00:00:00 2001 From: Kyle Barron Date: Tue, 17 Feb 2026 18:56:09 -0500 Subject: [PATCH 32/36] Apply suggestion from @kylebarron --- packages/deck.gl-geotiff/src/cog-layer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/deck.gl-geotiff/src/cog-layer.ts b/packages/deck.gl-geotiff/src/cog-layer.ts index 47ae8f4..4fb325e 100644 --- a/packages/deck.gl-geotiff/src/cog-layer.ts +++ b/packages/deck.gl-geotiff/src/cog-layer.ts @@ -280,7 +280,7 @@ export class COGLayer< // If z=0, use the coarsest overview (which is the last in the array) // If z=max, use the full-resolution image (which is the first in the array) - // TODO: should be able to optimize this to not create the array + // TODO: should be able to (micro) optimize this to not create the array // Something like: // const image = z === geotiff.overviews.length - 1 ? geotiff : // geotiff.overviews[geotiff.overviews.length - 1 - z]!; From 9d157788aaa74b45c7ce1d8148ce370e61f37165 Mon Sep 17 00:00:00 2001 From: Kyle Barron Date: Tue, 17 Feb 2026 18:58:53 -0500 Subject: [PATCH 33/36] conciseness --- packages/deck.gl-geotiff/src/geotiff-reprojection.ts | 6 +----- packages/deck.gl-geotiff/src/index.ts | 1 - 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/packages/deck.gl-geotiff/src/geotiff-reprojection.ts b/packages/deck.gl-geotiff/src/geotiff-reprojection.ts index 8125404..457c693 100644 --- a/packages/deck.gl-geotiff/src/geotiff-reprojection.ts +++ b/packages/deck.gl-geotiff/src/geotiff-reprojection.ts @@ -15,14 +15,10 @@ export async function extractGeotiffReprojectors( sourceProjection: string | PROJJSONDefinition | ProjectionDefinition, outputCrs: string | PROJJSONDefinition | Projection = "EPSG:4326", ): Promise { - // Extract geotransform from full-resolution image - // Only the top-level IFD has geo keys, so we'll derive overviews from this - const baseGeotransform = geotiff.transform; - // @ts-expect-error - proj4 type definitions are incomplete and don't include // support for wkt-parser output const converter = proj4(sourceProjection, outputCrs); - const { forwardTransform, inverseTransform } = fromAffine(baseGeotransform); + const { forwardTransform, inverseTransform } = fromAffine(geotiff.transform); return { forwardTransform, diff --git a/packages/deck.gl-geotiff/src/index.ts b/packages/deck.gl-geotiff/src/index.ts index 6af1f80..bd6e396 100644 --- a/packages/deck.gl-geotiff/src/index.ts +++ b/packages/deck.gl-geotiff/src/index.ts @@ -5,7 +5,6 @@ export * as texture from "./geotiff/texture.js"; // Don't export GeoTIFF Layer for now; nudge people towards COGLayer // export type { GeoTIFFLayerProps } from "./geotiff-layer.js"; // export { GeoTIFFLayer } from "./geotiff-layer.js"; -export { extractGeotiffReprojectors } from "./geotiff-reprojection.js"; export type { MosaicLayerProps } from "./mosaic-layer/mosaic-layer.js"; export { MosaicLayer } from "./mosaic-layer/mosaic-layer.js"; export { From 17c5e60cfa8e25bcce2348f2cba4a77db7e56f33 Mon Sep 17 00:00:00 2001 From: Kyle Barron Date: Tue, 17 Feb 2026 19:05:16 -0500 Subject: [PATCH 34/36] remove commented tms types --- .../src/raster-tileset/types.ts | 148 ------------------ 1 file changed, 148 deletions(-) diff --git a/packages/deck.gl-raster/src/raster-tileset/types.ts b/packages/deck.gl-raster/src/raster-tileset/types.ts index 50221bc..597d470 100644 --- a/packages/deck.gl-raster/src/raster-tileset/types.ts +++ b/packages/deck.gl-raster/src/raster-tileset/types.ts @@ -49,154 +49,6 @@ export type TileMatrixSetBoundingBox = CornerBounds & { crs?: CRS; }; -// /** -// * Represents a single resolution level in a raster tileset. -// * -// * COGs contain multiple resolution levels (overviews) for efficient -// * visualization at different zoom levels. -// * -// * IMPORTANT: Overviews are ordered according to TileMatrixSet specification: -// * - Index 0: Coarsest resolution (most zoomed out) -// * - Index N: Finest resolution (most zoomed in) -// * -// * This matches the natural ordering where z increases with detail. -// */ -// export type TileMatrix = { -// /** -// * Unique identifier for this tile matrix. -// * -// * The ID is typically a string representation of the overview level, -// * where lower values correspond to coarser resolutions. -// */ -// id: string; - -// /** -// * Scale denominator of this tile matrix. -// * -// * Defined as cellSize (meters per pixel) * meters per unit / 0.00028 -// */ -// scaleDenominator: number; - -// /** -// * Cell size of this tile matrix. -// * -// * CRS units per pixel (not necessarily meters). -// */ -// cellSize: number; - -// /** -// * Indicates which corner of the tile matrix is the origin. -// * -// * Typically "upperLeft" for most raster datasets. -// */ -// cornerOfOrigin: "lowerLeft" | "upperLeft"; - -// /** -// * Point of origin of this tile matrix in CRS coordinates. -// */ -// pointOfOrigin: Point; - -// /** -// * Width of each tile of this tile matrix in pixels. -// */ -// tileWidth: number; - -// /** -// * Height of each tile of this tile matrix in pixels. -// */ -// tileHeight: number; - -// /** -// * Number of tiles in the X (horizontal) direction at this overview level. -// * -// * Calculated as: Math.ceil(width / tileWidth) -// * -// * @example -// * // If tileWidth = 512: -// * tilesX: 3 // z=0: ceil(1250 / 512) -// * tilesX: 5 // z=1: ceil(2500 / 512) -// * tilesX: 10 // z=2: ceil(5000 / 512) -// * tilesX: 20 // z=3: ceil(10000 / 512) -// */ -// matrixWidth: number; - -// /** -// * Number of tiles in the Y (vertical) direction at this overview level. -// * -// * Calculated as: Math.ceil(height / tileHeight) -// * -// * @example -// * // If tileHeight = 512: -// * tilesY: 2 // z=0: ceil(1000 / 512) -// * tilesY: 4 // z=1: ceil(2000 / 512) -// * tilesY: 8 // z=2: ceil(4000 / 512) -// * tilesY: 16 // z=3: ceil(8000 / 512) -// */ -// matrixHeight: number; - -// /** -// * Affine geotransform for this overview level. -// * -// * Uses Python `affine` package ordering (NOT GDAL ordering): -// * [a, b, c, d, e, f] where: -// * - x_geo = a * col + b * row + c -// * - y_geo = d * col + e * row + f -// * -// * Parameters: -// * - a: pixel width (x resolution) -// * - b: row rotation (typically 0) -// * - c: x-coordinate of upper-left corner of the upper-left pixel -// * - d: column rotation (typically 0) -// * - e: pixel height (y resolution, typically negative) -// * - f: y-coordinate of upper-left corner of the upper-left pixel -// * -// * @example -// * // For a UTM image with 30m pixels: -// * [30, 0, 440720, 0, -30, 3751320] -// * // x_geo = 30 * col + 440720 -// * // y_geo = -30 * row + 3751320 -// */ -// geotransform: [number, number, number, number, number, number]; -// }; - -// /** -// * COG Metadata extracted from GeoTIFF -// */ -// export type TileMatrixSet = { -// /** -// * Title of this tile matrix set, normally used for display to a human -// */ -// title?: string; - -// /** -// * Brief narrative description of this tile matrix set, normally available for display to a human -// */ -// description?: string; - -// /** -// * Coordinate Reference System of this tile matrix set. -// */ -// crs: CRS; - -// /** -// * Bounding box of this TMS. -// * -// * The TileMatrixSetBoundingBox can contain its own CRS, which may differ -// * from the overall TileMatrixSet CRS. -// */ -// boundingBox?: TileMatrixSetBoundingBox; - -// /** -// * Describes scale levels and its tile matrices -// */ -// tileMatrices: TileMatrix[]; - -// /** -// * Bounding box of this TMS in WGS84 lon/lat. -// */ -// wgsBounds?: TileMatrixSetBoundingBox; -// }; - /** * Raster Tile Index * From 2f5062c86b9c8d5e9a2de6587359a6a3314d6af8 Mon Sep 17 00:00:00 2001 From: Kyle Barron Date: Tue, 17 Feb 2026 19:10:02 -0500 Subject: [PATCH 35/36] nits --- packages/geotiff/src/ifd.ts | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/geotiff/src/ifd.ts b/packages/geotiff/src/ifd.ts index bbd1340..48127d6 100644 --- a/packages/geotiff/src/ifd.ts +++ b/packages/geotiff/src/ifd.ts @@ -1,5 +1,5 @@ import type { TiffImage, TiffTagGeoType, TiffTagType } from "@cogeotiff/core"; -import { TiffTag, TiffTagGeo } from "@cogeotiff/core"; +import { SampleFormat, TiffTag, TiffTagGeo } from "@cogeotiff/core"; /** Subset of TIFF tags that we pre-fetch for easier visualization. */ export interface CachedTags { @@ -39,13 +39,19 @@ export async function prefetchTags(image: TiffImage): Promise { throw new Error("SamplesPerPixel tag should always exist."); } + if (photometric === null) { + throw new Error("Photometric tag should always exist."); + } + return { bitsPerSample: new Uint16Array(bitsPerSample), colorMap: colorMap ? new Uint16Array(colorMap as number[]) : undefined, compression, nodata, - photometric: photometric ?? 1, // Default to 1 (BlackIsZero) per spec - sampleFormat: sampleFormat ?? [1], // Default to 1 (unsigned int) per spec + photometric, + // Uint is the default sample format according to the spec + // https://web.archive.org/web/20240329145340/https://www.awaresystems.be/imaging/tiff/tifftags/sampleformat.html + sampleFormat: sampleFormat ?? [SampleFormat.Uint], // Waiting for release with https://github.com/blacha/cogeotiff/pull/1394 samplesPerPixel: samplesPerPixel as number, }; From 3a90fe7a932b0bd8b6caba306142993dbe1a061c Mon Sep 17 00:00:00 2001 From: Kyle Barron Date: Tue, 17 Feb 2026 19:13:32 -0500 Subject: [PATCH 36/36] add morecantile to references --- packages/deck.gl-geotiff/tsconfig.build.json | 5 +++-- packages/deck.gl-raster/tsconfig.build.json | 5 ++++- packages/geotiff/tsconfig.build.json | 5 ++++- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/packages/deck.gl-geotiff/tsconfig.build.json b/packages/deck.gl-geotiff/tsconfig.build.json index 62ae0a9..546e11e 100644 --- a/packages/deck.gl-geotiff/tsconfig.build.json +++ b/packages/deck.gl-geotiff/tsconfig.build.json @@ -8,8 +8,9 @@ "include": ["src/**/*"], "exclude": ["node_modules", "dist", "tests"], "references": [ + { "path": "../deck.gl-raster/tsconfig.build.json" }, { "path": "../geotiff/tsconfig.build.json" }, - { "path": "../raster-reproject/tsconfig.build.json" }, - { "path": "../deck.gl-raster/tsconfig.build.json" } + { "path": "../morecantile/tsconfig.build.json" }, + { "path": "../raster-reproject/tsconfig.build.json" } ] } diff --git a/packages/deck.gl-raster/tsconfig.build.json b/packages/deck.gl-raster/tsconfig.build.json index 9ab31b2..0e89e61 100644 --- a/packages/deck.gl-raster/tsconfig.build.json +++ b/packages/deck.gl-raster/tsconfig.build.json @@ -7,5 +7,8 @@ }, "include": ["src/**/*"], "exclude": ["node_modules", "dist", "tests"], - "references": [{ "path": "../raster-reproject/tsconfig.build.json" }] + "references": [ + { "path": "../morecantile/tsconfig.build.json" }, + { "path": "../raster-reproject/tsconfig.build.json" } + ] } diff --git a/packages/geotiff/tsconfig.build.json b/packages/geotiff/tsconfig.build.json index 337c3a4..0fb6fc5 100644 --- a/packages/geotiff/tsconfig.build.json +++ b/packages/geotiff/tsconfig.build.json @@ -7,5 +7,8 @@ }, "include": ["src/**/*"], "exclude": ["node_modules", "dist", "tests"], - "references": [{ "path": "../affine/tsconfig.build.json" }] + "references": [ + { "path": "../affine/tsconfig.build.json" }, + { "path": "../morecantile/tsconfig.build.json" } + ] }