From f889b77fc0c6e302e3ee0085c96b1f8d3973cb76 Mon Sep 17 00:00:00 2001 From: Nathan Date: Mon, 19 May 2025 16:06:09 -0700 Subject: [PATCH 01/19] add DEMData::pack() function and unit tests --- src/data/dem_data.test.ts | 57 +++++++++++++++++++++++++++++++++++++++ src/data/dem_data.ts | 10 +++++++ 2 files changed, 67 insertions(+) diff --git a/src/data/dem_data.test.ts b/src/data/dem_data.test.ts index ee579ab4a3d..f5b92c512f4 100644 --- a/src/data/dem_data.test.ts +++ b/src/data/dem_data.test.ts @@ -236,3 +236,60 @@ describe('DEMData#getImage', () => { test('Image is correctly returned - terrarium', testGetPixels(terrariumDEM, imageData)); test('Image is correctly returned - custom', testGetPixels(customDEM, imageData)); }); + +describe('DEMData pack and unpack', () => { + const imageData = createMockImage(4, 4); + test('mapbox', () => { + const dem = new DEMData('0', imageData, 'mapbox'); + expect(dem.unpack(123, 177, 215)).toEqual(800645.5); + expect(dem.pack(800645.5)).toEqual({r: 123, g: 177, b: 215}); + + expect(dem.unpack(0, 0, 0)).toEqual(-10000); + expect(dem.pack(-10000)).toEqual({r: 0, g: 0, b: 0}); + + expect(dem.unpack(1, 1, 1)).toBeCloseTo(-3420.7); + expect(dem.pack(-3420.7)).toEqual({r: 1, g: 1, b: 1}); + + expect(dem.unpack(255, 255, 255)).toEqual(1667721.5); + expect(dem.pack(1667721.5)).toEqual({r: 255, g: 255, b: 255}); + + expect(dem.unpack(255, 0, 255)).toEqual(1661193.5); + expect(dem.pack(1661193.5)).toEqual({r: 255, g: 0, b: 255}); + }); + + test('terrarium', () => { + const dem = new DEMData('0', imageData, 'terrarium'); + expect(dem.unpack(123, 177, 215)).toEqual(-1102.16015625); + expect(dem.pack(-1102.16015625)).toEqual({r: 123, g: 177, b: 215}); + + expect(dem.unpack(0, 0, 0)).toEqual(-32768); + expect(dem.pack(-32768)).toEqual({r: 0, g: 0, b: 0}); + + expect(dem.unpack(1, 1, 1)).toEqual(-32510.99609375); + expect(dem.pack(-32510.99609375)).toEqual({r: 1, g: 1, b: 1}); + + expect(dem.unpack(255, 255, 255)).toEqual(32767.99609375); + expect(dem.pack(32767.99609375)).toEqual({r: 255, g: 255, b: 255}); + + expect(dem.unpack(255, 0, 255)).toEqual(32512.99609375); + expect(dem.pack(32512.99609375)).toEqual({r: 255, g: 0, b: 255}); + }); + + test('custom', () => { + const dem = new DEMData('0', imageData, 'custom', 0.25, 64, 16384, 7000.0); + expect(dem.unpack(123, 177, 215)).toEqual(3526918.75); + expect(dem.pack(3526918.75)).toEqual({r: 123, g: 177, b: 215}); + + expect(dem.unpack(0, 0, 0)).toEqual(-7000); + expect(dem.pack(-7000)).toEqual({r: 0, g: 0, b: 0}); + + expect(dem.unpack(1, 1, 1)).toEqual(9448.25); + expect(dem.pack(9448.25)).toEqual({r: 1, g: 1, b: 1}); + + expect(dem.unpack(255, 255, 255)).toEqual(4187303.75); + expect(dem.pack(4187303.75)).toEqual({r: 255, g: 255, b: 255}); + + expect(dem.unpack(255, 0, 255)).toEqual(4170983.75); + expect(dem.pack(4170983.75)).toEqual({r: 255, g: 0, b: 255}); + }); +}); \ No newline at end of file diff --git a/src/data/dem_data.ts b/src/data/dem_data.ts index 4b3bcbc7b46..99dd45ba6ff 100644 --- a/src/data/dem_data.ts +++ b/src/data/dem_data.ts @@ -128,6 +128,16 @@ export class DEMData { return (r * this.redFactor + g * this.greenFactor + b * this.blueFactor - this.baseShift); } + pack(v: number): {r: number, g: number, b: number} { + const minScale = Math.min(this.redFactor, this.greenFactor, this.blueFactor); + const vScaled = Math.round((v + this.baseShift)/minScale); + return { + r: Math.floor(vScaled*minScale/this.redFactor) % 256, + g: Math.floor(vScaled*minScale/this.greenFactor) % 256, + b: Math.floor(vScaled*minScale/this.blueFactor) % 256 + }; + } + getPixels() { return new RGBAImage({width: this.stride, height: this.stride}, new Uint8Array(this.data.buffer)); } From a2dbc6d1bf6405ac14064819e3a8b0df19bf1d9d Mon Sep 17 00:00:00 2001 From: Nathan Date: Mon, 19 May 2025 17:40:03 -0700 Subject: [PATCH 02/19] version of color relief that uses textures instead of uniforms for colorramp --- src/data/dem_data.ts | 24 +++++++++----- src/render/draw_color_relief.ts | 12 ++++++- src/render/program/color_relief_program.ts | 20 +++++------- src/shaders/color_relief.fragment.glsl | 27 ++++++++++++---- .../style_layer/color_relief_style_layer.ts | 32 +++++++++++++++++++ test/build/min.test.ts | 2 +- 6 files changed, 89 insertions(+), 28 deletions(-) diff --git a/src/data/dem_data.ts b/src/data/dem_data.ts index 99dd45ba6ff..98ddf89e264 100644 --- a/src/data/dem_data.ts +++ b/src/data/dem_data.ts @@ -128,14 +128,8 @@ export class DEMData { return (r * this.redFactor + g * this.greenFactor + b * this.blueFactor - this.baseShift); } - pack(v: number): {r: number, g: number, b: number} { - const minScale = Math.min(this.redFactor, this.greenFactor, this.blueFactor); - const vScaled = Math.round((v + this.baseShift)/minScale); - return { - r: Math.floor(vScaled*minScale/this.redFactor) % 256, - g: Math.floor(vScaled*minScale/this.greenFactor) % 256, - b: Math.floor(vScaled*minScale/this.blueFactor) % 256 - }; + pack(v: number): {r: number; g: number; b: number} { + return packDEMData(v, this.getUnpackVector()); } getPixels() { @@ -178,4 +172,18 @@ export class DEMData { } } +export function packDEMData(v: number, unpackVector: number[]): {r: number; g: number; b: number} { + const redFactor = unpackVector[0]; + const greenFactor = unpackVector[1]; + const blueFactor = unpackVector[2]; + const baseShift = unpackVector[3]; + const minScale = Math.min(redFactor, greenFactor, blueFactor); + const vScaled = Math.round((v + baseShift)/minScale); + return { + r: Math.floor(vScaled*minScale/redFactor) % 256, + g: Math.floor(vScaled*minScale/greenFactor) % 256, + b: Math.floor(vScaled*minScale/blueFactor) % 256 + }; +} + register('DEMData', DEMData); diff --git a/src/render/draw_color_relief.ts b/src/render/draw_color_relief.ts index b72f349c371..2bd4fea34d2 100644 --- a/src/render/draw_color_relief.ts +++ b/src/render/draw_color_relief.ts @@ -58,9 +58,19 @@ function renderColorRelief( const program = painter.useProgram('colorRelief', null, false, defines); const align = !painter.options.moving; + let firstTile = true; + for (const coord of coords) { const tile = sourceCache.getTile(coord); const dem = tile.dem; + if(firstTile && layer.colorRamp) { + const {elevationTexture, colorTexture} = layer.getColorRampTextures(context, maxLength, dem.getUnpackVector()); + context.activeTexture.set(gl.TEXTURE5); + elevationTexture.bind(gl.NEAREST, gl.CLAMP_TO_EDGE); + context.activeTexture.set(gl.TEXTURE6); + colorTexture.bind(gl.NEAREST, gl.CLAMP_TO_EDGE); + firstTile = false; + } if (!dem || !dem.data) { continue; @@ -94,6 +104,6 @@ function renderColorRelief( }); program.draw(context, gl.TRIANGLES, depthMode, stencilModes[coord.overscaledZ], colorMode, CullFaceMode.backCCW, - colorReliefUniformValues(layer, tile.dem, maxLength), terrainData, projectionData, layer.id, mesh.vertexBuffer, mesh.indexBuffer, mesh.segments); + colorReliefUniformValues(layer, tile.dem), terrainData, projectionData, layer.id, mesh.vertexBuffer, mesh.indexBuffer, mesh.segments); } } diff --git a/src/render/program/color_relief_program.ts b/src/render/program/color_relief_program.ts index 20bcd4efeec..5733b56520e 100644 --- a/src/render/program/color_relief_program.ts +++ b/src/render/program/color_relief_program.ts @@ -2,9 +2,7 @@ import { Uniform1i, Uniform1f, Uniform2f, - Uniform4f, - UniformFloatArray, - UniformColorArray + Uniform4f } from '../uniform_binding'; import type {Context} from '../../gl/context'; @@ -16,8 +14,8 @@ export type ColorReliefUniformsType = { 'u_image': Uniform1i; 'u_unpack': Uniform4f; 'u_dimension': Uniform2f; - 'u_elevation_stops': UniformFloatArray; - 'u_color_stops': UniformColorArray; + 'u_elevation_stops': Uniform1i; + 'u_color_stops': Uniform1i; 'u_opacity': Uniform1f; }; @@ -25,24 +23,22 @@ const colorReliefUniforms = (context: Context, locations: UniformLocations): Col 'u_image': new Uniform1i(context, locations.u_image), 'u_unpack': new Uniform4f(context, locations.u_unpack), 'u_dimension': new Uniform2f(context, locations.u_dimension), - 'u_elevation_stops': new UniformFloatArray(context, locations.u_elevation_stops), - 'u_color_stops': new UniformColorArray(context, locations.u_color_stops), + 'u_elevation_stops': new Uniform1i(context, locations.u_elevation_stops), + 'u_color_stops': new Uniform1i(context, locations.u_color_stops), 'u_opacity': new Uniform1f(context, locations.u_opacity) }); const colorReliefUniformValues = ( layer: ColorReliefStyleLayer, - dem: DEMData, - maxLength: number + dem: DEMData ): UniformValues => { - const colorRamp = layer.getColorRamp(maxLength); return { 'u_image': 0, 'u_unpack': dem.getUnpackVector(), 'u_dimension': [dem.stride, dem.stride], - 'u_elevation_stops': colorRamp.elevationStops, - 'u_color_stops': colorRamp.colorStops, + 'u_elevation_stops': 5, + 'u_color_stops': 6, 'u_opacity': layer.paint.get('color-relief-opacity') }; }; diff --git a/src/shaders/color_relief.fragment.glsl b/src/shaders/color_relief.fragment.glsl index 23a30798dc8..d97130a7e08 100644 --- a/src/shaders/color_relief.fragment.glsl +++ b/src/shaders/color_relief.fragment.glsl @@ -1,7 +1,7 @@ uniform sampler2D u_image; uniform vec4 u_unpack; -uniform float u_elevation_stops[NUM_ELEVATION_STOPS]; -uniform vec4 u_color_stops[NUM_ELEVATION_STOPS]; +uniform sampler2D u_elevation_stops; +uniform sampler2D u_color_stops; uniform float u_opacity; in vec2 v_pos; @@ -13,27 +13,42 @@ float getElevation(vec2 coord) { return dot(data, u_unpack); } +float getElevationStop(int stop) { + // Convert encoded elevation value to meters + float x = float(stop)/float(textureSize(u_elevation_stops, 0)[0]); + vec4 data = texture(u_elevation_stops, vec2(x, 0)) * 255.0; + data.a = -1.0; + return dot(data, u_unpack); +} + void main() { float el = getElevation(v_pos); // Binary search int r = (NUM_ELEVATION_STOPS - 1); int l = 0; + float el_l = getElevationStop(l); + float el_r = getElevationStop(r); while(r - l > 1) { int m = (r + l) / 2; - if(el < u_elevation_stops[m]) + float el_m = getElevationStop(m); + if(el < el_m) { r = m; + el_r = el_m; } else { l = m; + el_l = el_m; } } - fragColor = u_opacity*mix(u_color_stops[l], - u_color_stops[r], - clamp((el - u_elevation_stops[l])/(u_elevation_stops[r]-u_elevation_stops[l]), 0.0, 1.0)); + vec4 color_l = texture(u_color_stops, vec2(float(l)/float(textureSize(u_color_stops, 0)[0]), 0)); + vec4 color_r = texture(u_color_stops, vec2(float(r)/float(textureSize(u_color_stops, 0)[0]), 0)); + fragColor = u_opacity*mix(color_l, + color_r, + clamp((el - el_l) / (el_r - el_l), 0.0, 1.0)); #ifdef OVERDRAW_INSPECTOR fragColor = vec4(1.0); diff --git a/src/style/style_layer/color_relief_style_layer.ts b/src/style/style_layer/color_relief_style_layer.ts index 22a27715319..f8f0745bcd4 100644 --- a/src/style/style_layer/color_relief_style_layer.ts +++ b/src/style/style_layer/color_relief_style_layer.ts @@ -6,13 +6,19 @@ import {type Transitionable, type Transitioning, type PossiblyEvaluated} from '. import type {ColorReliefPaintProps} from './color_relief_style_layer_properties.g'; import {Color, Interpolate, ZoomConstantExpression, type LayerSpecification, type EvaluationContext} from '@maplibre/maplibre-gl-style-spec'; import {warnOnce} from '../../util/util'; +import {Texture} from '../../render/texture'; +import {RGBAImage} from '../../util/image'; +import {type Context} from '../../gl/context'; +import {packDEMData} from '../../data/dem_data'; export const isColorReliefStyleLayer = (layer: StyleLayer): layer is ColorReliefStyleLayer => layer.type === 'color-relief'; export type ColorRamp = {elevationStops: Array; colorStops: Array}; +export type ColorRampTextures = {elevationTexture: Texture; colorTexture: Texture}; export class ColorReliefStyleLayer extends StyleLayer { colorRamp: ColorRamp; + colorRampTextures: ColorRampTextures; _transitionablePaint: Transitionable; _transitioningPaint: Transitioning; paint: PossiblyEvaluated; @@ -62,6 +68,32 @@ export class ColorReliefStyleLayer extends StyleLayer { } return this.colorRamp; } + + getColorRampTextures(context: Context, maxLength: number, unpackVector: number[]): ColorRampTextures { + if (!this.colorRampTextures) { + const colorRamp = this.getColorRamp(maxLength); + const colorImage = new RGBAImage({width: colorRamp.colorStops.length, height: 1}); + const elevationImage = new RGBAImage({width: colorRamp.colorStops.length, height: 1}); + for (let i = 0; i < colorRamp.elevationStops.length; i++) { + const elevationPacked = packDEMData(colorRamp.elevationStops[i], unpackVector); + elevationImage.data[4*i + 0] = elevationPacked.r; + elevationImage.data[4*i + 1] = elevationPacked.g; + elevationImage.data[4*i + 2] = elevationPacked.b; + elevationImage.data[4*i + 3] = 255; + + const pxColor = colorRamp.colorStops[i]; + colorImage.data[4*i + 0] = Math.round(pxColor.r * 255 / pxColor.a); + colorImage.data[4*i + 1] = Math.round(pxColor.g * 255 / pxColor.a); + colorImage.data[4*i + 2] = Math.round(pxColor.b * 255 / pxColor.a); + colorImage.data[4*i + 3] = Math.round(pxColor.a * 255); + } + this.colorRampTextures = { + elevationTexture: new Texture(context, elevationImage, context.gl.RGBA), + colorTexture: new Texture(context, colorImage, context.gl.RGBA) + }; + } + return this.colorRampTextures; + } hasOffscreenPass() { return this.visibility !== 'none' && !!this.colorRamp; diff --git a/test/build/min.test.ts b/test/build/min.test.ts index 0de1b7ac526..3f727b6a345 100644 --- a/test/build/min.test.ts +++ b/test/build/min.test.ts @@ -38,7 +38,7 @@ describe('test min build', () => { const decreaseQuota = 4096; // feel free to update this value after you've checked that it has changed on purpose :-) - const expectedBytes = 930287; + const expectedBytes = 914955; expect(actualBytes).toBeLessThan(expectedBytes + increaseQuota); expect(actualBytes).toBeGreaterThan(expectedBytes - decreaseQuota); From d9be1a85cfa6a2e8b3fab80da8e6345efbe500a9 Mon Sep 17 00:00:00 2001 From: Nathan Date: Mon, 19 May 2025 17:57:08 -0700 Subject: [PATCH 03/19] get the right size limit for color ramp --- src/render/draw_color_relief.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/render/draw_color_relief.ts b/src/render/draw_color_relief.ts index 2bd4fea34d2..8dbee1871cd 100644 --- a/src/render/draw_color_relief.ts +++ b/src/render/draw_color_relief.ts @@ -52,7 +52,7 @@ function renderColorRelief( const context = painter.context; const transform = painter.transform; const gl = context.gl; - const maxLength = Math.floor((gl.getParameter(gl.MAX_FRAGMENT_UNIFORM_VECTORS) - 3) / 2); + const maxLength = gl.getParameter(gl.MAX_TEXTURE_SIZE); const colorRampLength = Math.min(maxLength, layer.colorRamp.elevationStops.length); const defines = [`#define NUM_ELEVATION_STOPS ${colorRampLength}`]; const program = painter.useProgram('colorRelief', null, false, defines); From 6840b709df40c4ed215083b814104df72b1ca5cf Mon Sep 17 00:00:00 2001 From: Nathan Date: Mon, 19 May 2025 18:13:14 -0700 Subject: [PATCH 04/19] update expectedBytes --- test/build/min.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/build/min.test.ts b/test/build/min.test.ts index 3f727b6a345..4e34fd3b0c7 100644 --- a/test/build/min.test.ts +++ b/test/build/min.test.ts @@ -38,7 +38,7 @@ describe('test min build', () => { const decreaseQuota = 4096; // feel free to update this value after you've checked that it has changed on purpose :-) - const expectedBytes = 914955; + const expectedBytes = 932407; expect(actualBytes).toBeLessThan(expectedBytes + increaseQuota); expect(actualBytes).toBeGreaterThan(expectedBytes - decreaseQuota); From f59ead7d4d808d29885f588db938c63b76aa87a8 Mon Sep 17 00:00:00 2001 From: Nathan Date: Mon, 19 May 2025 18:17:14 -0700 Subject: [PATCH 05/19] fix off-by-one error --- src/shaders/color_relief.fragment.glsl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/shaders/color_relief.fragment.glsl b/src/shaders/color_relief.fragment.glsl index d97130a7e08..7c32157f5fb 100644 --- a/src/shaders/color_relief.fragment.glsl +++ b/src/shaders/color_relief.fragment.glsl @@ -15,7 +15,7 @@ float getElevation(vec2 coord) { float getElevationStop(int stop) { // Convert encoded elevation value to meters - float x = float(stop)/float(textureSize(u_elevation_stops, 0)[0]); + float x = float(stop)/float(textureSize(u_elevation_stops, 0)[0]-1); vec4 data = texture(u_elevation_stops, vec2(x, 0)) * 255.0; data.a = -1.0; return dot(data, u_unpack); @@ -44,8 +44,8 @@ void main() { el_l = el_m; } } - vec4 color_l = texture(u_color_stops, vec2(float(l)/float(textureSize(u_color_stops, 0)[0]), 0)); - vec4 color_r = texture(u_color_stops, vec2(float(r)/float(textureSize(u_color_stops, 0)[0]), 0)); + vec4 color_l = texture(u_color_stops, vec2(float(l)/float(textureSize(u_color_stops, 0)[0]-1), 0)); + vec4 color_r = texture(u_color_stops, vec2(float(r)/float(textureSize(u_color_stops, 0)[0]-1), 0)); fragColor = u_opacity*mix(color_l, color_r, clamp((el - el_l) / (el_r - el_l), 0.0, 1.0)); From 0f61df7a342b68e9b508c0fc3d98d9fb2b3964bd Mon Sep 17 00:00:00 2001 From: Nathan Date: Mon, 19 May 2025 19:17:41 -0700 Subject: [PATCH 06/19] use texture lookup instead of shader interpolation --- src/render/draw_color_relief.ts | 2 +- src/shaders/color_relief.fragment.glsl | 10 ++++------ 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/render/draw_color_relief.ts b/src/render/draw_color_relief.ts index 8dbee1871cd..18e3286c299 100644 --- a/src/render/draw_color_relief.ts +++ b/src/render/draw_color_relief.ts @@ -68,7 +68,7 @@ function renderColorRelief( context.activeTexture.set(gl.TEXTURE5); elevationTexture.bind(gl.NEAREST, gl.CLAMP_TO_EDGE); context.activeTexture.set(gl.TEXTURE6); - colorTexture.bind(gl.NEAREST, gl.CLAMP_TO_EDGE); + colorTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); firstTile = false; } diff --git a/src/shaders/color_relief.fragment.glsl b/src/shaders/color_relief.fragment.glsl index 7c32157f5fb..2166e451310 100644 --- a/src/shaders/color_relief.fragment.glsl +++ b/src/shaders/color_relief.fragment.glsl @@ -15,7 +15,7 @@ float getElevation(vec2 coord) { float getElevationStop(int stop) { // Convert encoded elevation value to meters - float x = float(stop)/float(textureSize(u_elevation_stops, 0)[0]-1); + float x = (float(stop)+0.5)/float(textureSize(u_elevation_stops, 0)[0]); vec4 data = texture(u_elevation_stops, vec2(x, 0)) * 255.0; data.a = -1.0; return dot(data, u_unpack); @@ -44,11 +44,9 @@ void main() { el_l = el_m; } } - vec4 color_l = texture(u_color_stops, vec2(float(l)/float(textureSize(u_color_stops, 0)[0]-1), 0)); - vec4 color_r = texture(u_color_stops, vec2(float(r)/float(textureSize(u_color_stops, 0)[0]-1), 0)); - fragColor = u_opacity*mix(color_l, - color_r, - clamp((el - el_l) / (el_r - el_l), 0.0, 1.0)); + + float x = (float(l) + (el - el_l) / (el_r - el_l) + 0.5)/float(textureSize(u_color_stops, 0)[0]); + fragColor = u_opacity*texture(u_color_stops, vec2(x, 0)); #ifdef OVERDRAW_INSPECTOR fragColor = vec4(1.0); From a583485c93ebd8ebdedd4a724080ad811a88a0e7 Mon Sep 17 00:00:00 2001 From: Nathan Date: Tue, 20 May 2025 08:31:19 -0700 Subject: [PATCH 07/19] remove unneeded shader #define --- src/render/draw_color_relief.ts | 8 +++----- src/shaders/color_relief.fragment.glsl | 4 +++- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/render/draw_color_relief.ts b/src/render/draw_color_relief.ts index 18e3286c299..8a8965d963b 100644 --- a/src/render/draw_color_relief.ts +++ b/src/render/draw_color_relief.ts @@ -52,10 +52,7 @@ function renderColorRelief( const context = painter.context; const transform = painter.transform; const gl = context.gl; - const maxLength = gl.getParameter(gl.MAX_TEXTURE_SIZE); - const colorRampLength = Math.min(maxLength, layer.colorRamp.elevationStops.length); - const defines = [`#define NUM_ELEVATION_STOPS ${colorRampLength}`]; - const program = painter.useProgram('colorRelief', null, false, defines); + const program = painter.useProgram('colorRelief'); const align = !painter.options.moving; let firstTile = true; @@ -63,7 +60,8 @@ function renderColorRelief( for (const coord of coords) { const tile = sourceCache.getTile(coord); const dem = tile.dem; - if(firstTile && layer.colorRamp) { + if(firstTile) { + const maxLength = gl.getParameter(gl.MAX_TEXTURE_SIZE); const {elevationTexture, colorTexture} = layer.getColorRampTextures(context, maxLength, dem.getUnpackVector()); context.activeTexture.set(gl.TEXTURE5); elevationTexture.bind(gl.NEAREST, gl.CLAMP_TO_EDGE); diff --git a/src/shaders/color_relief.fragment.glsl b/src/shaders/color_relief.fragment.glsl index 2166e451310..57deac1a00e 100644 --- a/src/shaders/color_relief.fragment.glsl +++ b/src/shaders/color_relief.fragment.glsl @@ -24,8 +24,10 @@ float getElevationStop(int stop) { void main() { float el = getElevation(v_pos); + int num_elevation_stops = textureSize(u_elevation_stops, 0)[0]; + // Binary search - int r = (NUM_ELEVATION_STOPS - 1); + int r = (num_elevation_stops - 1); int l = 0; float el_l = getElevationStop(l); float el_r = getElevationStop(r); From b200ba1230212fa0e762cae67c0a3f07ccdd9b7c Mon Sep 17 00:00:00 2001 From: Nathan Date: Tue, 20 May 2025 08:40:29 -0700 Subject: [PATCH 08/19] use first available textures --- src/render/draw_color_relief.ts | 4 ++-- src/render/program/color_relief_program.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/render/draw_color_relief.ts b/src/render/draw_color_relief.ts index 8a8965d963b..1894eedbcc6 100644 --- a/src/render/draw_color_relief.ts +++ b/src/render/draw_color_relief.ts @@ -63,9 +63,9 @@ function renderColorRelief( if(firstTile) { const maxLength = gl.getParameter(gl.MAX_TEXTURE_SIZE); const {elevationTexture, colorTexture} = layer.getColorRampTextures(context, maxLength, dem.getUnpackVector()); - context.activeTexture.set(gl.TEXTURE5); + context.activeTexture.set(gl.TEXTURE1); elevationTexture.bind(gl.NEAREST, gl.CLAMP_TO_EDGE); - context.activeTexture.set(gl.TEXTURE6); + context.activeTexture.set(gl.TEXTURE4); colorTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); firstTile = false; } diff --git a/src/render/program/color_relief_program.ts b/src/render/program/color_relief_program.ts index 5733b56520e..ec4b72c53eb 100644 --- a/src/render/program/color_relief_program.ts +++ b/src/render/program/color_relief_program.ts @@ -37,8 +37,8 @@ const colorReliefUniformValues = ( 'u_image': 0, 'u_unpack': dem.getUnpackVector(), 'u_dimension': [dem.stride, dem.stride], - 'u_elevation_stops': 5, - 'u_color_stops': 6, + 'u_elevation_stops': 1, + 'u_color_stops': 4, 'u_opacity': layer.paint.get('color-relief-opacity') }; }; From 090c66af05eaded99136b1eae0597771862f6fe2 Mon Sep 17 00:00:00 2001 From: Zbigniew Matysek Date: Tue, 20 May 2025 19:35:35 +0200 Subject: [PATCH 09/19] global-state expression support in filter and paint properties (#5613) * add global-state expression support * set global state on style load * use forked spec * temporarily build in prepare step * temporary build fix * fix unit tests * test setGlobalState * add setGlobalStateProperty * add getGlobalState * jsdoc * update to support schema * validate style fixes * use exported types * remove validation * cleanout * update filter evaluation in all layer types * cleanout * use style spec fork, fix worker transfer * cleanout * tests & fixes * fixes + example * minor fixes * update CHANGELOG * review fixes * review fixes * fix tests * add global state diff * include optional sharp dependencies * full diff implementation, example fixes * fix spellcheck * update bundle size test * review fixes * review fix * review fixes * fix types * update tests * use latest spec * _setGlobalState -> setGlobalState * more tests * ensure 100% coverage for new style methods --- CHANGELOG.md | 2 +- .../filter-symbols-using-global-state.png | Bin 0 -> 82598 bytes .../assets/funicolares-and-funivias-como.json | 103 + docs/index.md | 4 +- package-lock.json | 5173 +++++++++++------ src/data/bucket.ts | 1 + src/data/bucket/circle_bucket.ts | 4 +- src/data/bucket/fill_bucket.ts | 4 +- src/data/bucket/fill_extrusion_bucket.ts | 4 +- src/data/bucket/line_bucket.ts | 4 +- src/data/bucket/symbol_bucket.ts | 4 +- src/source/geojson_source.test.ts | 1 + src/source/geojson_source.ts | 3 +- src/source/vector_tile_source.test.ts | 1 + src/source/vector_tile_source.ts | 3 +- src/source/vector_tile_worker_source.ts | 1 + src/source/worker_source.ts | 1 + src/source/worker_tile.ts | 6 +- src/style/evaluation_parameters.ts | 11 +- src/style/properties.ts | 4 + src/style/style.test.ts | 283 +- src/style/style.ts | 91 +- src/style/style_layer.test.ts | 43 + src/style/style_layer.ts | 33 +- src/ui/map.ts | 28 +- src/ui/map_tests/map_global_state.test.ts | 73 + test/bench/lib/tile_parser.ts | 3 +- test/build/min.test.ts | 2 +- .../filter-symbols-using-global-state.html | 106 + test/unit/lib/create_symbol_layer.ts | 3 +- 30 files changed, 4158 insertions(+), 1841 deletions(-) create mode 100644 docs/assets/examples/filter-symbols-using-global-state.png create mode 100644 docs/assets/funicolares-and-funivias-como.json create mode 100644 src/ui/map_tests/map_global_state.test.ts create mode 100644 test/examples/filter-symbols-using-global-state.html diff --git a/CHANGELOG.md b/CHANGELOG.md index 028add09415..070e74af18e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ ## main ### ✨ Features and improvements - +- Add `setGlobalStateProperty()` and `getGlobalState()` to the map public API ([#5613](https://github.com/maplibre/maplibre-gl-js/pull/5613)) - _...Add new stuff here..._ ### 🐞 Bug fixes diff --git a/docs/assets/examples/filter-symbols-using-global-state.png b/docs/assets/examples/filter-symbols-using-global-state.png new file mode 100644 index 0000000000000000000000000000000000000000..009665644e78dfda9e04bad30a5a3da585c78431 GIT binary patch literal 82598 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�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 U(h5*BVW!|URCJWf6fK|qFIC>w>;M1& literal 0 HcmV?d00001 diff --git a/docs/assets/funicolares-and-funivias-como.json b/docs/assets/funicolares-and-funivias-como.json new file mode 100644 index 00000000000..44687f8c682 --- /dev/null +++ b/docs/assets/funicolares-and-funivias-como.json @@ -0,0 +1,103 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "name": "Funivia Pani d\"Erna", + "type": "lift" + }, + "geometry": { + "coordinates": [ + 9.428832133068624, + 45.86316915700536 + ], + "type": "Point" + } + }, + { + "type": "Feature", + "properties": { + "name": "Funicolare Como-Brunate", + "type": "railway" + }, + "geometry": { + "coordinates": [ + 9.082724408221196, + 45.8175517969448 + ], + "type": "Point" + }, + "id": 1 + }, + { + "type": "Feature", + "properties": { + "name": "Funivia Pigra Argegno", + "type": "lift" + }, + "geometry": { + "coordinates": [ + 9.129994484478942, + 45.94660892078414 + ], + "type": "Point" + } + }, + { + "type": "Feature", + "properties": { + "name": "Funicolare Sacro Monte", + "type": "railway" + }, + "geometry": { + "coordinates": [ + 8.787919643563527, + 45.85848217923672 + ], + "type": "Point" + } + }, + { + "type": "Feature", + "properties": { + "name": "Funicolare Cassarate Monte Brè", + "type": "railway" + }, + "geometry": { + "coordinates": [ + 8.970232317680455, + 46.00646782864027 + ], + "type": "Point" + } + }, + { + "type": "Feature", + "properties": { + "name": "Funicolare Monte San Salvatore" + }, + "geometry": { + "coordinates": [ + 8.945347867434748, + 45.990386744943265 + ], + "type": "Point" + } + }, + { + "type": "Feature", + "properties": { + "name": "Funivia Monte Lema", + "type": "lift" + }, + "geometry": { + "coordinates": [ + 8.856229999561407, + 46.0237566800011 + ], + "type": "Point" + } + } + ] +} \ No newline at end of file diff --git a/docs/index.md b/docs/index.md index 64934965abb..2edef3d6523 100644 --- a/docs/index.md +++ b/docs/index.md @@ -94,6 +94,6 @@ Note too that if the CSS isn't available by the first render, as soon as the CSS MapLibre GL JS is also distributed via UNPKG. Our latest version can installed by adding below tags this in the html ``. Further instructions on how to select specific versions and semver ranges can be found on at [unpkg.com](https://unpkg.com). ```html - - + + ``` diff --git a/package-lock.json b/package-lock.json index 3399de363d6..4ee2612cb29 100644 --- a/package-lock.json +++ b/package-lock.json @@ -137,14 +137,14 @@ "url": "https://github.com/maplibre/maplibre-gl-js?sponsor=1" } }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } + "../maplbre-forks/maplibre-gl-style-spec": { + "extraneous": true + }, + "../maplibre-forks/maplibre-gl-style-spec": { + "extraneous": true + }, + "../tomtom-forks/maplibre-gl-style-spec": { + "extraneous": true }, "node_modules/@ampproject/remapping": { "version": "2.3.0", @@ -161,75 +161,34 @@ } }, "node_modules/@asamuzakjp/css-color": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-2.8.2.tgz", - "integrity": "sha512-RtWv9jFN2/bLExuZgFFZ0I3pWWeezAHGgrmjqGGWclATl1aDe3yhCUaI0Ilkp6OCk9zX7+FjvDasEX8Q9Rxc5w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.1.1.tgz", + "integrity": "sha512-hpRD68SV2OMcZCsrbdkccTw5FXjNDLo5OuqSHyHZfwweGsDWZwDJ2+gONyNAbazZclobMirACLw0lk8WVxIqxA==", "dev": true, + "license": "MIT", "dependencies": { - "@csstools/css-calc": "^2.1.1", - "@csstools/css-color-parser": "^3.0.7", + "@csstools/css-calc": "^2.1.2", + "@csstools/css-color-parser": "^3.0.8", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", - "lru-cache": "^11.0.2" - } - }, - "node_modules/@asamuzakjp/css-color/node_modules/lru-cache": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.2.tgz", - "integrity": "sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==", - "dev": true, - "engines": { - "node": "20 || >=22" + "lru-cache": "^10.4.3" } }, "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/helper-string-parser": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", @@ -250,63 +209,14 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/parser": { - "version": "7.26.1", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.1.tgz", - "integrity": "sha512-reoQYNiAJreZNsJzyrDNzFQ+IQ5JFiIzAHJg9bn94S3l+4++J7RsIhNMoB+lgP/9tpmiAQqspv+xfdxTSzREOw==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.10.tgz", + "integrity": "sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.26.0" + "@babel/types": "^7.26.10" }, "bin": { "parser": "bin/babel-parser.js" @@ -316,9 +226,9 @@ } }, "node_modules/@babel/types": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", - "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.10.tgz", + "integrity": "sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==", "dev": true, "license": "MIT", "dependencies": { @@ -929,6 +839,8 @@ }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dev": true, "license": "MIT", "dependencies": { @@ -940,6 +852,8 @@ }, "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dev": true, "license": "MIT", "dependencies": { @@ -948,9 +862,9 @@ } }, "node_modules/@csstools/color-helpers": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.1.tgz", - "integrity": "sha512-MKtmkA0BX87PKaO1NFRTFH+UnkgnmySQOvNxJubsadusqPEC2aJ9MOQiMceZJJ6oitUl/i0L6u0M1IrmAOmgBA==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.2.tgz", + "integrity": "sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==", "dev": true, "funding": [ { @@ -962,14 +876,15 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "engines": { "node": ">=18" } }, "node_modules/@csstools/css-calc": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.1.tgz", - "integrity": "sha512-rL7kaUnTkL9K+Cvo2pnCieqNpTKgQzy5f+N+5Iuko9HAoasP+xgprVh7KN/MaJVvVL1l0EzQq2MoqBHKSrDrag==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.2.tgz", + "integrity": "sha512-TklMyb3uBB28b5uQdxjReG4L80NxAqgrECqLZFQbyLekwwlcDDS8r3f07DKqeo8C4926Br0gf/ZDe17Zv4wIuw==", "dev": true, "funding": [ { @@ -981,6 +896,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT", "engines": { "node": ">=18" }, @@ -990,9 +906,9 @@ } }, "node_modules/@csstools/css-color-parser": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.7.tgz", - "integrity": "sha512-nkMp2mTICw32uE5NN+EsJ4f5N+IGFeCFu4bGpiKgb2Pq/7J/MpyLBeQ5ry4KKtRFZaYs6sTmcMYrSRIyj5DFKA==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.8.tgz", + "integrity": "sha512-pdwotQjCCnRPuNi06jFuP68cykU1f3ZWExLe/8MQ1LOs8Xq+fTkYgd+2V8mWUWMrOn9iS2HftPVaMZDaXzGbhQ==", "dev": true, "funding": [ { @@ -1004,9 +920,10 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT", "dependencies": { - "@csstools/color-helpers": "^5.0.1", - "@csstools/css-calc": "^2.1.1" + "@csstools/color-helpers": "^5.0.2", + "@csstools/css-calc": "^2.1.2" }, "engines": { "node": ">=18" @@ -1031,6 +948,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT", "engines": { "node": ">=18" }, @@ -1053,6 +971,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT", "engines": { "node": ">=18" } @@ -1072,6 +991,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT", "engines": { "node": ">=18" }, @@ -1080,20 +1000,44 @@ "@csstools/css-tokenizer": "^3.0.3" } }, + "node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, "node_modules/@dual-bundle/import-meta-resolve": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", "integrity": "sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==", "dev": true, + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/@emnapi/runtime": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.0.tgz", - "integrity": "sha512-64WYIf4UYcdLnbKn/umDlNjQDSS8AgZrI/R9+x5ilkUVFxXcA1Ebl+gQLc/6mERA4407Xof0R7wEyEuj091CVw==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.3.tgz", + "integrity": "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==", "dev": true, "license": "MIT", "optional": true, @@ -1109,6 +1053,7 @@ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "aix" @@ -1125,6 +1070,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -1141,6 +1087,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -1157,6 +1104,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -1173,6 +1121,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -1189,6 +1138,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -1205,6 +1155,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -1221,6 +1172,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -1237,6 +1189,7 @@ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -1253,6 +1206,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -1269,6 +1223,7 @@ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -1285,6 +1240,7 @@ "loong64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -1301,6 +1257,7 @@ "mips64el" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -1317,6 +1274,7 @@ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -1333,6 +1291,7 @@ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -1349,6 +1308,7 @@ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -1365,6 +1325,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -1381,6 +1342,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "netbsd" @@ -1397,6 +1359,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "netbsd" @@ -1413,6 +1376,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openbsd" @@ -1429,6 +1393,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openbsd" @@ -1445,6 +1410,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "sunos" @@ -1461,6 +1427,7 @@ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -1477,6 +1444,7 @@ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -1493,6 +1461,7 @@ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -1520,11 +1489,25 @@ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@eslint-community/regexpp": { "version": "4.12.1", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", "dev": true, + "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -1544,6 +1527,30 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/@eslint/config-helpers": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.1.tgz", @@ -1591,6 +1598,17 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/@eslint/eslintrc/node_modules/globals": { "version": "14.0.0", "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", @@ -1604,6 +1622,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/@eslint/js": { "version": "9.27.0", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.27.0.tgz", @@ -1660,6 +1691,7 @@ "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=18.18.0" } @@ -1669,6 +1701,7 @@ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.3.0" @@ -1682,6 +1715,7 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=18.18" }, @@ -1692,6 +1726,8 @@ }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -2118,6 +2154,7 @@ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dev": true, + "license": "ISC", "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -2130,138 +2167,117 @@ "node": ">=12" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=8" } }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, + "license": "MIT", "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" + "jest-get-type": "^29.6.3" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "@sinclair/typebox": "^0.27.8" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", + "node_modules/@jest/types/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "node_modules/@jest/types/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { - "jest-get-type": "^29.6.3" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "node_modules/@jest/types/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { - "@sinclair/typebox": "^0.27.8" + "color-name": "~1.1.4" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=7.0.0" } }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "node_modules/@jest/types/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } + "license": "MIT" }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "dev": true, "license": "MIT", "dependencies": { @@ -2274,10 +2290,11 @@ } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -2293,13 +2310,14 @@ } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz", - "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, "node_modules/@jridgewell/sourcemap-codec": { @@ -2330,33 +2348,10 @@ "buffer": "^6.0.3" } }, - "node_modules/@keyv/serialize/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, "node_modules/@mapbox/geojson-rewind": { "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@mapbox/geojson-rewind/-/geojson-rewind-0.5.2.tgz", + "integrity": "sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA==", "license": "ISC", "dependencies": { "get-stream": "^6.0.1", @@ -2368,6 +2363,8 @@ }, "node_modules/@mapbox/jsonlint-lines-primitives": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz", + "integrity": "sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==", "engines": { "node": ">= 0.6" } @@ -2376,10 +2373,13 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/@mapbox/mapbox-gl-rtl-text/-/mapbox-gl-rtl-text-0.3.0.tgz", "integrity": "sha512-OwQplFqAAEYRobrTKm2wiVP+wcpUVlgXXiUMNQ8tcm5gPN5SQRXFADmITdQOaec4LhDhuuFchS7TS8ua8dUl4w==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/@mapbox/mvt-fixtures": { "version": "3.10.0", + "resolved": "https://registry.npmjs.org/@mapbox/mvt-fixtures/-/mvt-fixtures-3.10.0.tgz", + "integrity": "sha512-HpObcr5eu7MOcxWqjj81fWjQ/VNUaAWKoK/rjxnd6NeEgN3uknrq6aGrkhC5vvZ20T2G6sWkikyITJ8mgPUa8g==", "dev": true, "license": "ISC", "dependencies": { @@ -2392,10 +2392,14 @@ }, "node_modules/@mapbox/point-geometry": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz", + "integrity": "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==", "license": "ISC" }, "node_modules/@mapbox/sphericalmercator": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@mapbox/sphericalmercator/-/sphericalmercator-1.2.0.tgz", + "integrity": "sha512-ZTOuuwGuMOJN+HEmG/68bSEw15HHaMWmQ5gdTsWdWsjDe56K1kGvLOK6bOSC8gWgIvEO0w6un/2Gvv1q5hJSkQ==", "dev": true, "bin": { "bbox": "bin/bbox.js", @@ -2407,14 +2411,19 @@ "node_modules/@mapbox/tiny-sdf": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-2.0.6.tgz", - "integrity": "sha512-qMqa27TLw+ZQz5Jk+RcwZGH7BQf5G/TrutJhspsca/3SHwmgKQ1iq+d3Jxz5oysPVYTGP6aXxCo5Lk9Er6YBAA==" + "integrity": "sha512-qMqa27TLw+ZQz5Jk+RcwZGH7BQf5G/TrutJhspsca/3SHwmgKQ1iq+d3Jxz5oysPVYTGP6aXxCo5Lk9Er6YBAA==", + "license": "BSD-2-Clause" }, "node_modules/@mapbox/unitbezier": { "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.1.tgz", + "integrity": "sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw==", "license": "BSD-2-Clause" }, "node_modules/@mapbox/vector-tile": { "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@mapbox/vector-tile/-/vector-tile-1.3.1.tgz", + "integrity": "sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==", "license": "BSD-3-Clause", "dependencies": { "@mapbox/point-geometry": "~0.1.0" @@ -2422,6 +2431,8 @@ }, "node_modules/@mapbox/whoots-js": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz", + "integrity": "sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==", "license": "ISC", "engines": { "node": ">=6.0.0" @@ -2451,13 +2462,15 @@ "version": "0.15.1", "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.15.1.tgz", "integrity": "sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@microsoft/tsdoc-config": { "version": "0.17.1", "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.17.1.tgz", "integrity": "sha512-UtjIFe0C6oYgTnad4q1QP4qXwLhe6tIpNTRStJ2RZEPIkqQPREAwE5spzVxsdn9UaEMUqhh0AqSx3X4nWAKXWw==", "dev": true, + "license": "MIT", "dependencies": { "@microsoft/tsdoc": "0.15.1", "ajv": "~8.12.0", @@ -2470,6 +2483,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -2485,10 +2499,13 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "license": "MIT", "dependencies": { @@ -2501,6 +2518,8 @@ }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, "license": "MIT", "engines": { @@ -2509,6 +2528,8 @@ }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "license": "MIT", "dependencies": { @@ -2521,6 +2542,8 @@ }, "node_modules/@pdf-lib/standard-fonts": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@pdf-lib/standard-fonts/-/standard-fonts-1.0.0.tgz", + "integrity": "sha512-hU30BK9IUN/su0Mn9VdlVKsWBS6GyhVfqjwl1FjZN4TxP6cCw0jP2w7V3Hf5uX7M0AZJ16vey9yE0ny7Sa59ZA==", "dev": true, "license": "MIT", "dependencies": { @@ -2529,6 +2552,8 @@ }, "node_modules/@pdf-lib/upng": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@pdf-lib/upng/-/upng-1.0.1.tgz", + "integrity": "sha512-dQK2FUMQtowVP00mtIksrlZhdFXQZPC+taih1q4CvPZ5vqdxR/LKBaFg0oAfzd1GlHZXXSPdQfzQnt+ViGvEIQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2540,6 +2565,7 @@ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">=14" @@ -2549,7 +2575,8 @@ "version": "1.0.0-next.29", "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@puppeteer/browsers": { "version": "2.10.5", @@ -2573,6 +2600,33 @@ "node": ">=18" } }, + "node_modules/@puppeteer/browsers/node_modules/tar-fs": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.8.tgz", + "integrity": "sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^4.0.1", + "bare-path": "^3.0.0" + } + }, + "node_modules/@puppeteer/browsers/node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, "node_modules/@rollup/plugin-commonjs": { "version": "28.0.3", "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-28.0.3.tgz", @@ -2605,6 +2659,7 @@ "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.1.0.tgz", "integrity": "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==", "dev": true, + "license": "MIT", "dependencies": { "@rollup/pluginutils": "^5.1.0" }, @@ -2650,6 +2705,7 @@ "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-6.0.2.tgz", "integrity": "sha512-7QaYCf8bqF04dOy7w/eHmJeNExxTYwvKAmlSAH/EaWWUzbT0h5sbF6bktFoX/0F/0qwng5/dWFMyf3gzaM8DsQ==", "dev": true, + "license": "MIT", "dependencies": { "@rollup/pluginutils": "^5.0.1", "magic-string": "^0.30.3" @@ -2671,6 +2727,7 @@ "resolved": "https://registry.npmjs.org/@rollup/plugin-strip/-/plugin-strip-3.0.4.tgz", "integrity": "sha512-LDRV49ZaavxUo2YoKKMQjCxzCxugu1rCPQa0lDYBOWLj6vtzBMr8DcoJjsmg+s450RbKbe3qI9ZLaSO+O1oNbg==", "dev": true, + "license": "MIT", "dependencies": { "@rollup/pluginutils": "^5.0.1", "estree-walker": "^2.0.2", @@ -2693,6 +2750,7 @@ "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz", "integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==", "dev": true, + "license": "MIT", "dependencies": { "serialize-javascript": "^6.0.1", "smob": "^1.0.0", @@ -2715,6 +2773,7 @@ "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-12.1.2.tgz", "integrity": "sha512-cdtSp154H5sv637uMr1a8OTWB0L1SWDSm1rDGiyfcGcvQ6cuTs4MDk2BVEBGysUWago4OJN4EQZqOTl/QY3Jgg==", "dev": true, + "license": "MIT", "dependencies": { "@rollup/pluginutils": "^5.1.0", "resolve": "^1.22.1" @@ -3043,7 +3102,8 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@shikijs/engine-oniguruma": { "version": "3.2.1", @@ -3100,11 +3160,32 @@ "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "dev": true }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "13.0.5", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz", + "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.1" + } + }, "node_modules/@sinonjs/text-encoding": { "version": "0.7.3", "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.3.tgz", "integrity": "sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA==", - "dev": true + "dev": true, + "license": "(Unlicense OR Apache-2.0)" }, "node_modules/@stylistic/eslint-plugin-ts": { "version": "4.2.0", @@ -3124,18 +3205,6 @@ "eslint": ">=9.0.0" } }, - "node_modules/@stylistic/eslint-plugin-ts/node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/@tootallnate/quickjs-emscripten": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", @@ -3154,22 +3223,30 @@ } }, "node_modules/@tsconfig/node10": { - "version": "1.0.8", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", "dev": true, "license": "MIT" }, "node_modules/@tsconfig/node12": { - "version": "1.0.9", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", "dev": true, "license": "MIT" }, "node_modules/@tsconfig/node14": { - "version": "1.0.1", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", "dev": true, "license": "MIT" }, "node_modules/@tsconfig/node16": { - "version": "1.0.2", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "dev": true, "license": "MIT" }, @@ -3177,10 +3254,13 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@types/benchmark/-/benchmark-2.1.5.tgz", "integrity": "sha512-cKio2eFB3v7qmKcvIHLUMw/dIx/8bhWPuzpzRT4unCPRTD8VdA9Zb0afxpcxOqR4PixRS7yT42FqGS8BYL8g1w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/caseless": { - "version": "0.12.2", + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.5.tgz", + "integrity": "sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==", "dev": true, "license": "MIT" }, @@ -3189,6 +3269,7 @@ "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", "dev": true, + "license": "MIT", "dependencies": { "@types/d3-array": "*", "@types/d3-axis": "*", @@ -3223,93 +3304,123 @@ } }, "node_modules/@types/d3-array": { - "version": "1.2.9", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", + "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==", "dev": true, "license": "MIT" }, "node_modules/@types/d3-axis": { - "version": "1.0.16", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", + "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", "dev": true, "license": "MIT", "dependencies": { - "@types/d3-selection": "^1" + "@types/d3-selection": "*" } }, "node_modules/@types/d3-brush": { - "version": "1.1.5", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", + "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", "dev": true, "license": "MIT", "dependencies": { - "@types/d3-selection": "^1" + "@types/d3-selection": "*" } }, "node_modules/@types/d3-chord": { - "version": "1.0.11", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", + "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", "dev": true, "license": "MIT" }, "node_modules/@types/d3-color": { - "version": "1.4.2", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", "dev": true, "license": "MIT" }, "node_modules/@types/d3-contour": { - "version": "1.3.3", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", + "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", "dev": true, "license": "MIT", "dependencies": { - "@types/d3-array": "^1", + "@types/d3-array": "*", "@types/geojson": "*" } }, "node_modules/@types/d3-delaunay": { - "version": "6.0.0", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", "dev": true, "license": "MIT" }, "node_modules/@types/d3-dispatch": { - "version": "1.0.9", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.6.tgz", + "integrity": "sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==", "dev": true, "license": "MIT" }, "node_modules/@types/d3-drag": { - "version": "1.2.5", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", "dev": true, "license": "MIT", "dependencies": { - "@types/d3-selection": "^1" + "@types/d3-selection": "*" } }, "node_modules/@types/d3-dsv": { - "version": "1.2.1", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", + "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", "dev": true, "license": "MIT" }, "node_modules/@types/d3-ease": { - "version": "1.0.11", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", "dev": true, "license": "MIT" }, "node_modules/@types/d3-fetch": { - "version": "1.2.2", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", + "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", "dev": true, "license": "MIT", "dependencies": { - "@types/d3-dsv": "^1" + "@types/d3-dsv": "*" } }, "node_modules/@types/d3-force": { - "version": "1.2.4", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", + "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", "dev": true, "license": "MIT" }, "node_modules/@types/d3-format": { - "version": "1.4.2", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", + "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", "dev": true, "license": "MIT" }, "node_modules/@types/d3-geo": { - "version": "1.12.3", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3317,94 +3428,124 @@ } }, "node_modules/@types/d3-hierarchy": { - "version": "1.1.8", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", + "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==", "dev": true, "license": "MIT" }, "node_modules/@types/d3-interpolate": { - "version": "1.4.2", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", "dev": true, "license": "MIT", "dependencies": { - "@types/d3-color": "^1" + "@types/d3-color": "*" } }, "node_modules/@types/d3-path": { - "version": "1.0.9", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", "dev": true, "license": "MIT" }, "node_modules/@types/d3-polygon": { - "version": "1.0.8", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", + "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", "dev": true, "license": "MIT" }, "node_modules/@types/d3-quadtree": { - "version": "1.0.9", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", + "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", "dev": true, "license": "MIT" }, "node_modules/@types/d3-random": { - "version": "1.1.3", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", + "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==", "dev": true, "license": "MIT" }, "node_modules/@types/d3-scale": { - "version": "2.2.6", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", "dev": true, "license": "MIT", "dependencies": { - "@types/d3-time": "^1" + "@types/d3-time": "*" } }, "node_modules/@types/d3-scale-chromatic": { - "version": "1.5.1", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", "dev": true, "license": "MIT" }, "node_modules/@types/d3-selection": { - "version": "1.4.3", + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", + "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", "dev": true, "license": "MIT" }, "node_modules/@types/d3-shape": { - "version": "1.3.8", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz", + "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==", "dev": true, "license": "MIT", "dependencies": { - "@types/d3-path": "^1" + "@types/d3-path": "*" } }, "node_modules/@types/d3-time": { - "version": "1.1.1", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", "dev": true, "license": "MIT" }, "node_modules/@types/d3-time-format": { - "version": "2.3.1", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", + "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", "dev": true, "license": "MIT" }, "node_modules/@types/d3-timer": { - "version": "1.0.10", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", "dev": true, "license": "MIT" }, "node_modules/@types/d3-transition": { - "version": "1.3.2", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", + "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", "dev": true, "license": "MIT", "dependencies": { - "@types/d3-selection": "^1" + "@types/d3-selection": "*" } }, "node_modules/@types/d3-zoom": { - "version": "1.8.3", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", "dev": true, "license": "MIT", "dependencies": { - "@types/d3-interpolate": "^1", - "@types/d3-selection": "^1" + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" } }, "node_modules/@types/diff": { @@ -3418,13 +3559,15 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/earcut/-/earcut-3.0.0.tgz", "integrity": "sha512-k/9fOUGO39yd2sCjrbAJvGDEQvRwRnQIZlBz43roGwUZo5SHAmyVvSFyaVVZkicRVCaDXPKlbxrUcBuJoSWunQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/eslint": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -3447,6 +3590,7 @@ "version": "3.2.5", "resolved": "https://registry.npmjs.org/@types/geojson-vt/-/geojson-vt-3.2.5.tgz", "integrity": "sha512-qDO7wqtprzlpe8FfQ//ClPV9xiuoh2nkIgiouIptON9w5jvD/fA4szvP9GBlDVdJ5dldAl0kX/sy3URbWwLx0g==", + "license": "MIT", "dependencies": { "@types/geojson": "*" } @@ -3455,13 +3599,15 @@ "version": "6.0.5", "resolved": "https://registry.npmjs.org/@types/gl/-/gl-6.0.5.tgz", "integrity": "sha512-+kb412tonLn0LS+is73RCw90qi8MGhmxMTGzJ6J3C0/7zoOMRipBXVtaw4AAf0m0gDIMpnJigXnw1gXomEVDUA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/glob": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/@types/glob/-/glob-8.1.0.tgz", "integrity": "sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==", "dev": true, + "license": "MIT", "dependencies": { "@types/minimatch": "^5.1.2", "@types/node": "*" @@ -3478,12 +3624,16 @@ } }, "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.3", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", "dev": true, "license": "MIT" }, "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "dev": true, "license": "MIT", "dependencies": { @@ -3491,7 +3641,9 @@ } }, "node_modules/@types/istanbul-reports": { - "version": "3.0.1", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3503,6 +3655,7 @@ "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-21.1.7.tgz", "integrity": "sha512-yOriVnggzrnQ3a9OKOCxaVuSug3w3/SbOj5i7VwXWZEyUNl3bLF9V3MfxGbZKuwqJOQyRfqXyROBB1CoZLFWzA==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "@types/tough-cookie": "*", @@ -3513,23 +3666,27 @@ "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/mapbox__point-geometry": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/@types/mapbox__point-geometry/-/mapbox__point-geometry-0.1.4.tgz", - "integrity": "sha512-mUWlSxAmYLfwnRBmgYV86tgYmMIICX4kza8YnE/eIlywGe2XoOxlpVnXWwir92xRLjwyarqwpu2EJKD2pk0IUA==" + "integrity": "sha512-mUWlSxAmYLfwnRBmgYV86tgYmMIICX4kza8YnE/eIlywGe2XoOxlpVnXWwir92xRLjwyarqwpu2EJKD2pk0IUA==", + "license": "MIT" }, "node_modules/@types/mapbox__vector-tile": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/@types/mapbox__vector-tile/-/mapbox__vector-tile-1.3.4.tgz", "integrity": "sha512-bpd8dRn9pr6xKvuEBQup8pwQfD4VUyqO/2deGjfpe6AwC8YRlyEipvefyRJUSiCJTZuCb8Pl1ciVV5ekqJ96Bg==", + "license": "MIT", "dependencies": { "@types/geojson": "*", "@types/mapbox__point-geometry": "*", @@ -3540,25 +3697,29 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/murmurhash-js": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@types/murmurhash-js/-/murmurhash-js-1.0.6.tgz", "integrity": "sha512-P2RRwRpevEKO0FrK5xNjxBywg0Br24tEv8K2+iWg56PtcCUNGAkaaOWKBQiUpofA8H/gmgdHXrcvSgp2uXCVAQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/nise": { "version": "1.4.5", "resolved": "https://registry.npmjs.org/@types/nise/-/nise-1.4.5.tgz", "integrity": "sha512-KNx8h0QdeA+BnH5E8rFPBznTGCl+aQwZ+45TaFWRavTULakVpwu6vis8IMVCGphgGCVtqWD1ne/vO1yOq1QJxg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/node": { "version": "22.15.19", @@ -3574,18 +3735,21 @@ "version": "2019.7.3", "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz", "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/pbf": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@types/pbf/-/pbf-3.0.5.tgz", - "integrity": "sha512-j3pOPiEcWZ34R6a6mN07mUkM4o4Lwf6hPNt8eilOeZhTFbxFXmKhvXl9Y28jotFPaI1bpPDJsbCprUoNke6OrA==" + "integrity": "sha512-j3pOPiEcWZ34R6a6mN07mUkM4o4Lwf6hPNt8eilOeZhTFbxFXmKhvXl9Y28jotFPaI1bpPDJsbCprUoNke6OrA==", + "license": "MIT" }, "node_modules/@types/pixelmatch": { "version": "5.2.6", "resolved": "https://registry.npmjs.org/@types/pixelmatch/-/pixelmatch-5.2.6.tgz", "integrity": "sha512-wC83uexE5KGuUODn6zkm9gMzTwdY5L0chiK+VrKcDfEjzxh1uadlWTvOmAbCpnM9zx/Ww3f8uKlYQVnO/TrqVg==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -3595,6 +3759,7 @@ "resolved": "https://registry.npmjs.org/@types/pngjs/-/pngjs-6.0.5.tgz", "integrity": "sha512-0k5eKfrA83JOZPppLtS2C7OUtyNAl2wKNxfyYl9Q5g9lPkgBl/9hNyAu6HuEH2J4XmIv2znEpkDd0SaZVxW6iQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -3624,6 +3789,7 @@ "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.12.tgz", "integrity": "sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw==", "dev": true, + "license": "MIT", "dependencies": { "@types/caseless": "*", "@types/node": "*", @@ -3633,6 +3799,8 @@ }, "node_modules/@types/resolve": { "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", "dev": true, "license": "MIT" }, @@ -3640,10 +3808,13 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/@types/shuffle-seed/-/shuffle-seed-1.1.3.tgz", "integrity": "sha512-D05NnrEz9YvwCp8GSzyI/UipvOtmiMbEtLgupa5buU6QJkmelKb7Pwuslsb8C7c+Wkn3qiAAL329+/E2PfUd0A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/stack-utils": { - "version": "2.0.1", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", "dev": true, "license": "MIT" }, @@ -3651,12 +3822,15 @@ "version": "7.1.3", "resolved": "https://registry.npmjs.org/@types/supercluster/-/supercluster-7.1.3.tgz", "integrity": "sha512-Z0pOY34GDFl3Q6hUFYf3HkTwKEE02e7QgtJppBt+beEAxnyOpJua+voGFvxINBHa06GwLFFym7gRPY2SiKIfIA==", + "license": "MIT", "dependencies": { "@types/geojson": "*" } }, "node_modules/@types/tough-cookie": { - "version": "4.0.1", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", "dev": true, "license": "MIT" }, @@ -3672,12 +3846,15 @@ "resolved": "https://registry.npmjs.org/@types/window-or-global/-/window-or-global-1.0.6.tgz", "integrity": "sha512-Or0OTbvpUvx0qMHN3C2GZH0neJ5tmT4ST/LVej1iHcLltEaGaS6J1CvPPer83BgRCxTVX6NZDVlDinZdg9IbwQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/yargs": { - "version": "17.0.11", + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "dev": true, "license": "MIT", "dependencies": { @@ -3685,7 +3862,9 @@ } }, "node_modules/@types/yargs-parser": { - "version": "21.0.0", + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "dev": true, "license": "MIT" }, @@ -3820,19 +3999,6 @@ "typescript": ">=4.8.4 <5.9.0" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/ts-api-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", - "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.12" - }, - "peerDependencies": { - "typescript": ">=4.8.4" - } - }, "node_modules/@typescript-eslint/types": { "version": "8.32.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.32.1.tgz", @@ -3874,45 +4040,6 @@ "typescript": ">=4.8.4 <5.9.0" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/ts-api-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", - "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.12" - }, - "peerDependencies": { - "typescript": ">=4.8.4" - } - }, "node_modules/@typescript-eslint/utils": { "version": "8.32.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.32.1.tgz", @@ -3955,24 +4082,12 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/@vitest/coverage-v8": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.1.3.tgz", "integrity": "sha512-cj76U5gXCl3g88KSnf80kof6+6w+K4BjOflCl7t6yRJPDuCrHtVu0SgNYOUARJOL5TI8RScDbm5x4s1/P9bvpw==", "dev": true, + "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.3.0", "@bcoe/v8-coverage": "^1.0.2", @@ -4000,138 +4115,12 @@ } } }, - "node_modules/@vitest/coverage-v8/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@vitest/coverage-v8/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@vitest/coverage-v8/node_modules/istanbul-lib-source-maps": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", - "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.23", - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@vitest/coverage-v8/node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/@vitest/coverage-v8/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/@vitest/coverage-v8/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@vitest/coverage-v8/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/@vitest/coverage-v8/node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@vitest/coverage-v8/node_modules/test-exclude": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", - "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==", - "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^10.4.1", - "minimatch": "^9.0.4" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/@vitest/expect": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.1.3.tgz", "integrity": "sha512-7FTQQuuLKmN1Ig/h+h/GO+44Q1IlglPlR2es4ab7Yvfx+Uk5xsv+Ykk+MEt/M2Yn/xGmzaLKxGw2lgy2bwuYqg==", "dev": true, + "license": "MIT", "dependencies": { "@vitest/spy": "3.1.3", "@vitest/utils": "3.1.3", @@ -4147,6 +4136,7 @@ "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.1.3.tgz", "integrity": "sha512-PJbLjonJK82uCWHjzgBJZuR7zmAOrSvKk1QBxrennDIgtH4uK0TB1PvYmc0XBCigxxtiAVPfWtAdy4lpz8SQGQ==", "dev": true, + "license": "MIT", "dependencies": { "@vitest/spy": "3.1.3", "estree-walker": "^3.0.3", @@ -4173,6 +4163,7 @@ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" } @@ -4182,6 +4173,7 @@ "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.1.3.tgz", "integrity": "sha512-i6FDiBeJUGLDKADw2Gb01UtUNb12yyXAqC/mmRWuYl+m/U9GS7s8us5ONmGkGpUUo7/iAYzI2ePVfOZTYvUifA==", "dev": true, + "license": "MIT", "dependencies": { "tinyrainbow": "^2.0.0" }, @@ -4194,6 +4186,7 @@ "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.1.3.tgz", "integrity": "sha512-Tae+ogtlNfFei5DggOsSUvkIaSuVywujMj6HzR97AHK6XK8i3BuVyIifWAm/sE3a15lF5RH9yQIrbXYuo0IFyA==", "dev": true, + "license": "MIT", "dependencies": { "@vitest/utils": "3.1.3", "pathe": "^2.0.3" @@ -4207,6 +4200,7 @@ "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.1.3.tgz", "integrity": "sha512-XVa5OPNTYUsyqG9skuUkFzAeFnEzDp8hQu7kZ0N25B1+6KjGm4hWLtURyBbsIAOekfWQ7Wuz/N/XXzgYO3deWQ==", "dev": true, + "license": "MIT", "dependencies": { "@vitest/pretty-format": "3.1.3", "magic-string": "^0.30.17", @@ -4221,6 +4215,7 @@ "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.1.3.tgz", "integrity": "sha512-x6w+ctOEmEXdWaa6TO4ilb7l9DxPR5bwEb6hILKuxfU1NqWT2mpJD9NJN7t3OTfxmVlOMrvtoFJGdgyzZ605lQ==", "dev": true, + "license": "MIT", "dependencies": { "tinyspy": "^3.0.2" }, @@ -4233,6 +4228,7 @@ "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-3.1.3.tgz", "integrity": "sha512-IipSzX+8DptUdXN/GWq3hq5z18MwnpphYdOMm0WndkRGYELzfq7NDP8dMpZT7JGW1uXFrIGxOW2D0Xi++ulByg==", "dev": true, + "license": "MIT", "dependencies": { "@vitest/utils": "3.1.3", "fflate": "^0.8.2", @@ -4254,6 +4250,7 @@ "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.1.3.tgz", "integrity": "sha512-2Ltrpht4OmHO9+c/nmHtF09HWiyWdworqnHIwjfvDyWjuwKbdkcS9AnhsDn+8E2RM4x++foD1/tNuLPVvWG1Rg==", "dev": true, + "license": "MIT", "dependencies": { "@vitest/pretty-format": "3.1.3", "loupe": "^3.1.3", @@ -4281,6 +4278,7 @@ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, + "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -4303,6 +4301,7 @@ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", "dev": true, + "license": "MIT", "dependencies": { "acorn": "^8.11.0" }, @@ -4315,6 +4314,7 @@ "resolved": "https://registry.npmjs.org/address/-/address-2.0.3.tgz", "integrity": "sha512-XNAb/a6TCqou+TufU8/u11HCu9x1gYvOoxLwtlXgIqmkrYQADVv6ljyW2zwiPhHz9R1gItAWpuDrdJMmrOBFEA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 16.0.0" } @@ -4324,6 +4324,7 @@ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 14" } @@ -4345,8 +4346,23 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, "node_modules/ansi-styles": { "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "license": "MIT", "dependencies": { @@ -4357,7 +4373,9 @@ } }, "node_modules/anymatch": { - "version": "3.1.2", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "license": "ISC", "dependencies": { @@ -4373,6 +4391,7 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -4382,6 +4401,8 @@ }, "node_modules/arg": { "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "dev": true, "license": "MIT" }, @@ -4397,6 +4418,7 @@ "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "is-array-buffer": "^3.0.5" @@ -4413,6 +4435,7 @@ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -4437,6 +4460,8 @@ }, "node_modules/array-union": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, "license": "MIT", "engines": { @@ -4448,6 +4473,7 @@ "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -4464,17 +4490,19 @@ } }, "node_modules/array.prototype.findlastindex": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", - "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -4484,15 +4512,16 @@ } }, "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -4506,6 +4535,7 @@ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", @@ -4524,6 +4554,7 @@ "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -4540,6 +4571,7 @@ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", "dev": true, + "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.8", @@ -4561,6 +4593,7 @@ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" } @@ -4583,17 +4616,23 @@ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/async": { - "version": "3.2.3", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", "dev": true, "license": "MIT" }, "node_modules/async-cache": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/async-cache/-/async-cache-1.1.0.tgz", + "integrity": "sha512-YDQc4vBn5NFhY6g6HhVshyi3Fy9+SQ5ePnE7JLDJn1DoL+i7ER+vMwtTNOYk9leZkYMnOwpBCWqyLDPw8Aig8g==", + "deprecated": "No longer maintained. Use [lru-cache](http://npm.im/lru-cache) version 7.6 or higher, and provide an asynchronous `fetchMethod` option.", "dev": true, "license": "ISC", "dependencies": { @@ -4602,6 +4641,8 @@ }, "node_modules/async-cache/node_modules/lru-cache": { "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "dev": true, "license": "ISC", "dependencies": { @@ -4609,13 +4650,20 @@ "yallist": "^2.1.2" } }, - "node_modules/async-cache/node_modules/yallist": { - "version": "2.1.2", + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", "dev": true, - "license": "ISC" + "license": "MIT", + "engines": { + "node": ">= 0.4" + } }, "node_modules/asynckit": { "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true, "license": "MIT" }, @@ -4662,6 +4710,7 @@ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, + "license": "MIT", "dependencies": { "possible-typed-array-names": "^1.0.0" }, @@ -4681,6 +4730,8 @@ }, "node_modules/balanced-match": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, "license": "MIT" }, @@ -4763,6 +4814,8 @@ }, "node_modules/base64-js": { "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "dev": true, "funding": [ { @@ -4792,6 +4845,8 @@ }, "node_modules/benchmark": { "version": "2.1.4", + "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz", + "integrity": "sha512-l9MlfN4M1K/H2fbhfMy3B7vJd6AGKJVQn2h6Sg/Yx+KckoUA7ewS5Vv6TjSq18ooE1kS9hhAlQRH3AkXIh/aOQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4800,36 +4855,45 @@ } }, "node_modules/binary-extensions": { - "version": "2.2.0", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true, "license": "MIT", "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", + "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", "dev": true, + "license": "MIT", "dependencies": { - "buffer": "^5.5.0", + "buffer": "^6.0.3", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, "node_modules/boolbase": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "dev": true, "license": "ISC" }, "node_modules/brace-expansion": { - "version": "1.1.11", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^1.0.0" } }, "node_modules/braces": { @@ -4837,6 +4901,7 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, + "license": "MIT", "dependencies": { "fill-range": "^7.1.1" }, @@ -4879,6 +4944,8 @@ }, "node_modules/btoa": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz", + "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==", "dev": true, "license": "(MIT OR Apache-2.0)", "bin": { @@ -4889,9 +4956,9 @@ } }, "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "dev": true, "funding": [ { @@ -4907,9 +4974,10 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "ieee754": "^1.2.1" } }, "node_modules/buffer-crc32": { @@ -4924,6 +4992,8 @@ }, "node_modules/buffer-from": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true, "license": "MIT" }, @@ -4945,6 +5015,7 @@ "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -4975,6 +5046,7 @@ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", "dev": true, + "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", @@ -5021,6 +5093,8 @@ }, "node_modules/callsites": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, "license": "MIT", "engines": { @@ -5081,6 +5155,7 @@ "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.0.tgz", "integrity": "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==", "dev": true, + "license": "MIT", "dependencies": { "assertion-error": "^2.0.1", "check-error": "^2.1.1", @@ -5093,15 +5168,13 @@ } }, "node_modules/chalk": { - "version": "4.1.2", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", "dev": true, "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { - "node": ">=10" + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" @@ -5112,6 +5185,7 @@ "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-1.1.0.tgz", "integrity": "sha512-T2VJbcDuZQ0Tb2EWwSotMPJjgpy1/tGee1BTpUNsGZ/qgNjV2t7Mvu+d4600U564nbLesN1x2dPL+xii174Ekg==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^5.2.0" }, @@ -5122,66 +5196,21 @@ "url": "https://github.com/chalk/chalk-template?sponsor=1" } }, - "node_modules/chalk-template/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chalk/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/chalk/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/chalk/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "license": "MIT" - }, "node_modules/check-error": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 16" } }, "node_modules/chokidar": { - "version": "3.5.3", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], "license": "MIT", "dependencies": { "anymatch": "~3.1.2", @@ -5195,15 +5224,32 @@ "engines": { "node": ">= 8.10.0" }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, "optionalDependencies": { "fsevents": "~2.3.2" } }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/chromium-bidi": { "version": "5.1.0", @@ -5220,9 +5266,20 @@ } }, "node_modules/ci-info": { - "version": "3.3.2", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "dev": true, - "license": "MIT" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } }, "node_modules/clear-module": { "version": "4.1.2", @@ -5241,24 +5298,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/clear-module/node_modules/parent-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-2.0.0.tgz", - "integrity": "sha512-uo0Z9JJeWzv8BG+tRcapBKNJ0dro9cLyczGzulS6EfeyAdeC9sbojtW6XwvYxJkEne9En+J2XEl4zyglVeIwFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "callsites": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, + "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -5268,20 +5313,65 @@ "node": ">=12" } }, - "node_modules/cliui/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/cliui/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/cliui/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, "node_modules/cliui/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -5291,11 +5381,43 @@ "node": ">=8" } }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/color": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1", "color-string": "^1.9.0" @@ -5306,6 +5428,8 @@ }, "node_modules/color-convert": { "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "license": "MIT", "dependencies": { @@ -5314,6 +5438,8 @@ }, "node_modules/color-name": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, "license": "MIT" }, @@ -5322,6 +5448,7 @@ "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" @@ -5332,6 +5459,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -5343,15 +5471,20 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/colord": { "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", "dev": true, "license": "MIT" }, "node_modules/combined-stream": { "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, "license": "MIT", "dependencies": { @@ -5362,11 +5495,13 @@ } }, "node_modules/commander": { - "version": "7.2.0", + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", + "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", "dev": true, "license": "MIT", "engines": { - "node": ">= 10" + "node": ">=18" } }, "node_modules/comment-json": { @@ -5388,11 +5523,15 @@ }, "node_modules/commondir": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", "dev": true, "license": "MIT" }, "node_modules/concat-map": { "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true, "license": "MIT" }, @@ -5400,15 +5539,15 @@ "version": "2.2.3", "resolved": "https://registry.npmjs.org/console-grid/-/console-grid-2.2.3.tgz", "integrity": "sha512-+mecFacaFxGl+1G31IsCx41taUXuW2FxX+4xIE0TIPhgML+Jb9JFcBWGhhWerd1/vhScubdmHqTwOhB0KCUUAg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/convert-source-map": { - "version": "1.8.0", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.1" - } + "license": "MIT" }, "node_modules/core-util-is": { "version": "1.0.3", @@ -5422,6 +5561,7 @@ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", "dev": true, + "license": "MIT", "dependencies": { "env-paths": "^2.2.1", "import-fresh": "^3.3.0", @@ -5443,61 +5583,36 @@ } } }, - "node_modules/cosmiconfig/node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "node_modules/cosmiconfig/node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, + "license": "MIT", "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, "node_modules/create-require": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true, "license": "MIT" }, "node_modules/cross-spawn": { - "version": "6.0.5", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "license": "MIT", "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": ">=4.8" - } - }, - "node_modules/cross-spawn/node_modules/semver": { - "version": "5.7.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/cross-spawn/node_modules/which": { - "version": "1.3.1", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" + "node": ">= 8" } }, "node_modules/cspell": { @@ -5666,19 +5781,6 @@ "node": ">=20" } }, - "node_modules/cspell-lib/node_modules/env-paths": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz", - "integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/cspell-trie-lib": { "version": "9.0.2", "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-9.0.2.tgz", @@ -5759,6 +5861,7 @@ "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz", "integrity": "sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==", "dev": true, + "license": "MIT", "engines": { "node": ">=12 || >=16" } @@ -5768,6 +5871,7 @@ "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", @@ -5780,13 +5884,13 @@ } }, "node_modules/css-tree": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", - "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", + "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", "dev": true, "license": "MIT", "dependencies": { - "mdn-data": "2.0.30", + "mdn-data": "2.12.2", "source-map-js": "^1.0.1" }, "engines": { @@ -5795,6 +5899,8 @@ }, "node_modules/css-what": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -5806,6 +5912,8 @@ }, "node_modules/cssesc": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true, "license": "MIT", "bin": { @@ -5817,6 +5925,8 @@ }, "node_modules/cssfontparser": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/cssfontparser/-/cssfontparser-1.2.1.tgz", + "integrity": "sha512-6tun4LoZnj7VN6YeegOVb67KBX/7JJsqvj+pv3ZA7F878/eN33AbGa5b/S/wXxS/tcp8nc40xRUrsPlxIyNUPg==", "dev": true, "license": "MIT" }, @@ -5936,12 +6046,13 @@ "license": "CC0-1.0" }, "node_modules/cssstyle": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.2.1.tgz", - "integrity": "sha512-9+vem03dMXG7gDmZ62uqmRiMRNtinIZ9ZyuF6BdxzfOD+FdN5hretzynkn0ReS2DO2GSw76RWHs0UmJPI2zUjw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.3.0.tgz", + "integrity": "sha512-6r0NiY0xizYqfBvWp1G7WXJ06/bZyrk7Dc6PHql82C/pKGUTKu4yAX4Y8JPamb1ob9nBKuxWzCGTRuGwU3yxJQ==", "dev": true, + "license": "MIT", "dependencies": { - "@asamuzakjp/css-color": "^2.8.2", + "@asamuzakjp/css-color": "^3.1.1", "rrweb-cssom": "^0.8.0" }, "engines": { @@ -5949,7 +6060,9 @@ } }, "node_modules/csstype": { - "version": "3.0.10", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", "dev": true, "license": "MIT" }, @@ -5958,6 +6071,7 @@ "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", "dev": true, + "license": "ISC", "dependencies": { "d3-array": "3", "d3-axis": "3", @@ -5995,7 +6109,9 @@ } }, "node_modules/d3-array": { - "version": "3.2.0", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", "dev": true, "license": "ISC", "dependencies": { @@ -6007,6 +6123,8 @@ }, "node_modules/d3-axis": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", "dev": true, "license": "ISC", "engines": { @@ -6015,6 +6133,8 @@ }, "node_modules/d3-brush": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", "dev": true, "license": "ISC", "dependencies": { @@ -6030,6 +6150,8 @@ }, "node_modules/d3-chord": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", "dev": true, "license": "ISC", "dependencies": { @@ -6041,6 +6163,8 @@ }, "node_modules/d3-color": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", "dev": true, "license": "ISC", "engines": { @@ -6048,7 +6172,9 @@ } }, "node_modules/d3-contour": { - "version": "4.0.0", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", "dev": true, "license": "ISC", "dependencies": { @@ -6059,7 +6185,9 @@ } }, "node_modules/d3-delaunay": { - "version": "6.0.2", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", "dev": true, "license": "ISC", "dependencies": { @@ -6071,6 +6199,8 @@ }, "node_modules/d3-dispatch": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", "dev": true, "license": "ISC", "engines": { @@ -6079,6 +6209,8 @@ }, "node_modules/d3-drag": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", "dev": true, "license": "ISC", "dependencies": { @@ -6091,6 +6223,8 @@ }, "node_modules/d3-dsv": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", "dev": true, "license": "ISC", "dependencies": { @@ -6113,8 +6247,20 @@ "node": ">=12" } }, + "node_modules/d3-dsv/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, "node_modules/d3-ease": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -6123,6 +6269,8 @@ }, "node_modules/d3-fetch": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", "dev": true, "license": "ISC", "dependencies": { @@ -6134,6 +6282,8 @@ }, "node_modules/d3-force": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", "dev": true, "license": "ISC", "dependencies": { @@ -6147,6 +6297,8 @@ }, "node_modules/d3-format": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", "dev": true, "license": "ISC", "engines": { @@ -6154,7 +6306,9 @@ } }, "node_modules/d3-geo": { - "version": "3.0.1", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", "dev": true, "license": "ISC", "dependencies": { @@ -6165,7 +6319,9 @@ } }, "node_modules/d3-hierarchy": { - "version": "3.1.1", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", "dev": true, "license": "ISC", "engines": { @@ -6174,6 +6330,8 @@ }, "node_modules/d3-interpolate": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", "dev": true, "license": "ISC", "dependencies": { @@ -6184,7 +6342,9 @@ } }, "node_modules/d3-path": { - "version": "3.0.1", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", "dev": true, "license": "ISC", "engines": { @@ -6193,6 +6353,8 @@ }, "node_modules/d3-polygon": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", "dev": true, "license": "ISC", "engines": { @@ -6201,6 +6363,8 @@ }, "node_modules/d3-quadtree": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", "dev": true, "license": "ISC", "engines": { @@ -6209,11 +6373,15 @@ }, "node_modules/d3-queue": { "version": "3.0.7", + "resolved": "https://registry.npmjs.org/d3-queue/-/d3-queue-3.0.7.tgz", + "integrity": "sha512-2rs+6pNFKkrJhqe1rg5znw7dKJ7KZr62j9aLZfhondkrnz6U7VRmJj1UGcbD8MRc46c7H8m4SWhab8EalBQrkw==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/d3-random": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", "dev": true, "license": "ISC", "engines": { @@ -6222,6 +6390,8 @@ }, "node_modules/d3-scale": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", "dev": true, "license": "ISC", "dependencies": { @@ -6236,7 +6406,9 @@ } }, "node_modules/d3-scale-chromatic": { - "version": "3.0.0", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", "dev": true, "license": "ISC", "dependencies": { @@ -6249,6 +6421,8 @@ }, "node_modules/d3-selection": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "dev": true, "license": "ISC", "engines": { @@ -6256,18 +6430,22 @@ } }, "node_modules/d3-shape": { - "version": "3.1.0", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", "dev": true, "license": "ISC", "dependencies": { - "d3-path": "1 - 3" + "d3-path": "^3.1.0" }, "engines": { "node": ">=12" } }, "node_modules/d3-time": { - "version": "3.0.0", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", "dev": true, "license": "ISC", "dependencies": { @@ -6279,6 +6457,8 @@ }, "node_modules/d3-time-format": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", "dev": true, "license": "ISC", "dependencies": { @@ -6290,6 +6470,8 @@ }, "node_modules/d3-timer": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", "dev": true, "license": "ISC", "engines": { @@ -6298,6 +6480,8 @@ }, "node_modules/d3-transition": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", "dev": true, "license": "ISC", "dependencies": { @@ -6316,6 +6500,8 @@ }, "node_modules/d3-zoom": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", "dev": true, "license": "ISC", "dependencies": { @@ -6339,11 +6525,26 @@ "node": ">= 14" } }, + "node_modules/data-urls": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/data-view-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", @@ -6361,6 +6562,7 @@ "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", @@ -6378,6 +6580,7 @@ "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -6415,11 +6618,28 @@ "dev": true, "license": "MIT" }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/deep-eql": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -6429,17 +6649,22 @@ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4.0.0" } }, "node_modules/deep-is": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true, "license": "MIT" }, "node_modules/deepmerge": { - "version": "4.2.2", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, "license": "MIT", "engines": { @@ -6451,6 +6676,7 @@ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -6468,6 +6694,7 @@ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, + "license": "MIT", "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", @@ -6496,15 +6723,19 @@ } }, "node_modules/delaunator": { - "version": "5.0.0", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", + "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", "dev": true, "license": "ISC", "dependencies": { - "robust-predicates": "^3.0.0" + "robust-predicates": "^3.0.2" } }, "node_modules/delayed-stream": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true, "license": "MIT", "engines": { @@ -6526,6 +6757,7 @@ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=8" } @@ -6552,12 +6784,15 @@ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, + "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/dir-glob": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, "license": "MIT", "dependencies": { @@ -6567,11 +6802,35 @@ "node": ">=8" } }, + "node_modules/dir-glob/node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/dom-serializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dev": true, + "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", @@ -6583,6 +6842,8 @@ }, "node_modules/domelementtype": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true, "funding": [ { @@ -6597,6 +6858,7 @@ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.3.0" }, @@ -6627,6 +6889,7 @@ "resolved": "https://registry.npmjs.org/dts-bundle-generator/-/dts-bundle-generator-9.5.1.tgz", "integrity": "sha512-DxpJOb2FNnEyOzMkG11sxO2dmxPjthoVWxfKqWYJ/bI/rT1rvTMktF5EKjAYrRZu6Z6t3NhOUZ0sZ5ZXevOfbA==", "dev": true, + "license": "MIT", "dependencies": { "typescript": ">=5.0.2", "yargs": "^17.6.0" @@ -6643,6 +6906,7 @@ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "dev": true, + "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", @@ -6654,31 +6918,37 @@ }, "node_modules/duplexer": { "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "dev": true, "license": "MIT" }, "node_modules/earcut": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/earcut/-/earcut-3.0.1.tgz", - "integrity": "sha512-0l1/0gOjESMeQyYaK5IDiPNvFeu93Z/cO0TjZh9eZ1vyCtZnA7KMZ8rQggpsJHIbGSdrqYq9OhuveadOVHCshw==" + "integrity": "sha512-0l1/0gOjESMeQyYaK5IDiPNvFeu93Z/cO0TjZh9eZ1vyCtZnA7KMZ8rQggpsJHIbGSdrqYq9OhuveadOVHCshw==", + "license": "ISC" }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/eight-colors": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/eight-colors/-/eight-colors-1.3.1.tgz", "integrity": "sha512-7nXPYDeKh6DgJDR/mpt2G7N/hCNSGwwoPVmoI3+4TEwOb07VFN1WMPG0DFf6nMEjrkgdj8Og7l7IaEEk3VE6Zg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/ejs": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "jake": "^10.8.5" }, @@ -6690,14 +6960,16 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.150", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.150.tgz", - "integrity": "sha512-rOOkP2ZUMx1yL4fCxXQKDHQ8ZXwisb2OycOQVKHgvB3ZI4CvehOd4y2tfnnLDieJ3Zs1RL1Dlp3cMkyIn7nnXA==", + "version": "1.5.151", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.151.tgz", + "integrity": "sha512-Rl6uugut2l9sLojjS4H4SAr3A4IgACMLgpuEMPYCVcKydzfyPrn5absNRju38IhQOf/NwjJY8OGWjlteqYeBCA==", "dev": true, "license": "ISC" }, "node_modules/emoji-regex": { - "version": "8.0.0", + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true, "license": "MIT" }, @@ -6706,6 +6978,7 @@ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, + "license": "MIT", "dependencies": { "once": "^1.4.0" } @@ -6715,6 +6988,7 @@ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.12" }, @@ -6723,16 +6997,22 @@ } }, "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz", + "integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==", "dev": true, + "license": "MIT", "engines": { - "node": ">=6" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/error-ex": { "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "license": "MIT", "dependencies": { @@ -6740,10 +7020,11 @@ } }, "node_modules/es-abstract": { - "version": "1.23.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.7.tgz", - "integrity": "sha512-OygGC8kIcDhXX+6yAZRGLqwi2CmEXCbLQixeGUgYeR+Qwlppqmo7DIDr8XibtEBZp+fJcoYpoatp5qwLMEdcqQ==", + "version": "1.23.9", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", + "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", "dev": true, + "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", @@ -6756,10 +7037,11 @@ "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", + "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", "function.prototype.name": "^1.1.8", - "get-intrinsic": "^1.2.6", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.0", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", @@ -6780,9 +7062,12 @@ "object-inspect": "^1.13.3", "object-keys": "^1.1.1", "object.assign": "^4.1.7", + "own-keys": "^1.0.1", "regexp.prototype.flags": "^1.5.3", "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", @@ -6805,6 +7090,7 @@ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -6814,6 +7100,7 @@ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -6823,6 +7110,7 @@ "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", @@ -6849,7 +7137,8 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/es-object-atoms": { "version": "1.1.1", @@ -6865,26 +7154,32 @@ } }, "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "dev": true, + "license": "MIT", "dependencies": { - "get-intrinsic": "^1.2.4", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", "dev": true, + "license": "MIT", "dependencies": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/es-to-primitive": { @@ -6892,6 +7187,7 @@ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", "dev": true, + "license": "MIT", "dependencies": { "is-callable": "^1.2.7", "is-date-object": "^1.0.5", @@ -6910,6 +7206,7 @@ "integrity": "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==", "dev": true, "hasInstallScript": true, + "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -6956,15 +7253,22 @@ }, "node_modules/escape-html": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "dev": true, "license": "MIT" }, "node_modules/escape-string-regexp": { - "version": "1.0.5", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.8.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/escodegen": { @@ -6989,17 +7293,6 @@ "source-map": "~0.6.1" } }, - "node_modules/escodegen/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/eslint": { "version": "9.27.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.27.0.tgz", @@ -7066,6 +7359,7 @@ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", @@ -7077,6 +7371,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.1" } @@ -7086,6 +7381,7 @@ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^3.2.7" }, @@ -7103,6 +7399,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.1" } @@ -7158,6 +7455,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", "dev": true, + "license": "MIT", "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.8", @@ -7186,24 +7484,38 @@ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, + "node_modules/eslint-plugin-import/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/eslint-plugin-import/node_modules/debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", + "node_modules/eslint-plugin-import/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "Apache-2.0", + "license": "ISC", "dependencies": { - "esutils": "^2.0.2" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=0.10.0" + "node": "*" } }, "node_modules/eslint-plugin-import/node_modules/semver": { @@ -7211,6 +7523,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -7248,22 +7561,36 @@ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", + "node_modules/eslint-plugin-react/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/eslint-plugin-react/node_modules/resolve": { + "node_modules/eslint-plugin-react/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { "version": "2.0.0-next.5", "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", "dev": true, + "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -7281,6 +7608,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -7290,6 +7618,7 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-tsdoc/-/eslint-plugin-tsdoc-0.4.0.tgz", "integrity": "sha512-MT/8b4aKLdDClnS8mP3R/JNjg29i0Oyqd/0ym6NnQf+gfKbJJ4ZcSh2Bs1H0YiUMTBwww5JwXGTWot/RwyJ7aQ==", "dev": true, + "license": "MIT", "dependencies": { "@microsoft/tsdoc": "0.15.1", "@microsoft/tsdoc-config": "0.17.1" @@ -7422,30 +7751,30 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/eslint-plugin-vitest/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "node_modules/eslint-plugin-vitest/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint-plugin-vitest/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "node_modules/eslint-plugin-vitest/node_modules/ts-api-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", + "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, + "license": "MIT", "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependencies": { + "typescript": ">=4.2.0" } }, "node_modules/eslint-scope": { @@ -7466,47 +7795,11 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -7514,88 +7807,108 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/find-up": { - "version": "5.0.0", + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=10" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/eslint/node_modules/locate-path": { - "version": "6.0.0", + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { - "p-locate": "^5.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/eslint/node_modules/p-locate": { - "version": "5.0.0", + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { - "p-limit": "^3.0.2" + "color-name": "~1.1.4" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=7.0.0" } }, - "node_modules/eslint/node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint/node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, "engines": { - "node": ">=8" + "node": ">=16.0.0" } }, - "node_modules/eslint/node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "node_modules/eslint/node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, + "license": "MIT", "dependencies": { - "shebang-regex": "^3.0.0" + "flatted": "^3.2.9", + "keyv": "^4.5.4" }, "engines": { - "node": ">=8" + "node": ">=16" } }, - "node_modules/eslint/node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, "engines": { - "node": ">=8" + "node": ">=10.13.0" } }, "node_modules/espree": { @@ -7603,6 +7916,7 @@ "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.14.0", "acorn-jsx": "^5.3.2", @@ -7615,20 +7929,10 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/esprima": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, "license": "BSD-2-Clause", "bin": { @@ -7640,10 +7944,11 @@ } }, "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -7666,6 +7971,8 @@ }, "node_modules/estraverse": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -7674,11 +7981,15 @@ }, "node_modules/estree-walker": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true, "license": "MIT" }, "node_modules/esutils": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -7690,6 +8001,7 @@ "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", "dev": true, + "license": "(MIT OR WTFPL)", "engines": { "node": ">=6" } @@ -7699,6 +8011,7 @@ "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, + "license": "MIT", "dependencies": { "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", @@ -7759,6 +8072,8 @@ }, "node_modules/fast-deep-equal": { "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true, "license": "MIT" }, @@ -7784,6 +8099,7 @@ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -7795,33 +8111,64 @@ "node": ">=8.6.0" } }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true, "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true, "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", - "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==", - "dev": true + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" }, "node_modules/fastest-levenshtein": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4.9.1" } }, "node_modules/fastq": { - "version": "1.13.0", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", "dev": true, "license": "ISC", "dependencies": { @@ -7830,6 +8177,8 @@ }, "node_modules/fd": { "version": "0.0.3", + "resolved": "https://registry.npmjs.org/fd/-/fd-0.0.3.tgz", + "integrity": "sha512-iAHrIslQb3U68OcMSP0kkNWabp7sSN6d2TBSb2JO3gcLJVDd4owr/hKM4SFJovFOUeeXeItjYgouEDTMWiVAnA==", "dev": true, "license": "MIT" }, @@ -7862,38 +8211,23 @@ "version": "0.8.2", "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", - "dev": true - }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } + "license": "MIT" }, "node_modules/filelist": { - "version": "1.0.3", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", "dev": true, "license": "Apache-2.0", "dependencies": { "minimatch": "^5.0.1" } }, - "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, "node_modules/filelist/node_modules/minimatch": { - "version": "5.0.1", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, "license": "ISC", "dependencies": { @@ -7908,6 +8242,7 @@ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -7915,32 +8250,44 @@ "node": ">=8" } }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "license": "MIT", "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">=16" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/flatted": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", "dev": true, + "license": "MIT", "dependencies": { - "is-callable": "^1.1.3" + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/foreground-child": { @@ -7960,74 +8307,18 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/foreground-child/node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "node_modules/form-data": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.3.tgz", + "integrity": "sha512-XHIrMD0NpDrNM/Ckf7XJiBbLl57KEhT3+i3yY+eWm+cqYZJQTZrKo8Y8AWKnuV5GT4scfuUGt9LzNoIx3dU1nQ==", "dev": true, "license": "MIT", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/foreground-child/node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/foreground-child/node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/foreground-child/node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.1.tgz", - "integrity": "sha512-uUWsN4aOxJAS8KOuf3QMyFtgm1pkb6I+KRZbRF/ghdf5T7sM+B1lLLzPDxswUjkmHyxQAVzEgG35E3NzDM9GVw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data": { - "version": "2.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "mime-types": "^2.1.35", + "safe-buffer": "^5.2.1" }, "engines": { "node": ">= 0.12" @@ -8038,6 +8329,7 @@ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", "dev": true, + "license": "MIT", "engines": { "node": "*" }, @@ -8050,13 +8342,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", + "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -8066,16 +8360,10 @@ "node": ">=14.14" } }, - "node_modules/fs-extra/node_modules/universalify": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/fs.realpath": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true, "license": "ISC" }, @@ -8099,6 +8387,7 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -8108,6 +8397,7 @@ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", @@ -8125,6 +8415,8 @@ }, "node_modules/functions-have-names": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, "license": "MIT", "funding": { @@ -8144,10 +8436,13 @@ "node_modules/geojson-vt": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/geojson-vt/-/geojson-vt-4.0.2.tgz", - "integrity": "sha512-AV9ROqlNqoZEIJGfm1ncNjEXfkz2hdFlZf0qkVfmkwdKa8vj7H16YUOT81rJw1rdFhyEDlN2Tds91p/glzbl5A==" + "integrity": "sha512-AV9ROqlNqoZEIJGfm1ncNjEXfkz2hdFlZf0qkVfmkwdKa8vj7H16YUOT81rJw1rdFhyEDlN2Tds91p/glzbl5A==", + "license": "ISC" }, "node_modules/get-caller-file": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, "license": "ISC", "engines": { @@ -8195,6 +8490,8 @@ }, "node_modules/get-stream": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "license": "MIT", "engines": { "node": ">=10" @@ -8208,6 +8505,7 @@ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", @@ -8239,10 +8537,13 @@ "version": "0.0.0", "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/gl-matrix": { "version": "3.4.3", + "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.3.tgz", + "integrity": "sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==", "license": "MIT" }, "node_modules/glob": { @@ -8270,23 +8571,16 @@ } }, "node_modules/glob-parent": { - "version": "5.1.2", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "license": "ISC", "dependencies": { - "is-glob": "^4.0.1" + "is-glob": "^4.0.3" }, "engines": { - "node": ">= 6" - } - }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" + "node": ">=10.13.0" } }, "node_modules/glob/node_modules/minimatch": { @@ -8294,6 +8588,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -8304,15 +8599,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/glob/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, "node_modules/global-directory": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", @@ -8329,21 +8615,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/global-directory/node_modules/ini": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", - "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "node_modules/global-modules": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", "dev": true, + "license": "MIT", "dependencies": { "global-prefix": "^3.0.0" }, @@ -8356,6 +8633,7 @@ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", "dev": true, + "license": "MIT", "dependencies": { "ini": "^1.3.5", "kind-of": "^6.0.2", @@ -8369,13 +8647,15 @@ "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/global-modules/node_modules/which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -8387,6 +8667,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-4.0.0.tgz", "integrity": "sha512-w0Uf9Y9/nyHinEk5vMJKRie+wa4kR5hmDbEhGGds/kG1PwGLLHKRoNMeJOyCQjjBkANlnScqgzcFwGHgmgLkVA==", + "license": "MIT", "dependencies": { "ini": "^4.1.3", "kind-of": "^6.0.3", @@ -8396,10 +8677,20 @@ "node": ">=16" } }, + "node_modules/global-prefix/node_modules/ini": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", + "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/global-prefix/node_modules/isexe": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "license": "ISC", "engines": { "node": ">=16" } @@ -8408,6 +8699,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "license": "ISC", "dependencies": { "isexe": "^3.1.1" }, @@ -8436,6 +8728,7 @@ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, + "license": "MIT", "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" @@ -8449,6 +8742,8 @@ }, "node_modules/globby": { "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "license": "MIT", "dependencies": { @@ -8470,13 +8765,15 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -8485,7 +8782,9 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.9", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true, "license": "ISC" }, @@ -8493,10 +8792,13 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/gzip-size": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", "dev": true, "license": "MIT", "dependencies": { @@ -8514,6 +8816,7 @@ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -8523,6 +8826,8 @@ }, "node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { @@ -8544,6 +8849,7 @@ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" }, @@ -8556,6 +8862,7 @@ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", "dev": true, + "license": "MIT", "dependencies": { "dunder-proto": "^1.0.0" }, @@ -8571,6 +8878,7 @@ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -8583,6 +8891,7 @@ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, + "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" }, @@ -8598,6 +8907,7 @@ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -8614,20 +8924,37 @@ }, "node_modules/hosted-git-info": { "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true, "license": "ISC" }, + "node_modules/html-encoding-sniffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^3.1.1" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/html-tags": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -8635,29 +8962,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/htmlparser2": { - "version": "8.0.1", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "entities": "^4.3.0" - } - }, "node_modules/http-proxy-agent": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, + "license": "MIT", "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -8671,6 +8981,7 @@ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dev": true, + "license": "MIT", "dependencies": { "agent-base": "^7.1.2", "debug": "4" @@ -8681,6 +8992,8 @@ }, "node_modules/iconv-lite": { "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, "license": "MIT", "dependencies": { @@ -8692,6 +9005,8 @@ }, "node_modules/ieee754": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "funding": [ { "type": "github", @@ -8713,6 +9028,7 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } @@ -8734,8 +9050,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/import-fresh/node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/import-fresh/node_modules/resolve-from": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, "license": "MIT", "engines": { @@ -8755,6 +9086,8 @@ }, "node_modules/imurmurhash": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "license": "MIT", "engines": { @@ -8763,6 +9096,9 @@ }, "node_modules/inflight": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, "license": "ISC", "dependencies": { @@ -8772,13 +9108,17 @@ }, "node_modules/inherits": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true, "license": "ISC" }, "node_modules/ini": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", - "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", + "dev": true, + "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -8788,6 +9128,7 @@ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", "dev": true, + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.2", @@ -8799,6 +9140,8 @@ }, "node_modules/internmap": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", "dev": true, "license": "ISC", "engines": { @@ -8824,6 +9167,7 @@ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", @@ -8838,16 +9182,23 @@ }, "node_modules/is-arrayish": { "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true, "license": "MIT" }, "node_modules/is-async-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", "dev": true, + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -8861,6 +9212,7 @@ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", "dev": true, + "license": "MIT", "dependencies": { "has-bigints": "^1.0.2" }, @@ -8873,6 +9225,8 @@ }, "node_modules/is-binary-path": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, "license": "MIT", "dependencies": { @@ -8883,12 +9237,13 @@ } }, "node_modules/is-boolean-object": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.1.tgz", - "integrity": "sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", "dev": true, + "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", + "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" }, "engines": { @@ -8919,6 +9274,7 @@ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -8927,10 +9283,11 @@ } }, "node_modules/is-core-module": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", - "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dev": true, + "license": "MIT", "dependencies": { "hasown": "^2.0.2" }, @@ -8946,6 +9303,7 @@ "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", @@ -8963,6 +9321,7 @@ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" @@ -8976,6 +9335,8 @@ }, "node_modules/is-docker": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true, "license": "MIT", "bin": { @@ -8990,6 +9351,8 @@ }, "node_modules/is-extglob": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "license": "MIT", "engines": { @@ -9001,6 +9364,7 @@ "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.3" }, @@ -9011,13 +9375,27 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", "dev": true, + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -9028,6 +9406,8 @@ }, "node_modules/is-glob": { "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "license": "MIT", "dependencies": { @@ -9042,6 +9422,7 @@ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -9051,6 +9432,8 @@ }, "node_modules/is-module": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", "dev": true, "license": "MIT" }, @@ -9059,6 +9442,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -9068,6 +9452,7 @@ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" @@ -9084,17 +9469,22 @@ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-potential-custom-element-name": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", "dev": true, "license": "MIT" }, "node_modules/is-reference": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9106,6 +9496,7 @@ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", @@ -9124,6 +9515,7 @@ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -9136,6 +9528,7 @@ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.3" }, @@ -9151,6 +9544,7 @@ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" @@ -9167,6 +9561,7 @@ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "has-symbols": "^1.1.0", @@ -9184,6 +9579,7 @@ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", "dev": true, + "license": "MIT", "dependencies": { "which-typed-array": "^1.1.16" }, @@ -9199,6 +9595,7 @@ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -9207,12 +9604,13 @@ } }, "node_modules/is-weakref": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.0.tgz", - "integrity": "sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", "dev": true, + "license": "MIT", "dependencies": { - "call-bound": "^1.0.2" + "call-bound": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -9226,6 +9624,7 @@ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" @@ -9239,6 +9638,8 @@ }, "node_modules/is-wsl": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, "license": "MIT", "dependencies": { @@ -9252,10 +9653,13 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true, "license": "ISC" }, @@ -9264,6 +9668,7 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=8" } @@ -9273,6 +9678,7 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^4.0.0", @@ -9282,19 +9688,19 @@ "node": ">=10" } }, - "node_modules/istanbul-lib-report/node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "node_modules/istanbul-lib-source-maps": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", + "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "semver": "^7.5.3" + "@jridgewell/trace-mapping": "^0.3.23", + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0" }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/istanbul-reports": { @@ -9302,6 +9708,7 @@ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -9311,16 +9718,17 @@ } }, "node_modules/iterator.prototype": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.4.tgz", - "integrity": "sha512-x4WH0BWmrMmg4oHHl+duwubhrvczGlyuGAZu3nvrf0UXOfPu8IhZObFEr7DE/iv01YgVZrsOiRcqw2srkKEDIA==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", "dev": true, + "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", "has-symbols": "^1.1.0", - "reflect.getprototypeof": "^1.0.8", "set-function-name": "^2.0.2" }, "engines": { @@ -9328,10 +9736,11 @@ } }, "node_modules/jackspeak": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.1.tgz", - "integrity": "sha512-cub8rahkh0Q/bw1+GxP7aeSe29hHHn2V4m29nnDlvCdlgU+3UGxkZp7Z53jLUdpX3jdTO0nJZUDl3xvbWc2Xog==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.0.tgz", + "integrity": "sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -9340,20 +9749,19 @@ }, "funding": { "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" } }, "node_modules/jake": { - "version": "10.8.5", + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", "dev": true, "license": "Apache-2.0", "dependencies": { "async": "^3.2.3", "chalk": "^4.0.2", - "filelist": "^1.0.1", - "minimatch": "^3.0.4" + "filelist": "^1.0.4", + "minimatch": "^3.1.2" }, "bin": { "jake": "bin/cli.js" @@ -9362,11 +9770,89 @@ "node": ">=10" } }, + "node_modules/jake/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jake/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/jake/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jake/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jake/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/jake/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/jest-diff": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", @@ -9377,11 +9863,65 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-diff/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-diff/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, "node_modules/jest-get-type": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, + "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -9391,6 +9931,7 @@ "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.0.0", "jest-diff": "^29.7.0", @@ -9401,11 +9942,65 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-matcher-utils/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, "node_modules/jest-message-util": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", @@ -9421,11 +10016,65 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-message-util/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-message-util/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, "node_modules/jest-util": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, + "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", @@ -9438,11 +10087,65 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-util/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-util/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, "node_modules/jest-util/node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -9454,10 +10157,13 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/js-tokens": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true, "license": "MIT" }, @@ -9521,86 +10227,24 @@ } } }, - "node_modules/jsdom/node_modules/data-urls": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", - "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", - "dev": true, - "dependencies": { - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/jsdom/node_modules/html-encoding-sniffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", - "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", - "dev": true, - "dependencies": { - "whatwg-encoding": "^3.1.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/jsdom/node_modules/w3c-xmlserializer": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", - "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", - "dev": true, - "dependencies": { - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/jsdom/node_modules/whatwg-encoding": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", - "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", - "dev": true, - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/jsdom/node_modules/whatwg-mimetype": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", - "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", - "dev": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/jsdom/node_modules/xml-name-validator": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", - "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", - "dev": true, - "engines": { - "node": ">=18" - } - }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-parse-better-errors": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true, "license": "MIT" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true, "license": "MIT" }, @@ -9613,16 +10257,34 @@ }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true, "license": "MIT" }, "node_modules/json-stringify-pretty-compact": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-4.0.0.tgz", - "integrity": "sha512-3CNZ2DnrpByG9Nqj6Xo8vqbjT4F6N+tb4Gb28ESAZjYZ5yqvmc56J+/kuIwkaAMOyblTQhUW7PxMkUb8Q36N3Q==" + "integrity": "sha512-3CNZ2DnrpByG9Nqj6Xo8vqbjT4F6N+tb4Gb28ESAZjYZ5yqvmc56J+/kuIwkaAMOyblTQhUW7PxMkUb8Q36N3Q==", + "license": "MIT" + }, + "node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } }, "node_modules/jsonfile": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9632,21 +10294,17 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/jsonfile/node_modules/universalify": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/jsx-ast-utils": { - "version": "3.2.1", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", "dev": true, "license": "MIT", "dependencies": { - "array-includes": "^3.1.3", - "object.assign": "^4.1.2" + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" }, "engines": { "node": ">=4.0" @@ -9657,6 +10315,7 @@ "resolved": "https://registry.npmjs.org/junit-report-builder/-/junit-report-builder-5.1.1.tgz", "integrity": "sha512-ZNOIIGMzqCGcHQEA2Q4rIQQ3Df6gSIfne+X9Rly9Bc2y55KxAZu8iGv+n2pP0bLf0XAOctJZgeloC54hWzCahQ==", "dev": true, + "license": "MIT", "dependencies": { "lodash": "^4.17.21", "make-dir": "^3.1.0", @@ -9666,28 +10325,59 @@ "node": ">=16" } }, + "node_modules/junit-report-builder/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/junit-report-builder/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/just-extend": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-6.2.0.tgz", "integrity": "sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/kdbush": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-4.0.2.tgz", - "integrity": "sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA==" + "integrity": "sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA==", + "license": "ISC" }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, + "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } }, "node_modules/kind-of": { "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -9705,6 +10395,7 @@ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -9727,7 +10418,9 @@ } }, "node_modules/lines-and-columns": { - "version": "1.1.6", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true, "license": "MIT" }, @@ -9736,12 +10429,15 @@ "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", "dev": true, + "license": "MIT", "dependencies": { "uc.micro": "^2.0.0" } }, "node_modules/load-json-file": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", "dev": true, "license": "MIT", "dependencies": { @@ -9754,28 +10450,40 @@ "node": ">=4" } }, - "node_modules/lodash": { - "version": "4.17.21", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.difference": { - "version": "4.5.0", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.forown": { - "version": "4.4.0", + "node_modules/load-json-file/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } }, - "node_modules/lodash.get": { - "version": "4.4.2", + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/lodash.groupby": { - "version": "4.6.0", + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true, "license": "MIT" }, @@ -9788,11 +10496,8 @@ }, "node_modules/lodash.merge": { "version": "4.6.2", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.sortby": { - "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true, "license": "MIT" }, @@ -9800,7 +10505,8 @@ "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.uniq": { "version": "4.5.0", @@ -9811,6 +10517,8 @@ }, "node_modules/loose-envify": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "dev": true, "license": "MIT", "dependencies": { @@ -9824,29 +10532,29 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } + "license": "ISC" }, "node_modules/lunr": { "version": "2.3.9", "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lz-utils": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/lz-utils/-/lz-utils-2.1.0.tgz", "integrity": "sha512-CMkfimAypidTtWjNDxY8a1bc1mJdyEh04V2FfEQ5Zh8Nx4v7k850EYa+dOWGn9hKG5xOyHP5MkuduAZCTHRvJw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/magic-string": { "version": "0.30.17", @@ -9871,29 +10579,25 @@ } }, "node_modules/make-dir": { - "version": "3.1.0", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "license": "MIT", "dependencies": { - "semver": "^6.0.0" + "semver": "^7.5.3" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/make-error": { "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true, "license": "ISC" }, @@ -9902,6 +10606,7 @@ "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^2.0.1", "entities": "^4.4.0", @@ -9919,6 +10624,7 @@ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -9928,15 +10634,16 @@ "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", "dev": true, + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/mdn-data": { - "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", + "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", "dev": true, "license": "CC0-1.0" }, @@ -9944,10 +10651,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/memorystream": { "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", "dev": true, "engines": { "node": ">= 0.10.0" @@ -9958,6 +10668,7 @@ "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -9967,6 +10678,8 @@ }, "node_modules/merge2": { "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, "license": "MIT", "engines": { @@ -9978,6 +10691,7 @@ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, + "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -9991,6 +10705,7 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -10000,6 +10715,8 @@ }, "node_modules/mime": { "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true, "license": "MIT", "bin": { @@ -10010,7 +10727,9 @@ } }, "node_modules/mime-db": { - "version": "1.51.0", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, "license": "MIT", "engines": { @@ -10018,35 +10737,66 @@ } }, "node_modules/mime-types": { - "version": "2.1.34", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "license": "MIT", "dependencies": { - "mime-db": "1.51.0" + "mime-db": "1.52.0" }, "engines": { "node": ">= 0.6" } }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/minimatch": { - "version": "3.1.2", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/minimist": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/mitt": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", @@ -10054,14 +10804,30 @@ "dev": true, "license": "MIT" }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, "node_modules/mkdirp-classic": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/mock-geolocation": { "version": "1.0.11", + "resolved": "https://registry.npmjs.org/mock-geolocation/-/mock-geolocation-1.0.11.tgz", + "integrity": "sha512-F/kvZfwuVnuPNHjHPuSVZlch8HnLwZgq7LVyp83PKSW3sXYm3tJhi/Z1gIHvnbY953YfAxiq5a7wFhgzX+qIkg==", "dev": true, "license": "MIT" }, @@ -10089,27 +10855,19 @@ "mcr": "lib/cli.js" } }, - "node_modules/monocart-coverage-reports/node_modules/commander": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", - "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, "node_modules/monocart-locator": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/monocart-locator/-/monocart-locator-1.0.2.tgz", "integrity": "sha512-v8W5hJLcWMIxLCcSi/MHh+VeefI+ycFmGz23Froer9QzWjrbg4J3gFJBuI/T1VLNoYxF47bVPPxq8ZlNX4gVCw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/mrmime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" } @@ -10118,16 +10876,19 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/murmurhash-js": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz", + "integrity": "sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==", "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", - "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.10.tgz", + "integrity": "sha512-vSJJTG+t/dIKAUhUDw/dLdZ9s//5OxcHqLaDWWrW4Cdq7o6tdLIczUkMXt2MBNmk6sJRZBZRXVixs7URY1CmIg==", "dev": true, "funding": [ { @@ -10135,6 +10896,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -10143,18 +10905,23 @@ } }, "node_modules/napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", + "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", + "dev": true, + "license": "MIT" }, "node_modules/natural-compare": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true, "license": "MIT" }, "node_modules/negotiator": { - "version": "0.6.3", + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", "dev": true, "license": "MIT", "engines": { @@ -10173,6 +10940,8 @@ }, "node_modules/nice-try": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true, "license": "MIT" }, @@ -10181,6 +10950,7 @@ "resolved": "https://registry.npmjs.org/nise/-/nise-6.1.1.tgz", "integrity": "sha512-aMSAzLVY7LyeM60gvBS423nBmIPP+Wy7St7hsb+8/fc1HmeoHJfLO8CKse4u3BtOZvQLJghYPI2i/1WZrEj5/g==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^3.0.1", "@sinonjs/fake-timers": "^13.0.1", @@ -10189,29 +10959,12 @@ "path-to-regexp": "^8.1.0" } }, - "node_modules/nise/node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/nise/node_modules/@sinonjs/fake-timers": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.1.tgz", - "integrity": "sha512-ZEbLYOvZQHccQJzbg2E5r+/Mdjb6BMdjToL4r8WwUw0VTjTnyY3gCnwLeiovcXI3/Uo25exmqmiwsjL/eE/rSg==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^3.0.1" - } - }, "node_modules/node-abi": { - "version": "3.71.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.71.0.tgz", - "integrity": "sha512-SZ40vRiy/+wRTf21hxkkEjPJZpARzUMVcJoQse2EF8qkUWbbO2z7vd5oA/H6bVH6SZQ5STGcu0KRDS7biNRfxw==", + "version": "3.74.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.74.0.tgz", + "integrity": "sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w==", "dev": true, + "license": "MIT", "dependencies": { "semver": "^7.3.5" }, @@ -10223,7 +10976,8 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/node-releases": { "version": "2.0.19", @@ -10234,6 +10988,8 @@ }, "node_modules/normalize-package-data": { "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -10244,7 +11000,9 @@ } }, "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.1", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "license": "ISC", "bin": { @@ -10253,6 +11011,8 @@ }, "node_modules/normalize-path": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, "license": "MIT", "engines": { @@ -10264,17 +11024,22 @@ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/npm-font-open-sans": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/npm-font-open-sans/-/npm-font-open-sans-1.1.0.tgz", + "integrity": "sha512-t1y5ShWm6a8FSLwBdINT47XYMcuKY2rkTBsTdz/76YB2MtX0YD89RUkY2eSS2/XOmlZfBe1HFBAwD+b9+/UfmQ==", "dev": true, "license": "Apache-2.0" }, "node_modules/npm-run-all": { "version": "4.1.5", + "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", + "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -10297,8 +11062,21 @@ "node": ">= 4" } }, + "node_modules/npm-run-all/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/npm-run-all/node_modules/chalk": { "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "license": "MIT", "dependencies": { @@ -10310,16 +11088,103 @@ "node": ">=4" } }, + "node_modules/npm-run-all/node_modules/cross-spawn": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/npm-run-all/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/npm-run-all/node_modules/has-flag": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/npm-run-all/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", "dev": true, "license": "MIT", "engines": { "node": ">=4" } }, + "node_modules/npm-run-all/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/npm-run-all/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-all/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/npm-run-all/node_modules/supports-color": { "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "license": "MIT", "dependencies": { @@ -10329,8 +11194,23 @@ "node": ">=4" } }, + "node_modules/npm-run-all/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, "node_modules/nth-check": { - "version": "2.0.1", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -10341,13 +11221,16 @@ } }, "node_modules/nwsapi": { - "version": "2.2.16", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.16.tgz", - "integrity": "sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==", - "dev": true + "version": "2.2.18", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.18.tgz", + "integrity": "sha512-p1TRH/edngVEHVbwqWnxUViEmq5znDvyB+Sik5cmuLpGOIfDf/39zLiq3swPF8Vakqn+gvNiOQAZu8djYlQILA==", + "dev": true, + "license": "MIT" }, "node_modules/object-assign": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true, "license": "MIT", "engines": { @@ -10355,10 +11238,11 @@ } }, "node_modules/object-inspect": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", - "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -10368,6 +11252,8 @@ }, "node_modules/object-keys": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, "license": "MIT", "engines": { @@ -10379,6 +11265,7 @@ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", @@ -10415,6 +11302,7 @@ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -10433,6 +11321,7 @@ "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -10447,6 +11336,7 @@ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", @@ -10462,6 +11352,8 @@ }, "node_modules/once": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, "license": "ISC", "dependencies": { @@ -10470,6 +11362,8 @@ }, "node_modules/open": { "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", "dev": true, "license": "MIT", "dependencies": { @@ -10484,20 +11378,39 @@ } }, "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, + "license": "MIT", "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/p-limit": { @@ -10505,6 +11418,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -10515,6 +11429,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/pac-proxy-agent": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", @@ -10550,25 +11480,30 @@ } }, "node_modules/package-json-from-dist": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", - "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", - "dev": true + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" }, "node_modules/pako": { "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", "dev": true, "license": "(MIT AND Zlib)" }, "node_modules/parent-module": { - "version": "1.0.1", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-2.0.0.tgz", + "integrity": "sha512-uo0Z9JJeWzv8BG+tRcapBKNJ0dro9cLyczGzulS6EfeyAdeC9sbojtW6XwvYxJkEne9En+J2XEl4zyglVeIwFg==", "dev": true, "license": "MIT", "dependencies": { - "callsites": "^3.0.0" + "callsites": "^3.1.0" }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/parse-color": { @@ -10588,15 +11523,22 @@ "dev": true }, "node_modules/parse-json": { - "version": "4.0.0", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "license": "MIT", "dependencies": { + "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/parse5": { @@ -10604,6 +11546,7 @@ "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", "dev": true, + "license": "MIT", "dependencies": { "entities": "^4.5.0" }, @@ -10613,6 +11556,8 @@ }, "node_modules/path-exists": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "license": "MIT", "engines": { @@ -10621,6 +11566,8 @@ }, "node_modules/path-is-absolute": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, "license": "MIT", "engines": { @@ -10628,15 +11575,19 @@ } }, "node_modules/path-key": { - "version": "2.0.1", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, "license": "MIT", "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/path-parse": { "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true, "license": "MIT" }, @@ -10645,6 +11596,7 @@ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" @@ -10657,51 +11609,51 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.0.tgz", - "integrity": "sha512-Qv32eSV1RSCfhY3fpPE2GNZ8jgM9X7rdAfemLWqTUxwiyIC4jJ6Sy0fZ8H+oLWevO6i4/bizg7c8d8i6bxrzbA==", + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.2.tgz", + "integrity": "sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==", "dev": true, + "license": "ISC", "engines": { "node": "20 || >=22" } }, - "node_modules/path-scurry/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, "node_modules/path-to-regexp": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.1.0.tgz", - "integrity": "sha512-Bqn3vc8CMHty6zuD+tG23s6v2kwxslHEhTj4eYaVKGIEB+YX/2wd0/rgXLFD9G9id9KCtbVy/3ZgmvZjpa0UdQ==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", + "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=16" } }, "node_modules/path-type": { - "version": "4.0.0", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, "license": "MIT", + "dependencies": { + "pify": "^3.0.0" + }, "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/pathe": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/pathval": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 14.16" } @@ -10710,6 +11662,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/pbf/-/pbf-3.3.0.tgz", "integrity": "sha512-XDF38WCH3z5OV/OVa8GKUNtLAyneuzbCisx7QUCF8Q6Nutx0WnJrQe5O+kOtBlLfRNUws98Y58Lblp+NJG5T4Q==", + "license": "BSD-3-Clause", "dependencies": { "ieee754": "^1.1.12", "resolve-protobuf-schema": "^2.1.0" @@ -10720,6 +11673,8 @@ }, "node_modules/pdf-lib": { "version": "1.17.1", + "resolved": "https://registry.npmjs.org/pdf-lib/-/pdf-lib-1.17.1.tgz", + "integrity": "sha512-V/mpyJAoTsN4cnP31vc0wfNA1+p20evqqnap0KLoRUN0Yk/p3wN52DOEsL4oBFcLdb76hlpKPtzJIgo67j/XLw==", "dev": true, "license": "MIT", "dependencies": { @@ -10733,13 +11688,15 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "dev": true, + "license": "0BSD" }, "node_modules/pdf-merger-js": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/pdf-merger-js/-/pdf-merger-js-5.1.2.tgz", "integrity": "sha512-RCBjLQILZ8UA4keO/Ip2/gjUuxigMMoK7mO5eJg6zjlnyymboFnRTgzKwOs/FiU9ornS2m72Qr95oARX1C24fw==", "dev": true, + "license": "MIT", "dependencies": { "commander": "^11.1.0", "pdf-lib": "^1.17.1" @@ -10756,6 +11713,7 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=16" } @@ -10771,13 +11729,15 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/picomatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -10787,6 +11747,8 @@ }, "node_modules/pidtree": { "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", + "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", "dev": true, "license": "MIT", "bin": { @@ -10820,6 +11782,8 @@ }, "node_modules/platform": { "version": "1.3.6", + "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", + "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==", "dev": true, "license": "MIT" }, @@ -10828,15 +11792,17 @@ "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz", "integrity": "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.19.0" } }, "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -11025,6 +11991,7 @@ "resolved": "https://registry.npmjs.org/postcss-inline-svg/-/postcss-inline-svg-6.0.0.tgz", "integrity": "sha512-ok5j0Iqsn8mS/5U1W+Im6qkQjm6nBxdwwJU+BSnBaDhLjC06h1xvy9MA+tefxhfZP/ARTRwARSozzYGf/sqEGg==", "dev": true, + "license": "MIT", "dependencies": { "css-select": "^5.1.0", "dom-serializer": "^2.0.0", @@ -11035,10 +12002,30 @@ "postcss": "^8.1.4" } }, + "node_modules/postcss-inline-svg/node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, "node_modules/postcss-load-config": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-5.0.2.tgz", - "integrity": "sha512-Q8QR3FYbqOKa0bnC1UQ2bFq9/ulHX5Bi34muzitMr8aDtUelO5xKeJEYC/5smE0jNE9zdB/NBnOwXKexELbRlw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-5.1.0.tgz", + "integrity": "sha512-G5AJ+IX0aD0dygOE0yFZQ/huFFMSNneyfp0e3/bT05a8OfPC5FUoZRPfGijUdGOJNMewJiwzcHJXFafFzeKFVA==", "dev": true, "funding": [ { @@ -11050,16 +12037,18 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "lilconfig": "^3.0.0", - "yaml": "^2.3.4" + "lilconfig": "^3.1.1", + "yaml": "^2.4.2" }, "engines": { "node": ">= 18" }, "peerDependencies": { "jiti": ">=1.21.0", - "postcss": ">=8.0.9" + "postcss": ">=8.0.9", + "tsx": "^4.8.1" }, "peerDependenciesMeta": { "jiti": { @@ -11067,6 +12056,9 @@ }, "postcss": { "optional": true + }, + "tsx": { + "optional": true } } }, @@ -11368,24 +12360,28 @@ } }, "node_modules/postcss-reporter": { - "version": "7.0.4", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.1.0.tgz", + "integrity": "sha512-/eoEylGWyy6/DOiMP5lmFRdmDKThqgn7D6hP2dXKJI/0rJSO1ADFNngZfDzxL0YAxFvws+Rtpuji1YIHj4mySA==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", "dependencies": { - "lodash.difference": "^4.5.0", - "lodash.forown": "^4.4.0", - "lodash.get": "^4.4.2", - "lodash.groupby": "^4.6.0", - "lodash.sortby": "^4.7.0", - "picocolors": "^1.0.0" + "picocolors": "^1.0.0", + "thenby": "^1.3.4" }, "engines": { "node": ">=10" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, "peerDependencies": { "postcss": "^8.1.0" } @@ -11394,7 +12390,8 @@ "version": "0.1.6", "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz", "integrity": "sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/postcss-safe-parser": { "version": "7.0.1", @@ -11415,6 +12412,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "engines": { "node": ">=18.0" }, @@ -11471,25 +12469,30 @@ }, "node_modules/postcss-value-parser": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true, "license": "MIT" }, "node_modules/potpack": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/potpack/-/potpack-2.0.0.tgz", + "integrity": "sha512-Q+/tYsFU9r7xoOJ+y/ZTtdVQwTWfzjbiXBDMM/JKUux3+QPP02iUuIoeBQ+Ot6oEDlC+/PGjB/5A3K7KKb7hcw==", "license": "ISC" }, "node_modules/prebuild-install": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", - "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", + "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", "dev": true, + "license": "MIT", "dependencies": { "detect-libc": "^2.0.0", "expand-template": "^2.0.3", "github-from-package": "0.0.0", "minimist": "^1.2.3", "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", + "napi-build-utils": "^2.0.0", "node-abi": "^3.3.0", "pump": "^3.0.0", "rc": "^1.2.7", @@ -11504,92 +12507,12 @@ "node": ">=10" } }, - "node_modules/prebuild-install/node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/prebuild-install/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/prebuild-install/node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/prebuild-install/node_modules/tar-fs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.2.tgz", - "integrity": "sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==", - "dev": true, - "license": "MIT", - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/prebuild-install/node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8.0" } @@ -11612,6 +12535,7 @@ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, + "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -11623,6 +12547,8 @@ }, "node_modules/pretty-format/node_modules/ansi-styles": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", "engines": { @@ -11634,6 +12560,8 @@ }, "node_modules/pretty-hrtime": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==", "dev": true, "license": "MIT", "engines": { @@ -11652,6 +12580,8 @@ }, "node_modules/prop-types": { "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "dev": true, "license": "MIT", "dependencies": { @@ -11662,11 +12592,15 @@ }, "node_modules/prop-types/node_modules/react-is": { "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "dev": true, "license": "MIT" }, "node_modules/protocol-buffers-schema": { "version": "3.6.0", + "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz", + "integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==", "license": "MIT" }, "node_modules/proxy-agent": { @@ -11689,6 +12623,16 @@ "node": ">= 14" } }, + "node_modules/proxy-agent/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -11698,6 +12642,8 @@ }, "node_modules/pseudomap": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", "dev": true, "license": "ISC" }, @@ -11706,6 +12652,7 @@ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", "dev": true, + "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -11716,6 +12663,7 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -11725,6 +12673,7 @@ "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -11785,6 +12734,8 @@ }, "node_modules/queue-microtask": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true, "funding": [ { @@ -11805,13 +12756,15 @@ "node_modules/quickselect": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-3.0.0.tgz", - "integrity": "sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g==" + "integrity": "sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g==", + "license": "ISC" }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "^5.1.0" } @@ -11821,6 +12774,7 @@ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -11835,13 +12789,15 @@ "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/rc/node_modules/strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -11870,12 +12826,16 @@ } }, "node_modules/react-is": { - "version": "18.2.0", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, "license": "MIT" }, "node_modules/read-cache": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", "dev": true, "license": "MIT", "dependencies": { @@ -11884,6 +12844,8 @@ }, "node_modules/read-cache/node_modules/pify": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true, "license": "MIT", "engines": { @@ -11892,6 +12854,8 @@ }, "node_modules/read-pkg": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", "dev": true, "license": "MIT", "dependencies": { @@ -11903,22 +12867,12 @@ "node": ">=4" } }, - "node_modules/read-pkg/node_modules/path-type": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -11930,6 +12884,8 @@ }, "node_modules/readdirp": { "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "license": "MIT", "dependencies": { @@ -11944,6 +12900,7 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -11952,18 +12909,19 @@ } }, "node_modules/reflect.getprototypeof": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.9.tgz", - "integrity": "sha512-r0Ay04Snci87djAsI4U+WNRcSw5S4pOH7qFjd/veA5gC7TbqESR3tcj28ia95L/fYUDw11JKP7uqUKUAfVvV5Q==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", - "dunder-proto": "^1.0.1", - "es-abstract": "^1.23.6", + "es-abstract": "^1.23.9", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "gopd": "^1.2.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", "which-builtin-type": "^1.2.1" }, "engines": { @@ -11974,14 +12932,17 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", - "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", "set-function-name": "^2.0.2" }, "engines": { @@ -12003,6 +12964,8 @@ }, "node_modules/require-directory": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, "license": "MIT", "engines": { @@ -12014,29 +12977,36 @@ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "dev": true, + "license": "MIT", "dependencies": { - "is-core-module": "^2.13.0", + "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/resolve-from": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "license": "MIT", "engines": { @@ -12045,13 +13015,17 @@ }, "node_modules/resolve-protobuf-schema": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz", + "integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==", "license": "MIT", "dependencies": { "protocol-buffers-schema": "^3.3.1" } }, "node_modules/reusify": { - "version": "1.0.4", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "dev": true, "license": "MIT", "engines": { @@ -12059,8 +13033,70 @@ "node": ">=0.10.0" } }, + "node_modules/rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/robust-predicates": { - "version": "3.0.1", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", + "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", "dev": true, "license": "Unlicense" }, @@ -12130,10 +13166,13 @@ "version": "0.8.0", "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/run-parallel": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, "funding": [ { @@ -12156,6 +13195,8 @@ }, "node_modules/rw": { "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", "license": "BSD-3-Clause" }, "node_modules/safe-array-concat": { @@ -12163,6 +13204,7 @@ "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", @@ -12178,15 +13220,49 @@ } }, "node_modules/safe-buffer": { - "version": "5.1.2", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT" }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safe-regex-test": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -12201,6 +13277,8 @@ }, "node_modules/safer-buffer": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true, "license": "MIT" }, @@ -12209,6 +13287,7 @@ "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", "dev": true, + "license": "ISC", "dependencies": { "xmlchars": "^2.2.0" }, @@ -12225,6 +13304,8 @@ }, "node_modules/seedrandom": { "version": "2.4.4", + "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-2.4.4.tgz", + "integrity": "sha512-9A+PDmgm+2du77B5i0Ip2cxOqqHjgNxnBgglxLcX78A2D6c2rTo61z4jnVABpF4cKeDMDG+cmXXvdnqse2VqMA==", "dev": true, "license": "MIT" }, @@ -12256,6 +13337,7 @@ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, + "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -12273,6 +13355,7 @@ "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, + "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -12283,6 +13366,21 @@ "node": ">= 0.4" } }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/sharp": { "version": "0.34.1", "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.1.tgz", @@ -12325,31 +13423,45 @@ } }, "node_modules/shebang-command": { - "version": "1.2.0", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "license": "MIT", "dependencies": { - "shebang-regex": "^1.0.0" + "shebang-regex": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/shebang-regex": { - "version": "1.0.0", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/shell-quote": { - "version": "1.7.3", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", + "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/shuffle-seed": { "version": "1.1.6", + "resolved": "https://registry.npmjs.org/shuffle-seed/-/shuffle-seed-1.1.6.tgz", + "integrity": "sha512-Vr9wlwMKJVUeFNGyc4aNbrzkI568gkve7ykyJ+1/cz78j3yRlJODWU0CuJ/fmk3MCjvAClpnqlycd/Y53UG3UA==", "dev": true, "license": "MIT", "dependencies": { @@ -12361,6 +13473,7 @@ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "dev": true, + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", @@ -12380,6 +13493,7 @@ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "dev": true, + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" @@ -12396,6 +13510,7 @@ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -12414,6 +13529,7 @@ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -12435,8 +13551,23 @@ "dev": true, "license": "ISC" }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/simple-concat": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", "dev": true, "funding": [ { @@ -12454,11 +13585,38 @@ ], "license": "MIT" }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, "node_modules/simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", "dev": true, + "license": "MIT", "dependencies": { "is-arrayish": "^0.3.1" } @@ -12467,13 +13625,15 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/sirv": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.1.tgz", "integrity": "sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==", "dev": true, + "license": "MIT", "dependencies": { "@polka/url": "^1.0.0-next.24", "mrmime": "^2.0.0", @@ -12485,6 +13645,8 @@ }, "node_modules/slash": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, "license": "MIT", "engines": { @@ -12496,6 +13658,7 @@ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", @@ -12513,6 +13676,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -12528,6 +13692,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -12539,16 +13704,8 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, - "engines": { - "node": ">=8" - } + "license": "MIT" }, "node_modules/smart-buffer": { "version": "4.2.0", @@ -12562,10 +13719,11 @@ } }, "node_modules/smob": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/smob/-/smob-1.1.1.tgz", - "integrity": "sha512-i5aqEBPnDv9d77+NDxfjROtywxzNdAVNyaOr+RsLhM28Ts+Ar7luIp/Q+SBYa6wv/7BBcOpEkrhtDxsl2WA9Jg==", - "dev": true + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/smob/-/smob-1.5.0.tgz", + "integrity": "sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==", + "dev": true, + "license": "MIT" }, "node_modules/socks": { "version": "2.8.4", @@ -12598,41 +13756,101 @@ } }, "node_modules/source-map": { - "version": "0.7.4", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "license": "BSD-3-Clause", "engines": { - "node": ">= 8" + "node": ">=0.10.0" } }, "node_modules/source-map-explorer": { "version": "2.5.3", + "resolved": "https://registry.npmjs.org/source-map-explorer/-/source-map-explorer-2.5.3.tgz", + "integrity": "sha512-qfUGs7UHsOBE5p/lGfQdaAj/5U/GWYBw2imEpD6UQNkqElYonkow8t+HBL1qqIl3CuGZx7n8/CQo4x1HwSHhsg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "btoa": "^1.2.1", - "chalk": "^4.1.0", - "convert-source-map": "^1.7.0", - "ejs": "^3.1.5", - "escape-html": "^1.0.3", - "glob": "^7.1.6", - "gzip-size": "^6.0.0", - "lodash": "^4.17.20", - "open": "^7.3.1", - "source-map": "^0.7.4", - "temp": "^0.9.4", - "yargs": "^16.2.0" - }, - "bin": { - "sme": "bin/cli.js", - "source-map-explorer": "bin/cli.js" + "btoa": "^1.2.1", + "chalk": "^4.1.0", + "convert-source-map": "^1.7.0", + "ejs": "^3.1.5", + "escape-html": "^1.0.3", + "glob": "^7.1.6", + "gzip-size": "^6.0.0", + "lodash": "^4.17.20", + "open": "^7.3.1", + "source-map": "^0.7.4", + "temp": "^0.9.4", + "yargs": "^16.2.0" + }, + "bin": { + "sme": "bin/cli.js", + "source-map-explorer": "bin/cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/source-map-explorer/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-explorer/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/source-map-explorer/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/source-map-explorer/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=12" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/source-map-explorer/node_modules/cliui": { "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "license": "ISC", "dependencies": { @@ -12641,8 +13859,38 @@ "wrap-ansi": "^7.0.0" } }, + "node_modules/source-map-explorer/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/source-map-explorer/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/source-map-explorer/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, "node_modules/source-map-explorer/node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", "dependencies": { @@ -12660,38 +13908,33 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/source-map-explorer/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map-explorer/node_modules/mkdirp": { - "version": "0.5.5", + "node_modules/source-map-explorer/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "minimist": "^1.2.5" + "brace-expansion": "^1.1.7" }, - "bin": { - "mkdirp": "bin/cmd.js" + "engines": { + "node": "*" } }, - "node_modules/source-map-explorer/node_modules/rimraf": { - "version": "2.6.3", + "node_modules/source-map-explorer/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" } }, "node_modules/source-map-explorer/node_modules/string-width": { "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", "dependencies": { @@ -12703,20 +13946,41 @@ "node": ">=8" } }, - "node_modules/source-map-explorer/node_modules/temp": { - "version": "0.9.4", + "node_modules/source-map-explorer/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { - "mkdirp": "^0.5.1", - "rimraf": "~2.6.2" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=6.0.0" + "node": ">=8" + } + }, + "node_modules/source-map-explorer/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/source-map-explorer/node_modules/yargs": { "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "license": "MIT", "dependencies": { @@ -12732,11 +13996,22 @@ "node": ">=10" } }, + "node_modules/source-map-explorer/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -12746,22 +14021,16 @@ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/spdx-correct": { - "version": "3.1.1", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -12770,12 +14039,16 @@ } }, "node_modules/spdx-exceptions": { - "version": "2.3.0", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", "dev": true, "license": "CC-BY-3.0" }, "node_modules/spdx-expression-parse": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, "license": "MIT", "dependencies": { @@ -12784,7 +14057,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.10", + "version": "3.0.21", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", + "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", "dev": true, "license": "CC0-1.0" }, @@ -12800,6 +14075,7 @@ "resolved": "https://registry.npmjs.org/st/-/st-3.0.1.tgz", "integrity": "sha512-dy3Ly4csMnzbQgYhxiYqENUNdjylIPl2aeEf7n+dI3eXnV2mvGWiX97zegVXa9qVAHvY8M9HWUXqpXcWwJ2fSA==", "dev": true, + "license": "ISC", "dependencies": { "async-cache": "^1.1.0", "bl": "^5.0.0", @@ -12814,41 +14090,10 @@ "graceful-fs": "^4.2.3" } }, - "node_modules/st/node_modules/bl": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer": "^6.0.3", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/st/node_modules/buffer": { - "version": "6.0.3", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, "node_modules/stack-utils": { - "version": "2.0.5", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12860,6 +14105,8 @@ }, "node_modules/stack-utils/node_modules/escape-string-regexp": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, "license": "MIT", "engines": { @@ -12896,30 +14143,31 @@ }, "node_modules/string_decoder": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" } }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.2.1", + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/string-width-cjs": { "name": "string-width", @@ -12927,6 +14175,7 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -12936,11 +14185,32 @@ "node": ">=8" } }, - "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, "engines": { "node": ">=8" } @@ -12950,6 +14220,7 @@ "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", @@ -12973,13 +14244,16 @@ } }, "node_modules/string.prototype.padend": { - "version": "3.1.3", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.6.tgz", + "integrity": "sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -12993,6 +14267,7 @@ "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", "dev": true, + "license": "MIT", "dependencies": { "define-properties": "^1.1.3", "es-abstract": "^1.17.5" @@ -13003,6 +14278,7 @@ "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", @@ -13024,6 +14300,7 @@ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", @@ -13042,6 +14319,7 @@ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -13055,14 +14333,19 @@ } }, "node_modules/strip-ansi": { - "version": "6.0.1", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/strip-ansi-cjs": { @@ -13071,6 +14354,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -13083,13 +14367,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -13097,6 +14374,8 @@ }, "node_modules/strip-bom": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, "license": "MIT", "engines": { @@ -13245,46 +14524,29 @@ "stylelint": "^16.18.0" } }, - "node_modules/stylelint/node_modules/@csstools/selector-specificity": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", - "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "node_modules/stylelint/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], + "license": "MIT", "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss-selector-parser": "^7.0.0" + "node": ">=8" } }, "node_modules/stylelint/node_modules/balanced-match": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", - "dev": true + "dev": true, + "license": "MIT" }, - "node_modules/stylelint/node_modules/css-tree": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", - "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", + "node_modules/stylelint/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, - "dependencies": { - "mdn-data": "2.12.2", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" - } + "license": "MIT" }, "node_modules/stylelint/node_modules/file-entry-cache": { "version": "10.0.8", @@ -13313,42 +14575,17 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.3.tgz", "integrity": "sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } }, - "node_modules/stylelint/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/stylelint/node_modules/mdn-data": { - "version": "2.12.2", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", - "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", - "dev": true - }, - "node_modules/stylelint/node_modules/signal-exit": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.1.tgz", - "integrity": "sha512-uUWsN4aOxJAS8KOuf3QMyFtgm1pkb6I+KRZbRF/ghdf5T7sM+B1lLLzPDxswUjkmHyxQAVzEgG35E3NzDM9GVw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/stylelint/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -13358,29 +14595,32 @@ "node": ">=8" } }, - "node_modules/stylelint/node_modules/write-file-atomic": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", - "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "node_modules/stylelint/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^4.0.1" + "ansi-regex": "^5.0.1" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=8" } }, "node_modules/supercluster": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-8.0.1.tgz", "integrity": "sha512-IiOea5kJ9iqzD2t7QJq/cREyLHTtSmUT6gQsweojg9WH2sYJqZK9SswTu6jrscO6D1G5v5vYZ9ru/eq85lXeZQ==", + "license": "ISC", "dependencies": { "kdbush": "^4.0.2" } }, "node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -13409,6 +14649,8 @@ }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, "license": "MIT", "engines": { @@ -13450,8 +14692,41 @@ "url": "https://opencollective.com/svgo" } }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/svgo/node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/svgo/node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "dev": true, + "license": "CC0-1.0" + }, "node_modules/symbol-tree": { "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true, "license": "MIT" }, @@ -13460,6 +14735,7 @@ "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "ajv": "^8.0.1", "lodash.truncate": "^4.4.2", @@ -13476,6 +14752,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -13487,26 +14764,36 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/table/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "node_modules/table/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/table/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, "node_modules/table/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/table/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -13516,41 +14803,109 @@ "node": ">=8" } }, + "node_modules/table/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/tar-fs": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.8.tgz", - "integrity": "sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.2.tgz", + "integrity": "sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==", "dev": true, "license": "MIT", "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", "pump": "^3.0.0", - "tar-stream": "^3.1.5" - }, - "optionalDependencies": { - "bare-fs": "^4.0.1", - "bare-path": "^3.0.0" + "tar-stream": "^2.1.4" } }, "node_modules/tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", "dev": true, "license": "MIT", "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/tar-stream/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/temp": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz", + "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mkdirp": "^0.5.1", + "rimraf": "~2.6.2" + }, + "engines": { + "node": ">=6.0.0" } }, "node_modules/terser": { - "version": "5.17.4", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.4.tgz", - "integrity": "sha512-jcEKZw6UPrgugz/0Tuk/PVyLAPfMBJf5clnGueo45wTweoV8yh7Q7PEkhkJ5uuUbC7zAxEcG3tqNr1bstkQ8nw==", + "version": "5.39.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.0.tgz", + "integrity": "sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -13565,7 +14920,77 @@ "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/test-exclude": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", + "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^10.4.1", + "minimatch": "^9.0.4" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/test-exclude/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/test-exclude/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, "node_modules/text-decoder": { "version": "1.2.3", @@ -13577,6 +15002,13 @@ "b4a": "^1.6.4" } }, + "node_modules/thenby": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/thenby/-/thenby-1.3.4.tgz", + "integrity": "sha512-89Gi5raiWA3QZ4b2ePcEwswC3me9JIg+ToSgtE0JWeCynLnLxNr/f9G+xfo9K+Oj4AFdom8YNJjibIARTJmapQ==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/tinybench": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", @@ -13621,7 +15053,8 @@ "node_modules/tinyqueue": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-3.0.0.tgz", - "integrity": "sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g==" + "integrity": "sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g==", + "license": "ISC" }, "node_modules/tinyrainbow": { "version": "2.0.0", @@ -13638,6 +15071,7 @@ "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.0.0" } @@ -13667,6 +15101,7 @@ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -13679,6 +15114,7 @@ "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -13710,15 +15146,16 @@ } }, "node_modules/ts-api-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", - "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">=16" + "node": ">=18.12" }, "peerDependencies": { - "typescript": ">=4.2.0" + "typescript": ">=4.8.4" } }, "node_modules/ts-node": { @@ -13726,6 +15163,7 @@ "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, + "license": "MIT", "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -13766,6 +15204,8 @@ }, "node_modules/ts-node/node_modules/diff": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -13777,6 +15217,7 @@ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, + "license": "MIT", "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", @@ -13784,29 +15225,19 @@ "strip-bom": "^3.0.0" } }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true + "dev": true, + "license": "0BSD" }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "dev": true, + "license": "Apache-2.0", "dependencies": { "safe-buffer": "^5.0.1" }, @@ -13819,6 +15250,7 @@ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -13828,6 +15260,8 @@ }, "node_modules/type-detect": { "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true, "license": "MIT", "engines": { @@ -13839,6 +15273,7 @@ "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", @@ -13853,6 +15288,7 @@ "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "for-each": "^0.3.3", @@ -13872,6 +15308,7 @@ "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", "dev": true, + "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", @@ -13893,6 +15330,7 @@ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", @@ -13957,34 +15395,11 @@ "resolved": "https://registry.npmjs.org/typedoc-plugin-missing-exports/-/typedoc-plugin-missing-exports-4.0.0.tgz", "integrity": "sha512-Z4ei+853xppDEhcqzyeyRs4+R0kUuKQWnMK1EtSTEd5LFkgkdW5Bdn8vfo/rsCGbYVJxOWU99fxgM1mROw5Fug==", "dev": true, + "license": "MIT", "peerDependencies": { "typedoc": "^0.28.1" } }, - "node_modules/typedoc/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/typedoc/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/typescript": { "version": "5.8.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", @@ -14003,13 +15418,15 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/unbox-primitive": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "has-bigints": "^1.0.2", @@ -14030,6 +15447,16 @@ "dev": true, "license": "MIT" }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/update-browserslist-db": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", @@ -14063,6 +15490,8 @@ }, "node_modules/uri-js": { "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -14071,16 +15500,22 @@ }, "node_modules/util-deprecate": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true, "license": "MIT" }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", "dev": true, "license": "MIT" }, "node_modules/validate-npm-package-license": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -14093,6 +15528,7 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", "dev": true, + "license": "MIT", "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", @@ -14167,6 +15603,7 @@ "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.1.3.tgz", "integrity": "sha512-uHV4plJ2IxCl4u1up1FQRrqclylKAogbtBfOTwcuJ28xFi+89PZ57BRh+naIRvH70HPwxy5QHYzg1OrEaC7AbA==", "dev": true, + "license": "MIT", "dependencies": { "cac": "^6.7.14", "debug": "^4.4.0", @@ -14189,6 +15626,7 @@ "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.1.3.tgz", "integrity": "sha512-188iM4hAHQ0km23TN/adso1q5hhwKqUpv+Sd6p5sOuh6FhQnRNW3IsiIpvxqahtBabsJ2SLZgmGSpcYK4wQYJw==", "dev": true, + "license": "MIT", "dependencies": { "@vitest/expect": "3.1.3", "@vitest/mocker": "3.1.3", @@ -14281,6 +15719,8 @@ }, "node_modules/vt-pbf": { "version": "3.1.3", + "resolved": "https://registry.npmjs.org/vt-pbf/-/vt-pbf-3.1.3.tgz", + "integrity": "sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA==", "license": "MIT", "dependencies": { "@mapbox/point-geometry": "0.1.0", @@ -14288,15 +15728,52 @@ "pbf": "^3.2.1" } }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=12" } }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/whatwg-url": { "version": "14.2.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", @@ -14313,6 +15790,8 @@ }, "node_modules/which": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "license": "ISC", "dependencies": { @@ -14330,6 +15809,7 @@ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", "dev": true, + "license": "MIT", "dependencies": { "is-bigint": "^1.1.0", "is-boolean-object": "^1.2.1", @@ -14349,6 +15829,7 @@ "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "function.prototype.name": "^1.1.6", @@ -14376,6 +15857,7 @@ "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dev": true, + "license": "MIT", "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", @@ -14390,15 +15872,17 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz", - "integrity": "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==", + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", "dev": true, + "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "for-each": "^0.3.3", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" }, @@ -14426,17 +15910,29 @@ "node": ">=8" } }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wrap-ansi": { - "version": "7.0.0", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" @@ -14448,6 +15944,7 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -14460,11 +15957,22 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -14480,6 +15988,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -14491,22 +16000,22 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, - "node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, - "engines": { - "node": ">=8" - } + "license": "MIT" }, "node_modules/wrap-ansi-cjs/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -14516,62 +16025,53 @@ "node": ">=8" } }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, "engines": { - "node": ">=7.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } + "license": "ISC" }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "4.2.3", + "node_modules/write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" }, "engines": { - "node": ">=8" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/wrappy": { - "version": "1.0.2", - "dev": true, - "license": "ISC" - }, "node_modules/ws": { "version": "8.18.2", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", @@ -14607,28 +16107,50 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, "node_modules/xmlbuilder": { "version": "15.1.1", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.0" } }, "node_modules/xmlchars": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true, "license": "MIT" }, "node_modules/y18n": { "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, "license": "ISC", "engines": { "node": ">=10" } }, + "node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", + "dev": true, + "license": "ISC" + }, "node_modules/yaml": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz", @@ -14647,6 +16169,7 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, + "license": "MIT", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -14661,23 +16184,36 @@ } }, "node_modules/yargs-parser": { - "version": "20.2.9", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, "license": "ISC", "engines": { - "node": ">=10" + "node": ">=12" } }, - "node_modules/yargs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, "node_modules/yargs/node_modules/string-width": { "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", "dependencies": { @@ -14689,12 +16225,17 @@ "node": ">=8" } }, - "node_modules/yargs/node_modules/yargs-parser": { - "version": "21.1.1", + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "license": "ISC", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, "engines": { - "node": ">=12" + "node": ">=8" } }, "node_modules/yauzl": { @@ -14710,6 +16251,8 @@ }, "node_modules/yn": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true, "license": "MIT", "engines": { @@ -14718,6 +16261,8 @@ }, "node_modules/yocto-queue": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, "license": "MIT", "engines": { @@ -14728,9 +16273,9 @@ } }, "node_modules/zod": { - "version": "3.24.1", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.1.tgz", - "integrity": "sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==", + "version": "3.24.2", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.2.tgz", + "integrity": "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==", "dev": true, "license": "MIT", "funding": { diff --git a/src/data/bucket.ts b/src/data/bucket.ts index 8d335686efa..a52649fe79c 100644 --- a/src/data/bucket.ts +++ b/src/data/bucket.ts @@ -19,6 +19,7 @@ export type BucketParameters = { collisionBoxArray: CollisionBoxArray; sourceLayerIndex: number; sourceID: string; + globalState: Record; }; export type PopulateParameters = { diff --git a/src/data/bucket/circle_bucket.ts b/src/data/bucket/circle_bucket.ts index 06f9a4f602c..ca08060eb24 100644 --- a/src/data/bucket/circle_bucket.ts +++ b/src/data/bucket/circle_bucket.ts @@ -49,6 +49,7 @@ function addCircleVertex(layoutVertexArray, x, y, extrudeX, extrudeY) { export class CircleBucket implements Bucket { index: number; zoom: number; + globalState: Record; overscaling: number; layerIds: Array; layers: Array; @@ -68,6 +69,7 @@ export class CircleBucket im constructor(options: BucketParameters) { this.zoom = options.zoom; + this.globalState = options.globalState; this.overscaling = options.overscaling; this.layers = options.layers; this.layerIds = this.layers.map(layer => layer.id); @@ -106,7 +108,7 @@ export class CircleBucket im const needGeometry = this.layers[0]._featureFilter.needGeometry; const evaluationFeature = toEvaluationFeature(feature, needGeometry); - if (!this.layers[0]._featureFilter.filter(new EvaluationParameters(this.zoom), evaluationFeature, canonical)) continue; + if (!this.layers[0]._featureFilter.filter(new EvaluationParameters(this.zoom, {globalState: this.globalState}), evaluationFeature, canonical)) continue; const sortKey = sortFeaturesByKey ? circleSortKey.evaluate(evaluationFeature, {}, canonical) : diff --git a/src/data/bucket/fill_bucket.ts b/src/data/bucket/fill_bucket.ts index 60715255703..7ebb83a49b4 100644 --- a/src/data/bucket/fill_bucket.ts +++ b/src/data/bucket/fill_bucket.ts @@ -41,6 +41,7 @@ export class FillBucket implements Bucket { stateDependentLayers: Array; stateDependentLayerIds: Array; patternFeatures: Array; + globalState: Record; layoutVertexArray: FillLayoutArray; layoutVertexBuffer: VertexBuffer; @@ -59,6 +60,7 @@ export class FillBucket implements Bucket { constructor(options: BucketParameters) { this.zoom = options.zoom; + this.globalState = options.globalState; this.overscaling = options.overscaling; this.layers = options.layers; this.layerIds = this.layers.map(layer => layer.id); @@ -85,7 +87,7 @@ export class FillBucket implements Bucket { const needGeometry = this.layers[0]._featureFilter.needGeometry; const evaluationFeature = toEvaluationFeature(feature, needGeometry); - if (!this.layers[0]._featureFilter.filter(new EvaluationParameters(this.zoom), evaluationFeature, canonical)) continue; + if (!this.layers[0]._featureFilter.filter(new EvaluationParameters(this.zoom, {globalState: this.globalState}), evaluationFeature, canonical)) continue; const sortKey = sortFeaturesByKey ? fillSortKey.evaluate(evaluationFeature, {}, canonical, options.availableImages) : diff --git a/src/data/bucket/fill_extrusion_bucket.ts b/src/data/bucket/fill_extrusion_bucket.ts index e451c3e6e88..fe5bb8a9fa0 100644 --- a/src/data/bucket/fill_extrusion_bucket.ts +++ b/src/data/bucket/fill_extrusion_bucket.ts @@ -61,6 +61,7 @@ type CentroidAccumulator = { export class FillExtrusionBucket implements Bucket { index: number; zoom: number; + globalState: Record; overscaling: number; layers: Array; layerIds: Array; @@ -84,6 +85,7 @@ export class FillExtrusionBucket implements Bucket { constructor(options: BucketParameters) { this.zoom = options.zoom; + this.globalState = options.globalState; this.overscaling = options.overscaling; this.layers = options.layers; this.layerIds = this.layers.map(layer => layer.id); @@ -106,7 +108,7 @@ export class FillExtrusionBucket implements Bucket { const needGeometry = this.layers[0]._featureFilter.needGeometry; const evaluationFeature = toEvaluationFeature(feature, needGeometry); - if (!this.layers[0]._featureFilter.filter(new EvaluationParameters(this.zoom), evaluationFeature, canonical)) continue; + if (!this.layers[0]._featureFilter.filter(new EvaluationParameters(this.zoom, {globalState: this.globalState}), evaluationFeature, canonical)) continue; const bucketFeature: BucketFeature = { id, diff --git a/src/data/bucket/line_bucket.ts b/src/data/bucket/line_bucket.ts index e084c0bdb50..0abd459d658 100644 --- a/src/data/bucket/line_bucket.ts +++ b/src/data/bucket/line_bucket.ts @@ -99,6 +99,7 @@ export class LineBucket implements Bucket { index: number; zoom: number; + globalState: Record; overscaling: number; layers: Array; layerIds: Array; @@ -123,6 +124,7 @@ export class LineBucket implements Bucket { constructor(options: BucketParameters) { this.zoom = options.zoom; + this.globalState = options.globalState; this.overscaling = options.overscaling; this.layers = options.layers; this.layerIds = this.layers.map(layer => layer.id); @@ -155,7 +157,7 @@ export class LineBucket implements Bucket { const needGeometry = this.layers[0]._featureFilter.needGeometry; const evaluationFeature = toEvaluationFeature(feature, needGeometry); - if (!this.layers[0]._featureFilter.filter(new EvaluationParameters(this.zoom), evaluationFeature, canonical)) continue; + if (!this.layers[0]._featureFilter.filter(new EvaluationParameters(this.zoom, {globalState: this.globalState}), evaluationFeature, canonical)) continue; const sortKey = sortFeaturesByKey ? lineSortKey.evaluate(evaluationFeature, {}, canonical) : diff --git a/src/data/bucket/symbol_bucket.ts b/src/data/bucket/symbol_bucket.ts index b9eb8b319b0..6d4241fe720 100644 --- a/src/data/bucket/symbol_bucket.ts +++ b/src/data/bucket/symbol_bucket.ts @@ -312,6 +312,7 @@ export class SymbolBucket implements Bucket { collisionBoxArray: CollisionBoxArray; zoom: number; + globalState: Record; overscaling: number; layers: Array; layerIds: Array; @@ -363,6 +364,7 @@ export class SymbolBucket implements Bucket { constructor(options: BucketParameters) { this.collisionBoxArray = options.collisionBoxArray; this.zoom = options.zoom; + this.globalState = options.globalState; this.overscaling = options.overscaling; this.layers = options.layers; this.layerIds = this.layers.map(layer => layer.id); @@ -458,7 +460,7 @@ export class SymbolBucket implements Bucket { const icons = options.iconDependencies; const stacks = options.glyphDependencies; const availableImages = options.availableImages; - const globalProperties = new EvaluationParameters(this.zoom); + const globalProperties = new EvaluationParameters(this.zoom, {globalState: this.globalState}); for (const {feature, id, index, sourceLayerIndex} of features) { diff --git a/src/source/geojson_source.test.ts b/src/source/geojson_source.test.ts index 8af0beb7387..aeb8d753bcd 100644 --- a/src/source/geojson_source.test.ts +++ b/src/source/geojson_source.test.ts @@ -431,6 +431,7 @@ describe('GeoJSONSource#update', () => { source.map = { transform: {} as IReadonlyTransform, getPixelRatio() { return 1; }, + getGlobalState: () => ({}), style: { projection: { get subdivisionGranularity() { diff --git a/src/source/geojson_source.ts b/src/source/geojson_source.ts index 6417f8bc83e..fcd687fe6c6 100644 --- a/src/source/geojson_source.ts +++ b/src/source/geojson_source.ts @@ -428,7 +428,8 @@ export class GeoJSONSource extends Evented implements Source { pixelRatio: this.map.getPixelRatio(), showCollisionBoxes: this.map.showCollisionBoxes, promoteId: this.promoteId, - subdivisionGranularity: this.map.style.projection.subdivisionGranularity + subdivisionGranularity: this.map.style.projection.subdivisionGranularity, + globalState: this.map.getGlobalState() }; tile.abortController = new AbortController(); diff --git a/src/source/vector_tile_source.test.ts b/src/source/vector_tile_source.test.ts index 9ee16655430..ba626c501f3 100644 --- a/src/source/vector_tile_source.test.ts +++ b/src/source/vector_tile_source.test.ts @@ -27,6 +27,7 @@ function createSource(options, transformCallback?, clearTiles = () => {}) { } } }, + getGlobalState: () => ({}), getPixelRatio() { return 1; }, } as any as Map); diff --git a/src/source/vector_tile_source.ts b/src/source/vector_tile_source.ts index a3afdac1c72..f3c63b325c0 100644 --- a/src/source/vector_tile_source.ts +++ b/src/source/vector_tile_source.ts @@ -201,7 +201,8 @@ export class VectorTileSource extends Evented implements Source { pixelRatio: this.map.getPixelRatio(), showCollisionBoxes: this.map.showCollisionBoxes, promoteId: this.promoteId, - subdivisionGranularity: this.map.style.projection.subdivisionGranularity + subdivisionGranularity: this.map.style.projection.subdivisionGranularity, + globalState: this.map.getGlobalState() }; params.request.collectResourceTiming = this._collectResourceTiming; let messageType: MessageType.loadTile | MessageType.reloadTile = MessageType.reloadTile; diff --git a/src/source/vector_tile_worker_source.ts b/src/source/vector_tile_worker_source.ts index 396c96c96cd..6bf3cf4730e 100644 --- a/src/source/vector_tile_worker_source.ts +++ b/src/source/vector_tile_worker_source.ts @@ -155,6 +155,7 @@ export class VectorTileWorkerSource implements WorkerSource { } const workerTile = this.loaded[uid]; workerTile.showCollisionBoxes = params.showCollisionBoxes; + workerTile.globalState = params.globalState; if (workerTile.status === 'parsing') { const result = await workerTile.parse(workerTile.vectorTile, this.layerIndex, this.availableImages, this.actor, params.subdivisionGranularity); // if we have cancelled the original parse, make sure to pass the rawTileData from the original fetch diff --git a/src/source/worker_source.ts b/src/source/worker_source.ts index a7f1108f99f..9869990cc40 100644 --- a/src/source/worker_source.ts +++ b/src/source/worker_source.ts @@ -39,6 +39,7 @@ export type WorkerTileParameters = TileParameters & { collectResourceTiming?: boolean; returnDependencies?: boolean; subdivisionGranularity: SubdivisionGranularitySetting; + globalState: Record; }; /** diff --git a/src/source/worker_tile.ts b/src/source/worker_tile.ts index 33f24f41615..09ee9a1ec6c 100644 --- a/src/source/worker_tile.ts +++ b/src/source/worker_tile.ts @@ -24,7 +24,6 @@ import type {PromoteIdSpecification} from '@maplibre/maplibre-gl-style-spec'; import type {VectorTile} from '@mapbox/vector-tile'; import {MessageType, type GetGlyphsResponse, type GetImagesResponse} from '../util/actor_messages'; import type {SubdivisionGranularitySetting} from '../render/subdivision_granularity_settings'; - export class WorkerTile { tileID: OverscaledTileID; uid: string | number; @@ -37,6 +36,7 @@ export class WorkerTile { showCollisionBoxes: boolean; collectResourceTiming: boolean; returnDependencies: boolean; + globalState: Record; status: 'parsing' | 'done'; data: VectorTile; @@ -59,6 +59,7 @@ export class WorkerTile { this.returnDependencies = !!params.returnDependencies; this.promoteId = params.promoteId; this.inFlightDependencies = []; + this.globalState = params.globalState; } async parse(data: VectorTile, layerIndex: StyleLayerIndex, availableImages: Array, actor: IActor, subdivisionGranularity: SubdivisionGranularitySetting): Promise { @@ -122,7 +123,8 @@ export class WorkerTile { overscaling: this.overscaling, collisionBoxArray: this.collisionBoxArray, sourceLayerIndex, - sourceID: this.source + sourceID: this.source, + globalState: this.globalState }); bucket.populate(features, options, this.tileID.canonical); diff --git a/src/style/evaluation_parameters.ts b/src/style/evaluation_parameters.ts index baf695dff32..e75498ae32c 100644 --- a/src/style/evaluation_parameters.ts +++ b/src/style/evaluation_parameters.ts @@ -20,21 +20,24 @@ export class EvaluationParameters { fadeDuration: number; zoomHistory: ZoomHistory; transition: TransitionSpecification; + globalState: Record; // "options" may also be another EvaluationParameters to copy, see CrossFadedProperty.possiblyEvaluate constructor(zoom: number, options?: any) { this.zoom = zoom; if (options) { - this.now = options.now; - this.fadeDuration = options.fadeDuration; - this.zoomHistory = options.zoomHistory; - this.transition = options.transition; + this.now = options.now || 0; + this.fadeDuration = options.fadeDuration || 0; + this.zoomHistory = options.zoomHistory || new ZoomHistory(); + this.transition = options.transition || {}; + this.globalState = options.globalState || {}; } else { this.now = 0; this.fadeDuration = 0; this.zoomHistory = new ZoomHistory(); this.transition = {}; + this.globalState = {}; } } diff --git a/src/style/properties.ts b/src/style/properties.ts index 5235353b79a..1470bde4ff2 100644 --- a/src/style/properties.ts +++ b/src/style/properties.ts @@ -82,6 +82,10 @@ export class PropertyValue { return this.expression.kind === 'source' || this.expression.kind === 'composite'; } + getGlobalStateRefs(): Set { + return this.expression.globalStateRefs || new Set(); + } + possiblyEvaluate( parameters: EvaluationParameters, canonical?: CanonicalTileID, diff --git a/src/style/style.test.ts b/src/style/style.test.ts index c4d409e6819..b10ecbbc157 100644 --- a/src/style/style.test.ts +++ b/src/style/style.test.ts @@ -413,6 +413,22 @@ describe('Style#loadJSON', () => { expect(style.map.setTerrain).toHaveBeenCalled(); }); + test('sets state if defined', async () => { + const map = getStubMap(); + const style = new Style(map); + style.loadJSON(createStyleJSON({ + state: { + foo: { + default: 'bar' + } + } + })); + + await style.once('style.load'); + + expect(style.getGlobalState()).toEqual({foo: 'bar'}); + }); + test('applies transformStyle function', async () => { const previousStyle = createStyleJSON({ sources: { @@ -650,6 +666,7 @@ describe('Style#setState', () => { test('do nothing if there are no changes', async () => { const style = createStyle(); style.loadJSON(createStyleJSON()); + await style.once('style.load'); const spys = []; spys.push(vi.spyOn(style, 'addLayer').mockImplementation((() => {}) as any)); spys.push(vi.spyOn(style, 'removeLayer').mockImplementation((() => {}) as any)); @@ -662,7 +679,7 @@ describe('Style#setState', () => { spys.push(vi.spyOn(style, 'setLayerZoomRange').mockImplementation((() => {}) as any)); spys.push(vi.spyOn(style, 'setLight').mockImplementation((() => {}) as any)); spys.push(vi.spyOn(style, 'setSky').mockImplementation((() => {}) as any)); - await style.once('style.load'); + spys.push(vi.spyOn(style, 'setGlobalState').mockImplementation((() => {}) as any)); const didChange = style.setState(createStyleJSON()); expect(didChange).toBeFalsy(); for (const spy of spys) { @@ -673,6 +690,11 @@ describe('Style#setState', () => { test('do operations if there are changes', async () => { const style = createStyle(); const styleJson = createStyleJSON({ + state: { + accentColor: { + default: 'blue' + } + }, layers: [{ id: 'layerId0', type: 'symbol', @@ -714,8 +736,10 @@ describe('Style#setState', () => { spys.push(vi.spyOn(style, 'setProjection').mockImplementation((() => {}) as any)); spys.push(vi.spyOn(style.map, 'setTerrain').mockImplementation((() => {}) as any)); spys.push(vi.spyOn(style, 'setSky').mockImplementation((() => {}) as any)); + spys.push(vi.spyOn(style, 'setGlobalState').mockImplementation((() => {}) as any)); const newStyle = JSON.parse(JSON.stringify(styleJson)) as StyleSpecification; + newStyle.state.accentColor.default = 'red'; newStyle.layers[0].paint = {'text-color': '#7F7F7F',}; newStyle.layers[0].layout = {'text-size': 16,}; newStyle.layers[0].minzoom = 2; @@ -1228,6 +1252,263 @@ describe('Style#setGeoJSONSourceData', () => { }); }); +describe('Style#setGlobalState', () => { + test('throws before loaded', () => { + const style = new Style(getStubMap()); + expect(() => style.setGlobalState({})).toThrow(/load/i); + }); + test('sets global state', async () => { + const style = new Style(getStubMap()); + style.loadJSON(createStyleJSON()); + await style.once('style.load'); + style.setGlobalState({accentColor: {default: 'yellow'}}); + expect(style.getGlobalState()).toEqual({accentColor: 'yellow'}); + }); + + test('reloads sources when state property is used in filter property', async () => { + const style = new Style(getStubMap()); + style.loadJSON(createStyleJSON({ + sources: { + 'circle-source-id': createGeoJSONSource(), + 'fill-source-id': createGeoJSONSource() + }, + layers: [{ + id: 'first-layer-id', + type: 'circle', + source: 'circle-source-id', + filter: ['global-state', 'showCircles'] + }, + { + id: 'fourth-layer-id', + type: 'fill', + source: 'fill-source-id', + filter: ['global-state', 'showFill'], + }] + })); + + await style.once('style.load'); + + style.sourceCaches['circle-source-id'].resume = vi.fn(); + style.sourceCaches['circle-source-id'].reload = vi.fn(); + style.sourceCaches['fill-source-id'].resume = vi.fn(); + style.sourceCaches['fill-source-id'].reload = vi.fn(); + + style.setGlobalState({showCircles: {default: true}, showFill: {default: false}}); + + expect(style.sourceCaches['circle-source-id'].resume).toHaveBeenCalled(); + expect(style.sourceCaches['circle-source-id'].reload).toHaveBeenCalled(); + expect(style.sourceCaches['fill-source-id'].resume).toHaveBeenCalled(); + expect(style.sourceCaches['fill-source-id'].reload).toHaveBeenCalled(); + }); + + test('does not reload sources when state property is set to the same value as current one', async () => { + const style = new Style(getStubMap()); + style.loadJSON(createStyleJSON({ + state: { + 'showCircles': { + default: true + } + }, + sources: { + 'circle-source-id': createGeoJSONSource(), + 'fill-source-id': createGeoJSONSource() + }, + layers: [{ + id: 'first-layer-id', + type: 'circle', + source: 'circle-source-id', + filter: ['global-state', 'showCircles'] + }] + })); + + await style.once('style.load'); + + style.sourceCaches['circle-source-id'].resume = vi.fn(); + style.sourceCaches['circle-source-id'].reload = vi.fn(); + + style.setGlobalState({showCircles: {default: true}}); + + expect(style.sourceCaches['circle-source-id'].resume).not.toHaveBeenCalled(); + expect(style.sourceCaches['circle-source-id'].reload).not.toHaveBeenCalled(); + }); + + test('does not reload sources when new state property is used in paint property', async () => { + const style = new Style(getStubMap()); + style.loadJSON(createStyleJSON({ + sources: { + 'circle-source-id': createGeoJSONSource(), + 'fill-source-id': createGeoJSONSource() + }, + layers: [{ + id: 'first-layer-id', + type: 'circle', + source: 'circle-source-id', + paint: { + 'circle-color': ['global-state', 'circleColor'] + } + }] + })); + + await style.once('style.load'); + + style.sourceCaches['circle-source-id'].resume = vi.fn(); + style.sourceCaches['circle-source-id'].reload = vi.fn(); + + style.setGlobalState({circleColor: {default: 'red'}}); + + expect(style.sourceCaches['circle-source-id'].resume).not.toHaveBeenCalled(); + expect(style.sourceCaches['circle-source-id'].reload).not.toHaveBeenCalled(); + }); +}); + +describe('Style#setGlobalStateProperty', () => { + test('throws before loaded', () => { + const style = new Style(getStubMap()); + expect(() => style.setGlobalStateProperty('accentColor', 'yellow')).toThrow(/load/i); + }); + + test('sets property', async () => { + const style = new Style(getStubMap()); + style.loadJSON(createStyleJSON()); + + await style.once('style.load'); + + style.setGlobalStateProperty('accentColor', 'yellow'); + + expect(style.getGlobalState()).toEqual({accentColor: 'yellow'}); + }); + + test('sets property to default value when called with null', async () => { + const style = new Style(getStubMap()); + style.loadJSON(createStyleJSON({ + state: { + 'accentColor': { + default: 'blue' + } + } + })); + + await style.once('style.load'); + + style.setGlobalStateProperty('accentColor', 'yellow'); + expect(style.getGlobalState()).toEqual({accentColor: 'yellow'}); + style.setGlobalStateProperty('accentColor', null); + expect(style.getGlobalState()).toEqual({accentColor: 'blue'}); + }); + + test('reloads sources when state property is used in filter property', async () => { + const style = new Style(getStubMap()); + style.loadJSON(createStyleJSON({ + sources: { + 'circle-1-source-id': createGeoJSONSource(), + 'circle-2-source-id': createGeoJSONSource(), + 'fill-source-id': createGeoJSONSource() + }, + layers: [{ + id: 'first-layer-id', + type: 'circle', + source: 'circle-1-source-id', + filter: ['global-state', 'showCircles'] + }, { + id: 'second-layer-id', + type: 'fill', + source: 'fill-source-id', + }, { + id: 'third-layer-id', + type: 'circle', + source: 'circle-2-source-id', + filter: ['global-state', 'showCircles'] + }, + { + id: 'fourth-layer-id', + type: 'fill', + source: 'fill-source-id', + filter: ['global-state', 'showFill'], + }] + })); + + await style.once('style.load'); + + style.sourceCaches['circle-1-source-id'].resume = vi.fn(); + style.sourceCaches['circle-1-source-id'].reload = vi.fn(); + style.sourceCaches['circle-2-source-id'].resume = vi.fn(); + style.sourceCaches['circle-2-source-id'].reload = vi.fn(); + style.sourceCaches['fill-source-id'].resume = vi.fn(); + style.sourceCaches['fill-source-id'].reload = vi.fn(); + + style.setGlobalStateProperty('showCircles', true); + + // The circle sources should be reloaded + expect(style.sourceCaches['circle-1-source-id'].resume).toHaveBeenCalled(); + expect(style.sourceCaches['circle-1-source-id'].reload).toHaveBeenCalled(); + expect(style.sourceCaches['circle-2-source-id'].resume).toHaveBeenCalled(); + expect(style.sourceCaches['circle-2-source-id'].reload).toHaveBeenCalled(); + + // The fill source should not be reloaded + expect(style.sourceCaches['fill-source-id'].resume).not.toHaveBeenCalled(); + expect(style.sourceCaches['fill-source-id'].reload).not.toHaveBeenCalled(); + }); + + test('does not reload sources when state property is set to the same value as current one', async () => { + const style = new Style(getStubMap()); + style.loadJSON(createStyleJSON({ + state: { + 'showCircle': { + default: true + } + }, + sources: { + 'circle': createGeoJSONSource(), + + }, + layers: [{ + id: 'first-layer-id', + type: 'circle', + source: 'circle', + filter: ['global-state', 'showCircle'] + } + ] + })); + + await style.once('style.load'); + + style.sourceCaches['circle'].resume = vi.fn(); + style.sourceCaches['circle'].reload = vi.fn(); + + style.setGlobalStateProperty('showCircle', true); + + expect(style.sourceCaches['circle'].resume).not.toHaveBeenCalled(); + expect(style.sourceCaches['circle'].reload).not.toHaveBeenCalled(); + }); + + test('does not reload sources when state property is only used in paint properties', async () => { + const style = new Style(getStubMap()); + style.loadJSON(createStyleJSON({ + sources: { + 'circle-source-id': createGeoJSONSource() + }, + layers: [{ + id: 'layer-id', + type: 'circle', + source: 'circle-source-id', + paint: { + 'circle-color': ['global-state', 'circleColor'] + } + }] + })); + + await style.once('style.load'); + + style.sourceCaches['circle-source-id'].resume = vi.fn(); + style.sourceCaches['circle-source-id'].reload = vi.fn(); + + style.setGlobalStateProperty('circleColor', 'red'); + + expect(style.sourceCaches['circle-source-id'].resume).not.toHaveBeenCalled(); + expect(style.sourceCaches['circle-source-id'].reload).not.toHaveBeenCalled(); + }); +}); + describe('Style#addLayer', () => { test('throw before loaded', () => { const style = new Style(getStubMap()); diff --git a/src/style/style.ts b/src/style/style.ts index 675379098c8..8d4bd969616 100644 --- a/src/style/style.ts +++ b/src/style/style.ts @@ -52,7 +52,8 @@ import type { SpriteSpecification, DiffOperations, ProjectionSpecification, - SkySpecification + SkySpecification, + StateSpecification } from '@maplibre/maplibre-gl-style-spec'; import type {CanvasSourceSpecification} from '../source/canvas_source'; import type {CustomLayerInterface} from './style_layer/custom_style_layer'; @@ -229,7 +230,7 @@ export class Style extends Evented { _spritesImagesIds: {[spriteId: string]: string[]}; // image ids of all images loaded (sprite + user) _availableImages: Array; - + _globalState: Record; crossTileSymbolIndex: CrossTileSymbolIndex; pauseablePlacement: PauseablePlacement; placement: Placement; @@ -260,6 +261,7 @@ export class Style extends Evented { this.zoomHistory = new ZoomHistory(); this._loaded = false; this._availableImages = []; + this._globalState = {}; this._resetUpdates(); @@ -302,6 +304,82 @@ export class Style extends Evented { } }; + setGlobalStateProperty(name: string, value: any) { + this._checkLoaded(); + + const newValue = value === null ? + this.stylesheet.state?.[name]?.default ?? null : + value; + + if (deepEqual(newValue, this._globalState[name])) { + return this; + } + + this._globalState[name] = newValue; + + const sourceIdsToReload = this._findGlobalStateAffectedSources([name]); + + for (const id in this.sourceCaches) { + if (sourceIdsToReload.has(id)) { + this._reloadSource(id); + this._changed = true; + } + } + } + + getGlobalState() { + return this._globalState; + } + + setGlobalState(newStylesheetState: StateSpecification) { + this._checkLoaded(); + + const changedGlobalStateRefs = []; + + for (const propertyName in newStylesheetState) { + const didChange = !deepEqual(this._globalState[propertyName], newStylesheetState[propertyName].default); + + if (didChange) { + changedGlobalStateRefs.push(propertyName); + this._globalState[propertyName] = newStylesheetState[propertyName].default; + } + } + + const sourceIdsToReload = this._findGlobalStateAffectedSources(changedGlobalStateRefs); + + for (const id in this.sourceCaches) { + if (sourceIdsToReload.has(id)) { + this._reloadSource(id); + this._changed = true; + } + } + } + + /** + * Find all sources that are affected by the global state changes. + * For example, if a layer filter uses global-state expression, this function will return the source id of that layer. + */ + _findGlobalStateAffectedSources(globalStateRefs: string[]) { + if (globalStateRefs.length === 0) { + return new Set(); + } + + const sourceIdsToReload = new Set(); + + for (const layerId in this._layers) { + const layer = this._layers[layerId]; + const layoutAffectingGlobalStateRefs = layer.getLayoutAffectingGlobalStateRefs(); + + for (const ref of globalStateRefs) { + if (layoutAffectingGlobalStateRefs.has(ref)) { + sourceIdsToReload.add(layer.source); + } + } + } + + return sourceIdsToReload; + } + loadURL(url: string, options: StyleSwapOptions & StyleSetterOptions = {}, previousStyle?: StyleSpecification) { this.fire(new Event('dataloading', {dataType: 'style'})); @@ -367,6 +445,8 @@ export class Style extends Evented { this.map.setTerrain(this.stylesheet.terrain ?? null); + this.setGlobalState(this.stylesheet.state ?? null); + this.fire(new Event('data', {dataType: 'style'})); this.fire(new Event('style.load')); } @@ -812,6 +892,9 @@ export class Style extends Evented { case 'setProjection': this.setProjection.apply(this, op.args); break; + case 'setGlobalState': + operations.push(() => this.setGlobalState.apply(this, op.args)); + break; case 'setTransition': operations.push(() => {}); break; @@ -1150,7 +1233,7 @@ export class Style extends Evented { } if (filter === null || filter === undefined) { - layer.filter = undefined; + layer.setFilter(undefined); this._updateLayer(layer); return; } @@ -1159,7 +1242,7 @@ export class Style extends Evented { return; } - layer.filter = clone(filter); + layer.setFilter(clone(filter)); this._updateLayer(layer); } diff --git a/src/style/style_layer.test.ts b/src/style/style_layer.test.ts index f4d4132bb22..a8eac795e95 100644 --- a/src/style/style_layer.test.ts +++ b/src/style/style_layer.test.ts @@ -242,6 +242,49 @@ describe('StyleLayer#setLayoutProperty', () => { }); }); +describe('StyleLayer#getLayoutAffectingGlobalStateRefs', () => { + test('returns empty Set when no global state references', () => { + const layer = createStyleLayer({ + 'id': 'background', + 'type': 'background', + 'paint': { + 'background-color': '#000000' + } + } as LayerSpecification); + + expect(layer.getLayoutAffectingGlobalStateRefs()).toEqual(new Set()); + }); + + test('returns global-state references from filter properties', () => { + const layer = createStyleLayer({ + 'id': 'symbol', + 'type': 'symbol', + source: 'source', + //@ts-ignore + 'filter': ['==', ['global-state', 'showSymbol'], true], + }); + + expect(layer.getLayoutAffectingGlobalStateRefs()).toEqual(new Set(['showSymbol'])); + }); + + test('returns global-state references from layout properties', () => { + const layer = createStyleLayer({ + 'id': 'symbol', + 'type': 'symbol', + source: 'source', + 'layout': { + 'text-field': '{text}', + //@ts-ignore + 'text-size': ['global-state', 'textSize'], + //@ts-ignore + 'text-transform': ['global-state', 'textTransform'] + } + }); + + expect(layer.getLayoutAffectingGlobalStateRefs()).toEqual(new Set(['textSize', 'textTransform'])); + }); +}); + describe('StyleLayer#serialize', () => { function createSymbolLayer(layer?) { diff --git a/src/style/style_layer.ts b/src/style/style_layer.ts index 782b121508a..e3f4c3a72e9 100644 --- a/src/style/style_layer.ts +++ b/src/style/style_layer.ts @@ -1,6 +1,6 @@ import {filterObject} from '../util/util'; -import {latest as styleSpec, supportsPropertyExpression} from '@maplibre/maplibre-gl-style-spec'; +import {featureFilter, latest as styleSpec, supportsPropertyExpression} from '@maplibre/maplibre-gl-style-spec'; import { validateStyle, validateLayoutProperty, @@ -127,6 +127,7 @@ export abstract class StyleLayer extends Evented { this.source = layer.source; this.sourceLayer = layer['source-layer']; this.filter = layer.filter; + this._featureFilter = featureFilter(layer.filter); } if (properties.layout) { @@ -149,6 +150,11 @@ export abstract class StyleLayer extends Evented { } } + setFilter(filter: FilterSpecification | void) { + this.filter = filter; + this._featureFilter = featureFilter(filter); + } + getCrossfadeParameters() { return this._crossfadeParameters; } @@ -161,6 +167,31 @@ export abstract class StyleLayer extends Evented { return this._unevaluatedLayout.getValue(name); } + /** + * Get list of global state references that are used within layout or filter properties. + * This is used to determine if layer source need to be reloaded when global state property changes. + * + */ + getLayoutAffectingGlobalStateRefs() { + const globalStateRefs = new Set(); + + if (this._unevaluatedLayout) { + for (const propertyName in this._unevaluatedLayout._values) { + const value = this._unevaluatedLayout._values[propertyName]; + + for (const globalStateRef of value.getGlobalStateRefs()) { + globalStateRefs.add(globalStateRef); + } + } + } + + for (const globalStateRef of this._featureFilter.getGlobalStateRefs()) { + globalStateRefs.add(globalStateRef); + } + + return globalStateRefs; + } + setLayoutProperty(name: string, value: any, options: StyleSetterOptions = {}) { if (value !== null && value !== undefined) { const key = `layers.${this.id}.layout.${name}`; diff --git a/src/ui/map.ts b/src/ui/map.ts index 842c66f27f2..a3e3cbc5b28 100644 --- a/src/ui/map.ts +++ b/src/ui/map.ts @@ -54,7 +54,7 @@ import type { SourceSpecification, TerrainSpecification, ProjectionSpecification, - SkySpecification + SkySpecification, } from '@maplibre/maplibre-gl-style-spec'; import type {CanvasSourceSpecification} from '../source/canvas_source'; import type {GeoJSONFeature, MapGeoJSONFeature} from '../util/vectortile_to_geojson'; @@ -776,6 +776,29 @@ export class Map extends Camera { return this._mapId; } + /** + * Sets a global state property that can be retrieved with the [`global-state` expression](https://maplibre.org/maplibre-style-spec/expressions/#global-state). + * If the value is null, it resets the property to its default value defined in the [`state` style property](https://maplibre.org/maplibre-style-spec/root/#state). + * + * Note that changing `global-state` values defined in layout properties is not supported, and will be ignored. + * + * @param propertyName - The name of the state property to set. + * @param value - The value of the state property to set. + */ + setGlobalStateProperty(propertyName: string, value: any) { + this.style.setGlobalStateProperty(propertyName, value); + return this._update(true); + } + + /** + * Returns the global map state + * + * @returns The map state object. + */ + getGlobalState(): Record { + return this.style.getGlobalState(); + } + /** * Adds an {@link IControl} to the map, calling `control.onAdd(this)`. * @@ -3275,7 +3298,8 @@ export class Map extends Camera { now, fadeDuration, zoomHistory: this.style.zoomHistory, - transition: this.style.getTransition() + transition: this.style.getTransition(), + globalState: this.style.getGlobalState() }); const factor = parameters.crossFadingFactor(); diff --git a/src/ui/map_tests/map_global_state.test.ts b/src/ui/map_tests/map_global_state.test.ts new file mode 100644 index 00000000000..3eb574335d9 --- /dev/null +++ b/src/ui/map_tests/map_global_state.test.ts @@ -0,0 +1,73 @@ +import {describe, beforeEach, test, expect, vitest} from 'vitest'; +import {createMap, beforeMapTest} from '../../util/test/util'; + +beforeEach(() => { + beforeMapTest(); +}); + +describe('#setGlobalStateProperty', () => { + test('sets state', async () => { + const map = createMap({ + style: { + version: 8, + state: { + backgroundColor: { + default: 'red' + } + }, + sources: {}, + layers: [{ + id: 'background', + type: 'background', + paint: { + 'background-color': ['global-state', 'backgroundColor'] + } + }] + } + }); + + await map.once('style.load'); + map._update = vitest.fn(); + + map.setGlobalStateProperty('backgroundColor', 'blue'); + + expect(map.getGlobalState()).toEqual({backgroundColor: 'blue'}); + expect(map._update).toHaveBeenCalledWith(true); + }); + + test('resets state to default value when called with null', async () => { + const map = createMap({ + style: { + version: 8, + state: { + backgroundColor: { + default: 'red' + } + }, + sources: {}, + layers: [{ + id: 'background', + type: 'background', + paint: { + 'background-color': ['global-state', 'backgroundColor'] + } + }] + } + }); + + await map.once('style.load'); + map._update = vitest.fn(); + + map.setGlobalStateProperty('backgroundColor', 'blue'); + + expect(map.getGlobalState()).toEqual({backgroundColor: 'blue'}); + expect(map._update).toHaveBeenCalledTimes(1); + expect(map._update).toHaveBeenCalledWith(true); + + map.setGlobalStateProperty('backgroundColor', null); + + expect(map.getGlobalState()).toEqual({backgroundColor: 'red'}); + expect(map._update).toHaveBeenCalledTimes(2); + expect(map._update).toHaveBeenNthCalledWith(2, true); + }); +}); diff --git a/test/bench/lib/tile_parser.ts b/test/bench/lib/tile_parser.ts index 41f9d49acc8..e5517270e2a 100644 --- a/test/bench/lib/tile_parser.ts +++ b/test/bench/lib/tile_parser.ts @@ -137,7 +137,8 @@ export default class TileParser { request: {url: ''}, returnDependencies, promoteId: undefined, - subdivisionGranularity: SubdivisionGranularitySetting.noSubdivision + subdivisionGranularity: SubdivisionGranularitySetting.noSubdivision, + globalState: {} }); const vectorTile = new VT.VectorTile(new Protobuf(tile.buffer)); diff --git a/test/build/min.test.ts b/test/build/min.test.ts index 410ac9b6e31..7023b927ed5 100644 --- a/test/build/min.test.ts +++ b/test/build/min.test.ts @@ -38,7 +38,7 @@ describe('test min build', () => { const decreaseQuota = 4096; // feel free to update this value after you've checked that it has changed on purpose :-) - const expectedBytes = 925625; + const expectedBytes = 927884; expect(actualBytes).toBeLessThan(expectedBytes + increaseQuota); expect(actualBytes).toBeGreaterThan(expectedBytes - decreaseQuota); diff --git a/test/examples/filter-symbols-using-global-state.html b/test/examples/filter-symbols-using-global-state.html new file mode 100644 index 00000000000..e2d26180672 --- /dev/null +++ b/test/examples/filter-symbols-using-global-state.html @@ -0,0 +1,106 @@ + + + + Filter layer symbols using global state + + + + + + + + + +
+
+ Filter by type + +
+ + + + + \ No newline at end of file diff --git a/test/unit/lib/create_symbol_layer.ts b/test/unit/lib/create_symbol_layer.ts index 2357129b990..f4e46a5b297 100644 --- a/test/unit/lib/create_symbol_layer.ts +++ b/test/unit/lib/create_symbol_layer.ts @@ -17,7 +17,8 @@ export function createSymbolBucket(layerId, font, text, collisionBoxArray) { overscaling: 1, zoom: 0, collisionBoxArray, - layers: [layer] + layers: [layer], + globalState: {} } as BucketParameters); } From 64ae6afa7551c894401a3be683dd5a78d1ba6b39 Mon Sep 17 00:00:00 2001 From: Jakub Pelc <57600346+kubapelc@users.noreply.github.com> Date: Tue, 20 May 2025 20:09:55 +0200 Subject: [PATCH 10/19] Improved tile frustum culling for globe (#5865) * Adapt coveringTiles for usage with generic bounding volumes * Basic OBB implementation * Attempt at globe OBB generation * Temp: bounding box debug view * OBB generation fixes * Add detailed comments to the OBB computation * Minor refactor Mostly comments and function+argument names * Handle terrain in globe OBB generation * Fix failing unit tests * Add OBB unit tests * Remove obb-debug page * Shorten camera frustum to not extend far beyond the horizon clipping plane * Fix obb-frustum test * Use a general convex bounding volume * Frustum debug example * Refactor names and update tests * Update build size * Add changelog entry * Delete frustum debug webpage * Optimize convex volume - frustum test * Update build size * Include NathanMOlson's unit tests from PR 5835 * Fix failing tests * Break up primitives.test.ts into multiple files * Minor refactor * Fix changelog * Add mercator covering tiles benchmark * Rename prepareNextFrame to swapBuffers * Remove generic CoveringTilesDetailsProviderImplementation interface * Return early from isTileVisible * Add threePlaneIntersection tests * Improve frustum creation + code review fixes * Split up frustum creation function * Fix constants in frustum.ts --- CHANGELOG.md | 1 + src/geo/projection/covering_tiles.test.ts | 195 +++++++++++++- src/geo/projection/covering_tiles.ts | 20 +- .../covering_tiles_details_provider.ts | 12 +- .../projection/globe_covering_tiles.test.ts | 77 +++++- .../globe_covering_tiles_details_provider.ts | 243 +++++++++++++----- src/geo/projection/globe_transform.ts | 4 +- ...ercator_covering_tiles_details_provider.ts | 8 +- .../vertical_perspective_transform.ts | 2 +- .../{primitives.test.ts => aabb.test.ts} | 62 +---- src/util/primitives/aabb.ts | 9 +- src/util/primitives/aabb_cache.ts | 53 ---- src/util/primitives/bounding_volume.ts | 21 ++ ....test.ts => bounding_volume_cache.test.ts} | 54 ++-- src/util/primitives/bounding_volume_cache.ts | 52 ++++ src/util/primitives/convex_volume.test.ts | 110 ++++++++ src/util/primitives/convex_volume.ts | 175 +++++++++++++ src/util/primitives/frustum.test.ts | 41 +++ src/util/primitives/frustum.ts | 141 +++++++++- src/util/test/util.ts | 19 +- src/util/util.test.ts | 87 ++++++- src/util/util.ts | 42 ++- .../benchmarks/covering_tiles_mercator.ts | 29 +++ test/bench/versions/index.ts | 3 + test/build/min.test.ts | 2 +- 25 files changed, 1197 insertions(+), 265 deletions(-) rename src/util/primitives/{primitives.test.ts => aabb.test.ts} (70%) delete mode 100644 src/util/primitives/aabb_cache.ts create mode 100644 src/util/primitives/bounding_volume.ts rename src/util/primitives/{aabb_cache.test.ts => bounding_volume_cache.test.ts} (65%) create mode 100644 src/util/primitives/bounding_volume_cache.ts create mode 100644 src/util/primitives/convex_volume.test.ts create mode 100644 src/util/primitives/convex_volume.ts create mode 100644 src/util/primitives/frustum.test.ts create mode 100644 test/bench/benchmarks/covering_tiles_mercator.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 070e74af18e..1f314a6258c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ### ✨ Features and improvements - Add `setGlobalStateProperty()` and `getGlobalState()` to the map public API ([#5613](https://github.com/maplibre/maplibre-gl-js/pull/5613)) +- Improve tile frustum culling for globe, leading to better performance and faster loading times. ([#5865](https://github.com/maplibre/maplibre-gl-js/pull/5865)) - _...Add new stuff here..._ ### 🐞 Bug fixes diff --git a/src/geo/projection/covering_tiles.test.ts b/src/geo/projection/covering_tiles.test.ts index ef72d358bbd..7c6ef4b6f35 100644 --- a/src/geo/projection/covering_tiles.test.ts +++ b/src/geo/projection/covering_tiles.test.ts @@ -65,11 +65,7 @@ describe('coveringTiles', () => { new OverscaledTileID(3, 0, 3, 2, 3), new OverscaledTileID(3, 0, 3, 2, 4), new OverscaledTileID(3, 0, 3, 5, 3), - new OverscaledTileID(3, 0, 3, 5, 4), - new OverscaledTileID(3, 0, 3, 2, 2), - new OverscaledTileID(3, 0, 3, 2, 5), - new OverscaledTileID(3, 0, 3, 5, 2), - new OverscaledTileID(3, 0, 3, 5, 5), + new OverscaledTileID(3, 0, 3, 5, 4) ]); }); @@ -89,7 +85,7 @@ describe('coveringTiles', () => { new OverscaledTileID(6, 0, 6, 32, 31), new OverscaledTileID(6, 0, 6, 31, 31), new OverscaledTileID(10, 0, 10, 511, 512), - new OverscaledTileID(10, 0, 10, 512, 512) + new OverscaledTileID(10, 0, 10, 512, 512), ]); }); @@ -108,10 +104,8 @@ describe('coveringTiles', () => { expect(tiles).toEqual([ new OverscaledTileID(7, 0, 7, 64, 64), - new OverscaledTileID(7, 0, 7, 65, 63), new OverscaledTileID(7, 0, 7, 64, 63), new OverscaledTileID(7, 0, 7, 63, 63), - new OverscaledTileID(7, 0, 7, 64, 62), new OverscaledTileID(10, 0, 10, 510, 512), new OverscaledTileID(10, 0, 10, 511, 512), new OverscaledTileID(10, 0, 10, 511, 513) @@ -171,6 +165,101 @@ describe('coveringTiles', () => { new OverscaledTileID(0, 0, 0, 0, 0) ]); }); + + test('zoom = 11', () => { + const transform = new GlobeTransform(); + transform.resize(128, 128); + transform.setZoom(11); + transform.setPitch(0); + transform.setCenter(new LngLat(-179.73, -0.087)); + + const tiles = coveringTiles(transform, { + tileSize: 512, + minzoom: 0, + maxzoom: 15, + reparseOverscaled: true + }); + + expect(tiles).toEqual([ + new OverscaledTileID(11, 0, 11, 1, 1024) + ]); + }); + + test('zoom = 11, mid lat', () => { + const transform = new GlobeTransform(); + transform.resize(128, 128); + transform.setZoom(11); + transform.setPitch(0); + transform.setCenter(new LngLat(-179.73, 60.02)); + + const tiles = coveringTiles(transform, { + tileSize: 512, + minzoom: 0, + maxzoom: 15, + reparseOverscaled: true + }); + + expect(tiles).toEqual([ + new OverscaledTileID(11, 0, 11, 1, 594) + ]); + }); + + test('zoom = 11, high lat', () => { + const transform = new GlobeTransform(); + transform.resize(128, 128); + transform.setZoom(11); + transform.setPitch(0); + transform.setCenter(new LngLat(-179.73, 85.028)); + + const tiles = coveringTiles(transform, { + tileSize: 512, + minzoom: 0, + maxzoom: 15, + reparseOverscaled: true + }); + + expect(tiles).toEqual([ + new OverscaledTileID(11, 0, 11, 1, 1) + ]); + }); + + test('zoom = 11, mid lat, mid lng', () => { + const transform = new GlobeTransform(); + transform.resize(128, 128); + transform.setZoom(11); + transform.setPitch(0); + transform.setCenter(new LngLat(-58.97, 60.02)); + + const tiles = coveringTiles(transform, { + tileSize: 512, + minzoom: 0, + maxzoom: 15, + reparseOverscaled: true + }); + + expect(tiles).toEqual([ + new OverscaledTileID(11, 0, 11, 688, 594) + ]); + }); + + test('zoom = 11, mid lng', () => { + const transform = new GlobeTransform(); + transform.resize(128, 128); + transform.setZoom(11); + transform.setPitch(0); + transform.setCenter(new LngLat(-58.97, -0.087)); + + const tiles = coveringTiles(transform, { + tileSize: 512, + minzoom: 0, + maxzoom: 15, + reparseOverscaled: true + }); + + expect(tiles).toEqual([ + new OverscaledTileID(11, 0, 11, 688, 1024) + ]); + }); }); describe('mercator', () => { @@ -451,6 +540,96 @@ describe('coveringTiles', () => { new OverscaledTileID(0, 0, 0, 0, 0) ]); }); + + test('z11', () => { + const options = { + minzoom: 1, + maxzoom: 15, + tileSize: 512, + reparseOverscaled: true + }; + + const transform = new MercatorTransform(0, 15, 0, 85, true); + transform.resize(128, 128); + transform.setZoom(11); + transform.setCenter(new LngLat(-179.73, -0.087)); + + expect(coveringTiles(transform, options)).toEqual([ + new OverscaledTileID(11, 0, 11, 1, 1024) + ]); + }); + + test('z11, mid lat', () => { + const options = { + minzoom: 1, + maxzoom: 15, + tileSize: 512, + reparseOverscaled: true + }; + + const transform = new MercatorTransform(0, 15, 0, 85, true); + transform.resize(128, 128); + transform.setZoom(11); + transform.setCenter(new LngLat(-179.73, 60.02)); + + expect(coveringTiles(transform, options)).toEqual([ + new OverscaledTileID(11, 0, 11, 1, 594) + ]); + }); + + test('z11, high lat', () => { + const options = { + minzoom: 1, + maxzoom: 15, + tileSize: 512, + reparseOverscaled: true + }; + + const transform = new MercatorTransform(0, 15, 0, 85, true); + transform.resize(128, 128); + transform.setZoom(11); + transform.setCenter(new LngLat(-179.73, 85.028)); + + expect(coveringTiles(transform, options)).toEqual([ + new OverscaledTileID(11, 0, 11, 1, 1) + ]); + }); + + test('z11, mid lat, mid lng', () => { + const options = { + minzoom: 1, + maxzoom: 15, + tileSize: 512, + reparseOverscaled: true + }; + + const transform = new MercatorTransform(0, 15, 0, 85, true); + transform.resize(128, 128); + transform.setZoom(11); + transform.setCenter(new LngLat(-58.97, 60.02)); + + expect(coveringTiles(transform, options)).toEqual([ + new OverscaledTileID(11, 0, 11, 688, 594) + ]); + }); + + test('z11, low lat, mid lng', () => { + const options = { + minzoom: 1, + maxzoom: 15, + tileSize: 512, + reparseOverscaled: true + }; + + const transform = new MercatorTransform(0, 15, 0, 85, true); + transform.resize(128, 128); + transform.setZoom(11); + transform.setCenter(new LngLat(-58.97, -0.087)); + + expect(coveringTiles(transform, options)).toEqual([ + new OverscaledTileID(11, 0, 11, 688, 1024) + ]); + }); }); }); diff --git a/src/geo/projection/covering_tiles.ts b/src/geo/projection/covering_tiles.ts index 831f5b6ade4..54502e72b62 100644 --- a/src/geo/projection/covering_tiles.ts +++ b/src/geo/projection/covering_tiles.ts @@ -2,12 +2,12 @@ import {OverscaledTileID} from '../../source/tile_id'; import {vec2, type vec4} from 'gl-matrix'; import {MercatorCoordinate} from '../mercator_coordinate'; import {degreesToRadians, scaleZoom} from '../../util/util'; -import {type Aabb, IntersectionResult} from '../../util/primitives/aabb'; import type {IReadonlyTransform} from '../transform_interface'; import type {Terrain} from '../../render/terrain'; import type {Frustum} from '../../util/primitives/frustum'; import {maxMercatorHorizonAngle} from './mercator_utils'; +import {type IBoundingVolume, IntersectionResult} from '../../util/primitives/bounding_volume'; type CoveringTilesResult = { tileID: OverscaledTileID; @@ -79,15 +79,14 @@ export type CalculateTileZoomFunction = (requestedCenterZoom: number, * A simple/heuristic function that returns whether the tile is visible under the current transform. * @returns an {@link IntersectionResult}. */ -export function isTileVisible(frustum: Frustum, aabb: Aabb, plane?: vec4): IntersectionResult { - - const frustumTest = aabb.intersectsFrustum(frustum); - if (!plane) { +export function isTileVisible(frustum: Frustum, tileBoundingVolume: IBoundingVolume, plane?: vec4): IntersectionResult { + const frustumTest = tileBoundingVolume.intersectsFrustum(frustum); + if (!plane || frustumTest === IntersectionResult.None) { return frustumTest; } - const planeTest = aabb.intersectsPlane(plane); + const planeTest = tileBoundingVolume.intersectsPlane(plane); - if (frustumTest === IntersectionResult.None || planeTest === IntersectionResult.None) { + if (planeTest === IntersectionResult.None) { return IntersectionResult.None; } @@ -97,6 +96,7 @@ export function isTileVisible(frustum: Frustum, aabb: Aabb, plane?: vec4): Inter return IntersectionResult.Partial; } + /** * Definite integral of cos(x)^p. The analytical solution is described in `developer-guides/covering-tiles.md`, * but here the integral is evaluated numerically. @@ -231,11 +231,11 @@ export function coveringTiles(transform: IReadonlyTransform, options: CoveringTi const y = it.y; let fullyVisible = it.fullyVisible; const tileID = {x, y, z: it.zoom}; - const aabb = detailsProvider.getTileAABB(tileID, it.wrap, transform.elevation, options); + const boundingVolume = detailsProvider.getTileBoundingVolume(tileID, it.wrap, transform.elevation, options); // Visibility of a tile is not required if any of its ancestor is fully visible if (!fullyVisible) { - const intersectResult = isTileVisible(frustum, aabb, plane); + const intersectResult = isTileVisible(frustum, boundingVolume, plane); if (intersectResult === IntersectionResult.None) continue; @@ -243,7 +243,7 @@ export function coveringTiles(transform: IReadonlyTransform, options: CoveringTi fullyVisible = intersectResult === IntersectionResult.Full; } - const distToTile2d = detailsProvider.distanceToTile2d(cameraCoord.x, cameraCoord.y, tileID, aabb); + const distToTile2d = detailsProvider.distanceToTile2d(cameraCoord.x, cameraCoord.y, tileID, boundingVolume); let thisTileDesiredZ = desiredZ; if (allowVariableZoom) { diff --git a/src/geo/projection/covering_tiles_details_provider.ts b/src/geo/projection/covering_tiles_details_provider.ts index 9c962433c73..c9cfec03139 100644 --- a/src/geo/projection/covering_tiles_details_provider.ts +++ b/src/geo/projection/covering_tiles_details_provider.ts @@ -1,4 +1,4 @@ -import {type Aabb} from '../../util/primitives/aabb'; +import {type IBoundingVolume} from '../../util/primitives/bounding_volume'; import {type MercatorCoordinate} from '../mercator_coordinate'; import {type IReadonlyTransform} from '../transform_interface'; import {type CoveringTilesOptions} from './covering_tiles'; @@ -9,9 +9,9 @@ export interface CoveringTilesDetailsProvider { * @param pointX - point x. * @param pointY - point y. * @param tileID - Tile x, y and z for zoom. - * @param aabb - tile AABB + * @param boundingVolume - tile bounding volume */ - distanceToTile2d: (pointX: number, pointY: number, tileID: {x: number; y: number; z: number}, aabb: Aabb) => number; + distanceToTile2d: (pointX: number, pointY: number, tileID: {x: number; y: number; z: number}, boundingVolume: IBoundingVolume) => number; /** * Returns the wrap value for a given tile. @@ -19,13 +19,13 @@ export interface CoveringTilesDetailsProvider { getWrap: (centerCoord: MercatorCoordinate, tileID: {x:number; y: number; z: number}, parentWrap: number) => number; /** - * Returns the AABB of the specified tile. + * Returns the bounding volume of the specified tile. * @param tileID - Tile x, y and z for zoom. * @param wrap - wrap number of the tile. * @param elevation - camera center point elevation. * @param options - CoveringTilesOptions. */ - getTileAABB: (tileID: {x: number; y: number; z: number}, wrap: number, elevation: number, options: CoveringTilesOptions) => Aabb; + getTileBoundingVolume: (tileID: {x: number; y: number; z: number}, wrap: number, elevation: number, options: CoveringTilesOptions) => IBoundingVolume; /** * Whether to allow variable zoom, which is used at high pitch angle to avoid loading an excessive amount of tiles. @@ -40,5 +40,5 @@ export interface CoveringTilesDetailsProvider { /** * Prepare cache for the next frame. */ - recalculateCache(): void; + prepareNextFrame(): void; } diff --git a/src/geo/projection/globe_covering_tiles.test.ts b/src/geo/projection/globe_covering_tiles.test.ts index 62155ff7489..175d8a04fe8 100644 --- a/src/geo/projection/globe_covering_tiles.test.ts +++ b/src/geo/projection/globe_covering_tiles.test.ts @@ -1,17 +1,17 @@ import {describe, expect, test} from 'vitest'; -import {Aabb} from '../../util/primitives/aabb'; import {expectToBeCloseToArray} from '../../util/test/util'; import {GlobeCoveringTilesDetailsProvider} from './globe_covering_tiles_details_provider'; +import {ConvexVolume} from '../../util/primitives/convex_volume'; -describe('aabb creation', () => { +describe('bounding volume creation', () => { test('z=0', () => { const detailsProvider = new GlobeCoveringTilesDetailsProvider(); - const aabb = detailsProvider.getTileAABB({ + const convex = detailsProvider.getTileBoundingVolume({ x: 0, y: 0, z: 0, }, null, null, null); - expect(aabb).toEqual(new Aabb( + expect(convex).toEqual(ConvexVolume.fromAabb( [-1, -1, -1], [1, 1, 1], )); @@ -19,12 +19,12 @@ describe('aabb creation', () => { test('z=1,x=0', () => { const detailsProvider = new GlobeCoveringTilesDetailsProvider(); - const aabb = detailsProvider.getTileAABB({ + const convex = detailsProvider.getTileBoundingVolume({ x: 0, y: 0, z: 1, }, null, null, null); - expect(aabb).toEqual(new Aabb( + expect(convex).toEqual(ConvexVolume.fromAabb( [-1, 0, -1], [0, 1, 1], )); @@ -32,25 +32,74 @@ describe('aabb creation', () => { test('z=1,x=1', () => { const detailsProvider = new GlobeCoveringTilesDetailsProvider(); - const aabb = detailsProvider.getTileAABB({ + const convex = detailsProvider.getTileBoundingVolume({ x: 1, y: 0, z: 1, }, null, null, null); - expect(aabb).toEqual(new Aabb( + expect(convex).toEqual(ConvexVolume.fromAabb( [0, 0, -1], [1, 1, 1], )); }); - test('z=2,x=1', () => { + test('z=5,x=1,y=1', () => { const detailsProvider = new GlobeCoveringTilesDetailsProvider(); - const aabb = detailsProvider.getTileAABB({ + const convex = detailsProvider.getTileBoundingVolume({ x: 1, - y: 0, - z: 2, + y: 1, + z: 5, }, null, null, null); - expectToBeCloseToArray([...aabb.min], [-0.3985368153383868, 0.9171523356672743, -7.321002528698027e-17,]); - expectToBeCloseToArray([...aabb.max], [0, 1, 0.3985368153383868]); + const precision = 10; + const expectedMin = [-0.04878262717137475, 0.9918417649235776, -0.1250257487589308]; + const expectedMax = [-0.020462724105427713, 0.9944839919477184, -0.09690430455523656]; + const expectedPoints = [ + [-0.040144275638466294, 0.9946001124628003, -0.09691685469802916], + [-0.04013795776704037, 0.9944589865528525, -0.09690160200714736], + [-0.02046537424682884, 0.9946001124628002, -0.10288638417221826], + [-0.020462153423906553, 0.9944589865528524, -0.10287019200194392], + [-0.04902182691658952, 0.9919123845540323, -0.11834915939433684], + [-0.049015509045163594, 0.9917712586440846, -0.11833390670345505], + [-0.02499111064168652, 0.9919123845540323, -0.1256387974810376], + [-0.02498788981876423, 0.9917712586440844, -0.12562260531076325] + ]; + const expectedPlanes = [ + [0.033568258567807485, -0.9932912960221243, 0.11065971834147033, 1], + [ + -0.033568258567807485, + 0.9932912960221243, + -0.11065971834147033, + -0.999857920923587 + ], + [ + -0.2883372432854479, + -0.11563909912606864, + -0.9505205062952928, + 0.011318113428480242 + ], + [ + 0.2883372432854479, + 0.11563909912606864, + 0.9505205062952928, + 0.011924266779254289 + ], + [ + 0.9238795325112867, + -3.8143839245115144e-17, + -0.38268343236509017, + 0 + ], + [-0.9807852804032307, 0, 0.19509032201612764, 0] + ]; + expectToBeCloseToArray([...convex.min], expectedMin, precision); + expectToBeCloseToArray([...convex.max], expectedMax, precision); + expect(convex.points).toHaveLength(expectedPoints.length); + for (let i = 0; i < convex.points.length; i++) { + expectToBeCloseToArray([...convex.points[i]], expectedPoints[i], precision); + } + expect(convex.planes).toHaveLength(expectedPlanes.length); + for (let i = 0; i < convex.planes.length; i++) { + expectToBeCloseToArray([...convex.planes[i]], expectedPlanes[i], precision); + } }); }); diff --git a/src/geo/projection/globe_covering_tiles_details_provider.ts b/src/geo/projection/globe_covering_tiles_details_provider.ts index 6359e7a6f04..d01f8305feb 100644 --- a/src/geo/projection/globe_covering_tiles_details_provider.ts +++ b/src/geo/projection/globe_covering_tiles_details_provider.ts @@ -1,12 +1,15 @@ import {EXTENT} from '../../data/extent'; import {projectTileCoordinatesToSphere} from './globe_utils'; -import {Aabb} from '../../util/primitives/aabb'; -import {AabbCache} from '../../util/primitives/aabb_cache'; +import {BoundingVolumeCache} from '../../util/primitives/bounding_volume_cache'; import {coveringZoomLevel, type CoveringTilesOptions} from './covering_tiles'; -import type {vec3} from 'gl-matrix'; +import {vec3, type vec4} from 'gl-matrix'; import type {IReadonlyTransform} from '../transform_interface'; import type {MercatorCoordinate} from '../mercator_coordinate'; import type {CoveringTilesDetailsProvider} from './covering_tiles_details_provider'; +import {OverscaledTileID} from '../../source/tile_id'; +import {earthRadius} from '../lng_lat'; +import {ConvexVolume} from '../../util/primitives/convex_volume'; +import {threePlaneIntersection} from '../../util/util'; /** * Computes distance of a point to a tile in an arbitrary axis. @@ -39,13 +42,13 @@ function distanceToTileWrapX(pointX: number, pointY: number, tileCornerX: number } export class GlobeCoveringTilesDetailsProvider implements CoveringTilesDetailsProvider { - private _aabbCache: AabbCache = new AabbCache(this._computeTileAABB); + private _boundingVolumeCache: BoundingVolumeCache = new BoundingVolumeCache(this._computeTileBoundingVolume); /** - * Prepares the internal AABB cache for the next frame. + * Prepares the internal bounding volume cache for the next frame. */ - recalculateCache() { - this._aabbCache.recalculateCache(); + prepareNextFrame() { + this._boundingVolumeCache.swapBuffers(); } /** @@ -54,7 +57,7 @@ export class GlobeCoveringTilesDetailsProvider implements CoveringTilesDetailsPr * Handles distances on a sphere correctly: X is wrapped when crossing the antimeridian, * when crossing the poles Y is mirrored and X is shifted by half world size. */ - distanceToTile2d(pointX: number, pointY: number, tileID: {x: number; y: number; z: number}, _aabb: Aabb): number { + distanceToTile2d(pointX: number, pointY: number, tileID: {x: number; y: number; z: number}, _bv: ConvexVolume): number { const scale = 1 << tileID.z; const tileMercatorSize = 1.0 / scale; const tileCornerX = tileID.x / scale; // In range 0..1 @@ -101,59 +104,41 @@ export class GlobeCoveringTilesDetailsProvider implements CoveringTilesDetailsPr return false; } - getTileAABB(tileID: { x: number; y: number; z: number }, wrap: number, elevation: number, options: CoveringTilesOptions) { - return this._aabbCache.getTileAABB(tileID, wrap, elevation, options); + getTileBoundingVolume(tileID: { x: number; y: number; z: number }, wrap: number, elevation: number, options: CoveringTilesOptions) { + return this._boundingVolumeCache.getTileBoundingVolume(tileID, wrap, elevation, options); } - private _computeTileAABB(tileID: {x: number; y: number; z: number}, _wrap: number, _elevation: number, _options: CoveringTilesOptions): Aabb { - // We can get away with only checking the 4 tile corners for AABB construction, because for any tile of zoom level 2 or higher - // it holds that the extremes (minimal or maximal value) of X, Y or Z coordinates must lie in one of the tile corners. - // - // To see why this holds, consider the formula for computing X,Y and Z from angular coordinates. - // It goes something like this: - // - // X = sin(lng) * cos(lat) - // Y = sin(lat) - // Z = cos(lng) * cos(lat) - // - // Note that a tile always covers a continuous range of lng and lat values, - // and that tiles that border the mercator north/south edge are assumed to extend all the way to the poles. - // - // We will consider each coordinate separately and show that an extreme must always lie in a tile corner for every axis, and must not lie inside the tile. - // - // For Y, it is clear that the only way for an extreme to not lie on an edge of the lat range is for the range to contain lat=90° or lat=-90° without either being the tile edge. - // This cannot happen for any tile, these latitudes will always: - // - either lie outside the tile entirely, thus Y will be monotonically increasing or decreasing across the entire tile, thus the extreme must lie at a corner/edge - // - or be the tile edge itself, thus the extreme will lie at the tile edge - // - // For X, considering only longitude, the tile would also have to contain lng=90° or lng=-90° (with neither being the tile edge) for the extreme to not lie on a tile edge. - // This can only happen at zoom levels 0 and 1, which are handled separately. - // But X is also scaled by cos(lat)! However, this can only cause an extreme to lie inside the tile if the tile crosses lat=0°, which cannot happen for zoom levels other than 0. - // - // For Z, similarly to X, the extremes must lie at lng=0° or lng=180°, but for zoom levels other than 0 these cannot lie inside the tile. Scaling by cos(lat) has the same effect as with the X axis. - // - // So checking the 4 tile corners only fails for tiles with zoom level <2, and these are handled separately with hardcoded AABBs: - // - zoom level 0 tile is the entire sphere - // - zoom level 1 tiles are "quarters of a sphere" + private _computeTileBoundingVolume(tileID: {x: number; y: number; z: number}, wrap: number, elevation: number, options: CoveringTilesOptions): ConvexVolume { + let minElevation = elevation; + let maxElevation = elevation; + if (options?.terrain) { + const overscaledTileID = new OverscaledTileID(tileID.z, wrap, tileID.z, tileID.x, tileID.y); + const minMax = options.terrain.getMinMaxElevation(overscaledTileID); + minElevation = minMax.minElevation ?? elevation; + maxElevation = minMax.maxElevation ?? elevation; + } + // Convert elevation to distances from center of a unit sphere planet (so that 1 is surface) + minElevation /= earthRadius; + maxElevation /= earthRadius; + minElevation += 1; + maxElevation += 1; if (tileID.z <= 0) { // Tile covers the entire sphere. - return new Aabb( - [-1, -1, -1], - [1, 1, 1] + return ConvexVolume.fromAabb( // We return an AABB in this case. + [-maxElevation, -maxElevation, -maxElevation], + [maxElevation, maxElevation, maxElevation] ); } else if (tileID.z === 1) { // Tile covers a quarter of the sphere. // X is 1 at lng=E90° // Y is 1 at **north** pole // Z is 1 at null island - return new Aabb( - [tileID.x === 0 ? -1 : 0, tileID.y === 0 ? 0 : -1, -1], - [tileID.x === 0 ? 0 : 1, tileID.y === 0 ? 1 : 0, 1] + return ConvexVolume.fromAabb( // We also just use AABBs for this zoom level. + [tileID.x === 0 ? -maxElevation : 0, tileID.y === 0 ? 0 : -maxElevation, -maxElevation], + [tileID.x === 0 ? 0 : maxElevation, tileID.y === 0 ? maxElevation : 0, maxElevation] ); } else { - // Compute AABB using the 4 corners. - const corners = [ projectTileCoordinatesToSphere(0, 0, tileID.x, tileID.y, tileID.z), projectTileCoordinatesToSphere(EXTENT, 0, tileID.x, tileID.y, tileID.z), @@ -161,30 +146,166 @@ export class GlobeCoveringTilesDetailsProvider implements CoveringTilesDetailsPr projectTileCoordinatesToSphere(0, EXTENT, tileID.x, tileID.y, tileID.z), ]; - const min: vec3 = [1, 1, 1]; - const max: vec3 = [-1, -1, -1]; + const extremesPoints = []; for (const c of corners) { - for (let i = 0; i < 3; i++) { - min[i] = Math.min(min[i], c[i]); - max[i] = Math.max(max[i], c[i]); + extremesPoints.push(vec3.scale([] as any, c, maxElevation)); + } + + if (maxElevation !== minElevation) { + // Only add additional points if terrain is enabled and is not flat. + for (const c of corners) { + extremesPoints.push(vec3.scale([] as any, c, minElevation)); } } // Special handling of poles - we need to extend the tile AABB // to include the pole for tiles that border mercator north/south edge. - if (tileID.y === 0 || (tileID.y === (1 << tileID.z) - 1)) { - const pole = [0, tileID.y === 0 ? 1 : -1, 0]; + if (tileID.y === 0) { + extremesPoints.push([0, 1, 0]); // North pole + } + if (tileID.y === (1 << tileID.z) - 1) { + extremesPoints.push([0, -1, 0]); // South pole + } + + // Compute a best-fit AABB for the frustum rejection test + const aabbMin: vec3 = [1, 1, 1]; + const aabbMax: vec3 = [-1, -1, -1]; + + for (const c of extremesPoints) { for (let i = 0; i < 3; i++) { - min[i] = Math.min(min[i], pole[i]); - max[i] = Math.max(max[i], pole[i]); + aabbMin[i] = Math.min(aabbMin[i], c[i]); + aabbMax[i] = Math.max(aabbMax[i], c[i]); } } - return new Aabb( - min, - max - ); + // Now we compute the actual bounding volume. + // The up/down plane will be normal to the tile's center. + // The north/south plane will be used for the tile's north and south edge and will be orthogonal to the up/down plane. + // The left and right planes will be determined by the tile's east/west edges and will differ slightly - we are not creating a box! + // We will find the min and max extents for the up/down and north/south planes using the set of points + // where the extremes are likely to lie. + + // Vector "center" (from planet center to tile center) will be our up/down axis. + const center = projectTileCoordinatesToSphere(EXTENT / 2, EXTENT / 2, tileID.x, tileID.y, tileID.z); + // Vector to the east of "center". + const centerEast = vec3.cross([] as any, [0, 1, 0], center); + vec3.normalize(centerEast, centerEast); + // Vector to the north of "center" will be our north/south axis. + const north = vec3.cross([] as any, center, centerEast); + vec3.normalize(north, north); + + // Axes for the east and west edge of our bounding volume. + // These axes are NOT opposites of each other, they differ! + // They are also not orthogonal to the up/down and north/south axes. + const axisEast = vec3.cross([] as any, corners[2], corners[1]); + vec3.normalize(axisEast, axisEast); + const axisWest = vec3.cross([] as any, corners[0], corners[3]); + vec3.normalize(axisWest, axisWest); + + // Now we will expand the extremes point set for bounding volume creation. + // We will also include the tile center point, since it will always be an extreme for the "center" axis. + extremesPoints.push(vec3.scale([] as any, center, maxElevation)); + // No need to include a minElevation-scaled center, since we already have minElevation corners in the set and these will always lie lower than the center. + + // The extremes might also lie on the midpoint of the north or south edge. + // For tiles in the north hemisphere, only the south edge can contain an extreme, + // since when we imagine the tile's actual shape projected onto the plane normal to "center" vector, + // the tile's north edge will curve towards the tile center, thus its extremes are accounted for by the + // corners, however the south edge will curve away from the center point, extending beyond the tile's edges, + // thus it must be included. + // The poles are an exception - they must always be included in the extremes, if the tile touches the north/south mercator range edge. + // + // A tile's exaggerated shape on the northern hemisphere, projected onto the normal plane of "center". + // The "c" is the tile's center point. The "m" is the edge mid point we are looking for. + // + // /-- --\ + // / ------- \ + // / \ + // / c \ + // / \ + // /-- --\ + // ----- ----- + // ---m--- + + if (tileID.y >= (1 << tileID.z) / 2) { + // South hemisphere - include the tile's north edge midpoint + extremesPoints.push(vec3.scale([] as any, projectTileCoordinatesToSphere(EXTENT / 2, 0, tileID.x, tileID.y, tileID.z), maxElevation)); + // No need to include minElevation variant of this point, for the same reason why we don't include minElevation center. + } + if (tileID.y < (1 << tileID.z) / 2) { + // North hemisphere - include the tile's south edge midpoint + extremesPoints.push(vec3.scale([] as any, projectTileCoordinatesToSphere(EXTENT / 2, EXTENT, tileID.x, tileID.y, tileID.z), maxElevation)); + // No need to include minElevation variant of this point, for the same reason why we don't include minElevation center. + } + + // Find the min and max extends and the midpoints along each axis, + // using the set of extreme points. + const upDownMinMax = findAxisMinMax(center, extremesPoints); + const northSouthMinMax = findAxisMinMax(north, extremesPoints); + + const planeUp = [-center[0], -center[1], -center[2], upDownMinMax.max] as vec4; + const planeDown = [center[0], center[1], center[2], -upDownMinMax.min] as vec4; + const planeNorth = [-north[0], -north[1], -north[2], northSouthMinMax.max] as vec4; + const planeSouth = [north[0], north[1], north[2], -northSouthMinMax.min] as vec4; + const planeEast = [...axisEast, 0] as vec4; + const planeWest = [...axisWest, 0] as vec4; + + const points: vec3[] = []; + + // North points + if (tileID.y === 0) { + // If the tile borders a pole, then + points.push( + threePlaneIntersection(planeWest, planeEast, planeUp), + threePlaneIntersection(planeWest, planeEast, planeDown), + ); + } else { + points.push( + threePlaneIntersection(planeNorth, planeEast, planeUp), + threePlaneIntersection(planeNorth, planeEast, planeDown), + threePlaneIntersection(planeNorth, planeWest, planeUp), + threePlaneIntersection(planeNorth, planeWest, planeDown) + ); + } + + // South points + if (tileID.y === (1 << tileID.z) - 1) { + points.push( + threePlaneIntersection(planeWest, planeEast, planeUp), + threePlaneIntersection(planeWest, planeEast, planeDown), + ); + } else { + points.push( + threePlaneIntersection(planeSouth, planeEast, planeUp), + threePlaneIntersection(planeSouth, planeEast, planeDown), + threePlaneIntersection(planeSouth, planeWest, planeUp), + threePlaneIntersection(planeSouth, planeWest, planeDown) + ); + } + + return new ConvexVolume(points, [ + planeUp, + planeDown, + planeNorth, + planeSouth, + planeEast, + planeWest + ], aabbMin, aabbMax); } } +} + +function findAxisMinMax(axis: vec3, points: vec3[]) { + let min = +Infinity; + let max = -Infinity; + for (const c of points) { + const dot = vec3.dot(axis, c); + min = Math.min(min, dot); + max = Math.max(max, dot); + } + return { + min, + max + }; } \ No newline at end of file diff --git a/src/geo/projection/globe_transform.ts b/src/geo/projection/globe_transform.ts index d2e4a040ab4..76cad853163 100644 --- a/src/geo/projection/globe_transform.ts +++ b/src/geo/projection/globe_transform.ts @@ -230,8 +230,8 @@ export class GlobeTransform implements ITransform { this._globeness = globeness; this._globeLatitudeErrorCorrectionRadians = errorCorrectionValue; this._calcMatrices(); - this._verticalPerspectiveTransform.getCoveringTilesDetailsProvider().recalculateCache(); - this._mercatorTransform.getCoveringTilesDetailsProvider().recalculateCache(); + this._verticalPerspectiveTransform.getCoveringTilesDetailsProvider().prepareNextFrame(); + this._mercatorTransform.getCoveringTilesDetailsProvider().prepareNextFrame(); } private get currentTransform(): ITransform { diff --git a/src/geo/projection/mercator_covering_tiles_details_provider.ts b/src/geo/projection/mercator_covering_tiles_details_provider.ts index 06edf7133ae..7cec7691ae7 100644 --- a/src/geo/projection/mercator_covering_tiles_details_provider.ts +++ b/src/geo/projection/mercator_covering_tiles_details_provider.ts @@ -8,7 +8,7 @@ import {type CoveringTilesDetailsProvider} from './covering_tiles_details_provid export class MercatorCoveringTilesDetailsProvider implements CoveringTilesDetailsProvider { - distanceToTile2d(pointX: number, pointY: number, tileID: {x: number; y: number; z: number}, aabb: Aabb): number { + distanceToTile2d(pointX: number, pointY: number, _tileID: {x: number; y: number; z: number}, aabb: Aabb): number { const distanceX = aabb.distanceX([pointX, pointY]); const distanceY = aabb.distanceY([pointX, pointY]); return Math.hypot(distanceX, distanceY); @@ -25,10 +25,10 @@ export class MercatorCoveringTilesDetailsProvider implements CoveringTilesDetail * Returns the AABB of the specified tile. * @param tileID - Tile x, y and z for zoom. */ - getTileAABB(tileID: {x: number; y: number; z: number}, wrap: number, elevation: number, options: CoveringTilesOptions): Aabb { + getTileBoundingVolume(tileID: {x: number; y: number; z: number}, wrap: number, elevation: number, options: CoveringTilesOptions): Aabb { let minElevation = elevation; let maxElevation = elevation; - if (options.terrain) { + if (options?.terrain) { const overscaledTileID = new OverscaledTileID(tileID.z, wrap, tileID.z, tileID.x, tileID.y); const minMax = options.terrain.getMinMaxElevation(overscaledTileID); minElevation = minMax.minElevation ?? elevation; @@ -49,7 +49,7 @@ export class MercatorCoveringTilesDetailsProvider implements CoveringTilesDetail return true; } - recalculateCache(): void { + prepareNextFrame(): void { // Do nothing } } \ No newline at end of file diff --git a/src/geo/projection/vertical_perspective_transform.ts b/src/geo/projection/vertical_perspective_transform.ts index c4854badfad..821231f5a31 100644 --- a/src/geo/projection/vertical_perspective_transform.ts +++ b/src/geo/projection/vertical_perspective_transform.ts @@ -500,7 +500,7 @@ export class VerticalPerspectiveTransform implements ITransform { const matrix = mat4.clone(this._globeViewProjMatrixNoCorrectionInverted); mat4.scale(matrix, matrix, [1, 1, -1]); - this._cachedFrustum = Frustum.fromInvProjectionMatrix(matrix); + this._cachedFrustum = Frustum.fromInvProjectionMatrix(matrix, 1, 0, this._cachedClippingPlane, true); } calculateFogMatrix(_unwrappedTileID: UnwrappedTileID): mat4 { diff --git a/src/util/primitives/primitives.test.ts b/src/util/primitives/aabb.test.ts similarity index 70% rename from src/util/primitives/primitives.test.ts rename to src/util/primitives/aabb.test.ts index 4bd92283f87..575ac3d042f 100644 --- a/src/util/primitives/primitives.test.ts +++ b/src/util/primitives/aabb.test.ts @@ -1,9 +1,10 @@ import {describe, test, expect} from 'vitest'; -import {mat4, vec3, type vec4} from 'gl-matrix'; -import {Aabb, IntersectionResult} from './aabb'; -import {Frustum} from './frustum'; +import {vec3, type vec4} from 'gl-matrix'; +import {Aabb} from './aabb'; +import {IntersectionResult} from './bounding_volume'; +import {createTestCameraFrustum} from '../test/util'; -describe('primitives', () => { +describe('aabb', () => { test('Create an aabb', () => { const min = vec3.fromValues(0, 0, 0); const max = vec3.fromValues(2, 4, 6); @@ -44,21 +45,6 @@ describe('primitives', () => { expect(aabb.distanceY([-2, -2])).toBe(1); }); - const createTestCameraFrustum = (fovy, aspectRatio, zNear, zFar, elevation, rotation) => { - const proj = new Float64Array(16) as any as mat4; - const invProj = new Float64Array(16) as any as mat4; - - // Note that left handed coordinate space is used where z goes towards the sky. - // Y has to be flipped as well because it's part of the projection/camera matrix used in transform.js - mat4.perspective(proj, fovy, aspectRatio, zNear, zFar); - mat4.scale(proj, proj, [1, -1, 1]); - mat4.translate(proj, proj, [0, 0, elevation]); - mat4.rotateZ(proj, proj, rotation); - mat4.invert(invProj, proj); - - return Frustum.fromInvProjectionMatrix(invProj, 1.0, 0.0); - }; - test('Aabb fully inside a frustum', () => { const frustum = createTestCameraFrustum(Math.PI / 2, 1.0, 0.1, 100.0, -5, 0); @@ -158,41 +144,3 @@ describe('primitives', () => { expect(new Aabb([-1, -1, -1], [0, 0, 0]).intersectsPlane([-1, -1, -1, -0.00000001])).toBe(IntersectionResult.Partial); }); }); - -describe('frustum', () => { - test('Create a frustum from inverse projection matrix', () => { - const proj = new Float64Array(16) as any as mat4; - const invProj = new Float64Array(16) as any as mat4; - mat4.perspective(proj, Math.PI / 2, 1.0, 0.1, 100.0); - mat4.invert(invProj, proj); - - const frustum = Frustum.fromInvProjectionMatrix(invProj, 1.0, 0.0); - // mat4.perspective generates a projection matrix for right handed coordinate space. - // This means that forward direction will be -z - const expectedFrustumPoints = [ - [-0.1, 0.1, -0.1, 1.0], - [0.1, 0.1, -0.1, 1.0], - [0.1, -0.1, -0.1, 1.0], - [-0.1, -0.1, -0.1, 1.0], - [-100.0, 100.0, -100.0, 1.0], - [100.0, 100.0, -100.0, 1.0], - [100.0, -100.0, -100.0, 1.0], - [-100.0, -100.0, -100.0, 1.0], - ]; - - frustum.points = frustum.points.map(array => array.map(n => Math.round(n * 10) / 10)) as vec4[]; - frustum.planes = frustum.planes.map(array => array.map(n => Math.round(n * 1000) / 1000)) as vec4[]; - - const expectedFrustumPlanes = [ - [0, 0, 1.0, 0.1], - [-0, -0, -1.0, -100.0], - [-0.707, 0, 0.707, -0], - [0.707, 0, 0.707, -0], - [0, -0.707, 0.707, -0], - [-0, 0.707, 0.707, -0] - ]; - - expect(frustum.points).toEqual(expectedFrustumPoints); - expect(frustum.planes).toEqual(expectedFrustumPlanes); - }); -}); diff --git a/src/util/primitives/aabb.ts b/src/util/primitives/aabb.ts index 5ae7cde5857..7d7aa28552c 100644 --- a/src/util/primitives/aabb.ts +++ b/src/util/primitives/aabb.ts @@ -1,13 +1,8 @@ import {vec3, type vec4} from 'gl-matrix'; import {type Frustum} from './frustum'; +import {IntersectionResult, type IBoundingVolume} from './bounding_volume'; -export const enum IntersectionResult { - None = 0, - Partial = 1, - Full = 2, -} - -export class Aabb { +export class Aabb implements IBoundingVolume { min: vec3; max: vec3; center: vec3; diff --git a/src/util/primitives/aabb_cache.ts b/src/util/primitives/aabb_cache.ts deleted file mode 100644 index 276050c901d..00000000000 --- a/src/util/primitives/aabb_cache.ts +++ /dev/null @@ -1,53 +0,0 @@ -import {type CoveringTilesOptions} from '../../geo/projection/covering_tiles'; -import {type Aabb} from './aabb'; - -type AabbFactory = (tileID: {x: number; y: number; z: number}, wrap: number, elevation: number, options: CoveringTilesOptions) => Aabb; - -export class AabbCache { - private _cachePrevious: Map = new Map(); - private _cache: Map = new Map(); - private _hadAnyChanges = false; - private _aabbFactory: AabbFactory; - - constructor(aabbFactory: AabbFactory) { - this._aabbFactory = aabbFactory; - } - - /** - * Prepares AABB cache for next frame. Call at the beginning of a frame. - * Any tile accesses in the last frame is kept in the cache, other tiles are deleted. - * @returns - */ - recalculateCache() { - if (!this._hadAnyChanges) { - // If no new boxes were added this frame, no need to conserve memory, do not clear caches. - return; - } - const oldCache = this._cachePrevious; - this._cachePrevious = this._cache; - this._cache = oldCache; - this._cache.clear(); - this._hadAnyChanges = false; - } - - /** - * Returns the AABB of the specified tile, fetching it from cache or creating it using the factory function if needed. - * @param tileID - Tile x, y and z for zoom. - */ - getTileAABB(tileID: {x: number; y: number; z: number}, wrap: number, elevation: number, options: CoveringTilesOptions): Aabb { - const key = `${tileID.z}_${tileID.x}_${tileID.y}`; - const cached = this._cache.get(key); - if (cached) { - return cached; - } - const cachedPrevious = this._cachePrevious.get(key); - if (cachedPrevious) { - this._cache.set(key, cachedPrevious); - return cachedPrevious; - } - const aabb = this._aabbFactory(tileID, wrap, elevation, options); - this._cache.set(key, aabb); - this._hadAnyChanges = true; - return aabb; - } -} diff --git a/src/util/primitives/bounding_volume.ts b/src/util/primitives/bounding_volume.ts new file mode 100644 index 00000000000..bcd0b460fb5 --- /dev/null +++ b/src/util/primitives/bounding_volume.ts @@ -0,0 +1,21 @@ +import {type vec4} from 'gl-matrix'; +import {type Frustum} from './frustum'; + +export const enum IntersectionResult { + None = 0, + Partial = 1, + Full = 2, +} + +export interface IBoundingVolume { + /** + * Performs an intersection test with a frustum. + */ + intersectsFrustum(frustum: Frustum): IntersectionResult; + + /** + * Performs an intersection test with a half-space defined by a plane equation. + * The half-space is assumed to lie on the positive side of the plane. + */ + intersectsPlane(plane: vec4): IntersectionResult; +} diff --git a/src/util/primitives/aabb_cache.test.ts b/src/util/primitives/bounding_volume_cache.test.ts similarity index 65% rename from src/util/primitives/aabb_cache.test.ts rename to src/util/primitives/bounding_volume_cache.test.ts index db81489842e..6e45f71c5b4 100644 --- a/src/util/primitives/aabb_cache.test.ts +++ b/src/util/primitives/bounding_volume_cache.test.ts @@ -1,71 +1,71 @@ import {describe, expect, test} from 'vitest'; import {GlobeCoveringTilesDetailsProvider} from '../../geo/projection/globe_covering_tiles_details_provider'; -describe('aabb cache', () => { - test('retains aabbs from last frame', () => { +describe('bounding volume cache', () => { + test('retains bounding volumes from last frame', () => { const detailsProvider = new GlobeCoveringTilesDetailsProvider(); - const aabb1a = detailsProvider.getTileAABB({ + const box1a = detailsProvider.getTileBoundingVolume({ x: 0, y: 0, z: 1, }, null, null, null); - detailsProvider.recalculateCache(); - const aabb1b = detailsProvider.getTileAABB({ + detailsProvider.prepareNextFrame(); + const box1b = detailsProvider.getTileBoundingVolume({ x: 0, y: 0, z: 1, }, null, null, null); - expect(aabb1a).toBe(aabb1b); // Test reference equality + expect(box1a).toBe(box1b); // Test reference equality }); - test('clears no longer used aabbs', () => { + test('clears no longer used bounding volumes', () => { const detailsProvider = new GlobeCoveringTilesDetailsProvider(); // Get 1+2+3 - const box1a = detailsProvider.getTileAABB({ + const box1a = detailsProvider.getTileBoundingVolume({ x: 0, y: 0, z: 1, }, null, null, null); - const box2a = detailsProvider.getTileAABB({ + const box2a = detailsProvider.getTileBoundingVolume({ x: 1, y: 0, z: 1, }, null, null, null); - const box3a = detailsProvider.getTileAABB({ + const box3a = detailsProvider.getTileBoundingVolume({ x: 0, y: 1, z: 1, }, null, null, null); - detailsProvider.recalculateCache(); + detailsProvider.prepareNextFrame(); // Get 2+3+4 - const box2b = detailsProvider.getTileAABB({ + const box2b = detailsProvider.getTileBoundingVolume({ x: 1, y: 0, z: 1, }, null, null, null); - const box3b = detailsProvider.getTileAABB({ + const box3b = detailsProvider.getTileBoundingVolume({ x: 0, y: 1, z: 1, }, null, null, null); - const box4b = detailsProvider.getTileAABB({ + const box4b = detailsProvider.getTileBoundingVolume({ x: 1, y: 1, z: 1, }, null, null, null); - detailsProvider.recalculateCache(); + detailsProvider.prepareNextFrame(); // Get 1+3+4 - const box1c = detailsProvider.getTileAABB({ + const box1c = detailsProvider.getTileBoundingVolume({ x: 0, y: 0, z: 1, }, null, null, null); - const box3c = detailsProvider.getTileAABB({ + const box3c = detailsProvider.getTileBoundingVolume({ x: 0, y: 1, z: 1, }, null, null, null); - const box4c = detailsProvider.getTileAABB({ + const box4c = detailsProvider.getTileBoundingVolume({ x: 1, y: 1, z: 1, @@ -87,41 +87,41 @@ describe('aabb cache', () => { test('does not clear cache if no new box was added', () => { const detailsProvider = new GlobeCoveringTilesDetailsProvider(); // Get 1+2+3 - const box1a = detailsProvider.getTileAABB({ + const box1a = detailsProvider.getTileBoundingVolume({ x: 0, y: 0, z: 1, }, null, null, null); - const box2a = detailsProvider.getTileAABB({ + const box2a = detailsProvider.getTileBoundingVolume({ x: 1, y: 0, z: 1, }, null, null, null); - const box3a = detailsProvider.getTileAABB({ + const box3a = detailsProvider.getTileBoundingVolume({ x: 0, y: 1, z: 1, }, null, null, null); - detailsProvider.recalculateCache(); + detailsProvider.prepareNextFrame(); // Get 2+3 - const box2b = detailsProvider.getTileAABB({ + const box2b = detailsProvider.getTileBoundingVolume({ x: 1, y: 0, z: 1, }, null, null, null); - const box3b = detailsProvider.getTileAABB({ + const box3b = detailsProvider.getTileBoundingVolume({ x: 0, y: 1, z: 1, }, null, null, null); - detailsProvider.recalculateCache(); + detailsProvider.prepareNextFrame(); // Get 1+3 - const box1c = detailsProvider.getTileAABB({ + const box1c = detailsProvider.getTileBoundingVolume({ x: 0, y: 0, z: 1, }, null, null, null); - const box3c = detailsProvider.getTileAABB({ + const box3c = detailsProvider.getTileBoundingVolume({ x: 0, y: 1, z: 1, diff --git a/src/util/primitives/bounding_volume_cache.ts b/src/util/primitives/bounding_volume_cache.ts new file mode 100644 index 00000000000..c6389f4f891 --- /dev/null +++ b/src/util/primitives/bounding_volume_cache.ts @@ -0,0 +1,52 @@ +import {type CoveringTilesOptions} from '../../geo/projection/covering_tiles'; +import {type IBoundingVolume} from './bounding_volume'; + +type BoundingVolumeFactory = (tileID: {x: number; y: number; z: number}, wrap: number, elevation: number, options: CoveringTilesOptions) => T; + +export class BoundingVolumeCache { + private _cachePrevious: Map = new Map(); + private _cache: Map = new Map(); + private _hadAnyChanges = false; + private _boundingVolumeFactory: BoundingVolumeFactory; + + constructor(boundingVolumeFactory: BoundingVolumeFactory) { + this._boundingVolumeFactory = boundingVolumeFactory; + } + + /** + * Prepares bounding volume cache for next frame. Call at the beginning of a frame. + * Bounding volume of any tile accesses in the last frame is kept in the cache, other (unaccessed) bounding volumes are deleted. + */ + swapBuffers() { + if (!this._hadAnyChanges) { + // If no new bounding volumes were added this frame, no need to conserve memory, do not clear caches. + return; + } + const oldCache = this._cachePrevious; + this._cachePrevious = this._cache; + this._cache = oldCache; + this._cache.clear(); + this._hadAnyChanges = false; + } + + /** + * Returns the bounding volume of the specified tile, fetching it from cache or creating it using the factory function if needed. + * @param tileID - Tile x, y and z for zoom. + */ + getTileBoundingVolume(tileID: {x: number; y: number; z: number}, wrap: number, elevation: number, options: CoveringTilesOptions): T { + const key = `${tileID.z}_${tileID.x}_${tileID.y}_${options?.terrain ? 't' : ''}`; + const cached = this._cache.get(key); + if (cached) { + return cached; + } + const cachedPrevious = this._cachePrevious.get(key); + if (cachedPrevious) { + this._cache.set(key, cachedPrevious); + return cachedPrevious; + } + const boundingVolume = this._boundingVolumeFactory(tileID, wrap, elevation, options); + this._cache.set(key, boundingVolume); + this._hadAnyChanges = true; + return boundingVolume; + } +} diff --git a/src/util/primitives/convex_volume.test.ts b/src/util/primitives/convex_volume.test.ts new file mode 100644 index 00000000000..2e20ef4b042 --- /dev/null +++ b/src/util/primitives/convex_volume.test.ts @@ -0,0 +1,110 @@ +import {describe, test, expect} from 'vitest'; +import {mat4, vec3} from 'gl-matrix'; +import {Frustum} from './frustum'; +import {IntersectionResult} from './bounding_volume'; +import {createTestCameraFrustum, expectToBeCloseToArray} from '../test/util'; +import {ConvexVolume} from './convex_volume'; + +describe('convex bounding volume', () => { + describe('fromCenterSizeAngles', () => { + test('translated unit box', () => { + const obb = ConvexVolume.fromCenterSizeAngles([0, 1, 0], [1, 1, 1], [0, 0, 0]); + expect(obb.min).toEqual([-1, 0, -1]); + expect(obb.max).toEqual([1, 2, 1]); + }); + + test('nonuniform box', () => { + const obb = ConvexVolume.fromCenterSizeAngles([0, 0, 0], [1, 2, 3], [0, 0, 0]); + expect(obb.min).toEqual([-1, -2, -3]); + expect(obb.max).toEqual([1, 2, 3]); + }); + + test('translated rotated 90° unit box', () => { + const obb = ConvexVolume.fromCenterSizeAngles([0, 2, 0], [1, 1, 1], [90, 0, 0]); + expectToBeCloseToArray([...obb.min], [-1, 1, -1]); + expectToBeCloseToArray([...obb.max], [1, 3, 1]); + }); + }); + + test('box fully inside a frustum', () => { + const frustum = createTestCameraFrustum(Math.PI / 2, 1.0, 0.1, 100.0, -5, 0); + // Use same boxes as the AABB tests - this will still test the convex volume intersection logic. + const boxList = [ + ConvexVolume.fromAabb(vec3.fromValues(-1, -1, 0), vec3.fromValues(1, 1, 0)), + ConvexVolume.fromAabb(vec3.fromValues(-5, -5, 0), vec3.fromValues(5, 5, 0)), + ConvexVolume.fromAabb(vec3.fromValues(-5, -5, 0), vec3.fromValues(-4, -2, 0)) + ]; + + for (const box of boxList) + expect(box.intersectsFrustum(frustum)).toBe(IntersectionResult.Full); + + }); + + test('box intersecting with a frustum', () => { + const frustum = createTestCameraFrustum(Math.PI / 2, 1.0, 0.1, 100.0, -5, 0); + expect(ConvexVolume.fromAabb(vec3.fromValues(-6, -6, 0), vec3.fromValues(6, 6, 0)).intersectsFrustum(frustum)).toBe(IntersectionResult.Partial); + expect(ConvexVolume.fromAabb(vec3.fromValues(-6, -6, 0), vec3.fromValues(-5, -5, 0)).intersectsFrustum(frustum)).toBe(IntersectionResult.Partial); + }); + + test('No intersection between box and frustum', () => { + const frustum = createTestCameraFrustum(Math.PI / 2, 1.0, 0.1, 100.0, -5, 0); + + const boxList = [ + ConvexVolume.fromAabb(vec3.fromValues(-6, 0, 0), vec3.fromValues(-5.5, 0, 0)), + ConvexVolume.fromAabb(vec3.fromValues(-6, -6, 0), vec3.fromValues(-5.5, -5.5, 0)), + ConvexVolume.fromAabb(vec3.fromValues(7, -10, 0), vec3.fromValues(7.1, 20, 0)) + ]; + + for (const box of boxList) + expect(box.intersectsFrustum(frustum)).toBe(IntersectionResult.None); + + }); + + test('Obb-plane intersection axis-aligned', () => { + const obb = ConvexVolume.fromCenterSizeAngles([0, 0, 0], [1, 1, 1], [0, 0, 0]); + expect(obb.intersectsPlane([1, 0, 0, 1.0001])).toBe(IntersectionResult.Full); + expect(obb.intersectsPlane([1, 0, 0, 0.9999])).toBe(IntersectionResult.Partial); + expect(obb.intersectsPlane([1, 0, 0, 0])).toBe(IntersectionResult.Partial); + expect(obb.intersectsPlane([1, 0, 0, -0.9999])).toBe(IntersectionResult.Partial); + expect(obb.intersectsPlane([1, 0, 0, -1.0001])).toBe(IntersectionResult.None); + }); + + test('Obb-plane intersection rotated plane', () => { + const obb = ConvexVolume.fromCenterSizeAngles([0, 0, 0], [1, 1, 1], [0, 0, 0]); + expect(obb.intersectsPlane([1, 1, 0, 2.0001])).toBe(IntersectionResult.Full); + expect(obb.intersectsPlane([1, 1, 0, 1.9999])).toBe(IntersectionResult.Partial); + expect(obb.intersectsPlane([1, 1, 0, 0])).toBe(IntersectionResult.Partial); + expect(obb.intersectsPlane([1, 1, 0, -1.9999])).toBe(IntersectionResult.Partial); + expect(obb.intersectsPlane([1, 1, 0, -2.0001])).toBe(IntersectionResult.None); + }); + + test('Obb-plane intersection rotated box', () => { + const obb = ConvexVolume.fromCenterSizeAngles([0, 0, 0], [1, 1, 1], [0, 0, 45]); + expect(obb.intersectsPlane([1, 0, 0, 1.4143])).toBe(IntersectionResult.Full); + expect(obb.intersectsPlane([1, 0, 0, 1.4142])).toBe(IntersectionResult.Partial); + expect(obb.intersectsPlane([1, 0, 0, -1.4142])).toBe(IntersectionResult.Partial); + expect(obb.intersectsPlane([1, 0, 0, -1.4143])).toBe(IntersectionResult.None); + }); + + test('Obb-plane intersection rotated plane rotated box', () => { + const obb = ConvexVolume.fromCenterSizeAngles([0, 0, 0], [1, 1, 1], [0, 0, 45]); + expect(obb.intersectsPlane([1, 1, 0, 1.4143])).toBe(IntersectionResult.Full); + expect(obb.intersectsPlane([1, 1, 0, 1.4142])).toBe(IntersectionResult.Partial); + expect(obb.intersectsPlane([1, 1, 0, -1.4142])).toBe(IntersectionResult.Partial); + expect(obb.intersectsPlane([1, 1, 0, -1.4143])).toBe(IntersectionResult.None); + }); + + test('Frustum - large box test', () => { + const proj = new Float64Array(16) as any as mat4; + const invProj = new Float64Array(16) as any as mat4; + mat4.perspective(proj, Math.PI / 2, 1.0, 0.1, 100.0); + mat4.invert(invProj, proj); + + const frustum = Frustum.fromInvProjectionMatrix(invProj, 1.0, 0.0); + + expect(ConvexVolume.fromAabb([-400, 50, -40], [400, 500, 400]).intersectsFrustum(frustum)).toBe(IntersectionResult.None); + expect(ConvexVolume.fromAabb([-400, 101, -400], [400, 500, 400]).intersectsFrustum(frustum)).toBe(IntersectionResult.None); + // Rotated box that lies entirely outside the frustum but intersects its far plane and some side planes as well. + expect(ConvexVolume.fromCenterSizeAngles([0, 200, -200], [1000, 141, 1000], [45, 0, 0]).intersectsFrustum(frustum)).toBe(IntersectionResult.None); + }); +}); diff --git a/src/util/primitives/convex_volume.ts b/src/util/primitives/convex_volume.ts new file mode 100644 index 00000000000..6f02c9b5f93 --- /dev/null +++ b/src/util/primitives/convex_volume.ts @@ -0,0 +1,175 @@ +import {quat, vec3, type vec4} from 'gl-matrix'; +import {type Frustum} from './frustum'; +import {IntersectionResult, type IBoundingVolume} from './bounding_volume'; + +/** + * A general convex bounding volume, defined by a set of points. + */ +export class ConvexVolume implements IBoundingVolume { + // Precomputed AABB for rejecting frustum intersection. + min: vec3; + max: vec3; + + points: vec3[]; + planes: vec4[]; + + /** + * Creates an instance of a general convex bounding volume. + * Note that the provided points array is used *as is*, its contents are not copied! + * + * Additionally, an AABB must be provided for rejecting frustum intersections. + * This AABB does not need to bound this convex volume (it may be smaller), + * but it *must* accurately bound the actual shape this volume is approximating. + * @param points - Points forming the convex shape. Note that this array reference is used *as is*, its contents are not copied! + * @param min - The bounding AABB's min point. + * @param max - The bounding AABB's min point. + */ + constructor(points: vec3[], planes: vec4[], min: vec3, max: vec3) { + this.min = min; + this.max = max; + this.points = points; + this.planes = planes; + } + + /** + * Creates a convex BV equivalent to the specified AABB. + * @param min - The AABB's min point. + * @param max - The AABB's max point. + */ + public static fromAabb(min: vec3, max: vec3): ConvexVolume { + const points = []; + for (let i = 0; i < 8; i++) { + points.push([ + ((i >> 0) & 1) === 1 ? max[0] : min[0], + ((i >> 1) & 1) === 1 ? max[1] : min[1], + ((i >> 2) & 1) === 1 ? max[2] : min[2] + ]); + } + return new ConvexVolume(points, [ + [-1, 0, 0, max[0]], + [1, 0, 0, -min[0]], + [0, -1, 0, max[1]], + [0, 1, 0, -min[1]], + [0, 0, -1, max[2]], + [0, 0, 1, -min[2]] + ], min, max); + } + + /** + * Creates a convex bounding volume that is actually an oriented bounding box created from the specified center, half-size and rotation angles. + * @param center - Center of the OBB. + * @param halfSize - The half-size of the OBB in each axis. The box will extend by this value in each direction for the given axis. + * @param angles - The rotation of the box. Euler angles, in degrees. + */ + public static fromCenterSizeAngles(center: vec3, halfSize: vec3, angles: vec3): ConvexVolume { + const q = quat.fromEuler([] as any, angles[0], angles[1], angles[2]); + const axisX = vec3.transformQuat([] as any, [halfSize[0], 0, 0], q); + const axisY = vec3.transformQuat([] as any, [0, halfSize[1], 0], q); + const axisZ = vec3.transformQuat([] as any, [0, 0, halfSize[2]], q); + // Find the AABB min/max + const min = [...center] as vec3; + const max = [...center] as vec3; + for (let i = 0; i < 8; i++) { + for (let axis = 0; axis < 3; axis++) { + const point = center[axis] + + axisX[axis] * ((((i >> 0) & 1) === 1) ? 1 : -1) + + axisY[axis] * ((((i >> 1) & 1) === 1) ? 1 : -1) + + axisZ[axis] * ((((i >> 2) & 1) === 1) ? 1 : -1); + min[axis] = Math.min(min[axis], point); + max[axis] = Math.max(max[axis], point); + } + } + const points = []; + for (let i = 0; i < 8; i++) { + const p = [...center] as vec3; + vec3.add(p, p, vec3.scale([] as any, axisX, ((i >> 0) & 1) === 1 ? 1 : -1)); + vec3.add(p, p, vec3.scale([] as any, axisY, ((i >> 1) & 1) === 1 ? 1 : -1)); + vec3.add(p, p, vec3.scale([] as any, axisZ, ((i >> 2) & 1) === 1 ? 1 : -1)); + points.push(p); + } + return new ConvexVolume(points, [ + [...axisX, -vec3.dot(axisX, points[0])] as vec4, + [...axisY, -vec3.dot(axisY, points[0])] as vec4, + [...axisZ, -vec3.dot(axisZ, points[0])] as vec4, + [-axisX[0], -axisX[1], -axisX[2], -vec3.dot(axisX, points[7])] as vec4, + [-axisY[0], -axisY[1], -axisY[2], -vec3.dot(axisY, points[7])] as vec4, + [-axisZ[0], -axisZ[1], -axisZ[2], -vec3.dot(axisZ, points[7])] as vec4, + ], min, max); + } + + /** + * Performs an approximate frustum-obb intersection test. + */ + intersectsFrustum(frustum: Frustum): IntersectionResult { + // Performance-critical + let fullyInside = true; + + const boxPointCount = this.points.length; + const boxPlaneCount = this.planes.length; + const frustumPlaneCount = frustum.planes.length; + const frustumPointCount = frustum.points.length; + + // Test whether this volume's points are inside the frustum + for (let i = 0; i < frustumPlaneCount; i++) { + const plane = frustum.planes[i]; + let boxPointsPassed = 0; + for(let j = 0; j < boxPointCount; j++) { + const point = this.points[j]; + // Get point-plane distance sign + if (plane[0] * point[0] + plane[1] * point[1] + plane[2] * point[2] + plane[3] >= 0) { + boxPointsPassed++; + } + } + + if (boxPointsPassed === 0) { + return IntersectionResult.None; + } + if (boxPointsPassed < boxPointCount) { + fullyInside = false; + } + } + + if (fullyInside) { + return IntersectionResult.Full; + } + + // Test whether the frustum's points are inside this volume. + for (let i = 0; i < boxPlaneCount; i++) { + const plane = this.planes[i]; + let frustumPointsPassed = 0; + for (let j = 0; j < frustumPointCount; j++) { + const point = frustum.points[j]; + if (plane[0] * point[0] + plane[1] * point[1] + plane[2] * point[2] + plane[3] >= 0) { + frustumPointsPassed++; + } + } + if (frustumPointsPassed === 0) { + return IntersectionResult.None; + } + } + + return IntersectionResult.Partial; + } + + /** + * Performs an intersection test with a halfspace. + */ + intersectsPlane(plane: vec4): IntersectionResult { + const pointCount = this.points.length; + let positivePoints = 0; + for (let i = 0; i < pointCount; i++) { + const point = this.points[i]; + if (plane[0] * point[0] + plane[1] * point[1] + plane[2] * point[2] + plane[3] >= 0) { + positivePoints++; + } + } + + if (positivePoints === pointCount) { + return IntersectionResult.Full; + } + if (positivePoints === 0) { + return IntersectionResult.None; + } + return IntersectionResult.Partial; + } +} diff --git a/src/util/primitives/frustum.test.ts b/src/util/primitives/frustum.test.ts new file mode 100644 index 00000000000..3c71fad23de --- /dev/null +++ b/src/util/primitives/frustum.test.ts @@ -0,0 +1,41 @@ +import {describe, test, expect} from 'vitest'; +import {mat4, type vec4} from 'gl-matrix'; +import {Frustum} from './frustum'; + +describe('frustum', () => { + test('Create a frustum from inverse projection matrix', () => { + const proj = new Float64Array(16) as any as mat4; + const invProj = new Float64Array(16) as any as mat4; + mat4.perspective(proj, Math.PI / 2, 1.0, 0.1, 100.0); + mat4.invert(invProj, proj); + + const frustum = Frustum.fromInvProjectionMatrix(invProj, 1.0, 0.0); + // mat4.perspective generates a projection matrix for right handed coordinate space. + // This means that forward direction will be -z + const expectedFrustumPoints = [ + [-0.1, 0.1, -0.1, 1.0], + [0.1, 0.1, -0.1, 1.0], + [0.1, -0.1, -0.1, 1.0], + [-0.1, -0.1, -0.1, 1.0], + [-100.0, 100.0, -100.0, 1.0], + [100.0, 100.0, -100.0, 1.0], + [100.0, -100.0, -100.0, 1.0], + [-100.0, -100.0, -100.0, 1.0], + ]; + + frustum.points = frustum.points.map(array => array.map(n => Math.round(n * 10) / 10)) as vec4[]; + frustum.planes = frustum.planes.map(array => array.map(n => Math.round(n * 1000) / 1000)) as vec4[]; + + const expectedFrustumPlanes = [ + [0, 0, 1.0, 0.1], + [-0, -0, -1.0, -100.0], + [-0.707, 0, 0.707, -0], + [0.707, 0, 0.707, -0], + [0, -0.707, 0.707, -0], + [-0, 0.707, 0.707, -0] + ]; + + expect(frustum.points).toEqual(expectedFrustumPoints); + expect(frustum.planes).toEqual(expectedFrustumPlanes); + }); +}); diff --git a/src/util/primitives/frustum.ts b/src/util/primitives/frustum.ts index 488a36b1457..2e7395c64f0 100644 --- a/src/util/primitives/frustum.ts +++ b/src/util/primitives/frustum.ts @@ -1,11 +1,12 @@ import {type mat4, vec3, vec4} from 'gl-matrix'; import {Aabb} from './aabb'; +import {pointPlaneSignedDistance, rayPlaneIntersection} from '../util'; export class Frustum { constructor(public points: vec4[], public planes: vec4[], public aabb: Aabb) { } - public static fromInvProjectionMatrix(invProj: mat4, worldSize: number = 1, zoom: number = 0): Frustum { + public static fromInvProjectionMatrix(invProj: mat4, worldSize: number = 1, zoom: number = 0, horizonPlane?: vec4, flippedNearFar?: boolean): Frustum { const clipSpaceCorners = [ [-1, 1, -1, 1], [1, 1, -1, 1], @@ -17,16 +18,16 @@ export class Frustum { [-1, -1, 1, 1] ]; - const scale = Math.pow(2, zoom); - - // Transform frustum corner points from clip space to tile space, Z to meters - const frustumCoords = clipSpaceCorners.map(v => { - v = vec4.transformMat4([] as any, v as any, invProj) as any; - const s = 1.0 / v[3] / worldSize * scale; - return vec4.mul(v as any, v as any, [s, s, 1.0 / v[3], s] as vec4); - }); - - const frustumPlanePointIndices = [ + // Globe and mercator projection matrices have different Y directions, hence we need different sets of indices. + // This should be fixed in the future. + const frustumPlanePointIndices = flippedNearFar ? [ + [6, 5, 4], // near + [0, 1, 2], // far + [0, 3, 7], // left + [2, 1, 5], // right + [3, 2, 6], // bottom + [0, 4, 5] // top + ] : [ [0, 1, 2], // near [6, 5, 4], // far [0, 3, 7], // left @@ -35,6 +36,16 @@ export class Frustum { [0, 4, 5] // top ]; + const scale = Math.pow(2, zoom); + + // Transform frustum corner points from clip space to tile space, Z to meters + const frustumCoords = clipSpaceCorners.map(v => unprojectClipSpacePoint(v, invProj, worldSize, scale)); + + if (horizonPlane) { + // A horizon clipping plane was supplied. + adjustFarPlaneByHorizonPlane(frustumCoords, frustumPlanePointIndices[0], horizonPlane, flippedNearFar); + } + const frustumPlanes = frustumPlanePointIndices.map((p: number[]) => { const a = vec3.sub([] as any, frustumCoords[p[0]] as vec3, frustumCoords[p[1]] as vec3); const b = vec3.sub([] as any, frustumCoords[p[2]] as vec3, frustumCoords[p[1]] as vec3); @@ -56,3 +67,111 @@ export class Frustum { return new Frustum(frustumCoords, frustumPlanes, new Aabb(min, max)); } } + +function unprojectClipSpacePoint(point: vec4 | number[], invProj: mat4, worldSize: number, scale: number): vec4 { + const v = vec4.transformMat4([] as any, point as any, invProj) as any; + const s = 1.0 / v[3] / worldSize * scale; + return vec4.mul(v as any, v as any, [s, s, 1.0 / v[3], s] as vec4); +} + +/** + * Modifies points in the supplied `frustumCoords` array so that the frustum's far plane only lies as far as the horizon, + * which improves frustum culling effectiveness. + * @param frustumCoords - Points of the frustum. + * @param nearPlanePointsIndices - Which indices in the `frustumCoords` form the near plane. + * @param horizonPlane - The horizon plane. + */ +function adjustFarPlaneByHorizonPlane(frustumCoords: vec4[], nearPlanePointsIndices: number[], horizonPlane: vec4, flippedNearFar: boolean): void { + // For each of the 4 edges from near to far plane, + // we find at which distance these edges intersect the given clipping plane, + // select the maximal value from these distances and then we move + // the frustum's far plane so that it is at most as far away from the near plane + // as this maximal distance. + + const nearPlanePointsOffset = flippedNearFar ? 4 : 0; + const farPlanePointsOffset = flippedNearFar ? 0 : 4; + + let maxDist = 0; + const cornerRayLengths: number[] = []; + const cornerRayNormalizedDirections: vec3[] = []; + for (let i = 0; i < 4; i++) { + const dir = vec3.sub([] as any, frustumCoords[i + farPlanePointsOffset] as vec3, frustumCoords[i + nearPlanePointsOffset] as vec3); + const len = vec3.length(dir); + vec3.scale(dir, dir, 1.0 / len); // normalize + cornerRayLengths.push(len); + cornerRayNormalizedDirections.push(dir); + } + + for (let i = 0; i < 4; i++) { + const dist = rayPlaneIntersection(frustumCoords[i + nearPlanePointsOffset] as vec3, cornerRayNormalizedDirections[i], horizonPlane); + if (dist !== null && dist >= 0) { + maxDist = Math.max(maxDist, dist); + } else { + // Use the original ray length for rays parallel to the horizon plane, or for rays pointing away from it. + maxDist = Math.max(maxDist, cornerRayLengths[i]); + } + } + + // Compute the near plane. + // We use its normal as the "view vector" - direction in which the camera is looking. + const nearPlaneNormalized = getNormalizedNearPlane(frustumCoords, nearPlanePointsIndices); + + // We also try to adjust the far plane position so that it exactly intersects the point on the horizon + // that is most distant from the near plane. + const idealFarPlaneDistanceFromNearPlane = getIdealNearFarPlaneDistance(horizonPlane, nearPlaneNormalized); + if (idealFarPlaneDistanceFromNearPlane !== null) { + const idealCornerRayLength = idealFarPlaneDistanceFromNearPlane / vec3.dot(cornerRayNormalizedDirections[0], nearPlaneNormalized as vec3); // dot(near plane, ray dir) is the same for all 4 corners + maxDist = Math.min(maxDist, idealCornerRayLength); + } + + for (let i = 0; i < 4; i++) { + const targetLength = Math.min(maxDist, cornerRayLengths[i]); + const newPoint = [ + frustumCoords[i + nearPlanePointsOffset][0] + cornerRayNormalizedDirections[i][0] * targetLength, + frustumCoords[i + nearPlanePointsOffset][1] + cornerRayNormalizedDirections[i][1] * targetLength, + frustumCoords[i + nearPlanePointsOffset][2] + cornerRayNormalizedDirections[i][2] * targetLength, + 1, + ] as vec4; + frustumCoords[i + farPlanePointsOffset] = newPoint; + } +} + +/** + * Returns the near plane equation with unit length direction. + * @param frustumCoords - Points of the frustum. + * @param nearPlanePointsIndices - Which indices in the `frustumCoords` form the near plane. + */ +function getNormalizedNearPlane(frustumCoords: vec4[], nearPlanePointsIndices: number[]): vec4 { + const nearPlaneA = vec3.sub([] as any, frustumCoords[nearPlanePointsIndices[0]] as vec3, frustumCoords[nearPlanePointsIndices[1]] as vec3); + const nearPlaneB = vec3.sub([] as any, frustumCoords[nearPlanePointsIndices[2]] as vec3, frustumCoords[nearPlanePointsIndices[1]] as vec3); + const nearPlaneNormalized = [0, 0, 0, 0] as vec4; + vec3.normalize(nearPlaneNormalized as vec3, vec3.cross([] as any, nearPlaneA, nearPlaneB)) as any; + nearPlaneNormalized[3] = -vec3.dot(nearPlaneNormalized as vec3, frustumCoords[nearPlanePointsIndices[0]] as vec3); + return nearPlaneNormalized; +} + +/** + * Returns the ideal distance between the frustum's near and far plane so that the far plane only lies as far as the horizon. + */ +function getIdealNearFarPlaneDistance(horizonPlane: vec4, nearPlaneNormalized: vec4): number | null { + // Normalize the horizon plane to unit direction + const horizonPlaneLen = vec3.len(horizonPlane as vec3); + const normalizedHorizonPlane = vec4.scale([] as any, horizonPlane, 1 / horizonPlaneLen); + + // Project the view vector onto the horizon plane + const projectedViewDirection = vec3.sub([] as any, nearPlaneNormalized as vec3, vec3.scale([] as any, normalizedHorizonPlane as vec3, vec3.dot(nearPlaneNormalized as vec3, normalizedHorizonPlane as vec3))); + const projectedViewLength = vec3.len(projectedViewDirection); + + // projectedViewLength will be 0 if the camera is looking straight down + if (projectedViewLength > 0) { + // Find the radius and center of the horizon circle (the horizon circle is the intersection of the planet's sphere and the horizon plane). + const horizonCircleRadius = Math.sqrt(1 - normalizedHorizonPlane[3] * normalizedHorizonPlane[3]); + const horizonCircleCenter = vec3.scale([] as any, normalizedHorizonPlane as vec3, -normalizedHorizonPlane[3]); // The horizon plane normal always points towards the camera. + // Find the furthest point on the horizon circle from the near plane. + const pointFurthestOnHorizonCircle = vec3.add([] as any, horizonCircleCenter, vec3.scale([] as any, projectedViewDirection, horizonCircleRadius / projectedViewLength)); + // Compute this point's distance from the near plane. + return pointPlaneSignedDistance(nearPlaneNormalized, pointFurthestOnHorizonCircle); + } else { + return null; + } +} diff --git a/src/util/test/util.ts b/src/util/test/util.ts index fec944cd4d6..d97c0b7f8c1 100644 --- a/src/util/test/util.ts +++ b/src/util/test/util.ts @@ -10,6 +10,8 @@ import {RequestManager} from '../request_manager'; import {type IReadonlyTransform, type ITransform} from '../../geo/transform_interface'; import {type Style} from '../../style/style'; import {type Terrain} from '../../render/terrain'; +import {Frustum} from '../primitives/frustum'; +import {mat4} from 'gl-matrix'; export class StubMap extends Evented { style: Style; @@ -261,4 +263,19 @@ export function waitForEvent(evented: Evented, eventName: string, predicate: (e: }; evented.on(eventName, listener); }); -} \ No newline at end of file +} + +export function createTestCameraFrustum(fovy: number, aspectRatio: number, zNear: number, zFar: number, elevation: number, rotation: number): Frustum { + const proj = new Float64Array(16) as any as mat4; + const invProj = new Float64Array(16) as any as mat4; + + // Note that left handed coordinate space is used where z goes towards the sky. + // Y has to be flipped as well because it's part of the projection/camera matrix used in transform.js + mat4.perspective(proj, fovy, aspectRatio, zNear, zFar); + mat4.scale(proj, proj, [1, -1, 1]); + mat4.translate(proj, proj, [0, 0, elevation]); + mat4.rotateZ(proj, proj, rotation); + mat4.invert(invProj, proj); + + return Frustum.fromInvProjectionMatrix(invProj, 1.0, 0.0); +}; diff --git a/src/util/util.test.ts b/src/util/util.test.ts index a2c3a16622c..c68d82e38cc 100644 --- a/src/util/util.test.ts +++ b/src/util/util.test.ts @@ -1,7 +1,9 @@ import {describe, beforeEach, test, expect, vi} from 'vitest'; import Point from '@mapbox/point-geometry'; -import {arraysIntersect, bezier, clamp, clone, deepEqual, easeCubicInOut, extend, filterObject, findLineIntersection, isCounterClockwise, isPowerOfTwo, keysDifference, mapObject, nextPowerOfTwo, parseCacheControl, pick, readImageDataUsingOffscreenCanvas, readImageUsingVideoFrame, uniqueId, wrap, mod, distanceOfAnglesRadians, distanceOfAnglesDegrees, differenceOfAnglesRadians, differenceOfAnglesDegrees, solveQuadratic, remapSaturate, radiansToDegrees, degreesToRadians, rollPitchBearingToQuat, getRollPitchBearing, getAngleDelta, scaleZoom, zoomScale} from './util'; +import {arraysIntersect, bezier, clamp, clone, deepEqual, easeCubicInOut, extend, filterObject, findLineIntersection, isCounterClockwise, isPowerOfTwo, keysDifference, mapObject, nextPowerOfTwo, parseCacheControl, pick, readImageDataUsingOffscreenCanvas, readImageUsingVideoFrame, uniqueId, wrap, mod, distanceOfAnglesRadians, distanceOfAnglesDegrees, differenceOfAnglesRadians, differenceOfAnglesDegrees, solveQuadratic, remapSaturate, radiansToDegrees, degreesToRadians, rollPitchBearingToQuat, getRollPitchBearing, getAngleDelta, scaleZoom, zoomScale, threePlaneIntersection, pointPlaneSignedDistance} from './util'; import {Canvas} from 'canvas'; +import {expectToBeCloseToArray} from './test/util'; +import {vec3, type vec4} from 'gl-matrix'; describe('util', () => { expect(easeCubicInOut(0)).toBe(0); @@ -527,3 +529,86 @@ describe('util scaleZoom and zoomScale relation', () => { expect(scaleZoom(zoomScale(5))).toBe(5); }); }); + +describe('threePlaneIntersection', () => { + const precision = 10; + + function createPlane(origin: number[], direction: number[]): vec4 { + const normalized = vec3.normalize([] as any, direction as vec3); + const dist = vec3.dot(normalized, origin as vec3); + return [normalized[0], normalized[1], normalized[2], -dist]; + } + + test('plane creation helper function', () => { + const origin = [-4, 5, -6]; + const plane = createPlane(origin, [1, 2, 3]); + // Plane direction is normalized + expect(vec3.length([plane[0], plane[1], plane[2]])).toBeCloseTo(1, precision); + // Plane behaves as expected around the origin point + expect(pointPlaneSignedDistance(plane, origin as vec3)).toBe(0); + expect(pointPlaneSignedDistance(plane, [-4 + 1, 5 + 2, -6 + 3] as vec3)).toBeGreaterThan(0); + expect(pointPlaneSignedDistance(plane, [-4 - 1, 5 - 2, -6 - 3] as vec3)).toBeLessThan(0); + }); + + test('three orthogonal planes at origin', () => { + const plane1 = [1, 0, 0, 0] as vec4; + const plane2 = [0, 1, 0, 0] as vec4; + const plane3 = [0, 0, 1, 0] as vec4; + expectToBeCloseToArray([...threePlaneIntersection(plane1, plane2, plane3)], [0, 0, 0], precision); + }); + + test('three translated orthogonal planes', () => { + const plane1 = [1, 0, 0, -3] as vec4; + const plane2 = [0, 1, 0, -4] as vec4; + const plane3 = [0, 0, 1, -5] as vec4; + expectToBeCloseToArray([...threePlaneIntersection(plane1, plane2, plane3)], [3, 4, 5], precision); + }); + + test('three rotated planes at origin', () => { + const origin = [0, 0, 0]; + const plane1 = createPlane(origin, [1, 2, 3]); + const plane2 = createPlane(origin, [-4, 5, 6]); + const plane3 = createPlane(origin, [7, -8, 9]); + expectToBeCloseToArray([...threePlaneIntersection(plane1, plane2, plane3)], origin, precision); + }); + + test('three rotated planes placed arbitrarily', () => { + const origin = [-4, 5, -6]; + const plane1 = createPlane(origin, [1, 2, 3]); + const plane2 = createPlane(origin, [-4, 5, 6]); + const plane3 = createPlane(origin, [7, -8, 9]); + const intersection = threePlaneIntersection(plane1, plane2, plane3); + expect(pointPlaneSignedDistance(plane1, intersection)).toBeCloseTo(0, precision); + expect(pointPlaneSignedDistance(plane2, intersection)).toBeCloseTo(0, precision); + expect(pointPlaneSignedDistance(plane3, intersection)).toBeCloseTo(0, precision); + expectToBeCloseToArray([...intersection], origin, precision); + }); + + test('two parallel planes', () => { + const plane1 = createPlane([0, 0, 0], [1, 0, 0]); + const plane2 = createPlane([1, 0, 0], [1, 0, 0]); + const plane3 = createPlane([1, 0, 0], [0, 1, 0]); + expect(threePlaneIntersection(plane1, plane2, plane3)).toBeNull(); + }); + + test('three parallel planes', () => { + const plane1 = createPlane([0, 0, 0], [1, 0, 0]); + const plane2 = createPlane([1, 0, 0], [1, 0, 0]); + const plane3 = createPlane([2, 0, 0], [1, 0, 0]); + expect(threePlaneIntersection(plane1, plane2, plane3)).toBeNull(); + }); + + test('planes form an infinite triangle wedge', () => { + const plane1 = createPlane([0, 0, 0], [1, 0, 0]); + const plane2 = createPlane([0, 0, 0], [0, 1, 0]); + const plane3 = createPlane([2, 2, 0], [1, 1, 0]); + expect(threePlaneIntersection(plane1, plane2, plane3)).toBeNull(); + }); + + test('planes intersection is a line', () => { + const plane1 = createPlane([0, 0, 0], [1, 0, 0]); + const plane2 = createPlane([0, 0, 0], [0, 1, 0]); + const plane3 = createPlane([0, 0, 0], [1, 1, 0]); + expect(threePlaneIntersection(plane1, plane2, plane3)).toBeNull(); + }); +}); diff --git a/src/util/util.ts b/src/util/util.ts index 3a11817b6c1..efe67235e97 100644 --- a/src/util/util.ts +++ b/src/util/util.ts @@ -3,7 +3,7 @@ import UnitBezier from '@mapbox/unitbezier'; import {isOffscreenCanvasDistorted} from './offscreen_canvas_distorted'; import type {Size} from './image'; import type {WorkerGlobalScopeInterface} from './web_worker'; -import {mat3, mat4, quat, vec2, type vec3, type vec4} from 'gl-matrix'; +import {mat3, mat4, quat, vec2, vec3, type vec4} from 'gl-matrix'; import {pixelsToTileUnits} from '../source/pixels_to_tile_units'; import {type OverscaledTileID} from '../source/tile_id'; import type {Event} from './evented'; @@ -85,6 +85,46 @@ export function pointPlaneSignedDistance( return plane[0] * point[0] + plane[1] * point[1] + plane[2] * point[2] + plane[3]; } +/** + * Finds an intersection points of three planes. Returns `null` if no such (single) point exists. + * The planes *must* be in Hessian normal form - their xyz components must form a unit vector. + */ +export function threePlaneIntersection(plane0: vec4, plane1: vec4, plane2: vec4): vec3 | null { + // https://mathworld.wolfram.com/Plane-PlaneIntersection.html + const det = mat3.determinant([ + plane0[0], plane0[1], plane0[2], + plane1[0], plane1[1], plane1[2], + plane2[0], plane2[1], plane2[2] + ] as mat3); + if (det === 0) { + return null; + } + const cross12 = vec3.cross([] as any, [plane1[0], plane1[1], plane1[2]], [plane2[0], plane2[1], plane2[2]]); + const cross20 = vec3.cross([] as any, [plane2[0], plane2[1], plane2[2]], [plane0[0], plane0[1], plane0[2]]); + const cross01 = vec3.cross([] as any, [plane0[0], plane0[1], plane0[2]], [plane1[0], plane1[1], plane1[2]]); + const sum = vec3.scale([] as any, cross12, -plane0[3]); + vec3.add(sum, sum, vec3.scale([] as any, cross20, -plane1[3])); + vec3.add(sum, sum, vec3.scale([] as any, cross01, -plane2[3])); + vec3.scale(sum, sum, 1.0 / det); + return sum; +} + +/** + * Returns a parameter `t` such that the point obtained by + * `origin + direction * t` lies on the given plane. + * If the ray is parallel to the plane, returns null. + * Returns a negative value if the ray is pointing away from the plane. + * Direction does not need to be normalized. + */ +export function rayPlaneIntersection(origin: vec3, direction: vec3, plane: vec4): number | null { + const dotOriginPlane = origin[0] * plane[0] + origin[1] * plane[1] + origin[2] * plane[2]; + const dotDirectionPlane = direction[0] * plane[0] + direction[1] * plane[1] + direction[2] * plane[2]; + if (dotDirectionPlane === 0) { + return null; + } + return (-dotOriginPlane -plane[3]) / dotDirectionPlane; +} + /** * Solves a quadratic equation in the form ax^2 + bx + c = 0 and returns its roots in no particular order. * Returns null if the equation has no roots or if it has infinitely many roots. diff --git a/test/bench/benchmarks/covering_tiles_mercator.ts b/test/bench/benchmarks/covering_tiles_mercator.ts new file mode 100644 index 00000000000..63bd23d6e9a --- /dev/null +++ b/test/bench/benchmarks/covering_tiles_mercator.ts @@ -0,0 +1,29 @@ +import Benchmark from '../lib/benchmark'; +import {LngLat} from '../styles'; +import {coveringTiles} from '../../../src/geo/projection/covering_tiles'; +import { MercatorTransform } from '../../../src/geo/projection/mercator_transform'; + +export default class CoveringTilesMercator extends Benchmark { + _pitch: number; + + constructor(pitch: number) { + super(); + this._pitch = pitch; + } + + bench() { + const transform = new MercatorTransform(); + transform.setCenter(new LngLat(0, 0)); + transform.setZoom(4); + transform.resize(4096, 4096); + transform.setMaxPitch(this._pitch); + transform.setPitch(this._pitch); + + for (let i = 0; i < 40; i++) { + transform.setCenter(new LngLat(i * 0.2, 0)); + coveringTiles(transform, { + tileSize: 256, + }); + } + } +} diff --git a/test/bench/versions/index.ts b/test/bench/versions/index.ts index 63261f46f7e..35347aadf59 100644 --- a/test/bench/versions/index.ts +++ b/test/bench/versions/index.ts @@ -25,6 +25,7 @@ import SymbolCollisionBox from '../benchmarks/symbol_collision_box'; import Subdivide from '../benchmarks/subdivide'; import LoadMatchingFeature from '../benchmarks/feature_index'; import CoveringTilesGlobe from '../benchmarks/covering_tiles_globe'; +import CoveringTilesMercator from '../benchmarks/covering_tiles_mercator'; const styleLocations = locationsWithTileID(styleBenchmarkLocations.features as GeoJSON.Feature[]).filter(v => v.zoom < 15); // the used maptiler sources have a maxzoom of 14 @@ -83,6 +84,8 @@ register('SymbolCollisionBoxGlobe', new SymbolCollisionBox(true)); register('Subdivide', new Subdivide()); register('CoveringTilesGlobe', new CoveringTilesGlobe(0)); register('CoveringTilesGlobePitched', new CoveringTilesGlobe(60)); +register('CoveringTilesMercator', new CoveringTilesMercator(0)); +register('CoveringTilesMercatorPitched', new CoveringTilesMercator(60)); Promise.resolve().then(() => { // Ensure the global worker pool is never drained. Browsers have resource limits diff --git a/test/build/min.test.ts b/test/build/min.test.ts index 7023b927ed5..2772fd518ba 100644 --- a/test/build/min.test.ts +++ b/test/build/min.test.ts @@ -38,7 +38,7 @@ describe('test min build', () => { const decreaseQuota = 4096; // feel free to update this value after you've checked that it has changed on purpose :-) - const expectedBytes = 927884; + const expectedBytes = 933101; expect(actualBytes).toBeLessThan(expectedBytes + increaseQuota); expect(actualBytes).toBeGreaterThan(expectedBytes - decreaseQuota); From aa7b4509b8995a8ff8a8020fa1468970ccff20bf Mon Sep 17 00:00:00 2001 From: Nathan Date: Tue, 20 May 2025 11:36:26 -0700 Subject: [PATCH 11/19] fix expectedBytes --- test/build/min.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/build/min.test.ts b/test/build/min.test.ts index 2772fd518ba..7172387eaab 100644 --- a/test/build/min.test.ts +++ b/test/build/min.test.ts @@ -38,7 +38,7 @@ describe('test min build', () => { const decreaseQuota = 4096; // feel free to update this value after you've checked that it has changed on purpose :-) - const expectedBytes = 933101; + const expectedBytes = 939057; expect(actualBytes).toBeLessThan(expectedBytes + increaseQuota); expect(actualBytes).toBeGreaterThan(expectedBytes - decreaseQuota); From c4122970d101b3f2e209e5b65ce8b5918adca180 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 May 2025 08:43:38 +0000 Subject: [PATCH 12/19] Bump @types/node from 22.15.19 to 22.15.21 (#5922) Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 22.15.19 to 22.15.21. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-version: 22.15.21 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4ee2612cb29..0899c5ceb57 100644 --- a/package-lock.json +++ b/package-lock.json @@ -58,7 +58,7 @@ "@types/minimist": "^1.2.5", "@types/murmurhash-js": "^1.0.6", "@types/nise": "^1.4.5", - "@types/node": "^22.15.19", + "@types/node": "^22.15.21", "@types/offscreencanvas": "^2019.7.3", "@types/pixelmatch": "^5.2.6", "@types/pngjs": "^6.0.5", @@ -3722,9 +3722,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.15.19", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.19.tgz", - "integrity": "sha512-3vMNr4TzNQyjHcRZadojpRaD9Ofr6LsonZAoQ+HMUa/9ORTPoxVIw0e0mpqWpdjj8xybyCM+oKOUH2vwFu/oEw==", + "version": "22.15.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.21.tgz", + "integrity": "sha512-EV/37Td6c+MgKAbkcLG6vqZ2zEYHD7bvSrzqqs2RIhbA6w3x+Dqz8MZM3sP6kGTeLrdoOgKZe+Xja7tUB2DNkQ==", "dev": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 4d4c8d9348c..8e8c24c57fb 100644 --- a/package.json +++ b/package.json @@ -66,7 +66,7 @@ "@types/minimist": "^1.2.5", "@types/murmurhash-js": "^1.0.6", "@types/nise": "^1.4.5", - "@types/node": "^22.15.19", + "@types/node": "^22.15.21", "@types/offscreencanvas": "^2019.7.3", "@types/pixelmatch": "^5.2.6", "@types/pngjs": "^6.0.5", From 36e88333ea01de3148b8863b14e19ea6d9d7953b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 May 2025 08:44:34 +0000 Subject: [PATCH 13/19] Bump sharp from 0.34.1 to 0.34.2 (#5923) Bumps [sharp](https://github.com/lovell/sharp) from 0.34.1 to 0.34.2. - [Release notes](https://github.com/lovell/sharp/releases) - [Commits](https://github.com/lovell/sharp/compare/v0.34.1...v0.34.2) --- updated-dependencies: - dependency-name: sharp dependency-version: 0.34.2 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 129 +++++++++++++++++++++++++++------------------- package.json | 2 +- 2 files changed, 76 insertions(+), 55 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0899c5ceb57..388957406cb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -114,7 +114,7 @@ "rollup-plugin-sourcemaps2": "^0.5.2", "rw": "^1.3.3", "semver": "^7.7.2", - "sharp": "^0.34.1", + "sharp": "^0.34.2", "shuffle-seed": "^1.1.6", "source-map-explorer": "^2.5.3", "st": "^3.0.1", @@ -1753,9 +1753,9 @@ } }, "node_modules/@img/sharp-darwin-arm64": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.1.tgz", - "integrity": "sha512-pn44xgBtgpEbZsu+lWf2KNb6OAf70X68k+yk69Ic2Xz11zHR/w24/U49XT7AeRwJ0Px+mhALhU5LPci1Aymk7A==", + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.2.tgz", + "integrity": "sha512-OfXHZPppddivUJnqyKoi5YVeHRkkNE2zUFT2gbpKxp/JZCFYEYubnMg+gOp6lWfasPrTS+KPosKqdI+ELYVDtg==", "cpu": [ "arm64" ], @@ -1776,9 +1776,9 @@ } }, "node_modules/@img/sharp-darwin-x64": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.1.tgz", - "integrity": "sha512-VfuYgG2r8BpYiOUN+BfYeFo69nP/MIwAtSJ7/Zpxc5QF3KS22z8Pvg3FkrSFJBPNQ7mmcUcYQFBmEQp7eu1F8Q==", + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.2.tgz", + "integrity": "sha512-dYvWqmjU9VxqXmjEtjmvHnGqF8GrVjM2Epj9rJ6BUIXvk8slvNDJbhGFvIoXzkDhrJC2jUxNLz/GUjjvSzfw+g==", "cpu": [ "x64" ], @@ -1952,9 +1952,9 @@ } }, "node_modules/@img/sharp-linux-arm": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.1.tgz", - "integrity": "sha512-anKiszvACti2sGy9CirTlNyk7BjjZPiML1jt2ZkTdcvpLU1YH6CXwRAZCA2UmRXnhiIftXQ7+Oh62Ji25W72jA==", + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.2.tgz", + "integrity": "sha512-0DZzkvuEOqQUP9mo2kjjKNok5AmnOr1jB2XYjkaoNRwpAYMDzRmAqUIa1nRi58S2WswqSfPOWLNOr0FDT3H5RQ==", "cpu": [ "arm" ], @@ -1975,9 +1975,9 @@ } }, "node_modules/@img/sharp-linux-arm64": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.1.tgz", - "integrity": "sha512-kX2c+vbvaXC6vly1RDf/IWNXxrlxLNpBVWkdpRq5Ka7OOKj6nr66etKy2IENf6FtOgklkg9ZdGpEu9kwdlcwOQ==", + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.2.tgz", + "integrity": "sha512-D8n8wgWmPDakc83LORcfJepdOSN6MvWNzzz2ux0MnIbOqdieRZwVYY32zxVx+IFUT8er5KPcyU3XXsn+GzG/0Q==", "cpu": [ "arm64" ], @@ -1998,9 +1998,9 @@ } }, "node_modules/@img/sharp-linux-s390x": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.1.tgz", - "integrity": "sha512-7s0KX2tI9mZI2buRipKIw2X1ufdTeaRgwmRabt5bi9chYfhur+/C1OXg3TKg/eag1W+6CCWLVmSauV1owmRPxA==", + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.2.tgz", + "integrity": "sha512-EGZ1xwhBI7dNISwxjChqBGELCWMGDvmxZXKjQRuqMrakhO8QoMgqCrdjnAqJq/CScxfRn+Bb7suXBElKQpPDiw==", "cpu": [ "s390x" ], @@ -2021,9 +2021,9 @@ } }, "node_modules/@img/sharp-linux-x64": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.1.tgz", - "integrity": "sha512-wExv7SH9nmoBW3Wr2gvQopX1k8q2g5V5Iag8Zk6AVENsjwd+3adjwxtp3Dcu2QhOXr8W9NusBU6XcQUohBZ5MA==", + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.2.tgz", + "integrity": "sha512-sD7J+h5nFLMMmOXYH4DD9UtSNBD05tWSSdWAcEyzqW8Cn5UxXvsHAxmxSesYUsTOBmUnjtxghKDl15EvfqLFbQ==", "cpu": [ "x64" ], @@ -2044,9 +2044,9 @@ } }, "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.1.tgz", - "integrity": "sha512-DfvyxzHxw4WGdPiTF0SOHnm11Xv4aQexvqhRDAoD00MzHekAj9a/jADXeXYCDFH/DzYruwHbXU7uz+H+nWmSOQ==", + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.2.tgz", + "integrity": "sha512-NEE2vQ6wcxYav1/A22OOxoSOGiKnNmDzCYFOZ949xFmrWZOVII1Bp3NqVVpvj+3UeHMFyN5eP/V5hzViQ5CZNA==", "cpu": [ "arm64" ], @@ -2067,9 +2067,9 @@ } }, "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.1.tgz", - "integrity": "sha512-pax/kTR407vNb9qaSIiWVnQplPcGU8LRIJpDT5o8PdAx5aAA7AS3X9PS8Isw1/WfqgQorPotjrZL3Pqh6C5EBg==", + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.2.tgz", + "integrity": "sha512-DOYMrDm5E6/8bm/yQLCWyuDJwUnlevR8xtF8bs+gjZ7cyUNYXiSf/E8Kp0Ss5xasIaXSHzb888V1BE4i1hFhAA==", "cpu": [ "x64" ], @@ -2090,9 +2090,9 @@ } }, "node_modules/@img/sharp-wasm32": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.1.tgz", - "integrity": "sha512-YDybQnYrLQfEpzGOQe7OKcyLUCML4YOXl428gOOzBgN6Gw0rv8dpsJ7PqTHxBnXnwXr8S1mYFSLSa727tpz0xg==", + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.2.tgz", + "integrity": "sha512-/VI4mdlJ9zkaq53MbIG6rZY+QRN3MLbR6usYlgITEzi4Rpx5S6LFKsycOQjkOGmqTNmkIdLjEvooFKwww6OpdQ==", "cpu": [ "wasm32" ], @@ -2100,7 +2100,7 @@ "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", "optional": true, "dependencies": { - "@emnapi/runtime": "^1.4.0" + "@emnapi/runtime": "^1.4.3" }, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" @@ -2109,10 +2109,30 @@ "url": "https://opencollective.com/libvips" } }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.2.tgz", + "integrity": "sha512-cfP/r9FdS63VA5k0xiqaNaEoGxBg9k7uE+RQGzuK9fHt7jib4zAVVseR9LsE4gJcNWgT6APKMNnCcnyOtmSEUQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, "node_modules/@img/sharp-win32-ia32": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.1.tgz", - "integrity": "sha512-WKf/NAZITnonBf3U1LfdjoMgNO5JYRSlhovhRhMxXVdvWYveM4kM3L8m35onYIdh75cOMCo1BexgVQcCDzyoWw==", + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.2.tgz", + "integrity": "sha512-QLjGGvAbj0X/FXl8n1WbtQ6iVBpWU7JO94u/P2M4a8CFYsvQi4GW2mRy/JqkRx0qpBzaOdKJKw8uc930EX2AHw==", "cpu": [ "ia32" ], @@ -2130,9 +2150,9 @@ } }, "node_modules/@img/sharp-win32-x64": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.1.tgz", - "integrity": "sha512-hw1iIAHpNE8q3uMIRCgGOeDoz9KtFNarFLQclLxr/LK1VBkj8nby18RjFvr6aP7USRYAjTZW6yisnBWMX571Tw==", + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.2.tgz", + "integrity": "sha512-aUdT6zEYtDKCaxkofmmJDJYGCf0+pJg3eU9/oBuqvEeoB9dKI6ZLc/1iLJCTuJQDO4ptntAlkUmHgGjyuobZbw==", "cpu": [ "x64" ], @@ -6753,9 +6773,9 @@ } }, "node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -13382,16 +13402,16 @@ } }, "node_modules/sharp": { - "version": "0.34.1", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.1.tgz", - "integrity": "sha512-1j0w61+eVxu7DawFJtnfYcvSv6qPFvfTaqzTQ2BLknVhHTwGS8sc63ZBF4rzkWMBVKybo4S5OBtDdZahh2A1xg==", + "version": "0.34.2", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.2.tgz", + "integrity": "sha512-lszvBmB9QURERtyKT2bNmsgxXK0ShJrL/fvqlonCo7e6xBF8nT8xU6pW+PMIbLsz0RxQk3rgH9kd8UmvOzlMJg==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { "color": "^4.2.3", - "detect-libc": "^2.0.3", - "semver": "^7.7.1" + "detect-libc": "^2.0.4", + "semver": "^7.7.2" }, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" @@ -13400,8 +13420,8 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.34.1", - "@img/sharp-darwin-x64": "0.34.1", + "@img/sharp-darwin-arm64": "0.34.2", + "@img/sharp-darwin-x64": "0.34.2", "@img/sharp-libvips-darwin-arm64": "1.1.0", "@img/sharp-libvips-darwin-x64": "1.1.0", "@img/sharp-libvips-linux-arm": "1.1.0", @@ -13411,15 +13431,16 @@ "@img/sharp-libvips-linux-x64": "1.1.0", "@img/sharp-libvips-linuxmusl-arm64": "1.1.0", "@img/sharp-libvips-linuxmusl-x64": "1.1.0", - "@img/sharp-linux-arm": "0.34.1", - "@img/sharp-linux-arm64": "0.34.1", - "@img/sharp-linux-s390x": "0.34.1", - "@img/sharp-linux-x64": "0.34.1", - "@img/sharp-linuxmusl-arm64": "0.34.1", - "@img/sharp-linuxmusl-x64": "0.34.1", - "@img/sharp-wasm32": "0.34.1", - "@img/sharp-win32-ia32": "0.34.1", - "@img/sharp-win32-x64": "0.34.1" + "@img/sharp-linux-arm": "0.34.2", + "@img/sharp-linux-arm64": "0.34.2", + "@img/sharp-linux-s390x": "0.34.2", + "@img/sharp-linux-x64": "0.34.2", + "@img/sharp-linuxmusl-arm64": "0.34.2", + "@img/sharp-linuxmusl-x64": "0.34.2", + "@img/sharp-wasm32": "0.34.2", + "@img/sharp-win32-arm64": "0.34.2", + "@img/sharp-win32-ia32": "0.34.2", + "@img/sharp-win32-x64": "0.34.2" } }, "node_modules/shebang-command": { diff --git a/package.json b/package.json index 8e8c24c57fb..08ed334de64 100644 --- a/package.json +++ b/package.json @@ -122,7 +122,7 @@ "rollup-plugin-sourcemaps2": "^0.5.2", "rw": "^1.3.3", "semver": "^7.7.2", - "sharp": "^0.34.1", + "sharp": "^0.34.2", "shuffle-seed": "^1.1.6", "source-map-explorer": "^2.5.3", "st": "^3.0.1", From 1677f6349e7c40a54f1bce168f2ba810c43b146f Mon Sep 17 00:00:00 2001 From: Nathan Date: Wed, 21 May 2025 07:44:55 -0700 Subject: [PATCH 14/19] enable color ramp to be dynamically changes using map.setPaintProperty() --- src/style/style_layer/color_relief_style_layer.ts | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/style/style_layer/color_relief_style_layer.ts b/src/style/style_layer/color_relief_style_layer.ts index abaa6ff53b0..b858b6a7831 100644 --- a/src/style/style_layer/color_relief_style_layer.ts +++ b/src/style/style_layer/color_relief_style_layer.ts @@ -4,7 +4,7 @@ import properties, {type ColorReliefPaintPropsPossiblyEvaluated} from './color_r import {type Transitionable, type Transitioning, type PossiblyEvaluated} from '../properties'; import type {ColorReliefPaintProps} from './color_relief_style_layer_properties.g'; -import {Color, Interpolate, ZoomConstantExpression, type LayerSpecification, type EvaluationContext} from '@maplibre/maplibre-gl-style-spec'; +import {Color, Interpolate, ZoomConstantExpression, type LayerSpecification, type EvaluationContext, type StylePropertyExpression} from '@maplibre/maplibre-gl-style-spec'; import {warnOnce} from '../../util/util'; import {Texture} from '../../render/texture'; import {RGBAImage} from '../../util/image'; @@ -17,6 +17,7 @@ export type ColorRamp = {elevationStops: Array; colorStops: Array export type ColorRampTextures = {elevationTexture: Texture; colorTexture: Texture}; export class ColorReliefStyleLayer extends StyleLayer { + colorRampExpression: StylePropertyExpression; colorRamp: ColorRamp; colorRampTextures: ColorRampTextures; _transitionablePaint: Transitionable; @@ -31,6 +32,7 @@ export class ColorReliefStyleLayer extends StyleLayer { const colorRamp: ColorRamp = {elevationStops: [], colorStops: []}; const expression = this._transitionablePaint._values['color-relief-color'].value.expression; if (expression instanceof ZoomConstantExpression && expression._styleExpression.expression instanceof Interpolate) { + this.colorRampExpression = expression; const interpolater = expression._styleExpression.expression; colorRamp.elevationStops = interpolater.labels; colorRamp.colorStops = []; @@ -50,6 +52,10 @@ export class ColorReliefStyleLayer extends StyleLayer { } return colorRamp; } + + _colorRampChanged() : boolean { + return this.colorRampExpression != this._transitionablePaint._values['color-relief-color'].value.expression; + } /** * Get the color ramp, enforcing a maximum length for the vectors. This modifies the internal color ramp, @@ -61,9 +67,7 @@ export class ColorReliefStyleLayer extends StyleLayer { * */ getColorRamp(maxLength: number) : ColorRamp { - if (!this.colorRamp) { - this.colorRamp = this._createColorRamp(); - } + this.colorRamp = this._createColorRamp(); if (this.colorRamp.elevationStops.length > maxLength) { const colorRamp: ColorRamp = {elevationStops: [], colorStops: []}; const remapStepSize = (this.colorRamp.elevationStops.length - 1)/(maxLength - 1); @@ -79,7 +83,7 @@ export class ColorReliefStyleLayer extends StyleLayer { } getColorRampTextures(context: Context, maxLength: number, unpackVector: number[]): ColorRampTextures { - if (!this.colorRampTextures) { + if (!this.colorRampTextures || this._colorRampChanged()) { const colorRamp = this.getColorRamp(maxLength); const colorImage = new RGBAImage({width: colorRamp.colorStops.length, height: 1}); const elevationImage = new RGBAImage({width: colorRamp.colorStops.length, height: 1}); From 560163a37f708aea85471b14aec42d6e28d24007 Mon Sep 17 00:00:00 2001 From: Nathan Date: Wed, 21 May 2025 12:29:25 -0700 Subject: [PATCH 15/19] reduce indentation --- .../style_layer/color_relief_style_layer.ts | 41 ++++++++++--------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/src/style/style_layer/color_relief_style_layer.ts b/src/style/style_layer/color_relief_style_layer.ts index b858b6a7831..28605146e50 100644 --- a/src/style/style_layer/color_relief_style_layer.ts +++ b/src/style/style_layer/color_relief_style_layer.ts @@ -83,28 +83,29 @@ export class ColorReliefStyleLayer extends StyleLayer { } getColorRampTextures(context: Context, maxLength: number, unpackVector: number[]): ColorRampTextures { - if (!this.colorRampTextures || this._colorRampChanged()) { - const colorRamp = this.getColorRamp(maxLength); - const colorImage = new RGBAImage({width: colorRamp.colorStops.length, height: 1}); - const elevationImage = new RGBAImage({width: colorRamp.colorStops.length, height: 1}); - for (let i = 0; i < colorRamp.elevationStops.length; i++) { - const elevationPacked = packDEMData(colorRamp.elevationStops[i], unpackVector); - elevationImage.data[4*i + 0] = elevationPacked.r; - elevationImage.data[4*i + 1] = elevationPacked.g; - elevationImage.data[4*i + 2] = elevationPacked.b; - elevationImage.data[4*i + 3] = 255; + if (this.colorRampTextures && !this._colorRampChanged()) { + return this.colorRampTextures; + } + const colorRamp = this.getColorRamp(maxLength); + const colorImage = new RGBAImage({width: colorRamp.colorStops.length, height: 1}); + const elevationImage = new RGBAImage({width: colorRamp.colorStops.length, height: 1}); + for (let i = 0; i < colorRamp.elevationStops.length; i++) { + const elevationPacked = packDEMData(colorRamp.elevationStops[i], unpackVector); + elevationImage.data[4*i + 0] = elevationPacked.r; + elevationImage.data[4*i + 1] = elevationPacked.g; + elevationImage.data[4*i + 2] = elevationPacked.b; + elevationImage.data[4*i + 3] = 255; - const pxColor = colorRamp.colorStops[i]; - colorImage.data[4*i + 0] = Math.round(pxColor.r * 255 / pxColor.a); - colorImage.data[4*i + 1] = Math.round(pxColor.g * 255 / pxColor.a); - colorImage.data[4*i + 2] = Math.round(pxColor.b * 255 / pxColor.a); - colorImage.data[4*i + 3] = Math.round(pxColor.a * 255); - } - this.colorRampTextures = { - elevationTexture: new Texture(context, elevationImage, context.gl.RGBA), - colorTexture: new Texture(context, colorImage, context.gl.RGBA) - }; + const pxColor = colorRamp.colorStops[i]; + colorImage.data[4*i + 0] = Math.round(pxColor.r * 255 / pxColor.a); + colorImage.data[4*i + 1] = Math.round(pxColor.g * 255 / pxColor.a); + colorImage.data[4*i + 2] = Math.round(pxColor.b * 255 / pxColor.a); + colorImage.data[4*i + 3] = Math.round(pxColor.a * 255); } + this.colorRampTextures = { + elevationTexture: new Texture(context, elevationImage, context.gl.RGBA), + colorTexture: new Texture(context, colorImage, context.gl.RGBA) + }; return this.colorRampTextures; } From c562d13079c1a8f6260642922750a98591f8d731 Mon Sep 17 00:00:00 2001 From: Nathan Date: Wed, 21 May 2025 13:08:17 -0700 Subject: [PATCH 16/19] remove unneeded member variable colorRamp and combine _createColorRamp() and getColorRamp() --- .../color_relief_style_layer.test.ts | 10 ++-- .../style_layer/color_relief_style_layer.ts | 54 +++++++++---------- 2 files changed, 30 insertions(+), 34 deletions(-) diff --git a/src/style/style_layer/color_relief_style_layer.test.ts b/src/style/style_layer/color_relief_style_layer.test.ts index 23dba1d5518..3a95373b709 100644 --- a/src/style/style_layer/color_relief_style_layer.test.ts +++ b/src/style/style_layer/color_relief_style_layer.test.ts @@ -21,7 +21,7 @@ describe('ColorReliefStyleLayer', () => { expect(layer).toBeInstanceOf(ColorReliefStyleLayer); const colorReliefStyleLayer = layer as ColorReliefStyleLayer; expect(colorReliefStyleLayer.paint.get('color-relief-opacity')).toEqual(1); - const colorRamp = colorReliefStyleLayer.getColorRamp(256); + const colorRamp = colorReliefStyleLayer._createColorRamp(256); expect(colorRamp.elevationStops).toEqual([0,1]); expect(colorRamp.colorStops).toEqual([Color.transparent,Color.transparent]); }); @@ -42,7 +42,7 @@ describe('ColorReliefStyleLayer', () => { const layer = createStyleLayer(layerSpec); expect(layer).toBeInstanceOf(ColorReliefStyleLayer); const colorReliefStyleLayer = layer as ColorReliefStyleLayer; - const colorRamp = colorReliefStyleLayer.getColorRamp(256); + const colorRamp = colorReliefStyleLayer._createColorRamp(256); expect(colorRamp.elevationStops).toEqual([0,1000]); expect(colorRamp.colorStops).toEqual([Color.black,Color.white]); @@ -64,7 +64,7 @@ describe('ColorReliefStyleLayer', () => { const layer = createStyleLayer(layerSpec); expect(layer).toBeInstanceOf(ColorReliefStyleLayer); const colorReliefStyleLayer = layer as ColorReliefStyleLayer; - const colorRamp = colorReliefStyleLayer.getColorRamp(256); + const colorRamp = colorReliefStyleLayer._createColorRamp(256); expect(colorRamp.elevationStops).toEqual([0,1]); expect(colorRamp.colorStops).toEqual([Color.red,Color.red]); }); @@ -87,7 +87,7 @@ describe('ColorReliefStyleLayer', () => { expect(layer).toBeInstanceOf(ColorReliefStyleLayer); const colorReliefStyleLayer = layer as ColorReliefStyleLayer; - const colorRamp = colorReliefStyleLayer.getColorRamp(4); + const colorRamp = colorReliefStyleLayer._createColorRamp(4); expect(colorRamp.elevationStops).toEqual([0, 1000, 2000, 3000]); expect(colorRamp.colorStops).toEqual([Color.black, Color.red, Color.red, Color.white]); @@ -112,7 +112,7 @@ describe('ColorReliefStyleLayer', () => { expect(layer).toBeInstanceOf(ColorReliefStyleLayer); const colorReliefStyleLayer = layer as ColorReliefStyleLayer; - const colorRamp = colorReliefStyleLayer.getColorRamp(4); + const colorRamp = colorReliefStyleLayer._createColorRamp(4); expect(colorRamp.elevationStops).toEqual([0, 1000, 3000, 4000]); expect(colorRamp.colorStops).toEqual([Color.black, Color.red, Color.black, Color.red]); diff --git a/src/style/style_layer/color_relief_style_layer.ts b/src/style/style_layer/color_relief_style_layer.ts index 28605146e50..c87a1c17c03 100644 --- a/src/style/style_layer/color_relief_style_layer.ts +++ b/src/style/style_layer/color_relief_style_layer.ts @@ -18,7 +18,6 @@ export type ColorRampTextures = {elevationTexture: Texture; colorTexture: Textur export class ColorReliefStyleLayer extends StyleLayer { colorRampExpression: StylePropertyExpression; - colorRamp: ColorRamp; colorRampTextures: ColorRampTextures; _transitionablePaint: Transitionable; _transitioningPaint: Transitioning; @@ -28,7 +27,17 @@ export class ColorReliefStyleLayer extends StyleLayer { super(layer, properties); } - _createColorRamp() : ColorRamp { + /** + * Create the color ramp, enforcing a maximum length for the vectors. This modifies the internal color ramp, + * so that the remapping is only performed once. + * + * @param maxLength - the maximum number of stops in the color ramp + * + * @return a `ColorRamp` object with no more than `maxLength` stops. + * + */ + + _createColorRamp(maxLength: number) : ColorRamp { const colorRamp: ColorRamp = {elevationStops: [], colorStops: []}; const expression = this._transitionablePaint._values['color-relief-color'].value.expression; if (expression instanceof ZoomConstantExpression && expression._styleExpression.expression instanceof Interpolate) { @@ -50,43 +59,30 @@ export class ColorReliefStyleLayer extends StyleLayer { colorRamp.elevationStops.push(colorRamp.elevationStops[0] + 1); colorRamp.colorStops.push(colorRamp.colorStops[0]); } - return colorRamp; + if (colorRamp.elevationStops.length <= maxLength) { + return colorRamp; + } + + const remappedColorRamp: ColorRamp = {elevationStops: [], colorStops: []}; + const remapStepSize = (colorRamp.elevationStops.length - 1)/(maxLength - 1); + + for (let i = 0; i < colorRamp.elevationStops.length - 0.5; i += remapStepSize) { + remappedColorRamp.elevationStops.push(colorRamp.elevationStops[Math.round(i)]); + remappedColorRamp.colorStops.push(colorRamp.colorStops[Math.round(i)]); + } + warnOnce(`Too many colors in specification of ${this.id} color-relief layer, may not render properly.`); + return remappedColorRamp; } _colorRampChanged() : boolean { return this.colorRampExpression != this._transitionablePaint._values['color-relief-color'].value.expression; } - - /** - * Get the color ramp, enforcing a maximum length for the vectors. This modifies the internal color ramp, - * so that the remapping is only performed once. - * - * @param maxLength - the maximum number of stops in the color ramp - * - * @return a `ColorRamp` object with no more than `maxLength` stops. - * - */ - getColorRamp(maxLength: number) : ColorRamp { - this.colorRamp = this._createColorRamp(); - if (this.colorRamp.elevationStops.length > maxLength) { - const colorRamp: ColorRamp = {elevationStops: [], colorStops: []}; - const remapStepSize = (this.colorRamp.elevationStops.length - 1)/(maxLength - 1); - - for (let i = 0; i < this.colorRamp.elevationStops.length - 0.5; i += remapStepSize) { - colorRamp.elevationStops.push(this.colorRamp.elevationStops[Math.round(i)]); - colorRamp.colorStops.push(this.colorRamp.colorStops[Math.round(i)]); - } - warnOnce(`Too many colors in specification of ${this.id} color-relief layer, may not render properly.`); - this.colorRamp = colorRamp; - } - return this.colorRamp; - } getColorRampTextures(context: Context, maxLength: number, unpackVector: number[]): ColorRampTextures { if (this.colorRampTextures && !this._colorRampChanged()) { return this.colorRampTextures; } - const colorRamp = this.getColorRamp(maxLength); + const colorRamp = this._createColorRamp(maxLength); const colorImage = new RGBAImage({width: colorRamp.colorStops.length, height: 1}); const elevationImage = new RGBAImage({width: colorRamp.colorStops.length, height: 1}); for (let i = 0; i < colorRamp.elevationStops.length; i++) { From d9d873880a2fcebff5030334827808e4bdf7a7c8 Mon Sep 17 00:00:00 2001 From: Nathan Date: Wed, 21 May 2025 13:12:43 -0700 Subject: [PATCH 17/19] fix build --- src/style/style_layer/color_relief_style_layer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/style/style_layer/color_relief_style_layer.ts b/src/style/style_layer/color_relief_style_layer.ts index c87a1c17c03..78e19f45969 100644 --- a/src/style/style_layer/color_relief_style_layer.ts +++ b/src/style/style_layer/color_relief_style_layer.ts @@ -106,6 +106,6 @@ export class ColorReliefStyleLayer extends StyleLayer { } hasOffscreenPass() { - return this.visibility !== 'none' && !!this.colorRamp; + return this.visibility !== 'none' && !!this.colorRampTextures; } } From a71d5d45b22436568047e5c04f061caa37fc62d5 Mon Sep 17 00:00:00 2001 From: Nathan Date: Wed, 21 May 2025 14:07:15 -0700 Subject: [PATCH 18/19] add RGBAImage::setPixel() --- src/style/style_layer/color_relief_style_layer.ts | 12 ++---------- src/util/color_ramp.test.ts | 10 +++++----- src/util/color_ramp.ts | 7 +------ src/util/image.ts | 9 +++++++++ 4 files changed, 17 insertions(+), 21 deletions(-) diff --git a/src/style/style_layer/color_relief_style_layer.ts b/src/style/style_layer/color_relief_style_layer.ts index 78e19f45969..bbcd6fbb296 100644 --- a/src/style/style_layer/color_relief_style_layer.ts +++ b/src/style/style_layer/color_relief_style_layer.ts @@ -87,16 +87,8 @@ export class ColorReliefStyleLayer extends StyleLayer { const elevationImage = new RGBAImage({width: colorRamp.colorStops.length, height: 1}); for (let i = 0; i < colorRamp.elevationStops.length; i++) { const elevationPacked = packDEMData(colorRamp.elevationStops[i], unpackVector); - elevationImage.data[4*i + 0] = elevationPacked.r; - elevationImage.data[4*i + 1] = elevationPacked.g; - elevationImage.data[4*i + 2] = elevationPacked.b; - elevationImage.data[4*i + 3] = 255; - - const pxColor = colorRamp.colorStops[i]; - colorImage.data[4*i + 0] = Math.round(pxColor.r * 255 / pxColor.a); - colorImage.data[4*i + 1] = Math.round(pxColor.g * 255 / pxColor.a); - colorImage.data[4*i + 2] = Math.round(pxColor.b * 255 / pxColor.a); - colorImage.data[4*i + 3] = Math.round(pxColor.a * 255); + elevationImage.setPixel(0, i, new Color(elevationPacked.r/255, elevationPacked.g/255, elevationPacked.b/255, 1)); + colorImage.setPixel(0, i, colorRamp.colorStops[i]); } this.colorRampTextures = { elevationTexture: new Texture(context, elevationImage, context.gl.RGBA), diff --git a/src/util/color_ramp.test.ts b/src/util/color_ramp.test.ts index 356116cd219..ab369a96755 100644 --- a/src/util/color_ramp.test.ts +++ b/src/util/color_ramp.test.ts @@ -42,7 +42,7 @@ describe('renderColorRamp', () => { expect(pixelAt(ramp, 0)[3]).toBe(0); expect(nearlyEquals(pixelAt(ramp, 63), [255, 255, 255, 255])).toBeTruthy(); - expect(nearlyEquals(pixelAt(ramp, 127), [0, 255, 255, 127])).toBeTruthy(); + expect(nearlyEquals(pixelAt(ramp, 127), [0, 255, 255, 128])).toBeTruthy(); expect(nearlyEquals(pixelAt(ramp, 191), [0, 0, 0, 255])).toBeTruthy(); expect(nearlyEquals(pixelAt(ramp, 255), [255, 0, 0, 255])).toBeTruthy(); }); @@ -65,8 +65,8 @@ describe('renderColorRamp', () => { expect(ramp.width).toBe(512); expect(ramp.height).toBe(1); - expect(pixelAt(ramp, 0)[3]).toBe(25); - expect(nearlyEquals(pixelAt(ramp, 50), [0, 0, 255, 25])).toBeTruthy(); + expect(pixelAt(ramp, 0)[3]).toBe(26); + expect(nearlyEquals(pixelAt(ramp, 50), [0, 0, 255, 26])).toBeTruthy(); expect(nearlyEquals(pixelAt(ramp, 53), [255, 0, 0, 255])).toBeTruthy(); expect(nearlyEquals(pixelAt(ramp, 103), [255, 255, 0, 255])).toBeTruthy(); expect(nearlyEquals(pixelAt(ramp, 160), [255, 255, 255, 255])).toBeTruthy(); @@ -94,8 +94,8 @@ describe('renderColorRamp', () => { renderColorRamp({expression, evaluationKey: 'lineProgress', resolution: 512, image: ramp}); - expect(pixelAt(ramp, 0)[3]).toBe(127); - expect(nearlyEquals(pixelAt(ramp, 50), [255, 0, 0, 127])).toBeTruthy(); + expect(pixelAt(ramp, 0)[3]).toBe(128); + expect(nearlyEquals(pixelAt(ramp, 50), [255, 0, 0, 128])).toBeTruthy(); expect(nearlyEquals(pixelAt(ramp, 53), [0, 0, 0, 255])).toBeTruthy(); expect(nearlyEquals(pixelAt(ramp, 103), [255, 0, 0, 255])).toBeTruthy(); expect(nearlyEquals(pixelAt(ramp, 160), [0, 0, 255, 255])).toBeTruthy(); diff --git a/src/util/color_ramp.ts b/src/util/color_ramp.ts index 48243711dd8..4c8cc8be8a4 100644 --- a/src/util/color_ramp.ts +++ b/src/util/color_ramp.ts @@ -26,12 +26,7 @@ export function renderColorRamp(params: ColorRampParams): RGBAImage { const renderPixel = (stride, index, progress) => { evaluationGlobals[params.evaluationKey] = progress; const pxColor = params.expression.evaluate(evaluationGlobals as any); - // the colors are being unpremultiplied because Color uses - // premultiplied values, and the Texture class expects unpremultiplied ones - image.data[stride + index + 0] = Math.floor(pxColor.r * 255 / pxColor.a); - image.data[stride + index + 1] = Math.floor(pxColor.g * 255 / pxColor.a); - image.data[stride + index + 2] = Math.floor(pxColor.b * 255 / pxColor.a); - image.data[stride + index + 3] = Math.floor(pxColor.a * 255); + image.setPixel(stride / 4 / width, index / 4, pxColor); }; if (!params.clips) { diff --git a/src/util/image.ts b/src/util/image.ts index b3878dc06bb..c7effd08229 100644 --- a/src/util/image.ts +++ b/src/util/image.ts @@ -1,3 +1,4 @@ +import {Color} from '@maplibre/maplibre-gl-style-spec'; import {register} from './web_worker_transfer'; export type Size = { @@ -144,6 +145,14 @@ export class RGBAImage { static copy(srcImg: RGBAImage | ImageData, dstImg: RGBAImage, srcPt: Point2D, dstPt: Point2D, size: Size) { copyImage(srcImg, dstImg, srcPt, dstPt, size, 4); } + + setPixel(row: number, col: number, value: Color) { + const rLocation = (row * this.width + col) * 4; + this.data[rLocation + 0] = Math.round(value.r * 255 / value.a); + this.data[rLocation + 1] = Math.round(value.g * 255 / value.a); + this.data[rLocation + 2] = Math.round(value.b * 255 / value.a); + this.data[rLocation + 3] = Math.round(value.a * 255); + } } register('AlphaImage', AlphaImage); From 3c1cfaf121de3e490d15010c884bc46cce8fde71 Mon Sep 17 00:00:00 2001 From: Nathan Date: Wed, 21 May 2025 14:18:15 -0700 Subject: [PATCH 19/19] fix lint --- src/util/image.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/util/image.ts b/src/util/image.ts index c7effd08229..b1b89bc3ada 100644 --- a/src/util/image.ts +++ b/src/util/image.ts @@ -1,4 +1,4 @@ -import {Color} from '@maplibre/maplibre-gl-style-spec'; +import {type Color} from '@maplibre/maplibre-gl-style-spec'; import {register} from './web_worker_transfer'; export type Size = {