From fc8400cd46415acb322d0f8c2ffede6814387ef7 Mon Sep 17 00:00:00 2001 From: Johann Muszynski Date: Tue, 18 Jun 2024 19:50:42 +0300 Subject: [PATCH 01/45] Add missing paint_raster-particle entry (internal-1534) --- src/style-spec/reference/v8.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/style-spec/reference/v8.json b/src/style-spec/reference/v8.json index e15675ff75c..906ab24bd1c 100644 --- a/src/style-spec/reference/v8.json +++ b/src/style-spec/reference/v8.json @@ -5162,6 +5162,7 @@ "paint_fill-extrusion", "paint_symbol", "paint_raster", + "paint_raster-particle", "paint_hillshade", "paint_background", "paint_sky", From ea622fb965c435cb01d9925eee8d88d2ff77bebf Mon Sep 17 00:00:00 2001 From: Daniel Eke Date: Wed, 19 Jun 2024 16:21:40 +0800 Subject: [PATCH 02/45] Add API to set color-theme property (internal-1519) * Add new render tests and remove custom operation handler * Update lut debug page * Use getLut instead of direct access of luts on style * Add API to set color-theme --- 3d-style/render/lights.ts | 4 +- 3d-style/render/shadow_renderer.ts | 4 +- debug/lut.html | 63 ++------ src/render/draw_atmosphere.ts | 2 +- src/render/draw_background.ts | 2 +- src/render/fog.ts | 2 +- src/render/painter.ts | 2 +- src/style/style.ts | 140 +++++++++++++----- src/ui/map.ts | 21 ++- src/util/lut.ts | 1 + test/integration/lib/operation-handlers.js | 9 -- .../render-tests/color-theme/add/expected.png | Bin 0 -> 1431 bytes .../render-tests/color-theme/add/style.json | 77 ++++++++++ .../color-theme/remove/expected.png | Bin 0 -> 1490 bytes .../color-theme/remove/style.json | 78 ++++++++++ .../update-config-base/expected.png | Bin 0 -> 1431 bytes .../color-theme/update-config-base/style.json | 106 +++++++++++++ .../update-config-import/expected.png | Bin 0 -> 1423 bytes .../update-config-import/style.json | 116 +++++++++++++++ .../color-theme/update-with-api/expected.png | Bin 0 -> 1431 bytes .../color-theme/update-with-api/style.json | 80 ++++++++++ 21 files changed, 595 insertions(+), 112 deletions(-) create mode 100644 test/integration/render-tests/color-theme/add/expected.png create mode 100644 test/integration/render-tests/color-theme/add/style.json create mode 100644 test/integration/render-tests/color-theme/remove/expected.png create mode 100644 test/integration/render-tests/color-theme/remove/style.json create mode 100644 test/integration/render-tests/color-theme/update-config-base/expected.png create mode 100644 test/integration/render-tests/color-theme/update-config-base/style.json create mode 100644 test/integration/render-tests/color-theme/update-config-import/expected.png create mode 100644 test/integration/render-tests/color-theme/update-config-import/style.json create mode 100644 test/integration/render-tests/color-theme/update-with-api/expected.png create mode 100644 test/integration/render-tests/color-theme/update-with-api/style.json diff --git a/3d-style/render/lights.ts b/3d-style/render/lights.ts index b5f134b6196..65f60fec6a7 100644 --- a/3d-style/render/lights.ts +++ b/3d-style/render/lights.ts @@ -73,10 +73,10 @@ function calculateGroundRadiance(dir: vec3, dirColor: vec3, ambientColor: vec3): export const lightsUniformValues = (directional: Lights, ambient: Lights, style: Style): UniformValues => { const direction = directional.properties.get('direction'); - const directionalColor = directional.properties.get('color').toRenderColor(style._luts[directional.scope]).toArray01(); + const directionalColor = directional.properties.get('color').toRenderColor(style.getLut(directional.scope)).toArray01(); const directionalIntensity = directional.properties.get('intensity'); - const ambientColor = ambient.properties.get('color').toRenderColor(style._luts[ambient.scope]).toArray01(); + const ambientColor = ambient.properties.get('color').toRenderColor(style.getLut(ambient.scope)).toArray01(); const ambientIntensity = ambient.properties.get('intensity'); const dirVec: [number, number, number] = [direction.x, direction.y, direction.z]; diff --git a/3d-style/render/shadow_renderer.ts b/3d-style/render/shadow_renderer.ts index 250e003b831..968767a98fc 100644 --- a/3d-style/render/shadow_renderer.ts +++ b/3d-style/render/shadow_renderer.ts @@ -621,10 +621,10 @@ export function calculateGroundShadowFactor( const dirDirectionalFactor = Math.max(vec3.dot(groundNormal as [number, number, number], directionVec as [number, number, number]), 0.0); const ambStrength = [0, 0, 0]; // @ts-expect-error - TS2339 - Property 'toRenderColor' does not exist on type 'unknown'. | TS2345 - Argument of type 'unknown' is not assignable to parameter of type 'number'. - vec3.scale(ambStrength as [number, number, number], ambientColor.toRenderColor(style._luts[directionalLight.scope]).toArray01Linear().slice(0, 3), ambientIntensity); + vec3.scale(ambStrength as [number, number, number], ambientColor.toRenderColor(style.getLut(directionalLight.scope)).toArray01Linear().slice(0, 3), ambientIntensity); const dirStrength = [0, 0, 0]; // @ts-expect-error - TS2339 - Property 'toRenderColor' does not exist on type 'unknown'. | TS2363 - The right-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type. - vec3.scale(dirStrength as [number, number, number], dirColor.toRenderColor(style._luts[ambientLight.scope]).toArray01Linear().slice(0, 3), dirDirectionalFactor * dirIntensity); + vec3.scale(dirStrength as [number, number, number], dirColor.toRenderColor(style.getLut(ambientLight.scope)).toArray01Linear().slice(0, 3), dirDirectionalFactor * dirIntensity); // Multiplier X to get from lit surface color L to shadowed surface color S // X = A / (A + D) diff --git a/debug/lut.html b/debug/lut.html index 65c96924d28..db6ea2bff46 100644 --- a/debug/lut.html +++ b/debug/lut.html @@ -36,9 +36,8 @@ contrast: 1.0, saturation: 0.5, hue: 0.01, - lightPreset: 'day', lutPreset: 'custom', - styleURL: 'mapbox://styles/mapbox/standard', + styleURL: 'mapbox://styles/mapbox/streets-v12', firstLoadDone: false }; @@ -47,7 +46,6 @@ let lutData = ""; let standard = '{}'; - const lightPresets = ['dawn', 'day', 'dusk', 'night']; const lutPresets = ['custom', 'almost-bw', 'bright', 'bw-2', 'identity', 'red']; var map = window.map = new mapboxgl.Map({ @@ -61,25 +59,6 @@ style: PARAMS.styleURL }); - function updateStyle() { - map.setStyle({ - "version": 8, - "imports": [ - { - "id": "standard", - "url": "", - "data": standard, - "config": { - "lightPreset": PARAMS.lightPreset - } - } - ], - "color-theme": standard["color-theme"], - "sources": {}, - "layers": [] - }); - } - async function fetchJSON(url) { try { const response = await fetch(url); @@ -93,17 +72,6 @@ } } - function downloadStyle() { - fetchJSON(`https://api.mapbox.com/styles/v1/${PARAMS.styleURL.replace("mapbox://styles/", "")}?sdk=js-3.4.0-beta.1&access_token=${mapboxgl.accessToken}`).then(data => { - standard = data; - updateStyle(); - if (!PARAMS.firstLoadDone) { - updateLUT(); - PARAMS.firstLoadDone = true; - } - }); - } - const query = Object.fromEntries(location.search.substring(1).split('&').map(v => v.split('='))); const name = query.lut ? query.lut : 'red'; @@ -218,10 +186,9 @@ drawLUTOnCanvas(canvas, lut, resolution); document.getElementById('canvasImageHolder').src = canvas.toDataURL("image/png"); lutData = canvas.toDataURL(); - standard['color-theme'] = { + map.setColorTheme({ "data": lutData - }; - updateStyle(); + }); } else { // Load from preset const img = document.getElementById('canvasImageHolder'); @@ -230,10 +197,9 @@ const ctx = canvas.getContext('2d'); ctx.drawImage(img, 0, 0); lutData = canvas.toDataURL(); - standard['color-theme'] = { + map.setColorTheme({ "data": lutData - }; - updateStyle(); + }); }; img.onerror = function (e) { throw new Error(e.message); @@ -248,10 +214,9 @@ if (file) { const reader = new FileReader(); reader.onload = function(e) { - standard['color-theme'] = { - "data": e.target.result - }; - updateStyle(); + map.setColorTheme({ + "data": e.target.result + }); const img = document.getElementById('canvasImageHolder'); img.src = e.target.result; img.style.display = 'block'; @@ -307,17 +272,10 @@ updateLUT(); }); - pane.addBinding(PARAMS, 'lightPreset', { - label: 'lightPreset', - options: lightPresets.reduce((acc, item) => ({...acc, [item]: item}), {}) - }).on('change', (e) => { - updateStyle(); - }); - pane.addBinding(PARAMS, 'styleURL', { label: 'styleURL' }).on('change', (e) => { - downloadStyle(); + map.setStyle(PARAMS.styleURL); }); map.on('style.load', () => { @@ -383,9 +341,6 @@ } }); }); - map.once('load', () => { - downloadStyle(); - }); diff --git a/src/render/draw_atmosphere.ts b/src/render/draw_atmosphere.ts index 1a61ef3ef0b..67286317d04 100644 --- a/src/render/draw_atmosphere.ts +++ b/src/render/draw_atmosphere.ts @@ -137,7 +137,7 @@ class Atmosphere { const transitionT = globeToMercatorTransition(tr.zoom); - const fogLUT = painter.style._luts[fog.scope]; + const fogLUT = painter.style.getLut(fog.scope); const fogColor = fog.properties.get('color').toRenderColor(fogLUT).toArray01(); diff --git a/src/render/draw_background.ts b/src/render/draw_background.ts index c9b81758689..da80d12f663 100644 --- a/src/render/draw_background.ts +++ b/src/render/draw_background.ts @@ -33,7 +33,7 @@ function drawBackground(painter: Painter, sourceCache: SourceCache, layer: Backg if (image === null) { return; } - patternPosition = painter.imageManager.getPattern(image.toString(), layer.scope, painter.style._luts[layer.scope]); + patternPosition = painter.imageManager.getPattern(image.toString(), layer.scope, painter.style.getLut(layer.scope)); if (!patternPosition) { return; } diff --git a/src/render/fog.ts b/src/render/fog.ts index 5a262662ec7..5313712910c 100644 --- a/src/render/fog.ts +++ b/src/render/fog.ts @@ -59,7 +59,7 @@ export const fogUniformValues = ( ): UniformValues => { const tr = painter.transform; - const fogColor = fog.properties.get('color').toRenderColor(painter.style._luts[fog.scope]).toArray01(); + const fogColor = fog.properties.get('color').toRenderColor(painter.style.getLut(fog.scope)).toArray01(); fogColor[3] = fogOpacity; // Update Alpha const temporalOffset = (painter.frameCounter / 1000.0) % 1; diff --git a/src/render/painter.ts b/src/render/painter.ts index a0b2d3c3889..0733efeaded 100644 --- a/src/render/painter.ts +++ b/src/render/painter.ts @@ -981,7 +981,7 @@ class Painter { const fog = this.style.fog; if (fog && this.transform.projection.supportsFog) { - const fogLUT = this.style._luts[fog.scope]; + const fogLUT = this.style.getLut(fog.scope); if (!shouldRenderAtmosphere) { const fogColor = fog.properties.get('color').toRenderColor(fogLUT).toArray01(); diff --git a/src/style/style.ts b/src/style/style.ts index 6e1bdce881f..c6309b6b0a8 100644 --- a/src/style/style.ts +++ b/src/style/style.ts @@ -181,6 +181,12 @@ export type Fragment = { config?: ConfigSpecification | null | undefined; }; +type StyleColorTheme = { + lut: LUT | null; + lutLoading: boolean; + colorTheme: ColorThemeSpecification | null; +}; + const MAX_IMPORT_DEPTH = 5; const defaultTransition = {duration: 300, delay: 0}; @@ -201,7 +207,10 @@ class Style extends Evented { disableElevatedTerrain: boolean | null | undefined; fog: Fog | null | undefined; camera: CameraSpecification; - lut: LUT | null; + _styleColorTheme: StyleColorTheme; + _styleColorThemeForScope: { + [_: string]: StyleColorTheme; + }; transition: TransitionSpecification; projection: ProjectionSpecification; @@ -233,9 +242,6 @@ class Style extends Evented { [_: string]: SourceCache; }; _clipLayerIndices: Array; - _luts: { - [_: string]: LUT; - }; _request: Cancelable | null | undefined; _spriteRequest: Cancelable | null | undefined; @@ -364,7 +370,12 @@ class Style extends Evented { this._availableImages = []; this._order = []; this._markersNeedUpdate = false; - this._luts = {}; + this._styleColorTheme = { + lut: null, + lutLoading: false, + colorTheme: null + }; + this._styleColorThemeForScope = {}; this.options = options.configOptions ? options.configOptions : new Map(); this._configDependentLayers = options.configDependentLayers ? options.configDependentLayers : new Set(); @@ -722,7 +733,7 @@ class Style extends Evented { this._layers = {}; this._serializedLayers = {}; for (const layer of layers) { - const styleLayer = createStyleLayer(layer, this.scope, this.lut, this.options); + const styleLayer = createStyleLayer(layer, this.scope, this._styleColorTheme.lut, this.options); if (styleLayer.isConfigDependent) this._configDependentLayers.add(styleLayer.fqid); styleLayer.setEventedParent(this, {layer: {id: styleLayer.id}}); this._layers[styleLayer.id] = styleLayer; @@ -777,14 +788,18 @@ class Style extends Evented { } }; - if (this.stylesheet['color-theme']) { - this._loadColorTheme(this.stylesheet['color-theme']).then(() => { + const colorTheme = this.stylesheet['color-theme']; + this._styleColorTheme.colorTheme = colorTheme; + if (colorTheme) { + const data = this._evaluateColorThemeData(colorTheme); + this._loadColorTheme(data).then(() => { proceedWithStyleLoad(); }).catch((e) => { warnOnce(`Couldn\'t load color theme from the stylesheet: ${e}`); proceedWithStyleLoad(); }); } else { + this._styleColorTheme.lut = null; proceedWithStyleLoad(); } } @@ -802,6 +817,9 @@ class Style extends Evented { let projection; let transition; let camera; + const styleColorThemeForScope: { + [_: string]: StyleColorTheme; + } = {}; // Reset terrain that might have been set by a previous merge if (this.terrain && this.terrain.scope !== this.scope) { @@ -841,12 +859,15 @@ class Style extends Evented { if (style.stylesheet.transition != null) transition = style.stylesheet.transition; + + styleColorThemeForScope[style.scope] = style._styleColorTheme; }); this.light = light; this.ambientLight = ambientLight; this.directionalLight = directionalLight; this.fog = fog; + this._styleColorThemeForScope = styleColorThemeForScope; if (terrain === null) { delete this.terrain; @@ -976,18 +997,12 @@ class Style extends Evented { const mergedLayers: { [key: string]: StyleLayer; } = {}; - const luts: { - [key: string]: LUT; - } = {}; this._has3DLayers = false; this._hasCircleLayers = false; this._hasSymbolLayers = false; this.forEachFragmentStyle((style: Style) => { - if (style.lut) { - luts[style.scope] = style.lut; - } for (const layerId of style._order) { const layer = style._layers[layerId]; if (layer.type === 'slot') { @@ -1031,7 +1046,6 @@ class Style extends Evented { sort(mergedOrder); this._mergedLayers = mergedLayers; - this._luts = luts; this.updateDrapeFirstLayers(); this._buildingIndex.processLayersChanged(); } @@ -1050,27 +1064,34 @@ class Style extends Evented { return this; } - _loadColorTheme(colorization?: ColorThemeSpecification | null): Promise { - if (!colorization) { - return Promise.resolve(); - } - if (!colorization.data) { - return Promise.resolve(); + _evaluateColorThemeData(theme: ColorThemeSpecification): string | null { + if (!theme.data) { + return null; } + const properties = evaluateColorThemeProperties(this.scope, theme, this.options); + return properties.get('data'); + } - const properties = evaluateColorThemeProperties(this.scope, colorization, this.options); - let data = properties.get('data'); - const dataURLPrefix = 'data:image/png;base64,'; + _loadColorTheme(colorThemeData: string): Promise { + this._styleColorTheme.lutLoading = true; + return new Promise((resolve, reject) => { + const dataURLPrefix = 'data:image/png;base64,'; - if (!data.startsWith(dataURLPrefix)) { - data = dataURLPrefix + data; - } - // Reserved image name, which references the LUT in the image manager - const styleLutName = 'mapbox-reserved-lut'; + if (colorThemeData.length === 0) { + this._styleColorTheme.lut = null; + this._styleColorTheme.lutLoading = false; + resolve(); + return; + } - return new Promise((resolve, reject) => { + if (!colorThemeData.startsWith(dataURLPrefix)) { + colorThemeData = dataURLPrefix + colorThemeData; + } + // Reserved image name, which references the LUT in the image manager + const styleLutName = 'mapbox-reserved-lut'; - this.map.loadImage(data, (err, bitmap) => { + this.map.loadImage(colorThemeData, (err, bitmap) => { + this._styleColorTheme.lutLoading = false; if (err) { reject(new Error(`${err.message}`)); return; @@ -1094,12 +1115,10 @@ class Style extends Evented { if (!image) { reject(new Error('Missing LUT image.')); } else { - this.lut = { - // @ts-expect-error - TS2353 - Object literal may only specify known properties, and 'name' does not exist in type 'LUT'. - name: styleLutName, - image: image.data + this._styleColorTheme.lut = { + image: image.data, + data: colorThemeData }; - // @ts-expect-error - TS2794 - Expected 1 arguments, but got 0. Did you forget to include 'void' in your type argument to 'Promise'? resolve(); } }); @@ -1107,7 +1126,8 @@ class Style extends Evented { } getLut(scope: string): LUT | null { - return this._luts ? this._luts[scope] : null; + const styleColorTheme = this._styleColorThemeForScope[scope]; + return styleColorTheme ? styleColorTheme.lut : null; } setProjection(projection?: ProjectionSpecification | null) { @@ -1205,6 +1225,9 @@ class Style extends Evented { if (!this.modelManager.isLoaded()) return false; + if (this._styleColorTheme.lutLoading) + return false; + for (const {style} of this.fragments) { if (!style.loaded()) return false; } @@ -1423,7 +1446,7 @@ class Style extends Evented { if (!programIds) continue; for (const programId of programIds) { - const params = layer.getDefaultProgramParams(programId, parameters.zoom, this.lut); + const params = layer.getDefaultProgramParams(programId, parameters.zoom, this._styleColorTheme.lut); if (params) { painter.style = this; if (this.fog) { @@ -2049,6 +2072,15 @@ class Style extends Evented { this.fog.updateConfig(this.options); } + this.forEachFragmentStyle((style: Style) => { + if (style._styleColorTheme.colorTheme) { + const data = style._evaluateColorThemeData(style._styleColorTheme.colorTheme); + if (!style._styleColorTheme.lut || (style._styleColorTheme.lut && data !== style._styleColorTheme.lut.data)) { + style.setColorTheme(style._styleColorTheme.colorTheme); + } + } + }); + this._changes.setDirty(); } @@ -2073,7 +2105,7 @@ class Style extends Evented { let layer; if (layerObject.type === 'custom') { if (emitValidationErrors(this, validateCustomStyleLayer(layerObject))) return; - layer = createStyleLayer(layerObject, this.scope, this.lut, this.options); + layer = createStyleLayer(layerObject, this.scope, this._styleColorTheme.lut, this.options); } else { if (typeof layerObject.source === 'object') { this.addSource(id, layerObject.source); @@ -2085,7 +2117,7 @@ class Style extends Evented { if (this._validate(validateLayer, `layers.${id}`, layerObject, {arrayIndex: -1}, options)) return; - layer = createStyleLayer(layerObject, this.scope, this.lut, this.options); + layer = createStyleLayer(layerObject, this.scope, this._styleColorTheme.lut, this.options); this._validateLayer(layer); layer.setEventedParent(this, {layer: {id}}); @@ -2919,6 +2951,34 @@ class Style extends Evented { this._markersNeedUpdate = true; } + setColorTheme(colorTheme?: ColorThemeSpecification) { + this._checkLoaded(); + + const updateStyle = () => { + for (const layerId in this._layers) { + const layer = this._layers[layerId]; + layer.lut = this._styleColorTheme.lut; + } + for (const id in this._sourceCaches) { + this._sourceCaches[id].clearTiles(); + } + }; + + this._styleColorTheme.colorTheme = colorTheme; + if (!colorTheme) { + this._styleColorTheme.lut = null; + updateStyle(); + return; + } + + const data = this._evaluateColorThemeData(colorTheme); + this._loadColorTheme(data).then(() => { + updateStyle(); + }).catch((e) => { + warnOnce(`Couldn\'t set color theme: ${e}`); + }); + } + _getTransitionParameters(transition?: TransitionSpecification | null): TransitionParameters { return { now: browser.now(), diff --git a/src/ui/map.ts b/src/ui/map.ts index d02b67749fc..405e67ed778 100644 --- a/src/ui/map.ts +++ b/src/ui/map.ts @@ -81,7 +81,8 @@ import type { CameraSpecification, ImportSpecification, ConfigSpecification, - SchemaSpecification + SchemaSpecification, + ColorThemeSpecification } from '../style-spec/types'; import type StyleLayer from '../style/style_layer'; import type {Source} from '../source/source'; @@ -3474,6 +3475,24 @@ export class Map extends Camera { return this.style ? this.style.getFog() : null; } + /** + * Sets the color-theme property of the style. + * + * @param {ColorThemeSpecification} colorTheme The color-theme properties to set. + * If `null` or `undefined` is provided, this function call removes the color-theme from the map. + * Note: Calling this function triggers a full reload of tiles. + * @returns {Map} Returns itself to allow for method chaining. + * @example + * map.setColorTheme({ + * "data": "iVBORw0KGgoAA..." + * }); + */ + setColorTheme(colorTheme?: ColorThemeSpecification): this { + this._lazyInitEmptyStyle(); + this.style.setColorTheme(colorTheme); + return this._update(true); + } + /** * Sets the camera property of the style. * diff --git a/src/util/lut.ts b/src/util/lut.ts index a2faf9bd5d0..8190c051cdc 100644 --- a/src/util/lut.ts +++ b/src/util/lut.ts @@ -9,6 +9,7 @@ import type {ConfigOptions} from '../../src/style/properties'; export type LUT = { image: RGBAImage; + data: string; texture?: Texture3D; }; diff --git a/test/integration/lib/operation-handlers.js b/test/integration/lib/operation-handlers.js index 3d958c25613..94dc62c5583 100644 --- a/test/integration/lib/operation-handlers.js +++ b/test/integration/lib/operation-handlers.js @@ -216,15 +216,6 @@ export const operationHandlers = { updateGeoJSONData(map, [sourceId, data], doneCb) { map.getSource(sourceId).updateData(data); doneCb(); - }, - setColorTheme(map, params, doneCb) { - // Update this to setColorTheme after - // https://mapbox.atlassian.net/browse/GLJS-842 is implemented - const style = map.getStyle(); - style["color-theme"] = params[0]; - this.setStyle(map, [style], () => { - doneCb(); - }); } }; diff --git a/test/integration/render-tests/color-theme/add/expected.png b/test/integration/render-tests/color-theme/add/expected.png new file mode 100644 index 0000000000000000000000000000000000000000..94761627a85dc62cadfcd5f4ab8544ddafbe0582 GIT binary patch literal 1431 zcmV;I1!($-P)Px)QAtEWRCr$PTUjV=Z5Vz{A(S~zNMuOLJf+M-oQ#DKE<{O5Itis*As2L#Au^Sm zxR6pDp&FAYcSU8&tIo>gwu}nVA`xnwpZnzCPpL z&CLy+oSe|{@iE=q-Kmt1Dq#Qu_Vx882L}hz($ac2z^A7t+S=NprKKeX$Y+mF1>oDa zZxkIJO-4pWoZ`5+xS+|&N!r`n<8;3wH+>2K$Z|qL0@>KuD6)os&iVWIFO80l64=4_ z;2i+aJv}}BpH%;7AP9bFXo&Z+;1vK+J~cJ2;X3)( zuV1_|ffoQ!^M!?lywhGDKq!Zfjt*WlffoRhlaqN9JVjXnVH_D5QFOZ8c}fGIin^D# zdOq|(X#n!_@;Ljvvgt#g(AU?e)MJzaK$XHLFG^(vQ7HgoV`B*=fGphK-^*O%%gYP7 zy1G(aT%1ywl6UjQ#s*DHOmKd-QUDYc718?oI%Q{P)9L9cTg2|}E+J?O3k$-=2LldK zU0uz2k&+vc?Zd-EDk&*>eHI*{t*wpovpEBR;0g)~Sg;EV3-tW_OqZ9JR99C=fByWT zmX;QBa<VEiEnC-;#m3_*~w`NY?eMt1Ai*4<~15XX@?kC2ei(*XMP1c5>cDat1(_ z`aeECQhagr;Ep=3NgJt;pwpIlsA*u1s1H5wQgpp}&s z!n15`Z7C)uh6Uc#)I<#p4dmhBL2hntOn9rRs@NQ5+<-Fx?(Xgs78dp z-rnA?*Z24LDK|Hlu_HJ*n3c!$^fcQd4-O8p^MQzn2-@7-q^PJU($UeO)zww<_xGoi zloYD3ucyVuMOIn>4gdfUM@L7RnVDhWaT%Ne@bmMdfPesn0l;EwYHC>4Dl02VLqmhH zp{%ToN=r)#f(ihzmuPQqCu3t{rYm5Axw$z_O-<4F@82mYDT#V|de~u#rluzQ|6mk= zPgnv$JDsJvcaE!3PBev7kdjLYR(ZWn~fi3(#E>VsQBgr&US9Mb z0BR`#St2M;10Eh8C^9mV)hTEXM?eWk2HXI>0tOfWZRqaqrm?Xx#t!HSK#|7)wTPg^ z2Bo?9o(RIbL33odxVZQg0N9~47?S6mpP#c+B?#gC{5+kVol$6LDEkZtBhvS%#RjoZ zG(yr|{vH6JKk66rGcq!ml_A?`q>x#-L2GL(a}KZzyFG{|R3F-bz8|H6a)OXTBoh-8 z*$J~+8X*7x<(6)606;K7jf8^Cts9ZLP4Z%@C~X`udtJUZUXAWdd=-u{W}>r>Dmp z!O+lh`KM(;3f<6)h z0D?ah1qiA<9a2{Kq(zzYUO?8yLlt_UOxGuC&Ab92VS->^jY;?Rf_*tEO*6s19{+!> z3HA#TvP4IaUy+do#8>%@cNh37fhoEU5dc+xO-|9wsA`_b0FeRW?*+u)3y8lLP?h3- l#s4F^fan6E3kcf<{sS(BU2dQ~CO-fG002ovPDHLkV1lnmkQ@L2 literal 0 HcmV?d00001 diff --git a/test/integration/render-tests/color-theme/add/style.json b/test/integration/render-tests/color-theme/add/style.json new file mode 100644 index 00000000000..60c80b286f3 --- /dev/null +++ b/test/integration/render-tests/color-theme/add/style.json @@ -0,0 +1,77 @@ +{ + "version": 8, + "metadata": { + "test": { + "height": 64, + "width": 64, + "operations": [ + [ + "wait" + ], + [ + "setColorTheme", + { + "data": "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" + } + ], + [ + "wait" + ] + ] + } + }, + "center": [ + 0, + 0 + ], + "zoom": 0, + "transition": { + "duration": 0 + }, + "glyphs": "local://glyphs/{fontstack}/{range}.pbf", + "sources": { + "point": { + "type": "geojson", + "data": { + "type": "Point", + "coordinates": [ + 0, + 0 + ] + } + } + }, + "layers": [ + { + "id": "background", + "type": "background", + "paint": { + "background-color": "violet" + } + }, + { + "id": "circle", + "type": "circle", + "source": "point", + "paint": { + "circle-radius": 18, + "circle-color": "white" + } + }, + { + "id": "text", + "type": "symbol", + "source": "point", + "layout": { + "text-field": "Test", + "text-font": [ + "Open Sans Semibold", + "Arial Unicode MS Bold" + ] + }, + "paint": { + "text-color": "black" + } + } + ] +} \ No newline at end of file diff --git a/test/integration/render-tests/color-theme/remove/expected.png b/test/integration/render-tests/color-theme/remove/expected.png new file mode 100644 index 0000000000000000000000000000000000000000..2ea30a8675bab6eccc7cd6122b35a281a7692b57 GIT binary patch literal 1490 zcmV;@1ugoCP)Px)j7da6RCr$PTU|(7XBd8BVvWYMQPkCfom14(UHAv0bgR>fMN5?mBGaiCLWc-a z#7Qj_WEUz9lnyG6;@=R(UJQ2Q5413-C{{+r>R=bG2({o3l9DitAJbu|0Cn2?LZ-N~ph4BQPlt3f0G? z-3`0d4$Hq5n5WFJt=mpqoF@u^>Prh3lNmZo?#EBKTWW%SOr~woQqBd041RP zUJKP%s^iSz$QbLg6~+-GZ~}x79RQ-cwnlp-)sM{jvjCEYvDYZNEJOu>D6g&3dYYR@ z@y6ecqDn$E0BGgU{&?1-WP}E9|F$g}6T|^P3Fw-1qSOAcN}=!2i{c5Q0HFOrJi|LK zE7%x^jK>Xk8|O6uzRGEX=PpZc4bdwA zG$k5XVl5aP9K`PKuFE;v?RH$cbO{9o1zxR`yNh?1c47L%B>3K50ibKv;pIOsQBhF= zyb%Kh zLQYN&5)%_KFfag>>QkGo|3xo&7bzG3SMG1MT2WY7h!-zjU}9nd>FMbQ5`6piEqZ%< z88DJeN=gc9YHE;_l*Dn1i;EZ@9>)CqJm_9AF)_%`&*#Luy1LNO(ShXTWL&;{8CtCt z_wL=}7;mb9U;u*BgAh^}av(vQ&Bj_M0466Vk(QRWe|~Lk4OLZD%#JHpuCP3wK7ER~ zxHycCjv_of9J#r4VTWD`@$MfgUSy}`f0YHGn$H!x5 zYzH6y{vbpF!e5N2zf~jnyWnF3K$C50Y2j6CZf=G`p3UR z+1ZJU7ccT;*VorM`K+ugPWtNAtL!7?<>jcZu4cMBlANBNW+{}GmSSjV=s>c50l*Up zn9XKRj_6N%cT@+;Vsmp7nVFd^gYofk28bj?D^H-^y?Ym_si`;&0KZ7Ul?l4@0E@+f zYuB!^$r0_TB9H_egQ@}b3N(lTWM`L3n_ZBo-TU+ty(IZ}c0_MSk2T0SV`L7jrwHcz)wX?IslXp0{vrNd` zUcY|LtFKn8xgvyyhH?mXd(=u3{WTg5v%=XhDQ0D51zTHN2n!2CY-}w2x*4JgNqRd> z07(9U2!SB!M`A2qsXr8D3?%(n{C}JGg&%m+^|{(D3EmF7+j>d*)!3)zUcxU&otYus z*W;h*L$V)8xHKIpej?+}Fi*pA(W}5|NXnBr$N>2IGdWLI#}~0O17rrs|1Ti_zkqK) s&h>?}dGH&u3CboYo1kohk~YEr0Ksv9uF58hfdBvi07*qoM6N<$g1ec(Z2$lO literal 0 HcmV?d00001 diff --git a/test/integration/render-tests/color-theme/remove/style.json b/test/integration/render-tests/color-theme/remove/style.json new file mode 100644 index 00000000000..6becf011f20 --- /dev/null +++ b/test/integration/render-tests/color-theme/remove/style.json @@ -0,0 +1,78 @@ +{ + "version": 8, + "metadata": { + "test": { + "height": 64, + "width": 64, + "operations": [ + [ + "wait" + ], + [ + "setColorTheme", + null + ], + [ + "wait" + ] + ] + } + }, + "color-theme": { + "data": "iVBORw0KGgoAAAANSUhEUgAABAAAAAAgCAYAAACM/gqmAAAAAXNSR0IArs4c6QAABSFJREFUeF7t3cFO40AQAFHnBv//wSAEEgmJPeUDsid5h9VqtcMiZsfdPdXVzmVZlo+3ZVm+fr3//L7257Lm778x+prL1ff0/b//H+z/4/M4OkuP/n70Nc7f+nnb+yzb//sY6vxt5xXPn+dP/aH+GsXJekb25izxR/ypZ6ucUefv9g4z2jPP3/HPHwAAgABAABgACIACkAAsAL1SD4yKWQAUAHUBdAG8buKNYoYL8PEX4FcHQAAAAAAAAAAAAAAAAAAAAAAA8LAeGF1mABAABAABQACQbZP7+hk5AwACAAAAAAAAAAAAAAAAAAAAAAAA4EE9AICMx4QBAAAAAAAANgvJsxGQV1dA/PxmMEtxU9YoABQACoC5CgDxX/wvsb2sEf/Ff/Ff/N96l5n73+/5YAB4CeBqx2VvMqXgUfD2npkzBCAXEBeQcrkoa5x/FxAXEBcQF5A2Wy3/t32qNYr8I//Mln+MABgBMAJgBMAIgBEAIwBGAIwAGAEwAmAE4K4eAGCNQIw+qQ0AmQ+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/6gEABAB5RgACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN/UAAPKcAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgEFNODICRtDkDO/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOhvlPUWem+h9xKQ+V4CUt9wO6KZnn/Pv+ff8z/bW5DFP59CUnJbWSP+iX/iX78znqED/urxnwHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADoNMcHUAdQAQcAUfAe8xEwH0O86t3IPz8OvClu17WqD/UH+oP9cf1Gdia01d/LQsDgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABkCnSQwABgACj8Aj8D1mItAMAB1wHfDS3S5r5F/5V/6Vf3XAW12h/mIArHY89iZTAAQA2XtmBKAWqOslyf4rgBXACmAFcIur8k/bJ/mnQTr5V/6Vf+fKv0YAjAAYATACYATACIARACMARgCMABgBMAJgBMAIgBEAIwCdZuiA64AjwAgwAtxjpg6cDlztLlLA7/Pr1gueyr56/jx/5ZzUNeof9Y/6R/0zk4HGAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHQaQ4DgAGAgCPgCHiPmTqQOpC1u8gAYACMjAf5V/6Vf+XfmTrQ8l97v8Z/5X8GAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADIBO0xgADAAdCB0IHYgeMxkADAAdkGM7IPbf/pfuWlmj/lH/qH/UPzMZGAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAJ3mMAAYAAg4Ao6A95jJAGAA6EDrQJfuclkj/8q/8q/8O1MHWv47Nv8xABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAB0msYAYADoQOhA6ED0mMkAYADogBzbAbH/9r/YFWWN+kf9o/5R/8xkYDAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgAHSawwBgACDgCDgC3mMmA4ABoAOtA126y2WN/Cv/yr/y70wdaPnv2PzHAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHQaRoDgAGgA6EDoQPRYyYDgAGgA3JsB8T+2/9iV5Q16h/1j/pH/TOTgcEAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAPgyQ2AT4NBIB3ew5dkAAAAAElFTkSuQmCC" + }, + "center": [ + 0, + 0 + ], + "zoom": 0, + "transition": { + "duration": 0 + }, + "glyphs": "local://glyphs/{fontstack}/{range}.pbf", + "sources": { + "point": { + "type": "geojson", + "data": { + "type": "Point", + "coordinates": [ + 0, + 0 + ] + } + } + }, + "layers": [ + { + "id": "background", + "type": "background", + "paint": { + "background-color": "violet" + } + }, + { + "id": "circle", + "type": "circle", + "source": "point", + "paint": { + "circle-radius": 18, + "circle-color": "white" + } + }, + { + "id": "text", + "type": "symbol", + "source": "point", + "layout": { + "text-field": "Test", + "text-font": [ + "Open Sans Semibold", + "Arial Unicode MS Bold" + ] + }, + "paint": { + "text-color": "black" + } + } + ] +} \ No newline at end of file diff --git a/test/integration/render-tests/color-theme/update-config-base/expected.png b/test/integration/render-tests/color-theme/update-config-base/expected.png new file mode 100644 index 0000000000000000000000000000000000000000..94761627a85dc62cadfcd5f4ab8544ddafbe0582 GIT binary patch literal 1431 zcmV;I1!($-P)Px)QAtEWRCr$PTUjV=Z5Vz{A(S~zNMuOLJf+M-oQ#DKE<{O5Itis*As2L#Au^Sm zxR6pDp&FAYcSU8&tIo>gwu}nVA`xnwpZnzCPpL z&CLy+oSe|{@iE=q-Kmt1Dq#Qu_Vx882L}hz($ac2z^A7t+S=NprKKeX$Y+mF1>oDa zZxkIJO-4pWoZ`5+xS+|&N!r`n<8;3wH+>2K$Z|qL0@>KuD6)os&iVWIFO80l64=4_ z;2i+aJv}}BpH%;7AP9bFXo&Z+;1vK+J~cJ2;X3)( zuV1_|ffoQ!^M!?lywhGDKq!Zfjt*WlffoRhlaqN9JVjXnVH_D5QFOZ8c}fGIin^D# zdOq|(X#n!_@;Ljvvgt#g(AU?e)MJzaK$XHLFG^(vQ7HgoV`B*=fGphK-^*O%%gYP7 zy1G(aT%1ywl6UjQ#s*DHOmKd-QUDYc718?oI%Q{P)9L9cTg2|}E+J?O3k$-=2LldK zU0uz2k&+vc?Zd-EDk&*>eHI*{t*wpovpEBR;0g)~Sg;EV3-tW_OqZ9JR99C=fByWT zmX;QBa<VEiEnC-;#m3_*~w`NY?eMt1Ai*4<~15XX@?kC2ei(*XMP1c5>cDat1(_ z`aeECQhagr;Ep=3NgJt;pwpIlsA*u1s1H5wQgpp}&s z!n15`Z7C)uh6Uc#)I<#p4dmhBL2hntOn9rRs@NQ5+<-Fx?(Xgs78dp z-rnA?*Z24LDK|Hlu_HJ*n3c!$^fcQd4-O8p^MQzn2-@7-q^PJU($UeO)zww<_xGoi zloYD3ucyVuMOIn>4gdfUM@L7RnVDhWaT%Ne@bmMdfPesn0l;EwYHC>4Dl02VLqmhH zp{%ToN=r)#f(ihzmuPQqCu3t{rYm5Axw$z_O-<4F@82mYDT#V|de~u#rluzQ|6mk= zPgnv$JDsJvcaE!3PBev7kdjLYR(ZWn~fi3(#E>VsQBgr&US9Mb z0BR`#St2M;10Eh8C^9mV)hTEXM?eWk2HXI>0tOfWZRqaqrm?Xx#t!HSK#|7)wTPg^ z2Bo?9o(RIbL33odxVZQg0N9~47?S6mpP#c+B?#gC{5+kVol$6LDEkZtBhvS%#RjoZ zG(yr|{vH6JKk66rGcq!ml_A?`q>x#-L2GL(a}KZzyFG{|R3F-bz8|H6a)OXTBoh-8 z*$J~+8X*7x<(6)606;K7jf8^Cts9ZLP4Z%@C~X`udtJUZUXAWdd=-u{W}>r>Dmp z!O+lh`KM(;3f<6)h z0D?ah1qiA<9a2{Kq(zzYUO?8yLlt_UOxGuC&Ab92VS->^jY;?Rf_*tEO*6s19{+!> z3HA#TvP4IaUy+do#8>%@cNh37fhoEU5dc+xO-|9wsA`_b0FeRW?*+u)3y8lLP?h3- l#s4F^fan6E3kcf<{sS(BU2dQ~CO-fG002ovPDHLkV1lnmkQ@L2 literal 0 HcmV?d00001 diff --git a/test/integration/render-tests/color-theme/update-config-base/style.json b/test/integration/render-tests/color-theme/update-config-base/style.json new file mode 100644 index 00000000000..2e11fd55d47 --- /dev/null +++ b/test/integration/render-tests/color-theme/update-config-base/style.json @@ -0,0 +1,106 @@ +{ + "version": 8, + "metadata": { + "test": { + "height": 64, + "width": 64, + "operations": [ + [ + "wait" + ], + [ + "setConfigProperty", + "basemap", + "colorTheme", + "bw" + ], + [ + "wait" + ] + ] + } + }, + "color-theme": { + "data": [ + "match", + ["config", "colorTheme"], + "red", + "iVBORw0KGgoAAAANSUhEUgAABAAAAAAgCAYAAACM/gqmAAAAAXNSR0IArs4c6QAABSFJREFUeF7t3cFO40AQAFHnBv//wSAEEgmJPeUDsid5h9VqtcMiZsfdPdXVzmVZlo+3ZVm+fr3//L7257Lm778x+prL1ff0/b//H+z/4/M4OkuP/n70Nc7f+nnb+yzb//sY6vxt5xXPn+dP/aH+GsXJekb25izxR/ypZ6ucUefv9g4z2jPP3/HPHwAAgABAABgACIACkAAsAL1SD4yKWQAUAHUBdAG8buKNYoYL8PEX4FcHQAAAAAAAAAAAAAAAAAAAAAAA8LAeGF1mABAABAABQACQbZP7+hk5AwACAAAAAAAAAAAAAAAAAAAAAAAA4EE9AICMx4QBAAAAAAAANgvJsxGQV1dA/PxmMEtxU9YoABQACoC5CgDxX/wvsb2sEf/Ff/Ff/N96l5n73+/5YAB4CeBqx2VvMqXgUfD2npkzBCAXEBeQcrkoa5x/FxAXEBcQF5A2Wy3/t32qNYr8I//Mln+MABgBMAJgBMAIgBEAIwBGAIwAGAEwAmAE4K4eAGCNQIw+qQ0AmQ+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/6gEABAB5RgACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN/UAAPKcAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgEFNODICRtDkDO/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOhvlPUWem+h9xKQ+V4CUt9wO6KZnn/Pv+ff8z/bW5DFP59CUnJbWSP+iX/iX78znqED/urxnwHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADoNMcHUAdQAQcAUfAe8xEwH0O86t3IPz8OvClu17WqD/UH+oP9cf1Gdia01d/LQsDgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABkCnSQwABgACj8Aj8D1mItAMAB1wHfDS3S5r5F/5V/6Vf3XAW12h/mIArHY89iZTAAQA2XtmBKAWqOslyf4rgBXACmAFcIur8k/bJ/mnQTr5V/6Vf+fKv0YAjAAYATACYATACIARACMARgCMABgBMAJgBMAIgBEAIwCdZuiA64AjwAgwAtxjpg6cDlztLlLA7/Pr1gueyr56/jx/5ZzUNeof9Y/6R/0zk4HGAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHQaQ4DgAGAgCPgCHiPmTqQOpC1u8gAYACMjAf5V/6Vf+XfmTrQ8l97v8Z/5X8GAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADIBO0xgADAAdCB0IHYgeMxkADAAdkGM7IPbf/pfuWlmj/lH/qH/UPzMZGAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAJ3mMAAYAAg4Ao6A95jJAGAA6EDrQJfuclkj/8q/8q/8O1MHWv47Nv8xABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAB0msYAYADoQOhA6ED0mMkAYADogBzbAbH/9r/YFWWN+kf9o/5R/8xkYDAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgAHSawwBgACDgCDgC3mMmA4ABoAOtA126y2WN/Cv/yr/y70wdaPnv2PzHAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHQaRoDgAGgA6EDoQPRYyYDgAGgA3JsB8T+2/9iV5Q16h/1j/pH/TOTgcEAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAPgyQ2AT4NBIB3ew5dkAAAAAElFTkSuQmCC", + "bw", + "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", + "" + ] + }, + "schema": { + "colorTheme": { + "default": "red" + }, + "lightPreset": { + "default": [ + "format", + "abc", + { + "text-color": "red", + "text-font": [ + "Open Sans Semibold", + "Arial Unicode MS Bold" + ] + } + ] + } + }, + "center": [ + 0, + 0 + ], + "zoom": 0, + "transition": { + "duration": 0 + }, + "glyphs": "local://glyphs/{fontstack}/{range}.pbf", + "sources": { + "point": { + "type": "geojson", + "data": { + "type": "Point", + "coordinates": [ + 0, + 0 + ] + } + } + }, + "layers": [ + { + "id": "background", + "type": "background", + "paint": { + "background-color": "violet" + } + }, + { + "id": "circle", + "type": "circle", + "source": "point", + "paint": { + "circle-radius": 18, + "circle-color": "white" + } + }, + { + "id": "text", + "type": "symbol", + "source": "point", + "layout": { + "text-field": "Test", + "text-font": [ + "Open Sans Semibold", + "Arial Unicode MS Bold" + ] + }, + "paint": { + "text-color": "black" + } + } + ] +} \ No newline at end of file diff --git a/test/integration/render-tests/color-theme/update-config-import/expected.png b/test/integration/render-tests/color-theme/update-config-import/expected.png new file mode 100644 index 0000000000000000000000000000000000000000..cb1098be459ee7fa6b72e0bd26eda6de0ace96a1 GIT binary patch literal 1423 zcmV;A1#tR_P)Px)Nl8RORCr$PTWKhzUmX4+8T*!!ED^FVMLtc5#zp{?2O$E({t+HEY}_0`?~l4?|o1Ca-DPD^E~JGd!FAp@4aeO zRaLhn;HD-LAVz?g0-^>8SOZBELD2<77Z6=QbOF%?1k8YFgUYr+EiElFH8mv@6BE+b z)@HGHetu5-`}?%Fw?~(kmr9LCr9=P#`}p{fot+(NXlTd<_~*|b`uX!GO-)TPLSDPQ zDghQ27WD4jJJQ$J=Y-?euU|AUFhCm{8=S^JXV9w;F3IyO=TU&Wg3tkC8$VWv*y%gJv`ge46@R}055rCcl@ZrOY zz;NyS_3KyOB7qkIkn_pO$-IaCQv@L$YHMqG(F9%yh=_>bP4J!@6%fX*uCC{Hf3ly# z1Sli#pISX1dY~`?@$vDTeO}S+L!Hpr*r?Dn3K76n_!buz>FVl=+}+(tO-)T90E!Bt zLIk{j|DGHi99|3{Jw2V~=H{rnx|%#ZJYGEh?ttaxW$Nqe<2;8#1f-^>a#H@Zv@{wX z9wzLbr>7_9#bY2G;memVoaf+708VvDNl9`ad~gqV3A~_QvPyKs)due=poK{v=7y&p1Mn^}JtE(#`3(89t3 z6H=TXf`fylq;73(QD-`^7r?D6ag0(7X)WG zK0YRAXJZW^GZ29tE+{CVu&^-N-rlC{>}>YAjg1W% z85uD`6A}{G-`$3EnxCKNlm?s$@b&d2KR-X24_#edWfvZLdV2Kx_ixJ2&nN5>L=QU% z0w7!{opW<@Sw9d0z;Ff-g-WlovXVZ2{76|@S?uxz_XEbp#-ypKdGEOs6B9H!Ir-lq z0Qrha4Izw(zzzXaNl6Jy1rX5R-%s`R_0lLpzu4GVHm<$Bor;QzXm)m%8X6kN+uK_% zIF%6aR0<%UKY#vAKYsimb8~Z++oz|eERV~|%A^Dg4Gl3D@bdCv;6PepVj|ngrluxF zz|PJNK`5=Qt>qG+k`$07f&c+){Qmtr+hvHFj*br7eOOg-aj}$u!NEZWRFX#5*Vhym z7e`A=OAK^jVIj-;mX;Q>x3`x|fJ#JAmJJ>r9PoSax5!xoX- z0431?5a8nCLVU1dBO`;QPiX8G?f)XSb(fj zcw}URDk>_N4I=y<9UUnkAb@IWYS^7YWMm`*2!RB6sQ>QnE-QxKzI{tMIXPr#XvpwE z43R!ZM@LK}-~^vOePXF1X(}y+pE?X3930U4`Z~RN^M-l2y1F_82>=EL2GZLcj7QpR zZf=sUt}af$QxM zmjYf<;k)}x&W9mc3s;67C{p#wS~IT%NFqV7uf`+{3;N~g-7pjE>+y%VCfF}X$Pyhv zenp0h)hTNX?=GOMh4b|skpN|XO^&af<7*x<0>lUqe=i{ZUO@c40AGswf1F2j0nr6S d7ZA1!`~~$WNNzB4=kovn002ovPDHLkV1iUhe#-y= literal 0 HcmV?d00001 diff --git a/test/integration/render-tests/color-theme/update-config-import/style.json b/test/integration/render-tests/color-theme/update-config-import/style.json new file mode 100644 index 00000000000..1c7568711f0 --- /dev/null +++ b/test/integration/render-tests/color-theme/update-config-import/style.json @@ -0,0 +1,116 @@ +{ + "version": 8, + "metadata": { + "test": { + "height": 64, + "width": 64, + "operations": [ + [ + "wait" + ], + [ + "setConfigProperty", + "basemap", + "colorTheme", + "bw" + ], + [ + "wait" + ] + ] + } + }, + "center": [ + 0, + 0 + ], + "zoom": 0, + "transition": { + "duration": 0 + }, + "sources": {}, + "layers": [], + "imports": [ + { + "id": "basemap", + "url": "", + "data": { + "version": 8, + "color-theme": { + "data": [ + "match", + ["config", "colorTheme"], + "red", + "iVBORw0KGgoAAAANSUhEUgAABAAAAAAgCAYAAACM/gqmAAAAAXNSR0IArs4c6QAABSFJREFUeF7t3cFO40AQAFHnBv//wSAEEgmJPeUDsid5h9VqtcMiZsfdPdXVzmVZlo+3ZVm+fr3//L7257Lm778x+prL1ff0/b//H+z/4/M4OkuP/n70Nc7f+nnb+yzb//sY6vxt5xXPn+dP/aH+GsXJekb25izxR/ypZ6ucUefv9g4z2jPP3/HPHwAAgABAABgACIACkAAsAL1SD4yKWQAUAHUBdAG8buKNYoYL8PEX4FcHQAAAAAAAAAAAAAAAAAAAAAAA8LAeGF1mABAABAABQACQbZP7+hk5AwACAAAAAAAAAAAAAAAAAAAAAAAA4EE9AICMx4QBAAAAAAAANgvJsxGQV1dA/PxmMEtxU9YoABQACoC5CgDxX/wvsb2sEf/Ff/Ff/N96l5n73+/5YAB4CeBqx2VvMqXgUfD2npkzBCAXEBeQcrkoa5x/FxAXEBcQF5A2Wy3/t32qNYr8I//Mln+MABgBMAJgBMAIgBEAIwBGAIwAGAEwAmAE4K4eAGCNQIw+qQ0AmQ+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/6gEABAB5RgACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN/UAAPKcAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgEFNODICRtDkDO/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOhvlPUWem+h9xKQ+V4CUt9wO6KZnn/Pv+ff8z/bW5DFP59CUnJbWSP+iX/iX78znqED/urxnwHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADoNMcHUAdQAQcAUfAe8xEwH0O86t3IPz8OvClu17WqD/UH+oP9cf1Gdia01d/LQsDgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABkCnSQwABgACj8Aj8D1mItAMAB1wHfDS3S5r5F/5V/6Vf3XAW12h/mIArHY89iZTAAQA2XtmBKAWqOslyf4rgBXACmAFcIur8k/bJ/mnQTr5V/6Vf+fKv0YAjAAYATACYATACIARACMARgCMABgBMAJgBMAIgBEAIwCdZuiA64AjwAgwAtxjpg6cDlztLlLA7/Pr1gueyr56/jx/5ZzUNeof9Y/6R/0zk4HGAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHQaQ4DgAGAgCPgCHiPmTqQOpC1u8gAYACMjAf5V/6Vf+XfmTrQ8l97v8Z/5X8GAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADIBO0xgADAAdCB0IHYgeMxkADAAdkGM7IPbf/pfuWlmj/lH/qH/UPzMZGAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAJ3mMAAYAAg4Ao6A95jJAGAA6EDrQJfuclkj/8q/8q/8O1MHWv47Nv8xABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAB0msYAYADoQOhA6ED0mMkAYADogBzbAbH/9r/YFWWN+kf9o/5R/8xkYDAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgAHSawwBgACDgCDgC3mMmA4ABoAOtA126y2WN/Cv/yr/y70wdaPnv2PzHAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHQaRoDgAGgA6EDoQPRYyYDgAGgA3JsB8T+2/9iV5Q16h/1j/pH/TOTgcEAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAPgyQ2AT4NBIB3ew5dkAAAAAElFTkSuQmCC", + "bw", + "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", + "" + ] + }, + "glyphs": "local://glyphs/{fontstack}/{range}.pbf", + "schema": { + "colorTheme": { + "default": "red" + }, + "lightPreset": { + "default": [ + "format", + "abc", + { + "text-color": "red", + "text-font": [ + "Open Sans Semibold", + "Arial Unicode MS Bold" + ] + } + ] + } + }, + "sources": { + "point": { + "type": "geojson", + "data": { + "type": "Point", + "coordinates": [ + 0, + 0 + ] + } + } + }, + "layers": [ + { + "id": "background", + "type": "background", + "paint": { + "background-color": "violet" + } + }, + { + "id": "circle", + "type": "circle", + "source": "point", + "paint": { + "circle-radius": 18, + "circle-color": "white" + } + }, + { + "id": "text", + "type": "symbol", + "source": "point", + "layout": { + "text-field": [ + "config", + "lightPreset" + ] + }, + "paint": { + "text-color": "black" + } + } + ] + } + } + ] +} \ No newline at end of file diff --git a/test/integration/render-tests/color-theme/update-with-api/expected.png b/test/integration/render-tests/color-theme/update-with-api/expected.png new file mode 100644 index 0000000000000000000000000000000000000000..94761627a85dc62cadfcd5f4ab8544ddafbe0582 GIT binary patch literal 1431 zcmV;I1!($-P)Px)QAtEWRCr$PTUjV=Z5Vz{A(S~zNMuOLJf+M-oQ#DKE<{O5Itis*As2L#Au^Sm zxR6pDp&FAYcSU8&tIo>gwu}nVA`xnwpZnzCPpL z&CLy+oSe|{@iE=q-Kmt1Dq#Qu_Vx882L}hz($ac2z^A7t+S=NprKKeX$Y+mF1>oDa zZxkIJO-4pWoZ`5+xS+|&N!r`n<8;3wH+>2K$Z|qL0@>KuD6)os&iVWIFO80l64=4_ z;2i+aJv}}BpH%;7AP9bFXo&Z+;1vK+J~cJ2;X3)( zuV1_|ffoQ!^M!?lywhGDKq!Zfjt*WlffoRhlaqN9JVjXnVH_D5QFOZ8c}fGIin^D# zdOq|(X#n!_@;Ljvvgt#g(AU?e)MJzaK$XHLFG^(vQ7HgoV`B*=fGphK-^*O%%gYP7 zy1G(aT%1ywl6UjQ#s*DHOmKd-QUDYc718?oI%Q{P)9L9cTg2|}E+J?O3k$-=2LldK zU0uz2k&+vc?Zd-EDk&*>eHI*{t*wpovpEBR;0g)~Sg;EV3-tW_OqZ9JR99C=fByWT zmX;QBa<VEiEnC-;#m3_*~w`NY?eMt1Ai*4<~15XX@?kC2ei(*XMP1c5>cDat1(_ z`aeECQhagr;Ep=3NgJt;pwpIlsA*u1s1H5wQgpp}&s z!n15`Z7C)uh6Uc#)I<#p4dmhBL2hntOn9rRs@NQ5+<-Fx?(Xgs78dp z-rnA?*Z24LDK|Hlu_HJ*n3c!$^fcQd4-O8p^MQzn2-@7-q^PJU($UeO)zww<_xGoi zloYD3ucyVuMOIn>4gdfUM@L7RnVDhWaT%Ne@bmMdfPesn0l;EwYHC>4Dl02VLqmhH zp{%ToN=r)#f(ihzmuPQqCu3t{rYm5Axw$z_O-<4F@82mYDT#V|de~u#rluzQ|6mk= zPgnv$JDsJvcaE!3PBev7kdjLYR(ZWn~fi3(#E>VsQBgr&US9Mb z0BR`#St2M;10Eh8C^9mV)hTEXM?eWk2HXI>0tOfWZRqaqrm?Xx#t!HSK#|7)wTPg^ z2Bo?9o(RIbL33odxVZQg0N9~47?S6mpP#c+B?#gC{5+kVol$6LDEkZtBhvS%#RjoZ zG(yr|{vH6JKk66rGcq!ml_A?`q>x#-L2GL(a}KZzyFG{|R3F-bz8|H6a)OXTBoh-8 z*$J~+8X*7x<(6)606;K7jf8^Cts9ZLP4Z%@C~X`udtJUZUXAWdd=-u{W}>r>Dmp z!O+lh`KM(;3f<6)h z0D?ah1qiA<9a2{Kq(zzYUO?8yLlt_UOxGuC&Ab92VS->^jY;?Rf_*tEO*6s19{+!> z3HA#TvP4IaUy+do#8>%@cNh37fhoEU5dc+xO-|9wsA`_b0FeRW?*+u)3y8lLP?h3- l#s4F^fan6E3kcf<{sS(BU2dQ~CO-fG002ovPDHLkV1lnmkQ@L2 literal 0 HcmV?d00001 diff --git a/test/integration/render-tests/color-theme/update-with-api/style.json b/test/integration/render-tests/color-theme/update-with-api/style.json new file mode 100644 index 00000000000..2a5f7684a65 --- /dev/null +++ b/test/integration/render-tests/color-theme/update-with-api/style.json @@ -0,0 +1,80 @@ +{ + "version": 8, + "metadata": { + "test": { + "height": 64, + "width": 64, + "operations": [ + [ + "wait" + ], + [ + "setColorTheme", + { + "data": "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" + } + ], + [ + "wait" + ] + ] + } + }, + "color-theme": { + "data": "iVBORw0KGgoAAAANSUhEUgAABAAAAAAgCAYAAACM/gqmAAAAAXNSR0IArs4c6QAABSFJREFUeF7t3cFO40AQAFHnBv//wSAEEgmJPeUDsid5h9VqtcMiZsfdPdXVzmVZlo+3ZVm+fr3//L7257Lm778x+prL1ff0/b//H+z/4/M4OkuP/n70Nc7f+nnb+yzb//sY6vxt5xXPn+dP/aH+GsXJekb25izxR/ypZ6ucUefv9g4z2jPP3/HPHwAAgABAABgACIACkAAsAL1SD4yKWQAUAHUBdAG8buKNYoYL8PEX4FcHQAAAAAAAAAAAAAAAAAAAAAAA8LAeGF1mABAABAABQACQbZP7+hk5AwACAAAAAAAAAAAAAAAAAAAAAAAA4EE9AICMx4QBAAAAAAAANgvJsxGQV1dA/PxmMEtxU9YoABQACoC5CgDxX/wvsb2sEf/Ff/Ff/N96l5n73+/5YAB4CeBqx2VvMqXgUfD2npkzBCAXEBeQcrkoa5x/FxAXEBcQF5A2Wy3/t32qNYr8I//Mln+MABgBMAJgBMAIgBEAIwBGAIwAGAEwAmAE4K4eAGCNQIw+qQ0AmQ+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/6gEABAB5RgACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN/UAAPKcAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgEFNODICRtDkDO/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOhvlPUWem+h9xKQ+V4CUt9wO6KZnn/Pv+ff8z/bW5DFP59CUnJbWSP+iX/iX78znqED/urxnwHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADoNMcHUAdQAQcAUfAe8xEwH0O86t3IPz8OvClu17WqD/UH+oP9cf1Gdia01d/LQsDgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABkCnSQwABgACj8Aj8D1mItAMAB1wHfDS3S5r5F/5V/6Vf3XAW12h/mIArHY89iZTAAQA2XtmBKAWqOslyf4rgBXACmAFcIur8k/bJ/mnQTr5V/6Vf+fKv0YAjAAYATACYATACIARACMARgCMABgBMAJgBMAIgBEAIwCdZuiA64AjwAgwAtxjpg6cDlztLlLA7/Pr1gueyr56/jx/5ZzUNeof9Y/6R/0zk4HGAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHQaQ4DgAGAgCPgCHiPmTqQOpC1u8gAYACMjAf5V/6Vf+XfmTrQ8l97v8Z/5X8GAAOAAcAAYAAwABgADAAGAAOAAcAAYAAwABgADIBO0xgADAAdCB0IHYgeMxkADAAdkGM7IPbf/pfuWlmj/lH/qH/UPzMZGAwABgADgAHAAGAAMAAYAAwABgADgAHAAGAAMAAYAJ3mMAAYAAg4Ao6A95jJAGAA6EDrQJfuclkj/8q/8q/8O1MHWv47Nv8xABgADAAGAAOAAcAAYAAwABgADAAGAAOAAcAAYAB0msYAYADoQOhA6ED0mMkAYADogBzbAbH/9r/YFWWN+kf9o/5R/8xkYDAAGAAMAAYAA4ABwABgADAAGAAMAAYAA4ABwABgAHSawwBgACDgCDgC3mMmA4ABoAOtA126y2WN/Cv/yr/y70wdaPnv2PzHAGAAMAAYAAwABgADgAHAAGAAMAAYAAwABgADgAHQaRoDgAGgA6EDoQPRYyYDgAGgA3JsB8T+2/9iV5Q16h/1j/pH/TOTgcEAYAAwABgADAAGAAOAAcAAYAAwABgADAAGAAPgyQ2AT4NBIB3ew5dkAAAAAElFTkSuQmCC" + }, + "center": [ + 0, + 0 + ], + "zoom": 0, + "transition": { + "duration": 0 + }, + "glyphs": "local://glyphs/{fontstack}/{range}.pbf", + "sources": { + "point": { + "type": "geojson", + "data": { + "type": "Point", + "coordinates": [ + 0, + 0 + ] + } + } + }, + "layers": [ + { + "id": "background", + "type": "background", + "paint": { + "background-color": "violet" + } + }, + { + "id": "circle", + "type": "circle", + "source": "point", + "paint": { + "circle-radius": 18, + "circle-color": "white" + } + }, + { + "id": "text", + "type": "symbol", + "source": "point", + "layout": { + "text-field": "Test", + "text-font": [ + "Open Sans Semibold", + "Arial Unicode MS Bold" + ] + }, + "paint": { + "text-color": "black" + } + } + ] +} \ No newline at end of file From 424444c67fe363666e77e60249da68382d1b75bb Mon Sep 17 00:00:00 2001 From: Stepan Kuzmin Date: Mon, 24 Jun 2024 11:46:49 +0300 Subject: [PATCH 03/45] Update TypeScript to v5.5.x (internal-1484) --- package-lock.json | 8 ++++---- package.json | 2 +- src/source/worker.ts | 9 ++++----- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index a20cd8993d8..3afc8dc2a2a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -112,7 +112,7 @@ "tape-filter": "^1.0.4", "testem": "^3.14.0", "tsx": "^4.15.6", - "typescript": "^5.4.5", + "typescript": "^5.5.2", "typescript-eslint": "^7.13.1", "utility-types": "^3.11.0", "vite-plugin-arraybuffer": "^0.0.7", @@ -12874,9 +12874,9 @@ "dev": true }, "node_modules/typescript": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.2.tgz", + "integrity": "sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew==", "dev": true, "bin": { "tsc": "bin/tsc", diff --git a/package.json b/package.json index 83e573f1407..532e76c52fe 100644 --- a/package.json +++ b/package.json @@ -115,7 +115,7 @@ "tape-filter": "^1.0.4", "testem": "^3.14.0", "tsx": "^4.15.6", - "typescript": "^5.4.5", + "typescript": "^5.5.2", "typescript-eslint": "^7.13.1", "utility-types": "^3.11.0", "vite-plugin-arraybuffer": "^0.0.7", diff --git a/src/source/worker.ts b/src/source/worker.ts index f13ae8455bd..162cc69dba0 100644 --- a/src/source/worker.ts +++ b/src/source/worker.ts @@ -164,11 +164,10 @@ export default class Worker { for (const workerSource in this.workerSources[mapId][scope]) { const ws = this.workerSources[mapId][scope][workerSource]; for (const source in ws) { - if (ws[source] instanceof VectorTileWorkerSource) { - // @ts-expect-error - TS2339 - Property 'isSpriteLoaded' does not exist on type 'WorkerSource'. - ws[source].isSpriteLoaded = isLoaded; - // @ts-expect-error - TS2339 - Property 'fire' does not exist on type 'WorkerSource'. - ws[source].fire(new Event('isSpriteLoaded')); + const workerSource = ws[source]; + if (workerSource instanceof VectorTileWorkerSource) { + workerSource.isSpriteLoaded = isLoaded; + workerSource.fire(new Event('isSpriteLoaded')); } } } From 98a223967fed52a590adb5693ef2f89eb650fa0e Mon Sep 17 00:00:00 2001 From: Stepan Kuzmin Date: Mon, 24 Jun 2024 18:58:57 +0300 Subject: [PATCH 04/45] Expose deprecated `FunctionSpecification` type (internal-1538) --- build/generate-typed-style-spec.ts | 16 +++++++ src/style-spec/function/convert.ts | 57 ++++++++++-------------- src/style-spec/migrate/expressions.ts | 7 +-- src/style-spec/style-spec.ts | 19 +++++--- src/style-spec/types.ts | 16 +++++++ test/build/typings/compatibility-test.ts | 3 -- test/build/typings/package-lock.json | 25 ++++++----- 7 files changed, 83 insertions(+), 60 deletions(-) diff --git a/build/generate-typed-style-spec.ts b/build/generate-typed-style-spec.ts index be8f1fec48f..fa4064e0d1f 100644 --- a/build/generate-typed-style-spec.ts +++ b/build/generate-typed-style-spec.ts @@ -253,6 +253,21 @@ export type TransitionSpecification = { // Note: doesn't capture interpolatable vs. non-interpolatable types. +export type PropertyFunctionStop = [number, T]; +export type ZoomAndPropertyFunctionStop = [{zoom: number; value: string | number | boolean}, T]; + +/** + * @deprecated Use [Expressions](https://docs.mapbox.com/style-spec/reference/expressions/) syntax instead. +*/ +export type FunctionSpecification = { + stops: Array | ZoomAndPropertyFunctionStop>; + base?: number; + property?: string; + type?: 'identity' | 'exponential' | 'interval' | 'categorical'; + colorSpace?: 'rgb' | 'lab' | 'hcl'; + default?: T; +}; + export type CameraFunctionSpecification = | { type: 'exponential', stops: Array<[number, T]> } | { type: 'interval', stops: Array<[number, T]> }; @@ -277,6 +292,7 @@ export type PropertyValueSpecification = export type DataDrivenPropertyValueSpecification = | T + | FunctionSpecification | CameraFunctionSpecification | SourceFunctionSpecification | CompositeFunctionSpecification diff --git a/src/style-spec/function/convert.ts b/src/style-spec/function/convert.ts index c6a1f703f9d..fefb15f2c8e 100644 --- a/src/style-spec/function/convert.ts +++ b/src/style-spec/function/convert.ts @@ -1,27 +1,18 @@ import assert from 'assert'; import type {StylePropertySpecification} from '../style-spec'; -import type {ExpressionSpecification} from '../types'; - -type Stop = [{ - zoom: number; - value: string | number | boolean; -}, unknown]; - -type FunctionParameters = { - stops: Array; - base: number; - property: string; - type: 'identity' | 'exponential' | 'interval' | 'categorical'; - colorSpace: 'rgb' | 'lab' | 'hcl'; - default: unknown; -}; +import type { + FunctionSpecification, + PropertyFunctionStop, + ZoomAndPropertyFunctionStop, + ExpressionSpecification, +} from '../types'; function convertLiteral(value: unknown) { return typeof value === 'object' ? ['literal', value] : value; } -export default function convertFunction(parameters: FunctionParameters, propertySpec: StylePropertySpecification): ExpressionSpecification { +export default function convertFunction(parameters: FunctionSpecification, propertySpec: StylePropertySpecification): ExpressionSpecification { let stops = parameters.stops; if (!stops) { // identity function @@ -33,23 +24,22 @@ export default function convertFunction(parameters: FunctionParameters, property const zoomDependent = zoomAndFeatureDependent || !featureDependent; stops = stops.map((stop) => { - // @ts-expect-error - TS2339 - Property 'tokens' does not exist on type 'StylePropertySpecification'. if (!featureDependent && propertySpec.tokens && typeof stop[1] === 'string') { return [stop[0], convertTokenString(stop[1])]; } return [stop[0], convertLiteral(stop[1])]; - }); + }) as FunctionSpecification['stops']; if (zoomAndFeatureDependent) { - return convertZoomAndPropertyFunction(parameters, propertySpec, stops); + return convertZoomAndPropertyFunction(parameters, propertySpec, stops as Array>); } else if (zoomDependent) { - return convertZoomFunction(parameters, propertySpec, stops); + return convertZoomFunction(parameters, propertySpec, stops as PropertyFunctionStop[]); } else { - return convertPropertyFunction(parameters, propertySpec, stops); + return convertPropertyFunction(parameters, propertySpec, stops as PropertyFunctionStop[]); } } -function convertIdentityFunction(parameters: FunctionParameters, propertySpec: StylePropertySpecification): ExpressionSpecification { +function convertIdentityFunction(parameters: FunctionSpecification, propertySpec: StylePropertySpecification): ExpressionSpecification { const get: ExpressionSpecification = ['get', parameters.property]; if (parameters.default === undefined) { @@ -73,7 +63,7 @@ function convertIdentityFunction(parameters: FunctionParameters, propertySpec: S } } -function getInterpolateOperator(parameters: FunctionParameters) { +function getInterpolateOperator(parameters: FunctionSpecification) { switch (parameters.colorSpace) { case 'hcl': return 'interpolate-hcl'; case 'lab': return 'interpolate-lab'; @@ -81,10 +71,10 @@ function getInterpolateOperator(parameters: FunctionParameters) { } } -function convertZoomAndPropertyFunction( - parameters: FunctionParameters, +function convertZoomAndPropertyFunction( + parameters: FunctionSpecification, propertySpec: StylePropertySpecification, - stops: Array, + stops: Array>, ): ExpressionSpecification { const featureFunctionParameters: Record = {}; const featureFunctionStops: Record = {}; @@ -109,8 +99,7 @@ function convertZoomAndPropertyFunction( // function is determined directly from the style property specification // for which it's being used: linear for interpolatable properties, step // otherwise. - // @ts-expect-error - TS2345 - Argument of type '{}' is not assignable to parameter of type 'FunctionParameters'. - const functionType = getFunctionType({}, propertySpec); + const functionType = getFunctionType({} as FunctionSpecification, propertySpec); if (functionType === 'exponential') { const expression: ExpressionSpecification = [getInterpolateOperator(parameters), ['linear'], ['zoom']]; @@ -139,7 +128,7 @@ function coalesce(a: unknown, b: unknown) { if (b !== undefined) return b; } -function getFallback(parameters: FunctionParameters, propertySpec: StylePropertySpecification) { +function getFallback(parameters: FunctionSpecification, propertySpec: StylePropertySpecification) { const defaultValue = convertLiteral(coalesce(parameters.default, propertySpec.default)); /* @@ -154,10 +143,10 @@ function getFallback(parameters: FunctionParameters, propertySpec: StyleProperty return defaultValue; } -function convertPropertyFunction( - parameters: FunctionParameters, +function convertPropertyFunction( + parameters: FunctionSpecification, propertySpec: StylePropertySpecification, - stops: Array, + stops: Array>, ): ExpressionSpecification { const type = getFunctionType(parameters, propertySpec); const get: ExpressionSpecification = ['get', parameters.property]; @@ -211,7 +200,7 @@ function convertPropertyFunction( } } -function convertZoomFunction(parameters: FunctionParameters, propertySpec: StylePropertySpecification, stops: Array, input: Array = ['zoom']) { +function convertZoomFunction(parameters: FunctionSpecification, propertySpec: StylePropertySpecification, stops: Array>, input: Array = ['zoom']) { const type = getFunctionType(parameters, propertySpec); let expression; let isStep = false; @@ -256,7 +245,7 @@ function appendStopPair(curve: ExpressionSpecification, input: unknown, output: curve.push(output); } -function getFunctionType(parameters: FunctionParameters, propertySpec: StylePropertySpecification): string { +function getFunctionType(parameters: FunctionSpecification, propertySpec: StylePropertySpecification): string { if (parameters.type) { return parameters.type; } else { diff --git a/src/style-spec/migrate/expressions.ts b/src/style-spec/migrate/expressions.ts index ecc174b2218..f718237008c 100644 --- a/src/style-spec/migrate/expressions.ts +++ b/src/style-spec/migrate/expressions.ts @@ -3,7 +3,7 @@ import {isExpression} from '../expression/index'; import convertFunction, {convertTokenString} from '../function/convert'; import convertFilter from '../feature_filter/convert'; -import type {StyleSpecification} from '../types'; +import type {StyleSpecification, FunctionSpecification} from '../types'; /** * Migrate the given style object in place to use expressions. Specifically, @@ -22,10 +22,8 @@ export default function(style: StyleSpecification): StyleSpecification { eachProperty(style, {paint: true, layout: true}, ({path, value, reference, set}) => { if (isExpression(value)) return; if (typeof value === 'object' && !Array.isArray(value)) { - // @ts-expect-error - TS2345 - Argument of type 'object' is not assignable to parameter of type 'FunctionParameters'. - set(convertFunction(value, reference)); + set(convertFunction(value as FunctionSpecification, reference)); converted.push(path.join('.')); - // @ts-expect-error - TS2339 - Property 'tokens' does not exist on type 'StylePropertySpecification'. } else if (reference.tokens && typeof value === 'string') { set(convertTokenString(value)); } @@ -33,4 +31,3 @@ export default function(style: StyleSpecification): StyleSpecification { return style; } - diff --git a/src/style-spec/style-spec.ts b/src/style-spec/style-spec.ts index 23af16c7b87..df0f9e94cca 100644 --- a/src/style-spec/style-spec.ts +++ b/src/style-spec/style-spec.ts @@ -12,7 +12,8 @@ export type StylePropertySpecification = { 'property-type': ExpressionType, expression?: ExpressionSpecification, transition?: boolean, - default?: number + default?: number, + tokens: never } | { type: 'string', 'property-type': ExpressionType, @@ -25,20 +26,23 @@ export type StylePropertySpecification = { 'property-type': ExpressionType, expression?: ExpressionSpecification, transition?: boolean, - default?: boolean + default?: boolean, + tokens: never } | { type: 'enum', 'property-type': ExpressionType, expression?: ExpressionSpecification, values: {[_: string]: unknown}, transition?: boolean, - default?: string + default?: string, + tokens: never } | { type: 'color', 'property-type': ExpressionType, expression?: ExpressionSpecification, transition?: boolean, default?: string, + tokens: never, overridable: boolean } | { type: 'array', @@ -47,7 +51,8 @@ export type StylePropertySpecification = { expression?: ExpressionSpecification, length?: number, transition?: boolean, - default?: Array + default?: Array, + tokens: never } | { type: 'array', value: 'string', @@ -55,13 +60,15 @@ export type StylePropertySpecification = { expression?: ExpressionSpecification, length?: number, transition?: boolean, - default?: Array + default?: Array, + tokens: never } | { type: 'resolvedImage', 'property-type': ExpressionType, expression?: ExpressionSpecification, transition?: boolean, - default?: string + default?: string, + tokens: never }; import v8 from './reference/v8.json'; diff --git a/src/style-spec/types.ts b/src/style-spec/types.ts index c2e6ff836dc..5f2e256c9a2 100644 --- a/src/style-spec/types.ts +++ b/src/style-spec/types.ts @@ -27,6 +27,21 @@ export type TransitionSpecification = { // Note: doesn't capture interpolatable vs. non-interpolatable types. +export type PropertyFunctionStop = [number, T]; +export type ZoomAndPropertyFunctionStop = [{zoom: number; value: string | number | boolean}, T]; + +/** + * @deprecated Use [Expressions](https://docs.mapbox.com/style-spec/reference/expressions/) syntax instead. +*/ +export type FunctionSpecification = { + stops: Array | ZoomAndPropertyFunctionStop>; + base?: number; + property?: string; + type?: 'identity' | 'exponential' | 'interval' | 'categorical'; + colorSpace?: 'rgb' | 'lab' | 'hcl'; + default?: T; +}; + export type CameraFunctionSpecification = | { type: 'exponential', stops: Array<[number, T]> } | { type: 'interval', stops: Array<[number, T]> }; @@ -51,6 +66,7 @@ export type PropertyValueSpecification = export type DataDrivenPropertyValueSpecification = | T + | FunctionSpecification | CameraFunctionSpecification | SourceFunctionSpecification | CompositeFunctionSpecification diff --git a/test/build/typings/compatibility-test.ts b/test/build/typings/compatibility-test.ts index a9065febb33..fee6fcb784b 100644 --- a/test/build/typings/compatibility-test.ts +++ b/test/build/typings/compatibility-test.ts @@ -190,7 +190,6 @@ map.on("load", function () { layout: { "icon-image": "marker-15", "text-field": ["get", "property"], - // @ts-expect-error - incompatible "text-max-width": { stops: [ [10, 2], @@ -617,7 +616,6 @@ var mapStyle: mapboxgl.Style = { layout: { "text-field": "{name_en}", "text-font": ["DIN Offc Pro Bold", "Arial Unicode MS Bold"], - // @ts-expect-error - incompatible "text-size": { stops: [ [4, 9], @@ -671,7 +669,6 @@ var mapStyle: mapboxgl.Style = { ], "text-letter-spacing": 0.15, "text-max-width": 7, - // @ts-expect-error - incompatible "text-size": { stops: [ [4, 10], diff --git a/test/build/typings/package-lock.json b/test/build/typings/package-lock.json index c0ba19fc8de..08c04ac5f96 100644 --- a/test/build/typings/package-lock.json +++ b/test/build/typings/package-lock.json @@ -15,7 +15,7 @@ }, "../../..": { "name": "@mapbox/mapbox-gl-private", - "version": "3.5.0-alpha.1", + "version": "3.5.0-beta.1", "license": "SEE LICENSE IN LICENSE.txt", "workspaces": [ "src/style-spec" @@ -32,7 +32,7 @@ "csscolorparser": "~1.0.3", "earcut": "^2.2.4", "fflate": "^0.8.1", - "geojson-vt": "^3.2.1", + "geojson-vt": "^4.0.2", "gl-matrix": "^3.4.3", "grid-index": "^1.1.0", "kdbush": "^4.0.1", @@ -61,14 +61,15 @@ "@rollup/plugin-terser": "^0.4.4", "@tweakpane/core": "^2.0.3", "@types/geojson": "^7946.0.14", + "@types/geojson-vt": "^3.2.5", "@types/jest": "^29.5.12", "@types/mapbox__point-geometry": "^0.1.4", "@types/mapbox__vector-tile": "^1.3.4", - "@types/node": "^20.14.2", + "@types/node": "^20.14.3", "@types/offscreencanvas": "^2019.7.3", "@types/pbf": "^3.0.5", - "@typescript-eslint/eslint-plugin": "^7.12.0", - "@typescript-eslint/parser": "^7.12.0", + "@typescript-eslint/eslint-plugin": "^7.13.1", + "@typescript-eslint/parser": "^7.13.1", "@vitest/browser": "^1.6.0", "@vitest/ui": "^1.6.0", "address": "^2.0.2", @@ -82,13 +83,13 @@ "dts-bundle-generator": "^9.5.1", "ejs": "^3.1.10", "envify": "^4.1.0", - "esbuild": "^0.21.4", + "esbuild": "^0.21.5", "eslint": "^8.57.0", "eslint-config-mourner": "^3.0.0", "eslint-import-resolver-typescript": "^3.6.1", "eslint-plugin-html": "^8.1.1", "eslint-plugin-import": "^2.29.1", - "eslint-plugin-jsdoc": "^48.2.8", + "eslint-plugin-jsdoc": "^48.2.12", "glob": "^10.4.1", "is-builtin-module": "^4.0.0", "jest-extended": "^4.0.2", @@ -107,7 +108,6 @@ "postcss-cli": "^11.0.0", "postcss-inline-svg": "^6.0.0", "pretty-bytes": "^6.0.0", - "puppeteer-core": "^22.10.0", "qrcode-terminal": "^0.12.0", "rollup": "^4.18.0", "rollup-plugin-esbuild": "^6.1.1", @@ -117,12 +117,13 @@ "st": "^3.0.0", "stylelint": "^16.6.1", "stylelint-config-standard": "^36.0.0", - "tape": "^5.7.5", + "tape": "^5.8.1", "tape-filter": "^1.0.4", "testem": "^3.14.0", - "tsx": "^4.12.0", - "typescript": "^5.4.5", - "typescript-eslint": "^7.12.0", + "tsx": "^4.15.6", + "typescript": "^5.5.2", + "typescript-eslint": "^7.13.1", + "utility-types": "^3.11.0", "vite-plugin-arraybuffer": "^0.0.7", "vitest": "^1.6.0" } From eaf252c551d6ec362febe7f36816201b890ee654 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Jun 2024 10:30:16 +0300 Subject: [PATCH 05/45] Bump the eslint-dependencies group with 4 updates (internal-1539) Bumps the eslint-dependencies group with 4 updates: [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin), [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser), [eslint-plugin-jsdoc](https://github.com/gajus/eslint-plugin-jsdoc) and [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint). Updates `@typescript-eslint/eslint-plugin` from 7.13.1 to 7.14.1 - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v7.14.1/packages/eslint-plugin) Updates `@typescript-eslint/parser` from 7.13.1 to 7.14.1 - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v7.14.1/packages/parser) Updates `eslint-plugin-jsdoc` from 48.2.12 to 48.4.0 - [Release notes](https://github.com/gajus/eslint-plugin-jsdoc/releases) - [Changelog](https://github.com/gajus/eslint-plugin-jsdoc/blob/main/.releaserc) - [Commits](https://github.com/gajus/eslint-plugin-jsdoc/compare/v48.2.12...v48.4.0) Updates `typescript-eslint` from 7.13.1 to 7.14.1 - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v7.14.1/packages/typescript-eslint) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-minor dependency-group: eslint-dependencies - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-minor dependency-group: eslint-dependencies - dependency-name: eslint-plugin-jsdoc dependency-type: direct:development update-type: version-update:semver-minor dependency-group: eslint-dependencies - dependency-name: typescript-eslint dependency-type: direct:development update-type: version-update:semver-minor dependency-group: eslint-dependencies ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 173 ++++++++++++++++++++++++++++++---------------- package.json | 8 +-- 2 files changed, 118 insertions(+), 63 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3afc8dc2a2a..8394e2f3da8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -59,8 +59,8 @@ "@types/node": "^20.14.3", "@types/offscreencanvas": "^2019.7.3", "@types/pbf": "^3.0.5", - "@typescript-eslint/eslint-plugin": "^7.13.1", - "@typescript-eslint/parser": "^7.13.1", + "@typescript-eslint/eslint-plugin": "^7.14.1", + "@typescript-eslint/parser": "^7.14.1", "@vitest/browser": "^1.6.0", "@vitest/ui": "^1.6.0", "address": "^2.0.2", @@ -80,7 +80,7 @@ "eslint-import-resolver-typescript": "^3.6.1", "eslint-plugin-html": "^8.1.1", "eslint-plugin-import": "^2.29.1", - "eslint-plugin-jsdoc": "^48.2.12", + "eslint-plugin-jsdoc": "^48.4.0", "glob": "^10.4.1", "is-builtin-module": "^4.0.0", "jest-extended": "^4.0.2", @@ -113,7 +113,7 @@ "testem": "^3.14.0", "tsx": "^4.15.6", "typescript": "^5.5.2", - "typescript-eslint": "^7.13.1", + "typescript-eslint": "^7.14.1", "utility-types": "^3.11.0", "vite-plugin-arraybuffer": "^0.0.7", "vitest": "^1.6.0" @@ -1628,6 +1628,18 @@ "node": ">=14" } }, + "node_modules/@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, "node_modules/@polka/url": { "version": "1.0.0-next.25", "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.25.tgz", @@ -2265,16 +2277,16 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.13.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.13.1.tgz", - "integrity": "sha512-kZqi+WZQaZfPKnsflLJQCz6Ze9FFSMfXrrIOcyargekQxG37ES7DJNpJUE9Q/X5n3yTIP/WPutVNzgknQ7biLg==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.14.1.tgz", + "integrity": "sha512-aAJd6bIf2vvQRjUG3ZkNXkmBpN+J7Wd0mfQiiVCJMu9Z5GcZZdcc0j8XwN/BM97Fl7e3SkTXODSk4VehUv7CGw==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.13.1", - "@typescript-eslint/type-utils": "7.13.1", - "@typescript-eslint/utils": "7.13.1", - "@typescript-eslint/visitor-keys": "7.13.1", + "@typescript-eslint/scope-manager": "7.14.1", + "@typescript-eslint/type-utils": "7.14.1", + "@typescript-eslint/utils": "7.14.1", + "@typescript-eslint/visitor-keys": "7.14.1", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -2298,15 +2310,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "7.13.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.13.1.tgz", - "integrity": "sha512-1ELDPlnLvDQ5ybTSrMhRTFDfOQEOXNM+eP+3HT/Yq7ruWpciQw+Avi73pdEbA4SooCawEWo3dtYbF68gN7Ed1A==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.14.1.tgz", + "integrity": "sha512-8lKUOebNLcR0D7RvlcloOacTOWzOqemWEWkKSVpMZVF/XVcwjPR+3MD08QzbW9TCGJ+DwIc6zUSGZ9vd8cO1IA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "7.13.1", - "@typescript-eslint/types": "7.13.1", - "@typescript-eslint/typescript-estree": "7.13.1", - "@typescript-eslint/visitor-keys": "7.13.1", + "@typescript-eslint/scope-manager": "7.14.1", + "@typescript-eslint/types": "7.14.1", + "@typescript-eslint/typescript-estree": "7.14.1", + "@typescript-eslint/visitor-keys": "7.14.1", "debug": "^4.3.4" }, "engines": { @@ -2326,13 +2338,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "7.13.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.13.1.tgz", - "integrity": "sha512-adbXNVEs6GmbzaCpymHQ0MB6E4TqoiVbC0iqG3uijR8ZYfpAXMGttouQzF4Oat3P2GxDVIrg7bMI/P65LiQZdg==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.14.1.tgz", + "integrity": "sha512-gPrFSsoYcsffYXTOZ+hT7fyJr95rdVe4kGVX1ps/dJ+DfmlnjFN/GcMxXcVkeHDKqsq6uAcVaQaIi3cFffmAbA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.13.1", - "@typescript-eslint/visitor-keys": "7.13.1" + "@typescript-eslint/types": "7.14.1", + "@typescript-eslint/visitor-keys": "7.14.1" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -2343,13 +2355,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.13.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.13.1.tgz", - "integrity": "sha512-aWDbLu1s9bmgPGXSzNCxELu+0+HQOapV/y+60gPXafR8e2g1Bifxzevaa+4L2ytCWm+CHqpELq4CSoN9ELiwCg==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.14.1.tgz", + "integrity": "sha512-/MzmgNd3nnbDbOi3LfasXWWe292+iuo+umJ0bCCMCPc1jLO/z2BQmWUUUXvXLbrQey/JgzdF/OV+I5bzEGwJkQ==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "7.13.1", - "@typescript-eslint/utils": "7.13.1", + "@typescript-eslint/typescript-estree": "7.14.1", + "@typescript-eslint/utils": "7.14.1", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -2370,9 +2382,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "7.13.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.13.1.tgz", - "integrity": "sha512-7K7HMcSQIAND6RBL4kDl24sG/xKM13cA85dc7JnmQXw2cBDngg7c19B++JzvJHRG3zG36n9j1i451GBzRuHchw==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.14.1.tgz", + "integrity": "sha512-mL7zNEOQybo5R3AavY+Am7KLv8BorIv7HCYS5rKoNZKQD9tsfGUpO4KdAn3sSUvTiS4PQkr2+K0KJbxj8H9NDg==", "dev": true, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -2383,13 +2395,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.13.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.13.1.tgz", - "integrity": "sha512-uxNr51CMV7npU1BxZzYjoVz9iyjckBduFBP0S5sLlh1tXYzHzgZ3BR9SVsNed+LmwKrmnqN3Kdl5t7eZ5TS1Yw==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.14.1.tgz", + "integrity": "sha512-k5d0VuxViE2ulIO6FbxxSZaxqDVUyMbXcidC8rHvii0I56XZPv8cq+EhMns+d/EVIL41sMXqRbK3D10Oza1bbA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.13.1", - "@typescript-eslint/visitor-keys": "7.13.1", + "@typescript-eslint/types": "7.14.1", + "@typescript-eslint/visitor-keys": "7.14.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -2476,15 +2488,15 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "7.13.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.13.1.tgz", - "integrity": "sha512-h5MzFBD5a/Gh/fvNdp9pTfqJAbuQC4sCN2WzuXme71lqFJsZtLbjxfSk4r3p02WIArOF9N94pdsLiGutpDbrXQ==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.14.1.tgz", + "integrity": "sha512-CMmVVELns3nak3cpJhZosDkm63n+DwBlDX8g0k4QUa9BMnF+lH2lr3d130M1Zt1xxmB3LLk3NV7KQCq86ZBBhQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.13.1", - "@typescript-eslint/types": "7.13.1", - "@typescript-eslint/typescript-estree": "7.13.1" + "@typescript-eslint/scope-manager": "7.14.1", + "@typescript-eslint/types": "7.14.1", + "@typescript-eslint/typescript-estree": "7.14.1" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -2498,12 +2510,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.13.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.13.1.tgz", - "integrity": "sha512-k/Bfne7lrP7hcb7m9zSsgcBmo+8eicqqfNAJ7uUY+jkTFpKeH2FSkWpFRtimBxgkyvqfu9jTPRbYOvud6isdXA==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.14.1.tgz", + "integrity": "sha512-Crb+F75U1JAEtBeQGxSKwI60hZmmzaqA3z9sYsVm8X7W5cwLEm5bRe0/uXS6+MR/y8CVpKSR/ontIAIEPFcEkA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.13.1", + "@typescript-eslint/types": "7.14.1", "eslint-visitor-keys": "^3.4.3" }, "engines": { @@ -5238,9 +5250,9 @@ "dev": true }, "node_modules/es-module-lexer": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.2.tgz", - "integrity": "sha512-l60ETUTmLqbVbVHv1J4/qj+M8nq7AwMzEcg3kmJDt9dCNrTk+yHcYFf/Kw75pMDwd9mPcIGCG5LcS20SxYRzFA==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", "dev": true }, "node_modules/es-object-atoms": { @@ -5557,9 +5569,9 @@ } }, "node_modules/eslint-plugin-jsdoc": { - "version": "48.2.12", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-48.2.12.tgz", - "integrity": "sha512-sO9sKkJx5ovWoRk9hV0YiNzXQ4Z6j27CqE/po2E3wddZVuy9wvKPSTiIhpxMTrP/qURvKayJIDB2+o9kyCW1Fw==", + "version": "48.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-48.4.0.tgz", + "integrity": "sha512-xBUxuAx03cKoEA7y+MYSUdwyN8AJyZHbAJ257sOFXgVgCScm574S4zEYJpBoARwaCu4chhCbvA+gdm+00whlxA==", "dev": true, "dependencies": { "@es-joy/jsdoccomment": "~0.43.1", @@ -5568,8 +5580,10 @@ "debug": "^4.3.4", "escape-string-regexp": "^4.0.0", "esquery": "^1.5.0", + "parse-imports": "^2.1.0", "semver": "^7.6.2", - "spdx-expression-parse": "^4.0.0" + "spdx-expression-parse": "^4.0.0", + "synckit": "^0.9.0" }, "engines": { "node": ">=18" @@ -9472,6 +9486,19 @@ "node": ">= 0.10" } }, + "node_modules/parse-imports": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/parse-imports/-/parse-imports-2.1.0.tgz", + "integrity": "sha512-JQWgmK2o4w8leUkZeZPatWdAny6vXGU/3siIUvMF6J2rDCud9aTt8h/px9oZJ6U3EcfhngBJ635uPFI0q0VAeA==", + "dev": true, + "dependencies": { + "es-module-lexer": "^1.5.3", + "slashes": "^3.0.12" + }, + "engines": { + "node": ">= 18" + } + }, "node_modules/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", @@ -11352,6 +11379,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/slashes": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/slashes/-/slashes-3.0.12.tgz", + "integrity": "sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==", + "dev": true + }, "node_modules/slice-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", @@ -12273,6 +12306,22 @@ "url": "https://opencollective.com/svgo" } }, + "node_modules/synckit": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.0.tgz", + "integrity": "sha512-7RnqIMq572L8PeEzKeBINYEJDDxpcH8JEgLwUqBd3TkofhFRbkq4QLR0u+36avGAhCRbk2nnmjcW9SE531hPDg==", + "dev": true, + "dependencies": { + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, "node_modules/syntax-error": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", @@ -12715,6 +12764,12 @@ "json5": "lib/cli.js" } }, + "node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true + }, "node_modules/tsx": { "version": "4.15.6", "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.15.6.tgz", @@ -12887,14 +12942,14 @@ } }, "node_modules/typescript-eslint": { - "version": "7.13.1", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-7.13.1.tgz", - "integrity": "sha512-pvLEuRs8iS9s3Cnp/Wt//hpK8nKc8hVa3cLljHqzaJJQYP8oys8GUyIFqtlev+2lT/fqMPcyQko+HJ6iYK3nFA==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-7.14.1.tgz", + "integrity": "sha512-Eo1X+Y0JgGPspcANKjeR6nIqXl4VL5ldXLc15k4m9upq+eY5fhU2IueiEZL6jmHrKH8aCfbIvM/v3IrX5Hg99w==", "dev": true, "dependencies": { - "@typescript-eslint/eslint-plugin": "7.13.1", - "@typescript-eslint/parser": "7.13.1", - "@typescript-eslint/utils": "7.13.1" + "@typescript-eslint/eslint-plugin": "7.14.1", + "@typescript-eslint/parser": "7.14.1", + "@typescript-eslint/utils": "7.14.1" }, "engines": { "node": "^18.18.0 || >=20.0.0" diff --git a/package.json b/package.json index 532e76c52fe..8ead0fbe934 100644 --- a/package.json +++ b/package.json @@ -62,8 +62,8 @@ "@types/node": "^20.14.3", "@types/offscreencanvas": "^2019.7.3", "@types/pbf": "^3.0.5", - "@typescript-eslint/eslint-plugin": "^7.13.1", - "@typescript-eslint/parser": "^7.13.1", + "@typescript-eslint/eslint-plugin": "^7.14.1", + "@typescript-eslint/parser": "^7.14.1", "@vitest/browser": "^1.6.0", "@vitest/ui": "^1.6.0", "address": "^2.0.2", @@ -83,7 +83,7 @@ "eslint-import-resolver-typescript": "^3.6.1", "eslint-plugin-html": "^8.1.1", "eslint-plugin-import": "^2.29.1", - "eslint-plugin-jsdoc": "^48.2.12", + "eslint-plugin-jsdoc": "^48.4.0", "glob": "^10.4.1", "is-builtin-module": "^4.0.0", "jest-extended": "^4.0.2", @@ -116,7 +116,7 @@ "testem": "^3.14.0", "tsx": "^4.15.6", "typescript": "^5.5.2", - "typescript-eslint": "^7.13.1", + "typescript-eslint": "^7.14.1", "utility-types": "^3.11.0", "vite-plugin-arraybuffer": "^0.0.7", "vitest": "^1.6.0" From 6078272b8171bab46ff9ca6eba32c7a14807aafc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Jun 2024 10:30:49 +0300 Subject: [PATCH 06/45] Bump @octokit/rest from 20.1.1 to 21.0.0 (internal-1540) Bumps [@octokit/rest](https://github.com/octokit/rest.js) from 20.1.1 to 21.0.0. - [Release notes](https://github.com/octokit/rest.js/releases) - [Commits](https://github.com/octokit/rest.js/compare/v20.1.1...v21.0.0) --- updated-dependencies: - dependency-name: "@octokit/rest" dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 167 +++++++++++++++++++++++++++++++++++++++------- package.json | 2 +- 2 files changed, 144 insertions(+), 25 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8394e2f3da8..c3d07fc2422 100644 --- a/package-lock.json +++ b/package-lock.json @@ -42,7 +42,7 @@ }, "devDependencies": { "@mapbox/mvt-fixtures": "^3.10.0", - "@octokit/rest": "^20.1.1", + "@octokit/rest": "^21.0.0", "@rollup/plugin-alias": "^5.1.0", "@rollup/plugin-commonjs": "^26.0.1", "@rollup/plugin-json": "^6.1.0", @@ -1416,6 +1416,7 @@ "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz", "integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==", "dev": true, + "peer": true, "engines": { "node": ">= 18" } @@ -1425,6 +1426,7 @@ "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.1.0.tgz", "integrity": "sha512-BDa2VAMLSh3otEiaMJ/3Y36GU4qf6GI+VivQ/P41NC6GHcdxpKlqV0ikSZ5gdQsmS3ojXeRx5vasgNTinF0Q4g==", "dev": true, + "peer": true, "dependencies": { "@octokit/auth-token": "^4.0.0", "@octokit/graphql": "^7.0.0", @@ -1443,6 +1445,7 @@ "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.4.tgz", "integrity": "sha512-DWPLtr1Kz3tv8L0UvXTDP1fNwM0S+z6EJpRcvH66orY6Eld4XBMCSYsaWp4xIm61jTWxK68BrR7ibO+vSDnZqw==", "dev": true, + "peer": true, "dependencies": { "@octokit/types": "^12.0.0", "universal-user-agent": "^6.0.0" @@ -1456,6 +1459,7 @@ "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.0.2.tgz", "integrity": "sha512-OJ2iGMtj5Tg3s6RaXH22cJcxXRi7Y3EBqbHTBRq+PQAqfaS8f/236fUrWhfSn8P4jovyzqucxme7/vWSSZBX2Q==", "dev": true, + "peer": true, "dependencies": { "@octokit/request": "^8.0.1", "@octokit/types": "^12.0.0", @@ -1469,7 +1473,8 @@ "version": "20.0.0", "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz", "integrity": "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==", - "dev": true + "dev": true, + "peer": true }, "node_modules/@octokit/plugin-paginate-rest": { "version": "11.3.1", @@ -1501,18 +1506,6 @@ "@octokit/openapi-types": "^22.2.0" } }, - "node_modules/@octokit/plugin-request-log": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-4.0.1.tgz", - "integrity": "sha512-GihNqNpGHorUrO7Qa9JbAl0dbLnqJVrV8OXe2Zm5/Y4wFkZQDfTreBzVmiRfJVfE4mClXdihHnbpyyO9FSX4HA==", - "dev": true, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@octokit/core": "5" - } - }, "node_modules/@octokit/plugin-rest-endpoint-methods": { "version": "13.2.2", "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.2.2.tgz", @@ -1548,6 +1541,7 @@ "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.2.0.tgz", "integrity": "sha512-exPif6x5uwLqv1N1irkLG1zZNJkOtj8bZxuVHd71U5Ftuxf2wGNvAJyNBcPbPC+EBzwYEbBDdSFb8EPcjpYxPQ==", "dev": true, + "peer": true, "dependencies": { "@octokit/endpoint": "^9.0.0", "@octokit/request-error": "^5.0.0", @@ -1563,6 +1557,7 @@ "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.0.1.tgz", "integrity": "sha512-X7pnyTMV7MgtGmiXBwmO6M5kIPrntOXdyKZLigNfQWSEQzVxR4a4vo49vJjTWX70mPndj8KhfT4Dx+2Ng3vnBQ==", "dev": true, + "peer": true, "dependencies": { "@octokit/types": "^12.0.0", "deprecation": "^2.0.0", @@ -1573,25 +1568,146 @@ } }, "node_modules/@octokit/rest": { - "version": "20.1.1", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-20.1.1.tgz", - "integrity": "sha512-MB4AYDsM5jhIHro/dq4ix1iWTLGToIGk6cWF5L6vanFaMble5jTX/UBQyiv05HsWnwUtY8JrfHy2LWfKwihqMw==", + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-21.0.0.tgz", + "integrity": "sha512-XudXXOmiIjivdjNZ+fN71NLrnDM00sxSZlhqmPR3v0dVoJwyP628tSlc12xqn8nX3N0965583RBw5GPo6r8u4Q==", + "dev": true, + "dependencies": { + "@octokit/core": "^6.1.2", + "@octokit/plugin-paginate-rest": "^11.0.0", + "@octokit/plugin-request-log": "^5.1.0", + "@octokit/plugin-rest-endpoint-methods": "^13.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/rest/node_modules/@octokit/auth-token": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-5.1.1.tgz", + "integrity": "sha512-rh3G3wDO8J9wSjfI436JUKzHIxq8NaiL0tVeB2aXmG6p/9859aUOAjA9pmSPNGGZxfwmaJ9ozOJImuNVJdpvbA==", + "dev": true, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/rest/node_modules/@octokit/core": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-6.1.2.tgz", + "integrity": "sha512-hEb7Ma4cGJGEUNOAVmyfdB/3WirWMg5hDuNFVejGEDFqupeOysLc2sG6HJxY2etBp5YQu5Wtxwi020jS9xlUwg==", + "dev": true, + "dependencies": { + "@octokit/auth-token": "^5.0.0", + "@octokit/graphql": "^8.0.0", + "@octokit/request": "^9.0.0", + "@octokit/request-error": "^6.0.1", + "@octokit/types": "^13.0.0", + "before-after-hook": "^3.0.2", + "universal-user-agent": "^7.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/rest/node_modules/@octokit/endpoint": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.1.tgz", + "integrity": "sha512-JYjh5rMOwXMJyUpj028cu0Gbp7qe/ihxfJMLc8VZBMMqSwLgOxDI1911gV4Enl1QSavAQNJcwmwBF9M0VvLh6Q==", + "dev": true, + "dependencies": { + "@octokit/types": "^13.0.0", + "universal-user-agent": "^7.0.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/rest/node_modules/@octokit/graphql": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.1.1.tgz", + "integrity": "sha512-ukiRmuHTi6ebQx/HFRCXKbDlOh/7xEV6QUXaE7MJEKGNAncGI/STSbOkl12qVXZrfZdpXctx5O9X1AIaebiDBg==", + "dev": true, + "dependencies": { + "@octokit/request": "^9.0.0", + "@octokit/types": "^13.0.0", + "universal-user-agent": "^7.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/rest/node_modules/@octokit/openapi-types": { + "version": "22.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-22.2.0.tgz", + "integrity": "sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==", + "dev": true + }, + "node_modules/@octokit/rest/node_modules/@octokit/plugin-request-log": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-5.3.0.tgz", + "integrity": "sha512-FiGcyjdtYPlr03ExBk/0ysIlEFIFGJQAVoPPMxL19B24bVSEiZQnVGBunNtaAF1YnvE/EFoDpXmITtRnyCiypQ==", + "dev": true, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": ">=6" + } + }, + "node_modules/@octokit/rest/node_modules/@octokit/request": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.1.1.tgz", + "integrity": "sha512-pyAguc0p+f+GbQho0uNetNQMmLG1e80WjkIaqqgUkihqUp0boRU6nKItXO4VWnr+nbZiLGEyy4TeKRwqaLvYgw==", "dev": true, "dependencies": { - "@octokit/core": "^5.0.2", - "@octokit/plugin-paginate-rest": "11.3.1", - "@octokit/plugin-request-log": "^4.0.0", - "@octokit/plugin-rest-endpoint-methods": "13.2.2" + "@octokit/endpoint": "^10.0.0", + "@octokit/request-error": "^6.0.1", + "@octokit/types": "^13.1.0", + "universal-user-agent": "^7.0.2" }, "engines": { "node": ">= 18" } }, + "node_modules/@octokit/rest/node_modules/@octokit/request-error": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.1.tgz", + "integrity": "sha512-1mw1gqT3fR/WFvnoVpY/zUM2o/XkMs/2AszUUG9I69xn0JFLv6PGkPhNk5lbfvROs79wiS0bqiJNxfCZcRJJdg==", + "dev": true, + "dependencies": { + "@octokit/types": "^13.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/rest/node_modules/@octokit/types": { + "version": "13.5.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.5.0.tgz", + "integrity": "sha512-HdqWTf5Z3qwDVlzCrP8UJquMwunpDiMPt5er+QjGzL4hqr/vBVY/MauQgS1xWxCDT1oMx1EULyqxncdCY/NVSQ==", + "dev": true, + "dependencies": { + "@octokit/openapi-types": "^22.2.0" + } + }, + "node_modules/@octokit/rest/node_modules/before-after-hook": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-3.0.2.tgz", + "integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==", + "dev": true + }, + "node_modules/@octokit/rest/node_modules/universal-user-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.2.tgz", + "integrity": "sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==", + "dev": true + }, "node_modules/@octokit/types": { "version": "12.6.0", "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.6.0.tgz", "integrity": "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==", "dev": true, + "peer": true, "dependencies": { "@octokit/openapi-types": "^20.0.0" } @@ -3200,7 +3316,8 @@ "version": "2.2.3", "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", - "dev": true + "dev": true, + "peer": true }, "node_modules/binary-extensions": { "version": "2.3.0", @@ -4713,7 +4830,8 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", - "dev": true + "dev": true, + "peer": true }, "node_modules/deps-sort": { "version": "2.0.1", @@ -13059,7 +13177,8 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", - "dev": true + "dev": true, + "peer": true }, "node_modules/universalify": { "version": "2.0.1", diff --git a/package.json b/package.json index 8ead0fbe934..89d8ee46e3d 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ }, "devDependencies": { "@mapbox/mvt-fixtures": "^3.10.0", - "@octokit/rest": "^20.1.1", + "@octokit/rest": "^21.0.0", "@rollup/plugin-alias": "^5.1.0", "@rollup/plugin-commonjs": "^26.0.1", "@rollup/plugin-json": "^6.1.0", From d61b5a0c6cf6fd1ab60d7655877b887fa21259c1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Jun 2024 10:31:48 +0300 Subject: [PATCH 07/45] Bump cssnano from 7.0.2 to 7.0.3 (internal-1542) Bumps [cssnano](https://github.com/cssnano/cssnano) from 7.0.2 to 7.0.3. - [Release notes](https://github.com/cssnano/cssnano/releases) - [Commits](https://github.com/cssnano/cssnano/compare/cssnano@7.0.2...cssnano@7.0.3) --- updated-dependencies: - dependency-name: cssnano 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 | 156 ++++++++++++++++++++++++---------------------- package.json | 2 +- 2 files changed, 81 insertions(+), 77 deletions(-) diff --git a/package-lock.json b/package-lock.json index c3d07fc2422..ab614ddc759 100644 --- a/package-lock.json +++ b/package-lock.json @@ -68,7 +68,7 @@ "chalk": "^5.0.1", "chokidar": "^3.6.0", "cross-env": "^7.0.3", - "cssnano": "^7.0.2", + "cssnano": "^7.0.3", "d3-queue": "^3.0.7", "diff": "^5.2.0", "dts-bundle-generator": "^9.5.1", @@ -3660,9 +3660,9 @@ } }, "node_modules/browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "version": "4.23.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz", + "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==", "dev": true, "funding": [ { @@ -3679,10 +3679,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", + "caniuse-lite": "^1.0.30001629", + "electron-to-chromium": "^1.4.796", "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" + "update-browserslist-db": "^1.0.16" }, "bin": { "browserslist": "cli.js" @@ -3802,9 +3802,9 @@ "dev": true }, "node_modules/caniuse-lite": { - "version": "1.0.30001629", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001629.tgz", - "integrity": "sha512-c3dl911slnQhmxUIT4HhYzT7wnBK/XYpGnYLOj4nJBaRiw52Ibe7YxlDaAeRECvA786zCuExhxIUJ2K7nHMrBw==", + "version": "1.0.30001636", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001636.tgz", + "integrity": "sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==", "dev": true, "funding": [ { @@ -4506,13 +4506,13 @@ } }, "node_modules/cssnano": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-7.0.2.tgz", - "integrity": "sha512-LXm/Xx6TNLzfHM2lBaIQHfvtdW5QfdbyLzfJAWZrclCAb47yVa0/yJG69+amcw3Lq0YZ+kyU40rbsMPLcMt9aw==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-7.0.3.tgz", + "integrity": "sha512-lsekJctOTqdCn4cNrtrSwsuMR/fHC+oiVMHkp/OugBWtwjH8XJag1/OtGaYJGtz0un1fQcRy4ryfYTQsfh+KSQ==", "dev": true, "dependencies": { - "cssnano-preset-default": "^7.0.2", - "lilconfig": "^3.1.1" + "cssnano-preset-default": "^7.0.3", + "lilconfig": "^3.1.2" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" @@ -4526,38 +4526,38 @@ } }, "node_modules/cssnano-preset-default": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-7.0.2.tgz", - "integrity": "sha512-z95kGKZx8VWHfERj7LFzuiTxylbvEp07ZEYaFu+t6bFyNOXLd/+3oPyNaY7ISwcrfHFCkt8OfRo4IZxVRJZ7dg==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-7.0.3.tgz", + "integrity": "sha512-dQ3Ba1p/oewICp/szF1XjFFgql8OlOBrI2YNBUUwhHQnJNoMOcQTa+Bi7jSJN8r/eM1egW0Ud1se/S7qlduWKA==", "dev": true, "dependencies": { - "browserslist": "^4.23.0", + "browserslist": "^4.23.1", "css-declaration-sorter": "^7.2.0", "cssnano-utils": "^5.0.0", "postcss-calc": "^10.0.0", - "postcss-colormin": "^7.0.0", - "postcss-convert-values": "^7.0.0", - "postcss-discard-comments": "^7.0.0", + "postcss-colormin": "^7.0.1", + "postcss-convert-values": "^7.0.1", + "postcss-discard-comments": "^7.0.1", "postcss-discard-duplicates": "^7.0.0", "postcss-discard-empty": "^7.0.0", "postcss-discard-overridden": "^7.0.0", - "postcss-merge-longhand": "^7.0.1", - "postcss-merge-rules": "^7.0.1", + "postcss-merge-longhand": "^7.0.2", + "postcss-merge-rules": "^7.0.2", "postcss-minify-font-values": "^7.0.0", "postcss-minify-gradients": "^7.0.0", - "postcss-minify-params": "^7.0.0", - "postcss-minify-selectors": "^7.0.1", + "postcss-minify-params": "^7.0.1", + "postcss-minify-selectors": "^7.0.2", "postcss-normalize-charset": "^7.0.0", "postcss-normalize-display-values": "^7.0.0", "postcss-normalize-positions": "^7.0.0", "postcss-normalize-repeat-style": "^7.0.0", "postcss-normalize-string": "^7.0.0", "postcss-normalize-timing-functions": "^7.0.0", - "postcss-normalize-unicode": "^7.0.0", + "postcss-normalize-unicode": "^7.0.1", "postcss-normalize-url": "^7.0.0", "postcss-normalize-whitespace": "^7.0.0", - "postcss-ordered-values": "^7.0.0", - "postcss-reduce-initial": "^7.0.0", + "postcss-ordered-values": "^7.0.1", + "postcss-reduce-initial": "^7.0.1", "postcss-reduce-transforms": "^7.0.0", "postcss-svgo": "^7.0.1", "postcss-unique-selectors": "^7.0.1" @@ -5088,9 +5088,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.791", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.791.tgz", - "integrity": "sha512-6FlqP0NSWvxFf1v+gHu+LCn5wjr1pmkj5nPr7BsxPnj41EDR4EWhK/KmQN0ytHUqgTR1lkpHRYxvHBLZFQtkKw==", + "version": "1.4.811", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.811.tgz", + "integrity": "sha512-CDyzcJ5XW78SHzsIOdn27z8J4ist8eaFLhdto2hSMSJQgsiwvbv2fbizcKUICryw1Wii1TI/FEkvzvJsR3awrA==", "dev": true }, "node_modules/elliptic": { @@ -8298,9 +8298,9 @@ } }, "node_modules/lilconfig": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", - "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", "dev": true, "engines": { "node": ">=14" @@ -9977,12 +9977,12 @@ } }, "node_modules/postcss-colormin": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-7.0.0.tgz", - "integrity": "sha512-5CN6fqtsEtEtwf3mFV3B4UaZnlYljPpzmGeDB4yCK067PnAtfLe9uX2aFZaEwxHE7HopG5rUkW8gyHrNAesHEg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-7.0.1.tgz", + "integrity": "sha512-uszdT0dULt3FQs47G5UHCduYK+FnkLYlpu1HpWu061eGsKZ7setoG7kA+WC9NQLsOJf69D5TxGHgnAdRgylnFQ==", "dev": true, "dependencies": { - "browserslist": "^4.23.0", + "browserslist": "^4.23.1", "caniuse-api": "^3.0.0", "colord": "^2.9.3", "postcss-value-parser": "^4.2.0" @@ -9995,12 +9995,12 @@ } }, "node_modules/postcss-convert-values": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-7.0.0.tgz", - "integrity": "sha512-bMuzDgXBbFbByPgj+/r6va8zNuIDUaIIbvAFgdO1t3zdgJZ77BZvu6dfWyd6gHEJnYzmeVr9ayUsAQL3/qLJ0w==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-7.0.1.tgz", + "integrity": "sha512-9x2ofb+hYPwHWMlWAzyWys2yMDZYGfkX9LodbaVTmLdlupmtH2AGvj8Up95wzzNPRDEzPIxQIkUaPJew3bT6xA==", "dev": true, "dependencies": { - "browserslist": "^4.23.0", + "browserslist": "^4.23.1", "postcss-value-parser": "^4.2.0" }, "engines": { @@ -10011,10 +10011,13 @@ } }, "node_modules/postcss-discard-comments": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-7.0.0.tgz", - "integrity": "sha512-xpSdzRqYmy4YIVmjfGyYXKaI1SRnK6CTr+4Zmvyof8ANwvgfZgGdVtmgAvzh59gJm808mJCWQC9tFN0KF5dEXA==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-7.0.1.tgz", + "integrity": "sha512-GVrQxUOhmle1W6jX2SvNLt4kmN+JYhV7mzI6BMnkAWR9DtVvg8e67rrV0NfdWhn7x1zxvzdWkMBPdBDCls+uwQ==", "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.1.0" + }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, @@ -10128,13 +10131,13 @@ } }, "node_modules/postcss-merge-longhand": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-7.0.1.tgz", - "integrity": "sha512-qZlD26hnqSTMxSSOMS8+QCeRWtqOdMKeQHvHcBhjL3mJxKUs47cvO1Y1x3iTdYIk3ioMcRHTiy229TT0mEMH/A==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-7.0.2.tgz", + "integrity": "sha512-06vrW6ZWi9qeP7KMS9fsa9QW56+tIMW55KYqF7X3Ccn+NI2pIgPV6gFfvXTMQ05H90Y5DvnCDPZ2IuHa30PMUg==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0", - "stylehacks": "^7.0.1" + "stylehacks": "^7.0.2" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" @@ -10144,12 +10147,12 @@ } }, "node_modules/postcss-merge-rules": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-7.0.1.tgz", - "integrity": "sha512-bb8McYQbo2etgs0uVt6AfngajACK3FHSVP3sGLhprrjbtHJWgG03JZ4KKBlJ8/5Fb8/Rr+mMKaybMYeoYrAg0A==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-7.0.2.tgz", + "integrity": "sha512-VAR47UNvRsdrTHLe7TV1CeEtF9SJYR5ukIB9U4GZyZOptgtsS20xSxy+k5wMrI3udST6O1XuIn7cjQkg7sDAAw==", "dev": true, "dependencies": { - "browserslist": "^4.23.0", + "browserslist": "^4.23.1", "caniuse-api": "^3.0.0", "cssnano-utils": "^5.0.0", "postcss-selector-parser": "^6.1.0" @@ -10194,12 +10197,12 @@ } }, "node_modules/postcss-minify-params": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-7.0.0.tgz", - "integrity": "sha512-XOJAuX8Q/9GT1sGxlUvaFEe2H9n50bniLZblXXsAT/BwSfFYvzSZeFG7uupwc0KbKpTnflnQ7aMwGzX6JUWliQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-7.0.1.tgz", + "integrity": "sha512-e+Xt8xErSRPgSRFxHeBCSxMiO8B8xng7lh8E0A5ep1VfwYhY8FXhu4Q3APMjgx9YDDbSp53IBGENrzygbUvgUQ==", "dev": true, "dependencies": { - "browserslist": "^4.23.0", + "browserslist": "^4.23.1", "cssnano-utils": "^5.0.0", "postcss-value-parser": "^4.2.0" }, @@ -10211,11 +10214,12 @@ } }, "node_modules/postcss-minify-selectors": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-7.0.1.tgz", - "integrity": "sha512-YfIbGtcgMFquPxV2L/ASs36ZS4DsgfcDX9tQ8cTEIvBTv+0GXFKtcvvpi9tCKto/+DWGWYKMCESFG3Pnan0Feg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-7.0.2.tgz", + "integrity": "sha512-dCzm04wqW1uqLmDZ41XYNBJfjgps3ZugDpogAmJXoCb5oCiTzIX4oPXXKxDpTvWOnKxQKR4EbV4ZawJBLcdXXA==", "dev": true, "dependencies": { + "cssesc": "^3.0.0", "postcss-selector-parser": "^6.1.0" }, "engines": { @@ -10313,12 +10317,12 @@ } }, "node_modules/postcss-normalize-unicode": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.0.tgz", - "integrity": "sha512-OnKV52/VFFDAim4n0pdI+JAhsolLBdnCKxE6VV5lW5Q/JeVGFN8UM8ur6/A3EAMLsT1ZRm3fDHh/rBoBQpqi2w==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.1.tgz", + "integrity": "sha512-PTPGdY9xAkTw+8ZZ71DUePb7M/Vtgkbbq+EoI33EuyQEzbKemEQMhe5QSr0VP5UfZlreANDPxSfcdSprENcbsg==", "dev": true, "dependencies": { - "browserslist": "^4.23.0", + "browserslist": "^4.23.1", "postcss-value-parser": "^4.2.0" }, "engines": { @@ -10359,9 +10363,9 @@ } }, "node_modules/postcss-ordered-values": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-7.0.0.tgz", - "integrity": "sha512-KROvC63A8UQW1eYDljQe1dtwc1E/M+mMwDT6z7khV/weHYLWTghaLRLunU7x1xw85lWFwVZOAGakxekYvKV+0w==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-7.0.1.tgz", + "integrity": "sha512-irWScWRL6nRzYmBOXReIKch75RRhNS86UPUAxXdmW/l0FcAsg0lvAXQCby/1lymxn/o0gVa6Rv/0f03eJOwHxw==", "dev": true, "dependencies": { "cssnano-utils": "^5.0.0", @@ -10375,12 +10379,12 @@ } }, "node_modules/postcss-reduce-initial": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-7.0.0.tgz", - "integrity": "sha512-iqGgmBxY9LrblZ0BKLjmrA1mC/cf9A/wYCCqSmD6tMi+xAyVl0+DfixZIHSVDMbCPRPjNmVF0DFGth/IDGelFQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-7.0.1.tgz", + "integrity": "sha512-0JDUSV4bGB5FGM5g8MkS+rvqKukJZ7OTHw/lcKn7xPNqeaqJyQbUO8/dJpvyTpaVwPsd3Uc33+CfNzdVowp2WA==", "dev": true, "dependencies": { - "browserslist": "^4.23.0", + "browserslist": "^4.23.1", "caniuse-api": "^3.0.0" }, "engines": { @@ -12106,12 +12110,12 @@ "dev": true }, "node_modules/stylehacks": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-7.0.1.tgz", - "integrity": "sha512-PnrT4HzajnxbjfChpeBKLSpSykilnGBlD+pIffCoT5KbLur9fcL8uKRQJJap85byR2wCYZl/4Otk5eq76qeZxQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-7.0.2.tgz", + "integrity": "sha512-HdkWZS9b4gbgYTdMg4gJLmm7biAUug1qTqXjS+u8X+/pUd+9Px1E+520GnOW3rST9MNsVOVpsJG+mPHNosxjOQ==", "dev": true, "dependencies": { - "browserslist": "^4.23.0", + "browserslist": "^4.23.1", "postcss-selector-parser": "^6.1.0" }, "engines": { diff --git a/package.json b/package.json index 89d8ee46e3d..4808c98ffd6 100644 --- a/package.json +++ b/package.json @@ -71,7 +71,7 @@ "chalk": "^5.0.1", "chokidar": "^3.6.0", "cross-env": "^7.0.3", - "cssnano": "^7.0.2", + "cssnano": "^7.0.3", "d3-queue": "^3.0.7", "diff": "^5.2.0", "dts-bundle-generator": "^9.5.1", From 4a628a6e9db09961051f85a179192ec00ee4c0ca Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Jun 2024 10:36:52 +0300 Subject: [PATCH 08/45] Bump tsx from 4.15.6 to 4.15.7 (internal-1545) Bumps [tsx](https://github.com/privatenumber/tsx) from 4.15.6 to 4.15.7. - [Release notes](https://github.com/privatenumber/tsx/releases) - [Changelog](https://github.com/privatenumber/tsx/blob/master/release.config.cjs) - [Commits](https://github.com/privatenumber/tsx/compare/v4.15.6...v4.15.7) --- updated-dependencies: - dependency-name: tsx 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 ab614ddc759..60befd73265 100644 --- a/package-lock.json +++ b/package-lock.json @@ -111,7 +111,7 @@ "tape": "^5.8.1", "tape-filter": "^1.0.4", "testem": "^3.14.0", - "tsx": "^4.15.6", + "tsx": "^4.15.7", "typescript": "^5.5.2", "typescript-eslint": "^7.14.1", "utility-types": "^3.11.0", @@ -12893,9 +12893,9 @@ "dev": true }, "node_modules/tsx": { - "version": "4.15.6", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.15.6.tgz", - "integrity": "sha512-is0VQQlfNZRHEuSSTKA6m4xw74IU4AizmuB6lAYLRt9XtuyeQnyJYexhNZOPCB59SqC4JzmSzPnHGBXxf3k0hA==", + "version": "4.15.7", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.15.7.tgz", + "integrity": "sha512-u3H0iSFDZM3za+VxkZ1kywdCeHCn+8/qHQS1MNoO2sONDgD95HlWtt8aB23OzeTmFP9IU4/8bZUdg58Uu5J4cg==", "dev": true, "dependencies": { "esbuild": "~0.21.4", diff --git a/package.json b/package.json index 4808c98ffd6..28ef76f823b 100644 --- a/package.json +++ b/package.json @@ -114,7 +114,7 @@ "tape": "^5.8.1", "tape-filter": "^1.0.4", "testem": "^3.14.0", - "tsx": "^4.15.6", + "tsx": "^4.15.7", "typescript": "^5.5.2", "typescript-eslint": "^7.14.1", "utility-types": "^3.11.0", From 8fe0fcec080f81d4787629c0bb45899dc9d2a453 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Jun 2024 10:53:38 +0300 Subject: [PATCH 09/45] Bump playwright from 1.44.1 to 1.45.0 (internal-1543) Bumps [playwright](https://github.com/microsoft/playwright) from 1.44.1 to 1.45.0. - [Release notes](https://github.com/microsoft/playwright/releases) - [Commits](https://github.com/microsoft/playwright/compare/v1.44.1...v1.45.0) --- updated-dependencies: - dependency-name: playwright dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 20 ++++++++++---------- package.json | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index 60befd73265..4bda6067b68 100644 --- a/package-lock.json +++ b/package-lock.json @@ -94,7 +94,7 @@ "npm-font-open-sans": "^1.1.0", "npm-run-all": "^4.1.5", "pixelmatch": "^5.3.0", - "playwright": "^1.44.1", + "playwright": "^1.45.0", "postcss": "^8.4.38", "postcss-cli": "^11.0.0", "postcss-inline-svg": "^6.0.0", @@ -9830,33 +9830,33 @@ } }, "node_modules/playwright": { - "version": "1.44.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.44.1.tgz", - "integrity": "sha512-qr/0UJ5CFAtloI3avF95Y0L1xQo6r3LQArLIg/z/PoGJ6xa+EwzrwO5lpNr/09STxdHuUoP2mvuELJS+hLdtgg==", + "version": "1.45.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.45.0.tgz", + "integrity": "sha512-4z3ac3plDfYzGB6r0Q3LF8POPR20Z8D0aXcxbJvmfMgSSq1hkcgvFRXJk9rUq5H/MJ0Ktal869hhOdI/zUTeLA==", "dev": true, "dependencies": { - "playwright-core": "1.44.1" + "playwright-core": "1.45.0" }, "bin": { "playwright": "cli.js" }, "engines": { - "node": ">=16" + "node": ">=18" }, "optionalDependencies": { "fsevents": "2.3.2" } }, "node_modules/playwright-core": { - "version": "1.44.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.44.1.tgz", - "integrity": "sha512-wh0JWtYTrhv1+OSsLPgFzGzt67Y7BE/ZS3jEqgGBlp2ppp1ZDj8c+9IARNW4dwf1poq5MgHreEM2KV/GuR4cFA==", + "version": "1.45.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.45.0.tgz", + "integrity": "sha512-lZmHlFQ0VYSpAs43dRq1/nJ9G/6SiTI7VPqidld9TDefL9tX87bTKExWZZUF5PeRyqtXqd8fQi2qmfIedkwsNQ==", "dev": true, "bin": { "playwright-core": "cli.js" }, "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/playwright/node_modules/fsevents": { diff --git a/package.json b/package.json index 28ef76f823b..5210cd5ac48 100644 --- a/package.json +++ b/package.json @@ -97,7 +97,7 @@ "npm-font-open-sans": "^1.1.0", "npm-run-all": "^4.1.5", "pixelmatch": "^5.3.0", - "playwright": "^1.44.1", + "playwright": "^1.45.0", "postcss": "^8.4.38", "postcss-cli": "^11.0.0", "postcss-inline-svg": "^6.0.0", From 6cf640b42cd6a3b40383b4a67022f44b9eb50366 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Jun 2024 10:54:09 +0300 Subject: [PATCH 10/45] Bump glob from 10.4.1 to 10.4.2 (internal-1544) Bumps [glob](https://github.com/isaacs/node-glob) from 10.4.1 to 10.4.2. - [Changelog](https://github.com/isaacs/node-glob/blob/main/changelog.md) - [Commits](https://github.com/isaacs/node-glob/compare/v10.4.1...v10.4.2) --- updated-dependencies: - dependency-name: glob 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 | 15 +++++++++++---- package.json | 2 +- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4bda6067b68..f5eb893a3ba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -81,7 +81,7 @@ "eslint-plugin-html": "^8.1.1", "eslint-plugin-import": "^2.29.1", "eslint-plugin-jsdoc": "^48.4.0", - "glob": "^10.4.1", + "glob": "^10.4.2", "is-builtin-module": "^4.0.0", "jest-extended": "^4.0.2", "json-stringify-pretty-compact": "^4.0.0", @@ -6713,15 +6713,16 @@ "integrity": "sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==" }, "node_modules/glob": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.1.tgz", - "integrity": "sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==", + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz", + "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==", "dev": true, "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": { @@ -9560,6 +9561,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "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 + }, "node_modules/pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", diff --git a/package.json b/package.json index 5210cd5ac48..851e90bb536 100644 --- a/package.json +++ b/package.json @@ -84,7 +84,7 @@ "eslint-plugin-html": "^8.1.1", "eslint-plugin-import": "^2.29.1", "eslint-plugin-jsdoc": "^48.4.0", - "glob": "^10.4.1", + "glob": "^10.4.2", "is-builtin-module": "^4.0.0", "jest-extended": "^4.0.2", "json-stringify-pretty-compact": "^4.0.0", From e0e9d18454ecee6c9a47bcebe1555d5d6802f890 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Jun 2024 11:00:11 +0300 Subject: [PATCH 11/45] Bump address from 2.0.2 to 2.0.3 (internal-1541) Bumps [address](https://github.com/node-modules/address) from 2.0.2 to 2.0.3. - [Release notes](https://github.com/node-modules/address/releases) - [Changelog](https://github.com/node-modules/address/blob/master/CHANGELOG.md) - [Commits](https://github.com/node-modules/address/compare/v2.0.2...v2.0.3) --- updated-dependencies: - dependency-name: address 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 f5eb893a3ba..63abe4f9906 100644 --- a/package-lock.json +++ b/package-lock.json @@ -63,7 +63,7 @@ "@typescript-eslint/parser": "^7.14.1", "@vitest/browser": "^1.6.0", "@vitest/ui": "^1.6.0", - "address": "^2.0.2", + "address": "^2.0.3", "browserify": "^17.0.0", "chalk": "^5.0.1", "chokidar": "^3.6.0", @@ -2868,9 +2868,9 @@ } }, "node_modules/address": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/address/-/address-2.0.2.tgz", - "integrity": "sha512-u6nFssvaX9RHQmjMSqgT7b7QJbf/5/U8+ntbTL8vgABfIiEmm02ZSM5MwljKjCrIrm7iIbgYEya2YW6AaRccVA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/address/-/address-2.0.3.tgz", + "integrity": "sha512-XNAb/a6TCqou+TufU8/u11HCu9x1gYvOoxLwtlXgIqmkrYQADVv6ljyW2zwiPhHz9R1gItAWpuDrdJMmrOBFEA==", "dev": true, "engines": { "node": ">= 16.0.0" diff --git a/package.json b/package.json index 851e90bb536..142d21f885e 100644 --- a/package.json +++ b/package.json @@ -66,7 +66,7 @@ "@typescript-eslint/parser": "^7.14.1", "@vitest/browser": "^1.6.0", "@vitest/ui": "^1.6.0", - "address": "^2.0.2", + "address": "^2.0.3", "browserify": "^17.0.0", "chalk": "^5.0.1", "chokidar": "^3.6.0", From 801870fbc43b993948337bcc46bebdddc77ae377 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Jun 2024 11:11:15 +0300 Subject: [PATCH 12/45] Bump stylelint-config-standard from 36.0.0 to 36.0.1 (internal-1547) Bumps [stylelint-config-standard](https://github.com/stylelint/stylelint-config-standard) from 36.0.0 to 36.0.1. - [Release notes](https://github.com/stylelint/stylelint-config-standard/releases) - [Changelog](https://github.com/stylelint/stylelint-config-standard/blob/main/CHANGELOG.md) - [Commits](https://github.com/stylelint/stylelint-config-standard/compare/36.0.0...36.0.1) --- updated-dependencies: - dependency-name: stylelint-config-standard 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 | 38 +++++++++++++++++++++++++++++--------- package.json | 2 +- 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index 63abe4f9906..908dbf41421 100644 --- a/package-lock.json +++ b/package-lock.json @@ -107,7 +107,7 @@ "shuffle-seed": "^1.1.6", "st": "^3.0.0", "stylelint": "^16.6.1", - "stylelint-config-standard": "^36.0.0", + "stylelint-config-standard": "^36.0.1", "tape": "^5.8.1", "tape-filter": "^1.0.4", "testem": "^3.14.0", @@ -12196,24 +12196,44 @@ } }, "node_modules/stylelint-config-recommended": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-14.0.0.tgz", - "integrity": "sha512-jSkx290CglS8StmrLp2TxAppIajzIBZKYm3IxT89Kg6fGlxbPiTiyH9PS5YUuVAFwaJLl1ikiXX0QWjI0jmgZQ==", + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-14.0.1.tgz", + "integrity": "sha512-bLvc1WOz/14aPImu/cufKAZYfXs/A/owZfSMZ4N+16WGXLoX5lOir53M6odBxvhgmgdxCVnNySJmZKx73T93cg==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + }, + { + "type": "github", + "url": "https://github.com/sponsors/stylelint" + } + ], "engines": { "node": ">=18.12.0" }, "peerDependencies": { - "stylelint": "^16.0.0" + "stylelint": "^16.1.0" } }, "node_modules/stylelint-config-standard": { - "version": "36.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-36.0.0.tgz", - "integrity": "sha512-3Kjyq4d62bYFp/Aq8PMKDwlgUyPU4nacXsjDLWJdNPRUgpuxALu1KnlAHIj36cdtxViVhXexZij65yM0uNIHug==", + "version": "36.0.1", + "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-36.0.1.tgz", + "integrity": "sha512-8aX8mTzJ6cuO8mmD5yon61CWuIM4UD8Q5aBcWKGSf6kg+EC3uhB+iOywpTK4ca6ZL7B49en8yanOFtUW0qNzyw==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + }, + { + "type": "github", + "url": "https://github.com/sponsors/stylelint" + } + ], "dependencies": { - "stylelint-config-recommended": "^14.0.0" + "stylelint-config-recommended": "^14.0.1" }, "engines": { "node": ">=18.12.0" diff --git a/package.json b/package.json index 142d21f885e..97399187ffe 100644 --- a/package.json +++ b/package.json @@ -110,7 +110,7 @@ "shuffle-seed": "^1.1.6", "st": "^3.0.0", "stylelint": "^16.6.1", - "stylelint-config-standard": "^36.0.0", + "stylelint-config-standard": "^36.0.1", "tape": "^5.8.1", "tape-filter": "^1.0.4", "testem": "^3.14.0", From 09164020300108d4146a42eb703ac3b149f17860 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Jun 2024 11:11:34 +0300 Subject: [PATCH 13/45] Bump @types/node from 20.14.3 to 20.14.8 (internal-1546) Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 20.14.3 to 20.14.8. - [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-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 908dbf41421..60a156d3c65 100644 --- a/package-lock.json +++ b/package-lock.json @@ -56,7 +56,7 @@ "@types/jest": "^29.5.12", "@types/mapbox__point-geometry": "^0.1.4", "@types/mapbox__vector-tile": "^1.3.4", - "@types/node": "^20.14.3", + "@types/node": "^20.14.8", "@types/offscreencanvas": "^2019.7.3", "@types/pbf": "^3.0.5", "@typescript-eslint/eslint-plugin": "^7.14.1", @@ -2333,9 +2333,9 @@ } }, "node_modules/@types/node": { - "version": "20.14.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.3.tgz", - "integrity": "sha512-Nuzqa6WAxeGnve6SXqiPAM9rA++VQs+iLZ1DDd56y0gdvygSZlQvZuvdFPR3yLqkVxPu4WrO02iDEyH1g+wazw==", + "version": "20.14.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.8.tgz", + "integrity": "sha512-DO+2/jZinXfROG7j7WKFn/3C6nFwxy2lLpgLjEXJz+0XKphZlTLJ14mo8Vfg8X5BWN6XjyESXq+LcYdT7tR3bA==", "dev": true, "dependencies": { "undici-types": "~5.26.4" diff --git a/package.json b/package.json index 97399187ffe..a54ba8f6dbf 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,7 @@ "@types/jest": "^29.5.12", "@types/mapbox__point-geometry": "^0.1.4", "@types/mapbox__vector-tile": "^1.3.4", - "@types/node": "^20.14.3", + "@types/node": "^20.14.8", "@types/offscreencanvas": "^2019.7.3", "@types/pbf": "^3.0.5", "@typescript-eslint/eslint-plugin": "^7.14.1", From c99b8734b1211ee61b22793bf71214951430908b Mon Sep 17 00:00:00 2001 From: Jordi Torres Date: Wed, 26 Jun 2024 10:22:22 +0200 Subject: [PATCH 14/45] Add more unit tests to variant parsing (internal-1548) --- src/source/load_tilejson.ts | 10 ++- test/unit/source/load_tilejson.test.ts | 101 +++++++++++++++++++++++++ 2 files changed, 110 insertions(+), 1 deletion(-) create mode 100644 test/unit/source/load_tilejson.test.ts diff --git a/src/source/load_tilejson.ts b/src/source/load_tilejson.ts index 13c1bee8bba..faf45dfc553 100644 --- a/src/source/load_tilejson.ts +++ b/src/source/load_tilejson.ts @@ -33,10 +33,18 @@ export default function( } else if (tileJSON) { // Prefer TileJSON tiles, if both URL and tiles options are set if (options.url && tileJSON.tiles && options.tiles) delete options.tiles; - // check if we have variants and merge with the original TileJson if (tileJSON.variants) { + if (!Array.isArray(tileJSON.variants)) { + return callback(new Error("variants must be an array")); + } for (const variant of tileJSON.variants) { + if (variant == null || typeof variant !== 'object' || variant.constructor !== Object) { + return callback(new Error("variant must be an object")); + } + if (!Array.isArray(variant.capabilities)) { + return callback(new Error("capabilities must be an array")); + } // in this version we only support meshopt, we check there is no more different capabilities // so future tileJsons with more capabilities won't break existing sdk's if (variant.capabilities.length === 1 && variant.capabilities[0] === "meshopt") { diff --git a/test/unit/source/load_tilejson.test.ts b/test/unit/source/load_tilejson.test.ts new file mode 100644 index 00000000000..5261c09db6f --- /dev/null +++ b/test/unit/source/load_tilejson.test.ts @@ -0,0 +1,101 @@ +// @ts-nocheck +import {describe, test, expect} from '../../util/vitest'; +import {Evented} from '../../../src/util/evented'; +import loadTileJSON from '../../../src/source/load_tilejson'; + +class StubMap extends Evented { + constructor() { + super(); + this._requestManager = { + canonicalizeTileset: tileJSON => tileJSON.tiles + }; + } +} + + +describe('LoadTileJson#variants', () => { + const map = new StubMap(); + + test('returns error if variants is not an array', () => { + // variants should be an array + let tileJSON = { + "tiles": ["http://dataset1"], + "variants": "variants should not be a string" + }; + let tileJSONRequest = loadTileJSON(tileJSON, map._requestManager, null, null, (err, result) => { + expect(err.message).toEqual("variants must be an array"); + }); + // variants elements should be objects + tileJSON = { + "tiles": ["http://dataset1"], + "variants": ["variants elements should be objects"] + }; + tileJSONRequest = loadTileJSON(tileJSON, map._requestManager, null, null, (err, result) => { + expect(err.message).toEqual("variant must be an object"); + }); + // capabilities should be an array + tileJSON = { + "tiles": ["http://dataset1"], + "variants": [ + { + "capabilities" : "capabilities should be an array" + } + ] + }; + tileJSONRequest = loadTileJSON(tileJSON, map._requestManager, null, null, (err, result) => { + expect(err.message).toEqual("capabilities must be an array"); + }); + // tiles should be replaced if capabilities.lenght == 1 and capabilities[0]== "meshopt" + tileJSON = { + "tiles": ["http://dataset1"], + "variants": [ + { + "capabilities" : ["meshopt"], + "tiles": ["http://dataset2"] + } + ] + }; + tileJSONRequest = loadTileJSON(tileJSON, map._requestManager, null, null, (err, result) => { + expect(err).toEqual(null); + expect(result.tiles).toEqual(["http://dataset2"]); + }); + // tiles should be replaced even when the above condition is met, and it happens in a different variant. + tileJSON = { + "tiles": ["http://dataset1"], + "variants": [ + { + "capabilities" : ["customcapability"], + "tiles": ["http://dataset2"] + }, + { + "capabilities" : ["meshopt"], + "tiles": ["http://dataset3"] + } + ] + }; + tileJSONRequest = loadTileJSON(tileJSON, map._requestManager, null, null, (err, result) => { + expect(err).toEqual(null); + expect(result.tiles).toEqual(["http://dataset3"]); + }); + // meshopt variants should replace other fields as well + tileJSON = { + "tiles": ["http://dataset1"], + "minzoom": 1, + "variants": [ + { + "capabilities" : ["customcapability"], + "tiles": ["http://dataset2"] + }, + { + "minzoom": 14, + "capabilities" : ["meshopt"], + "tiles": ["http://dataset3"] + } + ] + }; + tileJSONRequest = loadTileJSON(tileJSON, map._requestManager, null, null, (err, result) => { + expect(err).toEqual(null); + expect(result.minzoom).toEqual(14); + }); + }); +}); From a1bc248a20ef45ee8b05afd65eccbe775b4056f1 Mon Sep 17 00:00:00 2001 From: Daniel Eke Date: Wed, 26 Jun 2024 18:17:09 +0800 Subject: [PATCH 15/45] Add query test with symbol above horizon (internal-1550) --- test/ignores/all.js | 2 + .../symbol/above-horizon/expected.json | 44 ++++++++++ .../symbol/above-horizon/style.json | 82 +++++++++++++++++++ 3 files changed, 128 insertions(+) create mode 100644 test/integration/query-tests/symbol/above-horizon/expected.json create mode 100644 test/integration/query-tests/symbol/above-horizon/style.json diff --git a/test/ignores/all.js b/test/ignores/all.js index 8c789552664..3e77daa6903 100644 --- a/test/ignores/all.js +++ b/test/ignores/all.js @@ -2,6 +2,8 @@ const todo = [ // "https://github.com/mapbox/mapbox-gl-js/issues/2716 "query-tests/regressions/mapbox-gl-js#4494", + // To be ported: https://mapbox.atlassian.net/browse/GLJS-892 + "query-tests/symbol/above-horizon", // https://github.com/mapbox/mapbox-gl-js/issues/7207 "render-tests/fill-pattern/update-feature-state", diff --git a/test/integration/query-tests/symbol/above-horizon/expected.json b/test/integration/query-tests/symbol/above-horizon/expected.json new file mode 100644 index 00000000000..850ba34f733 --- /dev/null +++ b/test/integration/query-tests/symbol/above-horizon/expected.json @@ -0,0 +1,44 @@ +[ + { + "type": "Feature", + "id": "feature3", + "geometry": { + "type": "Point", + "coordinates": [ + -0.0789642333984375, + 52.75000935103216 + ] + }, + "properties": {}, + "source": "geo", + "state": {} + }, + { + "type": "Feature", + "id": "feature2", + "geometry": { + "type": "Point", + "coordinates": [ + -0.17500877380371095, + 51.99999569006238 + ] + }, + "properties": {}, + "source": "geo", + "state": {} + }, + { + "type": "Feature", + "id": "feature1", + "geometry": { + "type": "Point", + "coordinates": [ + -0.12765169143676759, + 51.50732011286516 + ] + }, + "properties": {}, + "source": "geo", + "state": {} + } +] \ No newline at end of file diff --git a/test/integration/query-tests/symbol/above-horizon/style.json b/test/integration/query-tests/symbol/above-horizon/style.json new file mode 100644 index 00000000000..04c78819485 --- /dev/null +++ b/test/integration/query-tests/symbol/above-horizon/style.json @@ -0,0 +1,82 @@ +{ + "version": 8, + "metadata": { + "test": { + "width": 200, + "height": 700, + "collisionDebug": true, + "operations": [ + ["wait"], + ["wait"] + ], + "queryGeometry": [ + [ + 0, + 0 + ], + [ + 200, + 700 + ] + ] + } + }, + "glyphs": "local://glyphs/{fontstack}/{range}.pbf", + "sprite": "local://sprites/sprite", + "sources": { + "geo": { + "type": "geojson", + "data": { + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "id": "feature1", + "geometry": { + "type": "Point", + "coordinates": [ -0.1276474, 51.5073219] + } + }, + { + "type": "Feature", + "id": "feature2", + "geometry": { + "type": "Point", + "coordinates": [ -0.175, 52.00] + } + }, + { + "type": "Feature", + "id": "feature3", + "geometry": { + "type": "Point", + "coordinates": [ -0.079, 52.75] + } + } + ] + } + } + }, + "pitch": 85, + "zoom": 12.0, + "bearing": 0, + "center": [ + -0.1276474, + 51.5073219 + ], + "layers": [ + { + "id": "testing", + "layout": { + "icon-image": "building-12", + "icon-size": 3.0, + "icon-anchor": "bottom", + "icon-allow-overlap": true, + "icon-pitch-alignment": "viewport" + }, + "paint": {}, + "source": "geo", + "type": "symbol" + } + ] +} From 43e0b6df934b0d5f641a02a63f6fb8868da2f3a4 Mon Sep 17 00:00:00 2001 From: Stepan Kuzmin Date: Thu, 27 Jun 2024 18:37:04 +0300 Subject: [PATCH 16/45] Update CODEOWNERS (internal-1553) Add Native and 3D teams --- .github/CODEOWNERS | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index f4cc9f2aa28..0368da841cc 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1 +1,3 @@ * @mapbox/gl-js +* @mapbox/gl-native +* @mapbox/mapbox-3d-team From e4de7651c21145f0d242b4de5ac400ad75d42287 Mon Sep 17 00:00:00 2001 From: Lasse Lammi Date: Fri, 28 Jun 2024 09:03:45 +0300 Subject: [PATCH 17/45] [MAPS3D-1398] Fix model-front-cutoff paint property for meshopt models (internal-1552) * Fix issue with front cutoff opacity calculation * Add landmark-front-cutoff-meshopt render test * Remove POI layer from the new render test * Delete accidentally added file * Restore previous debug/index.html --- 3d-style/render/draw_model.ts | 6 +- .../expected.png | Bin 0 -> 405790 bytes .../landmark-front-cutoff-meshopt/style.json | 626 ++++++++++++++++++ 3 files changed, 629 insertions(+), 3 deletions(-) create mode 100644 test/integration/render-tests/model-layer/landmark-front-cutoff-meshopt/expected.png create mode 100644 test/integration/render-tests/model-layer/landmark-front-cutoff-meshopt/style.json diff --git a/3d-style/render/draw_model.ts b/3d-style/render/draw_model.ts index a4e024275c9..e6d3b72a5d6 100644 --- a/3d-style/render/draw_model.ts +++ b/3d-style/render/draw_model.ts @@ -875,7 +875,7 @@ function drawBatchedModels(painter: Painter, source: SourceCache, layer: ModelSt if (!isShadowPass) { if (frontCutoffEnabled) { - opacity *= calculateFrontCutoffOpacity(nodeModelMatrix, tr, nodeInfo.getLocalBounds(), frontCutoffParams); + opacity *= calculateFrontCutoffOpacity(tileModelMatrix as any, tr, nodeInfo.getLocalBounds(), frontCutoffParams); } opacity *= calculateFarCutoffOpacity(cutoffParams, depth); @@ -1120,7 +1120,7 @@ function calculateFarCutoffOpacity(cutoffParams: CutoffParams, depth: number): n return clamp((linearDepth - cutoffStart) / (cutoffEnd - cutoffStart), 0.0, 1.0); } -function calculateFrontCutoffOpacity(nodeModelMatrix: mat4, tr: Transform, aabb: Aabb, cutoffParams: [number, number, number]) { +function calculateFrontCutoffOpacity(tileModelMatrix: mat4, tr: Transform, aabb: Aabb, cutoffParams: [number, number, number]) { // The cutoff opacity is completely disabled when pitch is lower than 20. const fullyOpaquePitch = 20.0; const fullyTransparentPitch = 40.0; @@ -1131,7 +1131,7 @@ function calculateFrontCutoffOpacity(nodeModelMatrix: mat4, tr: Transform, aabb: } const worldToCamera = tr.getWorldToCameraMatrix(); - const mat = mat4.multiply([] as any, worldToCamera, nodeModelMatrix); + const mat = mat4.multiply([] as any, worldToCamera, tileModelMatrix); // The cutoff opacity is calculated based on how much below the view the AABB bottom corners are. // For this, we find the AABB points with the highest and lowest y value in the view space. diff --git a/test/integration/render-tests/model-layer/landmark-front-cutoff-meshopt/expected.png b/test/integration/render-tests/model-layer/landmark-front-cutoff-meshopt/expected.png new file mode 100644 index 0000000000000000000000000000000000000000..b66bee6400ed09c9f4796434abc2c0f71febc595 GIT binary patch literal 405790 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 z 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

RNW1_G*#GM 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

yk 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%0ABP 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

ch~Mg!D1horUs3=pn!Dk9k_NshsNJ{<)7V} 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 literal 0 HcmV?d00001 diff --git a/test/integration/render-tests/model-layer/landmark-front-cutoff-meshopt/style.json b/test/integration/render-tests/model-layer/landmark-front-cutoff-meshopt/style.json new file mode 100644 index 00000000000..37a59435463 --- /dev/null +++ b/test/integration/render-tests/model-layer/landmark-front-cutoff-meshopt/style.json @@ -0,0 +1,626 @@ +{ + "version": 8, + "metadata": { + "test": { + "allowed": 0.0012, + "width": 1024, + "height": 1024 + } + }, + "lights": [ + { + "type": "ambient", + "id": "environment" + }, + { + "type": "directional", + "id": "sun_light", + "properties": { + "cast-shadows": true, + "intensity": 0.8599999904632569, + "direction": [ + 311.9219970703125, + 82.37799835205078 + ] + } + } + ], + "glyphs": "local://glyphs/{fontstack}/{range}.pbf", + "sprite": "local://sprites/sprite", + "sources": { + "composite": { + "type": "vector", + "maxzoom": 15, + "tiles": [ + "local://models/vector/{z}-{x}-{y}.vector.pbf" + ] + }, + "file-system-tiles": { + "type": "batched-model", + "maxzoom": 14, + "tiles": [ + "local://models/landmark/mbx-meshopt/{x}-{y}-{z}.glb" + ] + } + }, + "transition": { + "duration": 0 + }, + "pitch": 55, + "zoom": 17.3, + "bearing": 0, + "center": [ + 11.582243, + 48.131199 + ], + "layers": [ + { + "type": "background", + "paint": { + "background-color": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 11.0, + [ + "rgba", + 239.00001525878907, + 233.00001525878907, + 225.00001525878907, + 1.0 + ], + 13.0, + [ + "rgba", + 230.00001525878907, + 228.00001525878907, + 224.00001525878907, + 1.0 + ] + ] + }, + "id": "land" + }, + { + "type": "fill", + "id": "landcover", + "source": "composite", + "maxzoom": 7.0, + "paint": { + "fill-antialias": false, + "fill-opacity": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 2.0, + 0.3, + 7.0, + 0.0 + ], + "fill-color": [ + "match", + [ + "get", + "class" + ], + "snow", + [ + "rgba", + 255.0, + 255.0, + 255.0, + 1.0 + ], + [ + "rgba", + 222.00001525878907, + 237.00001525878907, + 177.0, + 1.0 + ] + ] + }, + "source-layer": "landcover" + }, + { + "type": "fill", + "source": "composite", + "paint": { + "fill-color": [ + "rgba", + 117.00000762939453, + 207.00001525878907, + 240.00001525878907, + 1.0 + ] + }, + "source-layer": "water", + "id": "water" + }, + { + "minzoom": 11.0, + "type": "line", + "paint": { + "line-opacity": [ + "step", + [ + "zoom" + ], + 0.0, + 14.0, + 1.0 + ], + "line-color": [ + "match", + [ + "get", + "class" + ], + "street_limited", + [ + "rgba", + 240.00001525878907, + 238.00001525878907, + 235.00001525878907, + 1.0 + ], + [ + "rgba", + 255.0, + 255.0, + 255.0, + 1.0 + ] + ], + "line-width": [ + "interpolate", + [ + "exponential", + 1.5 + ], + [ + "zoom" + ], + 12.0, + 0.5, + 14.0, + 2.0, + 18.0, + 18.0 + ] + }, + "source-layer": "road", + "filter": [ + "all", + [ + "match", + [ + "get", + "class" + ], + [ + "primary_link", + "street", + "street_limited" + ], + true, + false + ], + [ + "match", + [ + "get", + "structure" + ], + [ + "ford", + "none" + ], + true, + false + ], + [ + "==", + [ + "geometry-type" + ], + "LineString" + ] + ], + "layout": { + "line-join": "round", + "line-cap": "round" + }, + "source": "composite", + "id": "road-street" + }, + { + "minzoom": 15.0, + "type": "fill-extrusion", + "paint": { + "fill-extrusion-height": [ + "number", + [ + "get", + "height" + ] + ], + "fill-extrusion-ambient-occlusion-intensity": 0.3499999940395355, + "fill-extrusion-ambient-occlusion-ground-radius": 5, + "fill-extrusion-ambient-occlusion-wall-radius": 5, + "fill-extrusion-opacity": 1.0, + "fill-extrusion-base": [ + "number", + [ + "get", + "min_height" + ] + ], + "fill-extrusion-color": [ + "rgba", + 255.0, + 255.0, + 255.0, + 1.0 + ], + "fill-extrusion-vertical-gradient": false, + "fill-extrusion-vertical-scale": [ + "interpolate", + ["linear"], + ["zoom"], + 16, 0, + 17, 2.0 + ] + }, + "source-layer": "building", + "filter": [ + "==", + [ + "get", + "extrude" + ], + "true" + ], + "source": "composite", + "id": "3d-buildings" + }, + { + "minzoom": 10.0, + "type": "symbol", + "paint": { + "text-halo-width": 1.0, + "text-halo-blur": 1.0, + "text-halo-color": [ + "match", + [ + "get", + "class" + ], + "ferry", + [ + "rgba", + 117.00000762939453, + 207.00001525878907, + 240.00001525878907, + 1.0 + ], + [ + "motorway", + "trunk" + ], + [ + "rgba", + 255.0, + 255.0, + 255.0, + 0.75 + ], + [ + "rgba", + 255.0, + 255.0, + 255.0, + 1.0 + ] + ], + "text-color": [ + "match", + [ + "get", + "class" + ], + "ferry", + [ + "rgba", + 58.000003814697269, + 76.0, + 166.0, + 1.0 + ], + [ + "rgba", + 0.0, + 0.0, + 0.0, + 1.0 + ] + ] + }, + "source-layer": "road", + "filter": [ + "step", + [ + "zoom" + ], + [ + "match", + [ + "get", + "class" + ], + [ + "motorway", + "primary", + "secondary", + "tertiary", + "trunk" + ], + true, + false + ], + 12.0, + [ + "match", + [ + "get", + "class" + ], + [ + "motorway", + "pedestrian", + "primary", + "secondary", + "street", + "street_limited", + "tertiary", + "trunk" + ], + true, + false + ], + 15.0, + [ + "match", + [ + "get", + "class" + ], + "golf", + false, + true + ] + ], + "layout": { + "text-font": [ "NotoCJK" ], + "text-max-angle": 30.0, + "text-size": [ + "interpolate", + [ + "linear" + ], + [ + "zoom" + ], + 10.0, + [ + "match", + [ + "get", + "class" + ], + [ + "motorway", + "primary", + "secondary", + "tertiary", + "trunk" + ], + 10.0, + [ + "motorway_link", + "pedestrian", + "primary_link", + "secondary_link", + "street", + "street_limited", + "tertiary_link", + "trunk_link" + ], + 9.0, + 6.5 + ], + 18.0, + [ + "match", + [ + "get", + "class" + ], + [ + "motorway", + "primary", + "secondary", + "tertiary", + "trunk" + ], + 16.0, + [ + "motorway_link", + "pedestrian", + "primary_link", + "secondary_link", + "street", + "street_limited", + "tertiary_link", + "trunk_link" + ], + 14.0, + 13.0 + ] + ], + "text-field": [ + "format", + [ + "coalesce", + [ + "get", + "name_en" + ], + [ + "get", + "name" + ] + ], + {} + ], + "symbol-placement": "line", + "text-rotation-alignment": "map", + "text-pitch-alignment": "viewport" + }, + "source": "composite", + "id": "road-label" + }, + { + "id": "building-models", + "minzoom": 14.0, + "paint": { + "model-ambient-occlusion-intensity": 0.75, + "model-color": "red", + "model-color-mix-intensity": [ + "match", + [ + "get", + "part" + ], + "logo", + [ + "interpolate", + [ "linear" ], + [ "measure-light", "brightness" ], + 0.2, + 0, + 0.4, + 0.3 + ], + 1.0 + ], + "model-emissive-strength": [ + "match", + [ + "get", + "part" + ], + "door", + [ + "interpolate", + [ "linear" ], + [ "measure-light", "brightness" ], + 0.2, + 1.5, + 0.4, + 2.5 + ], + "logo", + 0.6, + "window", + [ + "random", + 0.5, + 0.8, + [ + "id" + ] + ], + 0.0 + ], + "model-height-based-emissive-strength-multiplier": [ + "match", + [ + "get", + "part" + ], + "window", + [ + "literal", + [ + 0.0, + 0.9, + 0, + 1, + 0.5 + ] + ], + [ + "literal", + [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + ] + ], + "model-opacity": [ + "interpolate", + [ "linear" ], + [ "zoom" ], + 14.2, + 0.0, + 14.5, + 1.0 + ], + "model-roughness": [ + "match", + [ + "get", + "part" + ], + "window", + 0.0, + 1.0 + ], + "model-scale": [ + "interpolate", + [ "linear" ], + [ "zoom" ], + 16.0, + [ + 1.0, + 1.0, + 0.0 + ], + 17.0, + [ + 1.0, + 1.0, + 3.5 + ] + ], + "model-front-cutoff": [0.1, 0.5, 0.0], + "model-type": "common-3d" + }, + "source": "file-system-tiles", + "type": "model" + } + ] +} From fbc2f35af03f93d98604773bef1826804edc3619 Mon Sep 17 00:00:00 2001 From: Aleksandr Shoronov Date: Fri, 28 Jun 2024 12:20:30 +0300 Subject: [PATCH 18/45] [GLJS-894] Handle cache entries of empty tiles (internal-1551) Put null into Response for tile cache in case of null body status of original response --- src/util/tile_request_cache.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/util/tile_request_cache.ts b/src/util/tile_request_cache.ts index acdab5e5411..7ae5b54a695 100644 --- a/src/util/tile_request_cache.ts +++ b/src/util/tile_request_cache.ts @@ -62,6 +62,15 @@ function prepareBody(response: Response, callback: (body?: Blob | ReadableStream } } +// https://fetch.spec.whatwg.org/#null-body-status +function isNullBodyStatus(status: Response["status"]): boolean { + if (status === 200 || status === 404) { + return false; + } + + return [101, 103, 204, 205, 304].includes(status); +} + export function cachePut(request: Request, response: Response, requestTime: number) { cacheOpen(); if (!sharedCache) return; @@ -100,7 +109,7 @@ export function cachePut(request: Request, response: Response, requestTime: numb } prepareBody(response, body => { - const clonedResponse = new Response(body, options); + const clonedResponse = new Response(isNullBodyStatus(response.status) ? null : body, options); cacheOpen(); if (!sharedCache) return; From 09d8975e4621dd0563661bd05cadaf1bdb41bc57 Mon Sep 17 00:00:00 2001 From: Stepan Kuzmin Date: Fri, 28 Jun 2024 12:29:44 +0300 Subject: [PATCH 19/45] Update CODEOWNERS (internal-1557) --- .github/CODEOWNERS | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 0368da841cc..ad71e380a55 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,3 +1 @@ -* @mapbox/gl-js -* @mapbox/gl-native -* @mapbox/mapbox-3d-team +* @mapbox/gl-js @mapbox/gl-native @mapbox/mapbox-3d-team From 2b1bd1aa7361afdb8d64987e351df7f1d07493cd Mon Sep 17 00:00:00 2001 From: Volodymyr Agafonkin Date: Fri, 28 Jun 2024 13:54:29 +0300 Subject: [PATCH 20/45] Upgrade earcut & cheap-ruler (internal-1556) * upgrade earcut & cheap-ruler & some dev deps * upgrade cheap-ruler in style-spec as well --- package-lock.json | 44 ++++++++++++++++++++----------------- package.json | 10 ++++----- src/style-spec/package.json | 2 +- 3 files changed, 30 insertions(+), 26 deletions(-) diff --git a/package-lock.json b/package-lock.json index 60a156d3c65..7e970d9af2d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,14 +19,14 @@ "@mapbox/unitbezier": "^0.0.1", "@mapbox/vector-tile": "^1.3.1", "@mapbox/whoots-js": "^3.1.0", - "cheap-ruler": "^3.0.1", + "cheap-ruler": "^4.0.0", "csscolorparser": "~1.0.3", - "earcut": "^2.2.4", + "earcut": "^3.0.0", "fflate": "^0.8.1", "geojson-vt": "^4.0.2", "gl-matrix": "^3.4.3", "grid-index": "^1.1.0", - "kdbush": "^4.0.1", + "kdbush": "^4.0.2", "lodash.clonedeep": "^4.5.0", "murmurhash-js": "^1.0.0", "pbf": "^3.2.1", @@ -34,7 +34,7 @@ "quickselect": "^2.0.0", "rw": "^1.3.3", "serialize-to-js": "^3.1.2", - "supercluster": "^8.0.0", + "supercluster": "^8.0.1", "tiny-lru": "^11.2.6", "tinyqueue": "^2.0.3", "tweakpane": "^4.0.3", @@ -93,7 +93,7 @@ "node-notifier": "^10.0.1", "npm-font-open-sans": "^1.1.0", "npm-run-all": "^4.1.5", - "pixelmatch": "^5.3.0", + "pixelmatch": "^6.0.0", "playwright": "^1.45.0", "postcss": "^8.4.38", "postcss-cli": "^11.0.0", @@ -3861,9 +3861,10 @@ } }, "node_modules/cheap-ruler": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/cheap-ruler/-/cheap-ruler-3.0.2.tgz", - "integrity": "sha512-02T332h1/HTN6cDSufLP8x4JzDs2+VC+8qZ/N0kWIVPyc2xUkWwWh3B2fJxR7raXkL4Mq7k554mfuM9ofv/vGg==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cheap-ruler/-/cheap-ruler-4.0.0.tgz", + "integrity": "sha512-0BJa8f4t141BYKQyn9NSQt1PguFQXMXwZiA5shfoaBYHAb2fFk2RAX+tiWMoQU+Agtzt3mdt0JtuyshAXqZ+Vw==", + "license": "ISC" }, "node_modules/check-error": { "version": "1.0.3", @@ -5056,9 +5057,10 @@ } }, "node_modules/earcut": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz", - "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/earcut/-/earcut-3.0.0.tgz", + "integrity": "sha512-41Fs7Q/PLq1SDbqjsgcY7GA42T0jvaCNGXgGtsNdvg+Yv8eIu06bxv4/PoREkZ9nMDNwnUSG9OFB9+yv8eKhDg==", + "license": "ISC" }, "node_modules/eastasianwidth": { "version": "0.2.0", @@ -9814,12 +9816,13 @@ } }, "node_modules/pixelmatch": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-5.3.0.tgz", - "integrity": "sha512-o8mkY4E/+LNUf6LzX96ht6k6CEDi65k9G2rjMtBe9Oo+VPKSvl+0GKHuH/AlG+GA5LPG/i5hrekkxUc3s2HU+Q==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-6.0.0.tgz", + "integrity": "sha512-FYpL4XiIWakTnIqLqvt3uN4L9B3TsuHIvhLILzTiJZMJUsGvmKNeL4H3b6I99LRyerK9W4IuOXw+N28AtRgK2g==", "dev": true, + "license": "ISC", "dependencies": { - "pngjs": "^6.0.0" + "pngjs": "^7.0.0" }, "bin": { "pixelmatch": "bin/pixelmatch" @@ -9881,12 +9884,13 @@ } }, "node_modules/pngjs": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-6.0.0.tgz", - "integrity": "sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz", + "integrity": "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==", "dev": true, + "license": "MIT", "engines": { - "node": ">=12.13.0" + "node": ">=14.19.0" } }, "node_modules/possible-typed-array-names": { @@ -14402,7 +14406,7 @@ "@mapbox/jsonlint-lines-primitives": "~2.0.2", "@mapbox/point-geometry": "^0.1.0", "@mapbox/unitbezier": "^0.0.1", - "cheap-ruler": "^3.0.1", + "cheap-ruler": "^4.0.0", "csscolorparser": "~1.0.2", "json-stringify-pretty-compact": "^4.0.0", "minimist": "^1.2.6", diff --git a/package.json b/package.json index a54ba8f6dbf..ad8de6e3662 100644 --- a/package.json +++ b/package.json @@ -22,14 +22,14 @@ "@mapbox/unitbezier": "^0.0.1", "@mapbox/vector-tile": "^1.3.1", "@mapbox/whoots-js": "^3.1.0", - "cheap-ruler": "^3.0.1", + "cheap-ruler": "^4.0.0", "csscolorparser": "~1.0.3", - "earcut": "^2.2.4", + "earcut": "^3.0.0", "fflate": "^0.8.1", "geojson-vt": "^4.0.2", "gl-matrix": "^3.4.3", "grid-index": "^1.1.0", - "kdbush": "^4.0.1", + "kdbush": "^4.0.2", "lodash.clonedeep": "^4.5.0", "murmurhash-js": "^1.0.0", "pbf": "^3.2.1", @@ -37,7 +37,7 @@ "quickselect": "^2.0.0", "rw": "^1.3.3", "serialize-to-js": "^3.1.2", - "supercluster": "^8.0.0", + "supercluster": "^8.0.1", "tiny-lru": "^11.2.6", "tinyqueue": "^2.0.3", "tweakpane": "^4.0.3", @@ -96,7 +96,7 @@ "node-notifier": "^10.0.1", "npm-font-open-sans": "^1.1.0", "npm-run-all": "^4.1.5", - "pixelmatch": "^5.3.0", + "pixelmatch": "^6.0.0", "playwright": "^1.45.0", "postcss": "^8.4.38", "postcss-cli": "^11.0.0", diff --git a/src/style-spec/package.json b/src/style-spec/package.json index 6f5fe5a4950..2cd2af9d6f5 100644 --- a/src/style-spec/package.json +++ b/src/style-spec/package.json @@ -46,7 +46,7 @@ "@mapbox/jsonlint-lines-primitives": "~2.0.2", "@mapbox/point-geometry": "^0.1.0", "@mapbox/unitbezier": "^0.0.1", - "cheap-ruler": "^3.0.1", + "cheap-ruler": "^4.0.0", "csscolorparser": "~1.0.2", "json-stringify-pretty-compact": "^4.0.0", "minimist": "^1.2.6", From e7b38def214d945a24f5201e7c437ef7f85a3325 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aleksi=20Gr=C3=B6n?= Date: Fri, 28 Jun 2024 14:00:32 +0300 Subject: [PATCH 21/45] Improved precision line-pattern rendering for long-lines and high zoom (internal-1555) Improved precision line-pattern rendering - Distance for line pattern is encoded two floats for enhanced precision - Add render test for long line & high zoom - Add a long patterned line in line-pattern example --- debug/line-pattern.html | 43 ++++++++ src/data/array_types.ts | 88 ++++++++--------- src/data/bucket/line_attributes_pattern.ts | 2 +- src/data/bucket/line_bucket.ts | 27 +++-- src/shaders/line_pattern.fragment.glsl | 33 +++---- src/shaders/line_pattern.vertex.glsl | 56 ++++++----- .../3x-on-2x-add-image/style.json | 1 + .../int-zoom-constant-width/style.json | 3 +- .../line-join-none-fract-zoom/style.json | 3 +- .../line-join-none-high-zoom/expected.png | Bin 0 -> 8513 bytes .../line-join-none-high-zoom/style.json | 93 ++++++++++++++++++ .../line-join-none-runtime-pattern/style.json | 1 + .../line-join-none-with-offset/style.json | 3 +- .../line-pattern/line-join-none/style.json | 3 +- .../line-pattern/line-metrics/style.json | 3 +- 15 files changed, 259 insertions(+), 100 deletions(-) create mode 100644 test/integration/render-tests/line-pattern/line-join-none-high-zoom/expected.png create mode 100644 test/integration/render-tests/line-pattern/line-join-none-high-zoom/style.json diff --git a/debug/line-pattern.html b/debug/line-pattern.html index c5fd68f8c7e..1dfff38ef9e 100644 --- a/debug/line-pattern.html +++ b/debug/line-pattern.html @@ -148,6 +148,28 @@ ] }; +const longRoute = { + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "geometry": { + "coordinates": [ + [ 48.884680, 16.085282 ], [ 49.061463, 16.515979 ], [ 48.891005, 16.562687 ], [ 48.974135, 16.763008 ], + [ 49.268492, 16.718297 ], [ 49.331357, 16.902966 ], [ 49.386120, 16.986536 ], [ 49.587155, 17.011794 ], + [ 49.936453, 17.009859 ], [ 50.180135, 17.013721 ], [ 50.236977, 16.961266 ], [ 49.676524, 16.889389 ], + [ 49.528352, 16.714410 ], [ 49.408444, 16.321152 ], [ 49.556546, 16.118124 ], [ 49.802388, 16.008736 ], + [ 50.056386, 15.991148 ], [ 50.415946, 16.075220 ], [ 50.674048, 16.215688 ], [ 50.180274, 16.204027 ], + [ 50.178172, 16.317207 ], [ 49.885689, 16.315238 ], [ 49.875532, 16.399057 ], [ 49.674499, 16.445862 ], + [ 50.186082, 16.722162 ], [ 50.699853, 16.720252 ] + ], + "type": "LineString" + } + } + ] +}; + map.on('load', () => { map.setFog({ 'horizon-blend': 0.0 @@ -160,6 +182,13 @@ 'maxzoom': 19, }); + map.addSource('longRoute', { + 'type': 'geojson', + 'data': longRoute, + 'lineMetrics': true, + 'maxzoom': 16, + }); + map.addSource('mapbox-dem', { 'type': 'raster-dem', 'url': 'mapbox://mapbox.mapbox-terrain-dem-v1', @@ -216,6 +245,20 @@ } map.setPaintProperty('route', 'line-trim-offset', [0, progress]); }, 100); + + map.addLayer({ + 'id': 'longRoute', + 'slot': 'top', + 'source': 'longRoute', + 'type': 'line', + 'layout': { + 'line-join': 'none' + }, + 'paint': { + 'line-pattern': 'bluecircle', + 'line-width': zoomConstExpression + } + }); }); }); }); diff --git a/src/data/array_types.ts b/src/data/array_types.ts index 008d56e12b5..c1111df343f 100644 --- a/src/data/array_types.ts +++ b/src/data/array_types.ts @@ -219,11 +219,11 @@ register(StructArrayLayout4f16, 'StructArrayLayout4f16'); /** * Implementation of the StructArray layout: - * [0]: Float32[2] + * [0]: Float32[3] * * @private */ -class StructArrayLayout2f8 extends StructArray implements IStructArrayLayout { +class StructArrayLayout3f12 extends StructArray implements IStructArrayLayout { uint8: Uint8Array; float32: Float32Array; @@ -232,22 +232,23 @@ class StructArrayLayout2f8 extends StructArray implements IStructArrayLayout { this.float32 = new Float32Array(this.arrayBuffer); } - emplaceBack(v0: number, v1: number): number { + emplaceBack(v0: number, v1: number, v2: number): number { const i = this.length; this.resize(i + 1); - return this.emplace(i, v0, v1); + return this.emplace(i, v0, v1, v2); } - emplace(i: number, v0: number, v1: number): number { - const o4 = i * 2; + emplace(i: number, v0: number, v1: number, v2: number): number { + const o4 = i * 3; this.float32[o4 + 0] = v0; this.float32[o4 + 1] = v1; + this.float32[o4 + 2] = v2; return i; } } -StructArrayLayout2f8.prototype.bytesPerElement = 8; -register(StructArrayLayout2f8, 'StructArrayLayout2f8'); +StructArrayLayout3f12.prototype.bytesPerElement = 12; +register(StructArrayLayout3f12, 'StructArrayLayout3f12'); /** * Implementation of the StructArray layout: @@ -957,6 +958,38 @@ class StructArrayLayout7f28 extends StructArray implements IStructArrayLayout { StructArrayLayout7f28.prototype.bytesPerElement = 28; register(StructArrayLayout7f28, 'StructArrayLayout7f28'); +/** + * Implementation of the StructArray layout: + * [0]: Float32[2] + * + * @private + */ +class StructArrayLayout2f8 extends StructArray implements IStructArrayLayout { + uint8: Uint8Array; + float32: Float32Array; + + _refreshViews() { + this.uint8 = new Uint8Array(this.arrayBuffer); + this.float32 = new Float32Array(this.arrayBuffer); + } + + emplaceBack(v0: number, v1: number): number { + const i = this.length; + this.resize(i + 1); + return this.emplace(i, v0, v1); + } + + emplace(i: number, v0: number, v1: number): number { + const o4 = i * 2; + this.float32[o4 + 0] = v0; + this.float32[o4 + 1] = v1; + return i; + } +} + +StructArrayLayout2f8.prototype.bytesPerElement = 8; +register(StructArrayLayout2f8, 'StructArrayLayout2f8'); + /** * Implementation of the StructArray layout: * [0]: Uint32[1] @@ -1026,39 +1059,6 @@ class StructArrayLayout1ui2 extends StructArray implements IStructArrayLayout { StructArrayLayout1ui2.prototype.bytesPerElement = 2; register(StructArrayLayout1ui2, 'StructArrayLayout1ui2'); -/** - * Implementation of the StructArray layout: - * [0]: Float32[3] - * - * @private - */ -class StructArrayLayout3f12 extends StructArray implements IStructArrayLayout { - uint8: Uint8Array; - float32: Float32Array; - - _refreshViews() { - this.uint8 = new Uint8Array(this.arrayBuffer); - this.float32 = new Float32Array(this.arrayBuffer); - } - - emplaceBack(v0: number, v1: number, v2: number): number { - const i = this.length; - this.resize(i + 1); - return this.emplace(i, v0, v1, v2); - } - - emplace(i: number, v0: number, v1: number, v2: number): number { - const o4 = i * 3; - this.float32[o4 + 0] = v0; - this.float32[o4 + 1] = v1; - this.float32[o4 + 2] = v2; - return i; - } -} - -StructArrayLayout3f12.prototype.bytesPerElement = 12; -register(StructArrayLayout3f12, 'StructArrayLayout3f12'); - /** * Implementation of the StructArray layout: * [0]: Float32[16] @@ -1430,7 +1430,7 @@ export { StructArrayLayout5i10, StructArrayLayout2i4ub1f12, StructArrayLayout4f16, - StructArrayLayout2f8, + StructArrayLayout3f12, StructArrayLayout4ui1f12, StructArrayLayout4ui8, StructArrayLayout6i12, @@ -1448,9 +1448,9 @@ export { StructArrayLayout2f9i15ui1ul6f1ub88, StructArrayLayout5f20, StructArrayLayout7f28, + StructArrayLayout2f8, StructArrayLayout1ul3ui12, StructArrayLayout1ui2, - StructArrayLayout3f12, StructArrayLayout16f64, StructArrayLayout4ui3f20, StructArrayLayout1i2, @@ -1465,7 +1465,7 @@ export { StructArrayLayout2i4 as HeatmapLayoutArray, StructArrayLayout2i4ub1f12 as LineLayoutArray, StructArrayLayout4f16 as LineExtLayoutArray, - StructArrayLayout2f8 as LinePatternLayoutArray, + StructArrayLayout3f12 as LinePatternLayoutArray, StructArrayLayout4ui1f12 as PatternLayoutArray, StructArrayLayout4ui8 as DashLayoutArray, StructArrayLayout6i12 as FillExtrusionExtArray, diff --git a/src/data/bucket/line_attributes_pattern.ts b/src/data/bucket/line_attributes_pattern.ts index 9cabe4f0559..dabd187dc96 100644 --- a/src/data/bucket/line_attributes_pattern.ts +++ b/src/data/bucket/line_attributes_pattern.ts @@ -3,7 +3,7 @@ import {createLayout} from '../../util/struct_array'; import type {StructArrayLayout} from '../../util/struct_array'; const lineLayoutAttributesPattern: StructArrayLayout = createLayout([ - {name: 'a_pattern_data', components: 2, type: 'Float32'} + {name: 'a_pattern_data', components: 3, type: 'Float32'} ]); export default lineLayoutAttributesPattern; diff --git a/src/data/bucket/line_bucket.ts b/src/data/bucket/line_bucket.ts index 3c631b81e2a..aa16ed13880 100644 --- a/src/data/bucket/line_bucket.ts +++ b/src/data/bucket/line_bucket.ts @@ -110,6 +110,7 @@ class LineBucket implements Bucket { patternJoinNone: boolean; segmentStart: number; + segmentStartf32: number; segmentPoints: Array; index: number; @@ -401,6 +402,7 @@ class LineBucket implements Bucket { const joinNone = join === 'none'; this.patternJoinNone = this.hasPattern && joinNone; this.segmentStart = 0; + this.segmentStartf32 = 0; this.segmentPoints = []; if (this.lineClips) { @@ -511,13 +513,12 @@ class LineBucket implements Bucket { // Integer part contains position in tile units // Fractional part has offset sign 0.25 = -1, 0.5 = 0, 0.75 = 1 const posAndOffset = Math.round(pos) + 0.5 + offsetSign * 0.25; - bucket.patternVertexArray.emplaceBack(posAndOffset, segmentLength); - bucket.patternVertexArray.emplaceBack(posAndOffset, segmentLength); + bucket.patternVertexArray.emplaceBack(posAndOffset, segmentLength, bucket.segmentStart); + bucket.patternVertexArray.emplaceBack(posAndOffset, segmentLength, bucket.segmentStart); } // Reset line segment - bucket.segmentPoints = []; - bucket.segmentStart = bucket.lineSoFar; + bucket.segmentPoints.length = 0; assert(bucket.zOffsetVertexArray.length === bucket.patternVertexArray.length || !bucket.hasZOffset); } @@ -815,6 +816,18 @@ class LineBucket implements Bucket { x, y, }: Point, extrudeX: number, extrudeY: number, round: boolean, up: boolean, dir: number, segment: Segment, fixedElevation?: number | null) { + if (this.patternJoinNone) { + if (this.segmentPoints.length === 0) { + this.segmentStart = this.lineSoFar; + this.segmentStartf32 = Math.fround(this.lineSoFar); + } + + if (!up) { // Only add one segment point for each line point + // Real vertex data is inserted after each line segment is finished + this.segmentPoints.push(this.lineSoFar - this.segmentStart, dir); + } + } + this.layoutVertexArray.emplaceBack( // a_pos_normal // Encode round/up the least significant bits @@ -827,7 +840,7 @@ class LineBucket implements Bucket { ((dir === 0 ? 0 : (dir < 0 ? -1 : 1)) + 1), 0, // unused // a_linesofar - this.lineSoFar); + this.lineSoFar - this.segmentStartf32); // Constructs a second vertex buffer with higher precision line progress if (this.lineClips) { @@ -847,10 +860,6 @@ class LineBucket implements Bucket { if (fixedElevation != null) { this.zOffsetVertexArray.emplaceBack(fixedElevation); } - if (!up && this.patternJoinNone) { - // Real data is inserted after each line segment is finished - this.segmentPoints.push(this.lineSoFar - this.segmentStart, dir); - } assert(this.zOffsetVertexArray.length === this.layoutVertexArray.length || !this.hasZOffset); } diff --git a/src/shaders/line_pattern.fragment.glsl b/src/shaders/line_pattern.fragment.glsl index 84ae3013103..65bfc6d4df1 100644 --- a/src/shaders/line_pattern.fragment.glsl +++ b/src/shaders/line_pattern.fragment.glsl @@ -1,17 +1,17 @@ #include "_prelude_fog.fragment.glsl" #include "_prelude_lighting.glsl" -uniform lowp float u_device_pixel_ratio; -uniform float u_alpha_discard_threshold; -uniform vec2 u_texsize; -uniform mediump float u_tile_units_to_pixels; +uniform highp float u_device_pixel_ratio; +uniform highp float u_alpha_discard_threshold; +uniform highp vec2 u_texsize; +uniform highp float u_tile_units_to_pixels; uniform highp vec2 u_trim_offset; uniform sampler2D u_image; in vec2 v_normal; in vec2 v_width2; -in float v_linesofar; +in highp float v_linesofar; in float v_gamma_scale; in float v_width; #ifdef RENDER_LINE_TRIM_OFFSET @@ -22,24 +22,23 @@ in highp vec4 v_uv; in vec2 v_pattern_data; // [pos_in_segment, segment_length]; #endif -#pragma mapbox: define lowp vec4 pattern -#pragma mapbox: define lowp float pixel_ratio -#pragma mapbox: define lowp float blur -#pragma mapbox: define lowp float opacity +#pragma mapbox: define mediump vec4 pattern +#pragma mapbox: define mediump float pixel_ratio +#pragma mapbox: define mediump float blur +#pragma mapbox: define mediump float opacity void main() { #pragma mapbox: initialize mediump vec4 pattern - #pragma mapbox: initialize lowp float pixel_ratio - - #pragma mapbox: initialize lowp float blur - #pragma mapbox: initialize lowp float opacity + #pragma mapbox: initialize mediump float pixel_ratio + #pragma mapbox: initialize mediump float blur + #pragma mapbox: initialize mediump float opacity vec2 pattern_tl = pattern.xy; vec2 pattern_br = pattern.zw; vec2 display_size = (pattern_br - pattern_tl) / pixel_ratio; - vec2 pattern_size = vec2(display_size.x / u_tile_units_to_pixels, display_size.y); + float pattern_size = display_size.x / u_tile_units_to_pixels; float aspect = display_size.y / v_width; @@ -52,7 +51,7 @@ void main() { float blur2 = (blur + 1.0 / u_device_pixel_ratio) * v_gamma_scale; float alpha = clamp(min(dist - (v_width2.t - blur2), v_width2.s - dist) / blur2, 0.0, 1.0); - float pattern_x = v_linesofar / pattern_size.x * aspect; + highp float pattern_x = v_linesofar / pattern_size * aspect; float x = mod(pattern_x, 1.0); float y = 0.5 * v_normal.y + 0.5; @@ -91,8 +90,8 @@ void main() { // negative). v_pattern_data.y is not modified because we can't access overlap info for other end of the segment. // All units are tile units. // Distance from segment start point to start of first pattern instance - float pattern_len = pattern_size.x / aspect; - float segment_phase = pattern_len - mod((v_linesofar - v_pattern_data.x), pattern_len); + float pattern_len = pattern_size / aspect; + float segment_phase = pattern_len - mod(v_linesofar - v_pattern_data.x + pattern_len, pattern_len); // Step is used to check if we can fit an extra pattern cycle when considering the segment overlap at the corner float visible_start = segment_phase - step(pattern_len * 0.5, segment_phase) * pattern_len; float visible_end = floor((v_pattern_data.y - segment_phase) / pattern_len) * pattern_len + segment_phase; diff --git a/src/shaders/line_pattern.vertex.glsl b/src/shaders/line_pattern.vertex.glsl index 89a1c96672c..dcb81ea1775 100644 --- a/src/shaders/line_pattern.vertex.glsl +++ b/src/shaders/line_pattern.vertex.glsl @@ -20,46 +20,46 @@ in float a_z_offset; #ifdef RENDER_LINE_TRIM_OFFSET in highp vec4 a_packed; #endif -in float a_linesofar; +in highp float a_linesofar; #ifdef LINE_JOIN_NONE -in vec2 a_pattern_data; // [position_in_segment & offset_sign, segment_length]; +in highp vec3 a_pattern_data; // [position_in_segment & offset_sign, segment_length, linesofar_hi]; out vec2 v_pattern_data; // [position_in_segment, segment_length] #endif uniform mat4 u_matrix; -uniform mediump float u_tile_units_to_pixels; +uniform float u_tile_units_to_pixels; uniform vec2 u_units_to_pixels; uniform mat2 u_pixels_to_tile_units; -uniform lowp float u_device_pixel_ratio; +uniform float u_device_pixel_ratio; out vec2 v_normal; out vec2 v_width2; -out float v_linesofar; +out highp float v_linesofar; out float v_gamma_scale; out float v_width; #ifdef RENDER_LINE_TRIM_OFFSET out highp vec4 v_uv; #endif -#pragma mapbox: define lowp float blur -#pragma mapbox: define lowp float opacity -#pragma mapbox: define lowp float offset +#pragma mapbox: define mediump float blur +#pragma mapbox: define mediump float opacity +#pragma mapbox: define mediump float offset #pragma mapbox: define mediump float gapwidth #pragma mapbox: define mediump float width -#pragma mapbox: define lowp float floorwidth -#pragma mapbox: define lowp vec4 pattern -#pragma mapbox: define lowp float pixel_ratio +#pragma mapbox: define mediump float floorwidth +#pragma mapbox: define mediump vec4 pattern +#pragma mapbox: define mediump float pixel_ratio void main() { - #pragma mapbox: initialize lowp float blur - #pragma mapbox: initialize lowp float opacity - #pragma mapbox: initialize lowp float offset + #pragma mapbox: initialize mediump float blur + #pragma mapbox: initialize mediump float opacity + #pragma mapbox: initialize mediump float offset #pragma mapbox: initialize mediump float gapwidth #pragma mapbox: initialize mediump float width - #pragma mapbox: initialize lowp float floorwidth + #pragma mapbox: initialize mediump float floorwidth #pragma mapbox: initialize mediump vec4 pattern - #pragma mapbox: initialize lowp float pixel_ratio + #pragma mapbox: initialize mediump float pixel_ratio // the distance over which the line edge fades out. // Retina devices need a smaller distance to avoid aliasing. @@ -73,7 +73,7 @@ void main() { // x is 1 if it's a round cap, 0 otherwise // y is 1 if the normal points up, and -1 if it points down // We store these in the least significant bit of a_pos_normal - mediump vec2 normal = a_pos_normal - 2.0 * pos; + vec2 normal = a_pos_normal - 2.0 * pos; normal.y = normal.y * 2.0 - 1.0; v_normal = normal; @@ -88,15 +88,15 @@ void main() { // Scale the extrusion vector down to a normal and then up by the line width // of this vertex. - mediump vec2 dist = outset * a_extrude * scale; + vec2 dist = outset * a_extrude * scale; // Calculate the offset when drawing a line that is to the side of the actual line. // We do this by creating a vector that points towards the extrude, but rotate // it when we're drawing round end points (a_direction = -1 or 1) since their // extrude vector points in another direction. - mediump float u = 0.5 * a_direction; - mediump float t = 1.0 - abs(u); - mediump vec2 offset2 = offset * a_extrude * scale * normal.y * mat2(t, -u, u, t); + float u = 0.5 * a_direction; + float t = 1.0 - abs(u); + vec2 offset2 = offset * a_extrude * scale * normal.y * mat2(t, -u, u, t); vec4 projected_extrude = u_matrix * vec4(dist * u_pixels_to_tile_units, 0.0, 0.0); #if defined(ELEVATED) @@ -141,11 +141,19 @@ void main() { #ifdef LINE_JOIN_NONE // Needs to consider antialiasing width extension to get accurate pattern aspect ratio - v_width += ANTIALIASING; + v_width = floorwidth + ANTIALIASING; + + mediump float pixels_to_tile_units = 1.0 / u_tile_units_to_pixels; + mediump float pixel_ratio_inverse = 1.0 / pixel_ratio; + mediump float aspect = v_width / ((pattern.w - pattern.y) * pixel_ratio_inverse); + // Pattern length * 32 is chosen experimentally, seems to provide good quality + highp float subt_multiple = (pattern.z - pattern.x) * pixel_ratio_inverse * pixels_to_tile_units * aspect * 32.0; + highp float subt = floor(a_pattern_data.z / subt_multiple) * subt_multiple; + // Offset caused by vertices extended forward or backward from line point float offset_sign = (fract(a_pattern_data.x) - 0.5) * 4.0; - float line_progress_offset = offset_sign * v_width * 0.5 / u_tile_units_to_pixels; - v_linesofar += line_progress_offset; + float line_progress_offset = offset_sign * v_width * 0.5 * pixels_to_tile_units; + v_linesofar = (a_pattern_data.z - subt) + a_linesofar + line_progress_offset; v_pattern_data = vec2(a_pattern_data.x + line_progress_offset, a_pattern_data.y); #endif diff --git a/test/integration/render-tests/line-pattern/3x-on-2x-add-image/style.json b/test/integration/render-tests/line-pattern/3x-on-2x-add-image/style.json index 425c467c887..d2524de78bf 100644 --- a/test/integration/render-tests/line-pattern/3x-on-2x-add-image/style.json +++ b/test/integration/render-tests/line-pattern/3x-on-2x-add-image/style.json @@ -5,6 +5,7 @@ "width": 64, "height": 32, "pixelRatio": 2, + "allowed": 0.0005, "operations": [ [ "wait" diff --git a/test/integration/render-tests/line-pattern/int-zoom-constant-width/style.json b/test/integration/render-tests/line-pattern/int-zoom-constant-width/style.json index d5543915f96..6cd86e058f5 100644 --- a/test/integration/render-tests/line-pattern/int-zoom-constant-width/style.json +++ b/test/integration/render-tests/line-pattern/int-zoom-constant-width/style.json @@ -2,7 +2,8 @@ "version": 8, "metadata": { "test": { - "height": 256 + "height": 256, + "allowed": 0.0012 } }, "center": [ diff --git a/test/integration/render-tests/line-pattern/line-join-none-fract-zoom/style.json b/test/integration/render-tests/line-pattern/line-join-none-fract-zoom/style.json index b41fc20e195..629a5861e77 100644 --- a/test/integration/render-tests/line-pattern/line-join-none-fract-zoom/style.json +++ b/test/integration/render-tests/line-pattern/line-join-none-fract-zoom/style.json @@ -2,7 +2,8 @@ "version": 8, "metadata": { "test": { - "height": 256 + "height": 256, + "allowed": 0.0003 } }, "center": [ diff --git a/test/integration/render-tests/line-pattern/line-join-none-high-zoom/expected.png b/test/integration/render-tests/line-pattern/line-join-none-high-zoom/expected.png new file mode 100644 index 0000000000000000000000000000000000000000..fb180dcc32842c1e21e4e50f9292937a707ea22f GIT binary patch literal 8513 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 Date: Mon, 1 Jul 2024 16:06:51 +0800 Subject: [PATCH 22/45] Add new properties to control line trim coloring and fading (internal-1144) * Introduce `line-trim-fade-range` and `line-trim-color` paint properties * Add render tests * Update sdk-support section --------- Co-authored-by: Alexander Shalamov --- src/render/program/line_program.ts | 8 +- src/shaders/line.fragment.glsl | 15 +- src/style-spec/reference/v8.json | 80 ++++++- src/style-spec/types.ts | 6 + .../line_style_layer_properties.ts | 4 + .../trim-color-fade/expected.png | Bin 0 -> 3758 bytes .../trim-color-fade/style.json | 201 ++++++++++++++++++ 7 files changed, 300 insertions(+), 14 deletions(-) create mode 100644 test/integration/render-tests/line-trim-offset/trim-color-fade/expected.png create mode 100644 test/integration/render-tests/line-trim-offset/trim-color-fade/style.json diff --git a/src/render/program/line_program.ts b/src/render/program/line_program.ts index 378a5ecd3e2..7c8bf5c69a6 100644 --- a/src/render/program/line_program.ts +++ b/src/render/program/line_program.ts @@ -1,4 +1,4 @@ -import {Uniform1i, Uniform1f, Uniform2f, UniformMatrix2f, UniformMatrix4f} from '../uniform_binding'; +import {Uniform1i, Uniform1f, Uniform2f, Uniform4f, UniformMatrix2f, UniformMatrix4f} from '../uniform_binding'; import pixelsToTileUnits from '../../source/pixels_to_tile_units'; import type Context from '../../gl/context'; @@ -20,6 +20,8 @@ export type LineUniformsType = { ['u_tile_units_to_pixels']: Uniform1f; ['u_alpha_discard_threshold']: Uniform1f; ['u_trim_offset']: Uniform2f; + ['u_trim_fade_range']: Uniform2f; + ['u_trim_color']: Uniform4f; ['u_emissive_strength']: Uniform1f; }; @@ -49,6 +51,8 @@ const lineUniforms = (context: Context): LineUniformsType => ({ 'u_tile_units_to_pixels': new Uniform1f(context), 'u_alpha_discard_threshold': new Uniform1f(context), 'u_trim_offset': new Uniform2f(context), + 'u_trim_fade_range': new Uniform2f(context), + 'u_trim_color': new Uniform4f(context), 'u_emissive_strength': new Uniform1f(context) }); @@ -90,6 +94,8 @@ const lineUniformValues = ( 'u_tile_units_to_pixels': calculateTileRatio(tile, painter.transform), 'u_alpha_discard_threshold': 0.0, 'u_trim_offset': trimOffset, + 'u_trim_fade_range': layer.paint.get('line-trim-fade-range'), + 'u_trim_color': layer.paint.get('line-trim-color').toRenderColor(layer.lut).toArray01(), 'u_emissive_strength': layer.paint.get('line-emissive-strength') }; }; diff --git a/src/shaders/line.fragment.glsl b/src/shaders/line.fragment.glsl index 6b7b6fbae96..0e7f721ac47 100644 --- a/src/shaders/line.fragment.glsl +++ b/src/shaders/line.fragment.glsl @@ -4,6 +4,8 @@ uniform lowp float u_device_pixel_ratio; uniform float u_alpha_discard_threshold; uniform highp vec2 u_trim_offset; +uniform lowp vec2 u_trim_fade_range; +uniform lowp vec4 u_trim_color; in vec2 v_width2; in vec2 v_normal; @@ -69,7 +71,7 @@ void main() { out_color = color; #endif - float trimmed = 1.0; + float trim_alpha = 1.0; #ifdef RENDER_LINE_TRIM_OFFSET // v_uv[2] and v_uv[3] are specifying the original clip range that the vertex is located in. highp float start = v_uv[2]; @@ -86,10 +88,11 @@ void main() { // Nested conditionals fixes the issue // https://github.com/mapbox/mapbox-gl-js/issues/12013 if (trim_end > trim_start) { - if (line_progress <= trim_end && line_progress >= trim_start) { - out_color = vec4(0, 0, 0, 0); - trimmed = 0.0; - } + float start_transition = max(0.0, min(1.0, (line_progress - trim_start) / clamp(u_trim_fade_range[0], 1e-4, 1.0))); + float end_transition = max(0.0, min(1.0, (trim_end - line_progress) / clamp(u_trim_fade_range[1], 1e-4, 1.0))); + float transition_factor = min(start_transition, end_transition); + out_color = mix(out_color, u_trim_color, transition_factor); + trim_alpha = out_color.a; } #endif @@ -114,7 +117,7 @@ void main() { out_color.rgb *= (0.6 + 0.4 * smoothAlpha); } } else { - out_color.rgb = mix(border_color.rgb * border_color.a * trimmed, out_color.rgb, smoothAlpha); + out_color.rgb = mix(border_color.rgb * border_color.a * trim_alpha, out_color.rgb, smoothAlpha); } } #endif diff --git a/src/style-spec/reference/v8.json b/src/style-spec/reference/v8.json index 906ab24bd1c..0b3cc522967 100644 --- a/src/style-spec/reference/v8.json +++ b/src/style-spec/reference/v8.json @@ -6316,19 +6316,19 @@ "line-trim-offset": { "type": "array", "value": "number", - "doc": "The line part between [trim-start, trim-end] will be marked as transparent to make a route vanishing effect. The line trim-off offset is based on the whole line range [0.0, 1.0].", + "doc": "The line part between [trim-start, trim-end] will be painted using `line-trim-color,` which is transparent by default to produce a route vanishing effect. The line trim-off offset is based on the whole line range [0.0, 1.0].", "length": 2, "default": [0.0, 0.0], "minimum": [0.0, 0.0], "maximum": [1.0, 1.0], "transition": false, "requires": [ - { - "source": "geojson", - "has": { - "lineMetrics": true - } - } + { + "source": "geojson", + "has": { + "lineMetrics": true + } + } ], "sdk-support": { "basic functionality": { @@ -6339,6 +6339,72 @@ }, "property-type": "constant" }, + "line-trim-fade-range": { + "type": "array", + "value": "number", + "doc": "The fade range for the trim-start and trim-end points is defined by the `line-trim-offset` property. The first element of the array represents the fade range from the trim-start point toward the end of the line, while the second element defines the fade range from the trim-end point toward the beginning of the line. The fade result is achieved by interpolating between `line-trim-color` and the color specified by the `line-color` or the `line-gradient` property.", + "experimental": true, + "length": 2, + "default": [0.0, 0.0], + "minimum": [0.0, 0.0], + "maximum": [1.0, 1.0], + "transition": false, + "requires": [ + "line-trim-offset", + { + "source": "geojson", + "has": { + "lineMetrics": true + } + } + ], + "expression": { + "interpolated": true, + "parameters": [ + "zoom", + "measure-light" + ] + }, + "sdk-support": { + "basic functionality": { + "js": "3.6.0", + "android": "11.6.0", + "ios": "11.6.0" + } + }, + "property-type": "data-constant" + }, + "line-trim-color": { + "type": "color", + "doc": "The color to be used for rendering the trimmed line section that is defined by the `line-trim-offset` property.", + "experimental": true, + "default": "transparent", + "transition": true, + "requires": [ + "line-trim-offset", + { + "source": "geojson", + "has": { + "lineMetrics": true + } + } + ], + "sdk-support": { + "basic functionality": { + "js": "3.6.0", + "android": "11.6.0", + "ios": "11.6.0" + } + }, + "expression": { + "interpolated": true, + "parameters": [ + "zoom", + "measure-light" + ] + }, + "property-type": "data-constant" + }, "line-emissive-strength": { "type": "number", "default": 0.0, diff --git a/src/style-spec/types.ts b/src/style-spec/types.ts index 5f2e256c9a2..0f18b191f13 100644 --- a/src/style-spec/types.ts +++ b/src/style-spec/types.ts @@ -419,6 +419,12 @@ export type LineLayerSpecification = { "line-pattern"?: DataDrivenPropertyValueSpecification, "line-gradient"?: ExpressionSpecification, "line-trim-offset"?: [number, number], + /** + * @experimental This property is experimental and subject to change in future versions. + */ + "line-trim-fade-range"?: PropertyValueSpecification<[number, number]>, + "line-trim-color"?: PropertyValueSpecification, + "line-trim-color-transition"?: TransitionSpecification, "line-emissive-strength"?: PropertyValueSpecification, "line-emissive-strength-transition"?: TransitionSpecification, "line-border-width"?: DataDrivenPropertyValueSpecification, diff --git a/src/style/style_layer/line_style_layer_properties.ts b/src/style/style_layer/line_style_layer_properties.ts index a9d45224f99..6f5a9a3cf0d 100644 --- a/src/style/style_layer/line_style_layer_properties.ts +++ b/src/style/style_layer/line_style_layer_properties.ts @@ -49,6 +49,8 @@ export type PaintProps = { "line-pattern": DataDrivenProperty; "line-gradient": ColorRampProperty; "line-trim-offset": DataConstantProperty<[number, number]>; + "line-trim-fade-range": DataConstantProperty<[number, number]>; + "line-trim-color": DataConstantProperty; "line-emissive-strength": DataConstantProperty; "line-border-width": DataDrivenProperty; "line-border-color": DataDrivenProperty; @@ -68,6 +70,8 @@ const paint: Properties = new Properties({ "line-pattern": new DataDrivenProperty(styleSpec["paint_line"]["line-pattern"]), "line-gradient": new ColorRampProperty(styleSpec["paint_line"]["line-gradient"]), "line-trim-offset": new DataConstantProperty(styleSpec["paint_line"]["line-trim-offset"]), + "line-trim-fade-range": new DataConstantProperty(styleSpec["paint_line"]["line-trim-fade-range"]), + "line-trim-color": new DataConstantProperty(styleSpec["paint_line"]["line-trim-color"]), "line-emissive-strength": new DataConstantProperty(styleSpec["paint_line"]["line-emissive-strength"]), "line-border-width": new DataDrivenProperty(styleSpec["paint_line"]["line-border-width"]), "line-border-color": new DataDrivenProperty(styleSpec["paint_line"]["line-border-color"]), diff --git a/test/integration/render-tests/line-trim-offset/trim-color-fade/expected.png b/test/integration/render-tests/line-trim-offset/trim-color-fade/expected.png new file mode 100644 index 0000000000000000000000000000000000000000..a852552e5d7c343bd9cbf0d4f0ab43e1016f0b81 GIT binary patch literal 3758 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 literal 0 HcmV?d00001 diff --git a/test/integration/render-tests/line-trim-offset/trim-color-fade/style.json b/test/integration/render-tests/line-trim-offset/trim-color-fade/style.json new file mode 100644 index 00000000000..14fb20c57de --- /dev/null +++ b/test/integration/render-tests/line-trim-offset/trim-color-fade/style.json @@ -0,0 +1,201 @@ +{ + "version": 8, + "metadata": { + "test": { + "width": 150, + "height": 150 + } + }, + "zoom": 6.5, + "center": [0.4, 0.5], + "sources": { + "trim_offset": { + "type": "geojson", + "data": { + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "id": 1, + "geometry": { + "coordinates": [ + [ + 0.0, + 0.0 + ], + [ + 0.0, + 1.0 + ] + ], + "type": "LineString" + } + }, + { + "type": "Feature", + "properties": {}, + "id": 2, + "geometry": { + "coordinates": [ + [ + 0.2, + 0.0 + ], + [ + 0.2, + 1.0 + ] + ], + "type": "LineString" + } + }, + { + "type": "Feature", + "properties": {}, + "id": 3, + "geometry": { + "coordinates": [ + [ + 0.4, + 0.0 + ], + [ + 0.4, + 1.0 + ] + ], + "type": "LineString" + } + }, + { + "type": "Feature", + "properties": {}, + "id": 4, + "geometry": { + "coordinates": [ + [ + 0.6, + 0.0 + ], + [ + 0.6, + 1.0 + ] + ], + "type": "LineString" + } + }, + { + "type": "Feature", + "properties": {}, + "id": 5, + "geometry": { + "coordinates": [ + [ + 0.8, + 0.0 + ], + [ + 0.8, + 1.0 + ] + ], + "type": "LineString" + } + } + ] + }, + "lineMetrics": true + } + }, + "layers": [ + { + "id": "default_color_fade_begin", + "type": "line", + "source": "trim_offset", + "filter": ["==", ["id"], 1], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": 10, + "line-trim-offset": [0.0, 0.2], + "line-trim-fade-range": [0.0, 0.1] + } + }, + { + "id": "default_color_fade_end", + "type": "line", + "source": "trim_offset", + "filter": ["==", ["id"], 2], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": 10, + "line-trim-offset": [0.8, 1.0], + "line-trim-fade-range": [0.1, 0.0] + } + }, + { + "id": "trim-color", + "type": "line", + "source": "trim_offset", + "filter": ["==", ["id"], 3], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": 10, + "line-trim-offset": [0.2, 0.6], + "line-trim-fade-range": [0.0, 0.2], + "line-trim-color": "orange", + "line-color": "transparent" + } + }, + { + "id": "trim-fade-both-sides", + "type": "line", + "source": "trim_offset", + "filter": ["==", ["id"], 4], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": 10, + "line-trim-offset": [0.2, 0.9], + "line-trim-fade-range": [0.1, 0.1], + "line-trim-color": "green", + "line-color": "transparent" + } + }, + { + "id": "trim-fade-gradient", + "type": "line", + "source": "trim_offset", + "filter": ["==", ["id"], 5], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-width": 10, + "line-trim-offset": [0.1, 0.3], + "line-trim-fade-range": [0.02, 0.02], + "line-trim-color": "aquamarine", + "line-gradient": ["interpolate", + ["linear"], + ["line-progress"], + 0.0, "red", + 0.7, "green", + 1.0, "transparent" + ] + } + } + ] +} From 6c90d1344c93509308c56007cc2fe4f25fd55498 Mon Sep 17 00:00:00 2001 From: Daniel Eke Date: Mon, 1 Jul 2024 18:14:50 +0800 Subject: [PATCH 23/45] Apply LUT on model colors without PBR buffer (internal-1558) * Apply LUT on model colors without PBR buffer * Disable y flip and premultiply alpha in unpack config of 3D textures * Add render test for emissive model part with LUT colorization --- 3d-style/shaders/model.fragment.glsl | 4 ++ src/render/texture.ts | 2 + .../color-theme/emission-bw/expected.png | Bin 0 -> 29642 bytes .../color-theme/emission-bw/style.json | 49 ++++++++++++++++++ 4 files changed, 55 insertions(+) create mode 100644 test/integration/render-tests/color-theme/emission-bw/expected.png create mode 100644 test/integration/render-tests/color-theme/emission-bw/style.json diff --git a/3d-style/shaders/model.fragment.glsl b/3d-style/shaders/model.fragment.glsl index 8fc9b5ca3bb..4a75e36f9f8 100644 --- a/3d-style/shaders/model.fragment.glsl +++ b/3d-style/shaders/model.fragment.glsl @@ -494,6 +494,10 @@ vec4 finalColor; distance += mix(0.5, 0.0, clamp(resEmission - 1.0, 0.0, 1.0)); opacity *= v_roughness_metallic_emissive_alpha.w * saturate(1.0 - distance * distance); #endif +#else +#ifdef APPLY_LUT_ON_GPU + color = applyLUT(u_lutTexture, color); +#endif #endif // Use emissive strength as interpolation between lit and unlit color // for coherence with other layer types. diff --git a/src/render/texture.ts b/src/render/texture.ts index 80dfd213b77..7c2b3722be5 100644 --- a/src/render/texture.ts +++ b/src/render/texture.ts @@ -185,7 +185,9 @@ export class Texture3D { gl.bindTexture(gl.TEXTURE_3D, this.texture); + context.pixelStoreUnpackFlipY.set(false); context.pixelStoreUnpack.set(1); + context.pixelStoreUnpackPremultiplyAlpha.set(false); let internalFormat = this.format; let type: TextureType = gl.UNSIGNED_BYTE; diff --git a/test/integration/render-tests/color-theme/emission-bw/expected.png b/test/integration/render-tests/color-theme/emission-bw/expected.png new file mode 100644 index 0000000000000000000000000000000000000000..91f6603cd365903e3ba46967b86bb3e713b9f640 GIT binary patch literal 29642 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 Date: Mon, 1 Jul 2024 14:18:07 +0300 Subject: [PATCH 24/45] Fix canvas fingerprint noise check on `Map.setTerrain` (internal-1561) --- src/style/style.ts | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/style/style.ts b/src/style/style.ts index c6309b6b0a8..2aa7a5e8c71 100644 --- a/src/style/style.ts +++ b/src/style/style.ts @@ -753,14 +753,8 @@ class Style extends Evented { const terrain = this.stylesheet.terrain; if (terrain) { - // This workaround disables terrain and hillshade - // if there is noise in the Canvas2D operations used for image decoding. - if (this.disableElevatedTerrain === undefined) - this.disableElevatedTerrain = browser.hasCanvasFingerprintNoise(); - - if (this.disableElevatedTerrain) { - warnOnce('Terrain and hillshade are disabled because of Canvas2D limitations when fingerprinting protection is enabled (e.g. in private browsing mode).'); - } else if (!this.terrainSetForDrapingOnly()) { + this.checkCanvasFingerprintNoise(); + if (!this.terrainSetForDrapingOnly()) { this._createTerrain(terrain, DrapeRenderMode.elevated); } } @@ -2817,6 +2811,15 @@ class Style extends Evented { this.setTerrain(mockTerrainOptions, DrapeRenderMode.deferred); } + checkCanvasFingerprintNoise() { + // This workaround disables terrain and hillshade + // if there is noise in the Canvas2D operations used for image decoding. + if (this.disableElevatedTerrain === undefined) { + this.disableElevatedTerrain = browser.hasCanvasFingerprintNoise(); + if (this.disableElevatedTerrain) warnOnce('Terrain and hillshade are disabled because of Canvas2D limitations when fingerprinting protection is enabled (e.g. in private browsing mode).'); + } + } + // eslint-disable-next-line no-warning-comments // TODO: generic approach for root level property: light, terrain, skybox. // It is not done here to prevent rebasing issues. @@ -2841,9 +2844,13 @@ class Style extends Evented { return; } + this.checkCanvasFingerprintNoise(); + let options: TerrainSpecification = terrainOptions; const isUpdating = terrainOptions.source == null; if (drapeRenderMode === DrapeRenderMode.elevated) { + if (this.disableElevatedTerrain) return; + // Input validation and source object unrolling if (typeof options.source === 'object') { const id = 'terrain-dem-src'; From 99d8a32ea6e65c086801bae583d7066d8269c30a Mon Sep 17 00:00:00 2001 From: Daniel Eke Date: Mon, 1 Jul 2024 20:20:04 +0800 Subject: [PATCH 25/45] Load LUT into image element (internal-1562) --- src/style/style.ts | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/style/style.ts b/src/style/style.ts index 2aa7a5e8c71..6a5fac99273 100644 --- a/src/style/style.ts +++ b/src/style/style.ts @@ -1084,17 +1084,21 @@ class Style extends Evented { // Reserved image name, which references the LUT in the image manager const styleLutName = 'mapbox-reserved-lut'; - this.map.loadImage(colorThemeData, (err, bitmap) => { + const lutImage = new Image(); + lutImage.src = colorThemeData; + lutImage.onerror = () => { this._styleColorTheme.lutLoading = false; - if (err) { - reject(new Error(`${err.message}`)); - return; - } - if (bitmap.height > 32) { + reject(new Error('Failed to load image data')); + + }; + lutImage.onload = () => { + this._styleColorTheme.lutLoading = false; + const {width, height, data} = browser.getImageData(lutImage); + if (height > 32) { reject(new Error('The height of the image must be less than or equal to 32 pixels.')); return; } - if (bitmap.width !== bitmap.height * bitmap.height) { + if (width !== height * height) { reject(new Error('The width of the image must be equal to the height squared.')); return; } @@ -1102,7 +1106,6 @@ class Style extends Evented { if (this.getImage(styleLutName)) { this.removeImage(styleLutName); } - const {width, height, data} = browser.getImageData(bitmap); this.addImage(styleLutName, {data: new RGBAImage({width, height}, data), pixelRatio: 1, sdf: false, version: 0}); const image = this.imageManager.getImage(styleLutName, this.scope); @@ -1115,7 +1118,7 @@ class Style extends Evented { }; resolve(); } - }); + }; }); } From dc14c9bf37f1ee50dc0cd3e7bef2ca1300f76696 Mon Sep 17 00:00:00 2001 From: Fouad Valadbeigi <67509069+akoylasar@users.noreply.github.com> Date: Mon, 1 Jul 2024 15:14:42 +0200 Subject: [PATCH 26/45] fix initial value for globa clip bounds in ReplacementSource (internal-1563) --- 3d-style/source/replacement_source.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3d-style/source/replacement_source.ts b/3d-style/source/replacement_source.ts index f96c5f878e2..5c6eafe16e3 100644 --- a/3d-style/source/replacement_source.ts +++ b/3d-style/source/replacement_source.ts @@ -51,7 +51,7 @@ class ReplacementSource { this._sourceIds = []; this._activeRegions = []; this._prevRegions = []; - this._globalClipBounds = {min: new Point(0, 0), max: new Point(0, 0)}; + this._globalClipBounds = {min: new Point(Infinity, Infinity), max: new Point(-Infinity, -Infinity)}; } clear() { From d109bedb64c137f35aeab68abb2efcadd173a937 Mon Sep 17 00:00:00 2001 From: Volodymyr Agafonkin Date: Mon, 1 Jul 2024 19:18:05 +0300 Subject: [PATCH 27/45] Dynamic GeoJSON index for fast partial updates (internal-1549) * add dynamic geojson index for partial updates * fix update race condition * skip reloading tiles that haven't changed on partial update * fixup for lines * improve typing for geojson-rt --- src/source/geojson_rt.ts | 230 ++++++++++++++++++++++++++++ src/source/geojson_source.ts | 13 +- src/source/geojson_worker_source.ts | 41 +++-- src/source/geojson_wrapper.ts | 2 +- src/source/worker_source.ts | 1 + 5 files changed, 264 insertions(+), 23 deletions(-) create mode 100644 src/source/geojson_rt.ts diff --git a/src/source/geojson_rt.ts b/src/source/geojson_rt.ts new file mode 100644 index 00000000000..86150078eff --- /dev/null +++ b/src/source/geojson_rt.ts @@ -0,0 +1,230 @@ + +import EXTENT from '../style-spec/data/extent'; +import {mercatorXfromLng, mercatorYfromLat} from '../geo/mercator_coordinate'; + +import type WorkerTile from './worker_tile'; +import type {Feature} from './geojson_wrapper'; + +type BBox = { + minX: number, + minY: number, + maxX: number, + maxY: number +} + +type InternalFeature = BBox & { + id: string | number, + tags: {[_: string]: string | number | boolean}, + type: 1 | 2 | 3, + geometry: number[] | number[][] +}; + +const PAD = 64 / 4096; // geojson-vt default tile buffer + +/* + * A GeoJSON index tailored to "small data, updated frequently" use cases + * which gets used with GeoJSON sources in `dynamic` mode + */ +export default class GeoJSONRT { + features: Map; + + constructor() { + this.features = new Map(); + } + + clear() { + this.features.clear(); + } + + load(features: GeoJSON.Feature[] = [], cache: {[_: number]: WorkerTile}) { + for (const feature of features) { + const id = feature.id; + if (id == null) continue; + + let updated = this.features.get(id); + + // update tile cache for the old position + if (updated) this.updateCache(updated, cache); + + if (!feature.geometry) { + this.features.delete(id); + } else { + updated = convertFeature(feature); + // update tile cache for the new position + this.updateCache(updated, cache); + this.features.set(id, updated); + } + + this.updateCache(updated, cache); + } + } + + // clear all tiles that contain a given feature from the tile cache + updateCache(feature: InternalFeature, cache: {[_: number]: WorkerTile}) { + for (const {canonical, uid} of Object.values(cache)) { + const {z, x, y} = canonical; + const z2 = Math.pow(2, z); + + if (intersectsTile(feature, z2, x, y)) { + delete cache[uid]; + } + } + } + + // return all features that fit in the tile (plus a small padding) by bbox; since dynamic mode is + // for "small data, frequently updated" case, linear loop through all features should be fast enough + getTile(z: number, tx: number, ty: number) { + const z2 = Math.pow(2, z); + const features = []; + for (const feature of this.features.values()) { + if (intersectsTile(feature, z2, tx, ty)) { + features.push(outputFeature(feature, z2, tx, ty)); + } + } + return {features}; + } + + getFeatures() { + return [...this.features.values()]; + } +} + +function intersectsTile({minX, minY, maxX, maxY}: BBox, z2: number, tx: number, ty: number) { + const x0 = (tx - PAD) / z2; + const y0 = (ty - PAD) / z2; + const x1 = (tx + 1 + PAD) / z2; + const y1 = (ty + 1 + PAD) / z2; + return minX < x1 && minY < y1 && maxX > x0 && maxY > y0; +} + +function convertFeature(originalFeature: GeoJSON.Feature): InternalFeature { + const {id, geometry, properties} = originalFeature; + if (!geometry) return; + if (geometry.type === 'GeometryCollection') { + throw new Error('GeometryCollection not supported in dynamic mode.'); + } + const {type, coordinates} = geometry; + + const feature: InternalFeature = { + id, + type: 1, + geometry: [], + tags: properties, + minX: Infinity, + minY: Infinity, + maxX: -Infinity, + maxY: -Infinity + }; + const geom = feature.geometry; + + if (type === 'Point') { + convertPoint(coordinates, geom as number[], feature); + + } else if (type === 'MultiPoint') { + for (const p of coordinates) { + convertPoint(p, geom as number[], feature); + } + + } else if (type === 'LineString') { + feature.type = 2; + convertLine(coordinates, geom as number[][], feature); + + } else if (type === 'MultiLineString') { + feature.type = 2; + convertLines(coordinates, geom as number[][], feature); + + } else if (type === 'Polygon') { + feature.type = 3; + convertLines(coordinates, geom as number[][], feature, true); + + } else if (type === 'MultiPolygon') { + feature.type = 3; + for (const polygon of coordinates) { + convertLines(polygon, geom as number[][], feature, true); + } + + } else { + throw new Error('Input data is not a valid GeoJSON object.'); + } + + return feature; +} + +function convertPoint([lng, lat]: GeoJSON.Position, out: number[], bbox: BBox) { + const x = mercatorXfromLng(lng); + let y = mercatorYfromLat(lat); + y = y < 0 ? 0 : y > 1 ? 1 : y; + out.push(x, y); + + bbox.minX = Math.min(bbox.minX, x); + bbox.minY = Math.min(bbox.minY, y); + bbox.maxX = Math.max(bbox.maxX, x); + bbox.maxY = Math.max(bbox.maxY, y); +} + +function convertLine(ring: GeoJSON.Position[], out: number[][], bbox: BBox, isPolygon: boolean = false, isOuter: boolean = false) { + const newLine: number[] = []; + for (const p of ring) { + convertPoint(p, newLine, bbox); + } + out.push(newLine); + if (isPolygon) rewind(newLine, isOuter); +} + +function convertLines(lines: GeoJSON.Position[][], out: number[][], bbox: BBox, isPolygon: boolean = false) { + for (let i = 0; i < lines.length; i++) { + convertLine(lines[i], out, bbox, isPolygon, i === 0); + } +} + +function outputFeature(feature: InternalFeature, z2: number, tx: number, ty: number): Feature { + const {id, type, geometry, tags} = feature; + const tileGeom = []; + + if (type === 1) { + transformLine(geometry as number[], z2, tx, ty, tileGeom); + } else { + for (const ring of geometry) { + tileGeom.push(transformLine(ring as number[], z2, tx, ty)); + } + } + + return { + id, + type, + geometry: tileGeom, + tags + }; +} + +function transformLine(line: number[], z2: number, tx: number, ty: number, out: [number, number][] = []) { + for (let i = 0; i < line.length; i += 2) { + out.push(transformPoint(line[i], line[i + 1], z2, tx, ty)); + } + return out; +} + +function transformPoint(x: number, y: number, z2: number, tx: number, ty: number): [number, number] { + return [ + Math.round(EXTENT * (x * z2 - tx)), + Math.round(EXTENT * (y * z2 - ty)) + ]; +} + +// rewind a polygon ring to a given winding order (clockwise or anti-clockwise) +function rewind(ring: number[], clockwise: boolean) { + let area = 0; + for (let i = 0, len = ring.length, j = len - 2; i < len; j = i, i += 2) { + area += (ring[i] - ring[j]) * (ring[i + 1] + ring[j + 1]); + } + if (area > 0 === clockwise) { + for (let i = 0, len = ring.length; i < len / 2; i += 2) { + const x = ring[i]; + const y = ring[i + 1]; + ring[i] = ring[len - 2 - i]; + ring[i + 1] = ring[len - 1 - i]; + ring[len - 2 - i] = x; + ring[len - 1 - i] = y; + } + } +} diff --git a/src/source/geojson_source.ts b/src/source/geojson_source.ts index ce5a4b5fa86..3a1ad598c45 100644 --- a/src/source/geojson_source.ts +++ b/src/source/geojson_source.ts @@ -88,6 +88,7 @@ class GeoJSONSource extends Evented implements ISource { _metadataFired: boolean | null | undefined; _collectResourceTiming: boolean; _pendingLoad: Cancelable | null | undefined; + _partialReload: boolean; reload: undefined; hasTile: undefined; @@ -404,7 +405,9 @@ class GeoJSONSource extends Evented implements ISource { if (this._collectResourceTiming && result && result.resourceTiming && result.resourceTiming[this.id]) { data.resourceTiming = result.resourceTiming[this.id]; } + if (append) this._partialReload = true; this.fire(new Event('data', data)); + this._partialReload = false; this._metadataFired = true; } @@ -423,6 +426,7 @@ class GeoJSONSource extends Evented implements ISource { const message = !tile.actor ? 'loadTile' : 'reloadTile'; tile.actor = this.actor; const lutForScope = this.map.style ? this.map.style.getLut(this.scope) : null; + const partial = this._partialReload; const params = { type: this.type, uid: tile.uid, @@ -439,10 +443,17 @@ class GeoJSONSource extends Evented implements ISource { pixelRatio: browser.devicePixelRatio, showCollisionBoxes: this.map.showCollisionBoxes, promoteId: this.promoteId, - brightness: this.map.style ? (this.map.style.getBrightness() || 0.0) : 0.0 + brightness: this.map.style ? (this.map.style.getBrightness() || 0.0) : 0.0, + partial }; tile.request = this.actor.send(message, params, (err, data) => { + if (partial && !data) { + // if we did a partial reload and the tile didn't change, do nothing and treat the tile as loaded + tile.state = 'loaded'; + return callback(null); + } + delete tile.request; tile.destroy(); diff --git a/src/source/geojson_worker_source.ts b/src/source/geojson_worker_source.ts index 51bf3bb69bf..f4fc1df9c25 100644 --- a/src/source/geojson_worker_source.ts +++ b/src/source/geojson_worker_source.ts @@ -2,6 +2,7 @@ import {getJSON} from '../util/ajax'; import {getPerformanceMeasurement} from '../util/performance'; import GeoJSONWrapper from './geojson_wrapper'; +import GeoJSONRT from './geojson_rt'; import vtpbf from 'vt-pbf'; import Supercluster from 'supercluster'; import geojsonvt from 'geojson-vt'; @@ -43,9 +44,9 @@ export type LoadGeoJSON = (params: LoadGeoJSONParameters, callback: ResponseCall export interface GeoJSONIndex { getTile(z: number, x: number, y: number): any; // supercluster methods - getClusterExpansionZoom(clusterId: number): number; - getChildren(clusterId: number): Array; - getLeaves(clusterId: number, limit: number, offset: number): Array; + getClusterExpansionZoom?(clusterId: number): number; + getChildren?(clusterId: number): Array; + getLeaves?(clusterId: number, limit: number, offset: number): Array; } function loadGeoJSONTile(params: RequestedTileParameters, callback: LoadVectorDataCallback) { @@ -89,7 +90,7 @@ function loadGeoJSONTile(params: RequestedTileParameters, callback: LoadVectorDa */ class GeoJSONWorkerSource extends VectorTileWorkerSource { _geoJSONIndex: GeoJSONIndex; - _featureMap: Map; + _dynamicIndex: GeoJSONRT; /** * @param [loadGeoJSON] Optional method for custom loading/parsing of @@ -103,7 +104,7 @@ class GeoJSONWorkerSource extends VectorTileWorkerSource { if (loadGeoJSON) { this.loadGeoJSON = loadGeoJSON; } - this._featureMap = new Map(); + this._dynamicIndex = new GeoJSONRT(); } /** @@ -155,32 +156,27 @@ class GeoJSONWorkerSource extends VectorTileWorkerSource { if (data.type === 'Feature') data = {type: 'FeatureCollection', features: [data]}; if (!params.append) { - this._featureMap.clear(); + this._dynamicIndex.clear(); + this.loaded = {}; } - for (const feature of (data.features || [])) { - const id = feature.id; - if (id !== undefined) { - if (!feature.geometry) { - this._featureMap.delete(id); - } else { - this._featureMap.set(id, feature); - } - } - } - data.features = [...this._featureMap.values()]; + this._dynamicIndex.load(data.features, this.loaded); + + if (params.cluster) data.features = this._dynamicIndex.getFeatures(); + + } else { + this.loaded = {}; } - this._geoJSONIndex = params.cluster ? - new Supercluster(getSuperclusterOptions(params)).load(data.features) : + this._geoJSONIndex = + params.cluster ? new Supercluster(getSuperclusterOptions(params)).load(data.features) : + params.dynamic ? this._dynamicIndex : geojsonvt(data, params.geojsonVtOptions); } catch (err: any) { return callback(err); } - this.loaded = {}; - const result: Record = {}; if (perf) { const resourceTimingData = getPerformanceMeasurement(requestParam); @@ -211,6 +207,9 @@ class GeoJSONWorkerSource extends VectorTileWorkerSource { uid = params.uid; if (loaded && loaded[uid]) { + if (params.partial) { + return callback(null, undefined); + } return super.reloadTile(params, callback); } else { return this.loadTile(params, callback); diff --git a/src/source/geojson_wrapper.ts b/src/source/geojson_wrapper.ts index 62b9494c372..44da0264af0 100644 --- a/src/source/geojson_wrapper.ts +++ b/src/source/geojson_wrapper.ts @@ -8,7 +8,7 @@ import type {VectorTile, VectorTileLayer} from '@mapbox/vector-tile'; // The feature type used by geojson-vt and supercluster. Should be extracted to // global type and used in module definitions for those two modules. -type Feature = { +export type Feature = { type: 1; id: unknown; tags: { diff --git a/src/source/worker_source.ts b/src/source/worker_source.ts index 60e6d669ca1..0576e7e0353 100644 --- a/src/source/worker_source.ts +++ b/src/source/worker_source.ts @@ -41,6 +41,7 @@ export type WorkerTileParameters = RequestedTileParameters & { brightness: number; extraShadowCaster?: boolean; tessellationStep?: number // test purpose only; + partial?: boolean; }; export type DEMSourceEncoding = 'mapbox' | 'terrarium'; From 3b779af6ff3c54f6c9b3880dab564dd78d44c452 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Jul 2024 11:42:04 +0300 Subject: [PATCH 28/45] Bump typescript from 5.5.2 to 5.5.3 (internal-1570) Bumps [typescript](https://github.com/Microsoft/TypeScript) from 5.5.2 to 5.5.3. - [Release notes](https://github.com/Microsoft/TypeScript/releases) - [Changelog](https://github.com/microsoft/TypeScript/blob/main/azure-pipelines.release.yml) - [Commits](https://github.com/Microsoft/TypeScript/compare/v5.5.2...v5.5.3) --- updated-dependencies: - dependency-name: typescript 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 7e970d9af2d..ba79acff16b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -112,7 +112,7 @@ "tape-filter": "^1.0.4", "testem": "^3.14.0", "tsx": "^4.15.7", - "typescript": "^5.5.2", + "typescript": "^5.5.3", "typescript-eslint": "^7.14.1", "utility-types": "^3.11.0", "vite-plugin-arraybuffer": "^0.0.7", @@ -13082,9 +13082,9 @@ "dev": true }, "node_modules/typescript": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.2.tgz", - "integrity": "sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew==", + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", + "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==", "dev": true, "bin": { "tsc": "bin/tsc", diff --git a/package.json b/package.json index ad8de6e3662..9fc05bfbcd3 100644 --- a/package.json +++ b/package.json @@ -115,7 +115,7 @@ "tape-filter": "^1.0.4", "testem": "^3.14.0", "tsx": "^4.15.7", - "typescript": "^5.5.2", + "typescript": "^5.5.3", "typescript-eslint": "^7.14.1", "utility-types": "^3.11.0", "vite-plugin-arraybuffer": "^0.0.7", From ae83d321d5b59137566997c46911b564ed4421e0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Jul 2024 11:51:00 +0300 Subject: [PATCH 29/45] Bump postcss from 8.4.38 to 8.4.39 (internal-1569) Bumps [postcss](https://github.com/postcss/postcss) from 8.4.38 to 8.4.39. - [Release notes](https://github.com/postcss/postcss/releases) - [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md) - [Commits](https://github.com/postcss/postcss/compare/8.4.38...8.4.39) --- updated-dependencies: - dependency-name: postcss 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 | 10 +++++----- package.json | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index ba79acff16b..e6226fc699b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -95,7 +95,7 @@ "npm-run-all": "^4.1.5", "pixelmatch": "^6.0.0", "playwright": "^1.45.0", - "postcss": "^8.4.38", + "postcss": "^8.4.39", "postcss-cli": "^11.0.0", "postcss-inline-svg": "^6.0.0", "pretty-bytes": "^6.0.0", @@ -9903,9 +9903,9 @@ } }, "node_modules/postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "version": "8.4.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", + "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", "dev": true, "funding": [ { @@ -9923,7 +9923,7 @@ ], "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.0", + "picocolors": "^1.0.1", "source-map-js": "^1.2.0" }, "engines": { diff --git a/package.json b/package.json index 9fc05bfbcd3..25785371aa9 100644 --- a/package.json +++ b/package.json @@ -98,7 +98,7 @@ "npm-run-all": "^4.1.5", "pixelmatch": "^6.0.0", "playwright": "^1.45.0", - "postcss": "^8.4.38", + "postcss": "^8.4.39", "postcss-cli": "^11.0.0", "postcss-inline-svg": "^6.0.0", "pretty-bytes": "^6.0.0", From b5fe1d9eb85e75815c2745b3bbfcb42a2379e919 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Jul 2024 11:55:24 +0300 Subject: [PATCH 30/45] Bump esbuild from 0.21.5 to 0.22.0 (internal-1567) Bumps [esbuild](https://github.com/evanw/esbuild) from 0.21.5 to 0.22.0. - [Release notes](https://github.com/evanw/esbuild/releases) - [Changelog](https://github.com/evanw/esbuild/blob/main/CHANGELOG.md) - [Commits](https://github.com/evanw/esbuild/compare/v0.21.5...v0.22.0) --- updated-dependencies: - dependency-name: esbuild dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 663 +++++++++++++++++++++++++++++++++++++--------- package.json | 2 +- 2 files changed, 544 insertions(+), 121 deletions(-) diff --git a/package-lock.json b/package-lock.json index e6226fc699b..97ac3f51dca 100644 --- a/package-lock.json +++ b/package-lock.json @@ -74,7 +74,7 @@ "dts-bundle-generator": "^9.5.1", "ejs": "^3.1.10", "envify": "^4.1.0", - "esbuild": "^0.21.5", + "esbuild": "^0.22.0", "eslint": "^8.57.0", "eslint-config-mourner": "^3.0.0", "eslint-import-resolver-typescript": "^3.6.1", @@ -341,9 +341,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.22.0.tgz", + "integrity": "sha512-uvQR2crZ/zgzSHDvdygHyNI+ze9zwS8mqz0YtGXotSqvEE0UkYE9s+FZKQNTt1VtT719mfP3vHrUdCpxBNQZhQ==", "cpu": [ "ppc64" ], @@ -353,13 +353,13 @@ "aix" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.22.0.tgz", + "integrity": "sha512-PBnyP+r8vJE4ifxsWys9l+Mc2UY/yYZOpX82eoyGISXXb3dRr0M21v+s4fgRKWMFPMSf/iyowqPW/u7ScSUkjQ==", "cpu": [ "arm" ], @@ -369,13 +369,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.22.0.tgz", + "integrity": "sha512-UKhPb3o2gAB/bfXcl58ZXTn1q2oVu1rEu/bKrCtmm+Nj5MKUbrOwR5WAixE2v+lk0amWuwPvhnPpBRLIGiq7ig==", "cpu": [ "arm64" ], @@ -385,13 +385,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.22.0.tgz", + "integrity": "sha512-IjTYtvIrjhR41Ijy2dDPgYjQHWG/x/A4KXYbs1fiU3efpRdoxMChK3oEZV6GPzVEzJqxFgcuBaiX1kwEvWUxSw==", "cpu": [ "x64" ], @@ -401,13 +401,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.22.0.tgz", + "integrity": "sha512-mqt+Go4y9wRvEz81bhKd9RpHsQR1LwU8Xm6jZRUV/xpM7cIQFbFH6wBCLPTNsdELBvfoHeumud7X78jQQJv2TA==", "cpu": [ "arm64" ], @@ -417,13 +417,13 @@ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.22.0.tgz", + "integrity": "sha512-vTaTQ9OgYc3VTaWtOE5pSuDT6H3d/qSRFRfSBbnxFfzAvYoB3pqKXA0LEbi/oT8GUOEAutspfRMqPj2ezdFaMw==", "cpu": [ "x64" ], @@ -433,13 +433,13 @@ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.22.0.tgz", + "integrity": "sha512-0e1ZgoobJzaGnR4reD7I9rYZ7ttqdh1KPvJWnquUoDJhL0rYwdneeLailBzd2/4g/U5p4e5TIHEWa68NF2hFpQ==", "cpu": [ "arm64" ], @@ -449,13 +449,13 @@ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.22.0.tgz", + "integrity": "sha512-BFgyYwlCwRWyPQJtkzqq2p6pJbiiWgp0P9PNf7a5FQ1itKY4czPuOMAlFVItirSmEpRPCeImuwePNScZS0pL5Q==", "cpu": [ "x64" ], @@ -465,13 +465,13 @@ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.22.0.tgz", + "integrity": "sha512-KEMWiA9aGuPUD4BH5yjlhElLgaRXe+Eri6gKBoDazoPBTo1BXc/e6IW5FcJO9DoL19FBeCxgONyh95hLDNepIg==", "cpu": [ "arm" ], @@ -481,13 +481,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.22.0.tgz", + "integrity": "sha512-V/K2rctCUgC0PCXpN7AqT4hoazXKgIYugFGu/myk2+pfe6jTW2guz/TBwq4cZ7ESqusR/IzkcQaBkcjquuBWsw==", "cpu": [ "arm64" ], @@ -497,13 +497,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.22.0.tgz", + "integrity": "sha512-r2ZZqkOMOrpUhzNwxI7uLAHIDwkfeqmTnrv1cjpL/rjllPWszgqmprd/om9oviKXUBpMqHbXmppvjAYgISb26Q==", "cpu": [ "ia32" ], @@ -513,13 +513,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.22.0.tgz", + "integrity": "sha512-qaowLrV/YOMAL2RfKQ4C/VaDzAuLDuylM2sd/LH+4OFirMl6CuDpRlCq4u49ZBaVV8pkI/Y+hTdiibvQRhojCA==", "cpu": [ "loong64" ], @@ -529,13 +529,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.22.0.tgz", + "integrity": "sha512-hgrezzjQTRxjkQ5k08J6rtZN5PNnkWx/Rz6Kmj9gnsdCAX1I4Dn4ZPqvFRkXo55Q3pnVQJBwbdtrTO7tMGtyVA==", "cpu": [ "mips64el" ], @@ -545,13 +545,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.22.0.tgz", + "integrity": "sha512-ewxg6FLLUio883XgSjfULEmDl3VPv/TYNnRprVAS3QeGFLdCYdx1tIudBcd7n9jIdk82v1Ajov4jx87qW7h9+g==", "cpu": [ "ppc64" ], @@ -561,13 +561,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.22.0.tgz", + "integrity": "sha512-Az5XbgSJC2lE8XK8pdcutsf9RgdafWdTpUK/+6uaDdfkviw/B4JCwAfh1qVeRWwOohwdsl4ywZrWBNWxwrPLFg==", "cpu": [ "riscv64" ], @@ -577,13 +577,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.22.0.tgz", + "integrity": "sha512-8j4a2ChT9+V34NNNY9c/gMldutaJFmfMacTPq4KfNKwv2fitBCLYjee7c+Vxaha2nUhPK7cXcZpJtJ3+Y7ZdVQ==", "cpu": [ "s390x" ], @@ -593,13 +593,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.22.0.tgz", + "integrity": "sha512-JUQyOnpbAkkRFOk/AhsEemz5TfWN4FJZxVObUlnlNCbe7QBl61ZNfM4cwBXayQA6laMJMUcqLHaYQHAB6YQ95Q==", "cpu": [ "x64" ], @@ -609,13 +609,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.22.0.tgz", + "integrity": "sha512-11PoCoHXo4HFNbLsXuMB6bpMPWGDiw7xETji6COdJss4SQZLvcgNoeSqWtATRm10Jj1uEHiaIk4N0PiN6x4Fcg==", "cpu": [ "x64" ], @@ -625,13 +625,29 @@ "netbsd" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.22.0.tgz", + "integrity": "sha512-Ezlhu/YyITmXwKSB+Zu/QqD7cxrjrpiw85cc0Rbd3AWr2wsgp+dWbWOE8MqHaLW9NKMZvuL0DhbJbvzR7F6Zvg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.22.0.tgz", + "integrity": "sha512-ufjdW5tFJGUjlH9j/5cCE9lrwRffyZh+T4vYvoDKoYsC6IXbwaFeV/ENxeNXcxotF0P8CDzoICXVSbJaGBhkrw==", "cpu": [ "x64" ], @@ -641,13 +657,13 @@ "openbsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.22.0.tgz", + "integrity": "sha512-zY6ly/AoSmKnmNTowDJsK5ehra153/5ZhqxNLfq9NRsTTltetr+yHHcQ4RW7QDqw4JC8A1uC1YmeSfK9NRcK1w==", "cpu": [ "x64" ], @@ -657,13 +673,13 @@ "sunos" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.22.0.tgz", + "integrity": "sha512-Kml5F7tv/1Maam0pbbCrvkk9vj046dPej30kFzlhXnhuCtYYBP6FGy/cLbc5yUT1lkZznGLf2OvuvmLjscO5rw==", "cpu": [ "arm64" ], @@ -673,13 +689,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.22.0.tgz", + "integrity": "sha512-IOgwn+mYTM3RrcydP4Og5IpXh+ftN8oF+HELTXSmbWBlujuci4Qa3DTeO+LEErceisI7KUSfEIiX+WOUlpELkw==", "cpu": [ "ia32" ], @@ -689,13 +705,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.22.0.tgz", + "integrity": "sha512-4bDHJrk2WHBXJPhy1y80X7/5b5iZTZP3LGcKIlAP1J+KqZ4zQAPMLEzftGyjjfcKbA4JDlPt/+2R/F1ZTeRgrw==", "cpu": [ "x64" ], @@ -705,7 +721,7 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@eslint-community/eslint-utils": { @@ -5428,41 +5444,42 @@ } }, "node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.22.0.tgz", + "integrity": "sha512-zNYA6bFZsVnsU481FnGAQjLDW0Pl/8BGG7EvAp15RzUvGC+ME7hf1q7LvIfStEQBz/iEHuBJCYcOwPmNCf1Tlw==", "dev": true, "hasInstallScript": true, "bin": { "esbuild": "bin/esbuild" }, "engines": { - "node": ">=12" + "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" + "@esbuild/aix-ppc64": "0.22.0", + "@esbuild/android-arm": "0.22.0", + "@esbuild/android-arm64": "0.22.0", + "@esbuild/android-x64": "0.22.0", + "@esbuild/darwin-arm64": "0.22.0", + "@esbuild/darwin-x64": "0.22.0", + "@esbuild/freebsd-arm64": "0.22.0", + "@esbuild/freebsd-x64": "0.22.0", + "@esbuild/linux-arm": "0.22.0", + "@esbuild/linux-arm64": "0.22.0", + "@esbuild/linux-ia32": "0.22.0", + "@esbuild/linux-loong64": "0.22.0", + "@esbuild/linux-mips64el": "0.22.0", + "@esbuild/linux-ppc64": "0.22.0", + "@esbuild/linux-riscv64": "0.22.0", + "@esbuild/linux-s390x": "0.22.0", + "@esbuild/linux-x64": "0.22.0", + "@esbuild/netbsd-x64": "0.22.0", + "@esbuild/openbsd-arm64": "0.22.0", + "@esbuild/openbsd-x64": "0.22.0", + "@esbuild/sunos-x64": "0.22.0", + "@esbuild/win32-arm64": "0.22.0", + "@esbuild/win32-ia32": "0.22.0", + "@esbuild/win32-x64": "0.22.0" } }, "node_modules/escalade": { @@ -12942,6 +12959,412 @@ "fsevents": "~2.3.3" } }, + "node_modules/tsx/node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, "node_modules/tty-browserify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", diff --git a/package.json b/package.json index 25785371aa9..5de7a19828d 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "dts-bundle-generator": "^9.5.1", "ejs": "^3.1.10", "envify": "^4.1.0", - "esbuild": "^0.21.5", + "esbuild": "^0.22.0", "eslint": "^8.57.0", "eslint-config-mourner": "^3.0.0", "eslint-import-resolver-typescript": "^3.6.1", From 165e46193aa50a83ea7d60aa8589fe6999acd7ae Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Jul 2024 11:58:51 +0300 Subject: [PATCH 31/45] Bump @types/node from 20.14.8 to 20.14.9 (internal-1566) Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 20.14.8 to 20.14.9. - [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-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 97ac3f51dca..941f0499198 100644 --- a/package-lock.json +++ b/package-lock.json @@ -56,7 +56,7 @@ "@types/jest": "^29.5.12", "@types/mapbox__point-geometry": "^0.1.4", "@types/mapbox__vector-tile": "^1.3.4", - "@types/node": "^20.14.8", + "@types/node": "^20.14.9", "@types/offscreencanvas": "^2019.7.3", "@types/pbf": "^3.0.5", "@typescript-eslint/eslint-plugin": "^7.14.1", @@ -2349,9 +2349,9 @@ } }, "node_modules/@types/node": { - "version": "20.14.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.8.tgz", - "integrity": "sha512-DO+2/jZinXfROG7j7WKFn/3C6nFwxy2lLpgLjEXJz+0XKphZlTLJ14mo8Vfg8X5BWN6XjyESXq+LcYdT7tR3bA==", + "version": "20.14.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.9.tgz", + "integrity": "sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==", "dev": true, "dependencies": { "undici-types": "~5.26.4" diff --git a/package.json b/package.json index 5de7a19828d..dcc9d6985ee 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,7 @@ "@types/jest": "^29.5.12", "@types/mapbox__point-geometry": "^0.1.4", "@types/mapbox__vector-tile": "^1.3.4", - "@types/node": "^20.14.8", + "@types/node": "^20.14.9", "@types/offscreencanvas": "^2019.7.3", "@types/pbf": "^3.0.5", "@typescript-eslint/eslint-plugin": "^7.14.1", From 0ed085a308c6ed8a1c36cf544e1f369560261eeb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Jul 2024 13:28:49 +0300 Subject: [PATCH 32/45] Bump @tweakpane/core from 2.0.3 to 2.0.4 (internal-1565) Bumps @tweakpane/core from 2.0.3 to 2.0.4. --- updated-dependencies: - dependency-name: "@tweakpane/core" 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 941f0499198..a23d6f8184b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -50,7 +50,7 @@ "@rollup/plugin-replace": "^5.0.7", "@rollup/plugin-strip": "^3.0.4", "@rollup/plugin-terser": "^0.4.4", - "@tweakpane/core": "^2.0.3", + "@tweakpane/core": "^2.0.4", "@types/geojson": "^7946.0.14", "@types/geojson-vt": "^3.2.5", "@types/jest": "^29.5.12", @@ -2224,9 +2224,9 @@ } }, "node_modules/@tweakpane/core": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@tweakpane/core/-/core-2.0.3.tgz", - "integrity": "sha512-qHci4XA1Wngpwy8IzsLh5JEdscz8aDti/9YhyOaq01si+cgNDaZfwzTtXdn1+xTxSnCM+pW4Zb2/4eqn+K1ATw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@tweakpane/core/-/core-2.0.4.tgz", + "integrity": "sha512-0P3xcmvjBr8AmqMOEDNYIbkiaPwvQPkj8VeJX+8ZYkpRgWWbNp1HLbld0MDI0WJHdom89osH3MmCDLnWEXKI2w==", "dev": true }, "node_modules/@types/cookie": { diff --git a/package.json b/package.json index dcc9d6985ee..c4a382fe666 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,7 @@ "@rollup/plugin-replace": "^5.0.7", "@rollup/plugin-strip": "^3.0.4", "@rollup/plugin-terser": "^0.4.4", - "@tweakpane/core": "^2.0.3", + "@tweakpane/core": "^2.0.4", "@types/geojson": "^7946.0.14", "@types/geojson-vt": "^3.2.5", "@types/jest": "^29.5.12", From 1a41a809aaac68b6e2ebc0f2200c4cc313b79342 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Jul 2024 15:15:12 +0300 Subject: [PATCH 33/45] Bump vite-plugin-arraybuffer from 0.0.7 to 0.0.8 (internal-1572) Bumps [vite-plugin-arraybuffer](https://github.com/tachibana-shin/vite-plugin-arraybuffer) from 0.0.7 to 0.0.8. - [Commits](https://github.com/tachibana-shin/vite-plugin-arraybuffer/compare/v0.0.7...v0.0.8) --- updated-dependencies: - dependency-name: vite-plugin-arraybuffer 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 a23d6f8184b..f80f4f2096a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -115,7 +115,7 @@ "typescript": "^5.5.3", "typescript-eslint": "^7.14.1", "utility-types": "^3.11.0", - "vite-plugin-arraybuffer": "^0.0.7", + "vite-plugin-arraybuffer": "^0.0.8", "vitest": "^1.6.0" } }, @@ -13883,9 +13883,9 @@ } }, "node_modules/vite-plugin-arraybuffer": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/vite-plugin-arraybuffer/-/vite-plugin-arraybuffer-0.0.7.tgz", - "integrity": "sha512-c4Egxj7NUGco2Ggw9KUBToOxuc7Ws7mWm0hz/QnaT5Ph8ycC7ypMBOD31NuhPSx+wdUvgIbS1XpMvJLSdHakPA==", + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/vite-plugin-arraybuffer/-/vite-plugin-arraybuffer-0.0.8.tgz", + "integrity": "sha512-F+InDQuxd93YDVRdXTjBr3lydgjyVHSpgRZS4izK/i85Anl5kmbvf2NwJ//XHAccHh1TScfX70MFJfBx/rf3cg==", "dev": true }, "node_modules/vite/node_modules/@esbuild/aix-ppc64": { diff --git a/package.json b/package.json index c4a382fe666..09f9e6f8cf6 100644 --- a/package.json +++ b/package.json @@ -118,7 +118,7 @@ "typescript": "^5.5.3", "typescript-eslint": "^7.14.1", "utility-types": "^3.11.0", - "vite-plugin-arraybuffer": "^0.0.7", + "vite-plugin-arraybuffer": "^0.0.8", "vitest": "^1.6.0" }, "scripts": { From de68154940447c2f138aaef906bf0422f67b52c1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Jul 2024 15:15:35 +0300 Subject: [PATCH 34/45] Bump tsx from 4.15.7 to 4.16.0 (internal-1571) Bumps [tsx](https://github.com/privatenumber/tsx) from 4.15.7 to 4.16.0. - [Release notes](https://github.com/privatenumber/tsx/releases) - [Changelog](https://github.com/privatenumber/tsx/blob/master/release.config.cjs) - [Commits](https://github.com/privatenumber/tsx/compare/v4.15.7...v4.16.0) --- updated-dependencies: - dependency-name: tsx dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Stepan Kuzmin --- package-lock.json | 10 +++++----- package.json | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index f80f4f2096a..e55d36c9b30 100644 --- a/package-lock.json +++ b/package-lock.json @@ -111,7 +111,7 @@ "tape": "^5.8.1", "tape-filter": "^1.0.4", "testem": "^3.14.0", - "tsx": "^4.15.7", + "tsx": "^4.16.0", "typescript": "^5.5.3", "typescript-eslint": "^7.14.1", "utility-types": "^3.11.0", @@ -12941,12 +12941,12 @@ "dev": true }, "node_modules/tsx": { - "version": "4.15.7", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.15.7.tgz", - "integrity": "sha512-u3H0iSFDZM3za+VxkZ1kywdCeHCn+8/qHQS1MNoO2sONDgD95HlWtt8aB23OzeTmFP9IU4/8bZUdg58Uu5J4cg==", + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.16.0.tgz", + "integrity": "sha512-MPgN+CuY+4iKxGoJNPv+1pyo5YWZAQ5XfsyobUG+zoKG7IkvCPLZDEyoIb8yLS2FcWci1nlxAqmvPlFWD5AFiQ==", "dev": true, "dependencies": { - "esbuild": "~0.21.4", + "esbuild": "~0.21.5", "get-tsconfig": "^4.7.5" }, "bin": { diff --git a/package.json b/package.json index 09f9e6f8cf6..ea67fec6c5c 100644 --- a/package.json +++ b/package.json @@ -114,7 +114,7 @@ "tape": "^5.8.1", "tape-filter": "^1.0.4", "testem": "^3.14.0", - "tsx": "^4.15.7", + "tsx": "^4.16.0", "typescript": "^5.5.3", "typescript-eslint": "^7.14.1", "utility-types": "^3.11.0", From d644ed465997a140184e9f31e6dbf80661498466 Mon Sep 17 00:00:00 2001 From: Jordi Torres Date: Tue, 2 Jul 2024 14:27:14 +0200 Subject: [PATCH 35/45] Precompute mesh and nodes aabb transformations for landmarks to avoid doing it per frame (internal-1575) --- 3d-style/data/bucket/tiled_3d_model_bucket.ts | 10 ++++++---- 3d-style/data/model.ts | 1 + 3d-style/render/draw_model.ts | 5 ++--- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/3d-style/data/bucket/tiled_3d_model_bucket.ts b/3d-style/data/bucket/tiled_3d_model_bucket.ts index 3db534b627a..859a313fb66 100644 --- a/3d-style/data/bucket/tiled_3d_model_bucket.ts +++ b/3d-style/data/bucket/tiled_3d_model_bucket.ts @@ -95,8 +95,9 @@ export class Tiled3dModelFeature { this.emissionHeightBasedParams = []; // Needs to calculate geometry this.feature = {type: 'Point', id: node.id, geometry: [], properties: {'height' : getNodeHeight(node)}}; + this.aabb = this._getLocalBounds(); } - getLocalBounds(): Aabb { + _getLocalBounds(): Aabb { if (!this.node.meshes) { return new Aabb([Infinity, Infinity, Infinity], [-Infinity, -Infinity, -Infinity]); } @@ -105,11 +106,12 @@ export class Tiled3dModelFeature { const aabb = new Aabb([Infinity, Infinity, Infinity], [-Infinity, -Infinity, -Infinity]); for (const mesh of this.node.meshes) { if (this.node.lightMeshIndex !== i) { - aabb.encapsulate(mesh.aabb); + mesh.transformedAabb = Aabb.applyTransform(mesh.aabb, this.node.matrix); + aabb.encapsulate(mesh.transformedAabb); } i++; } - this.aabb = Aabb.applyTransform(aabb, this.node.matrix); + this.aabb = aabb; } return this.aabb; } @@ -551,7 +553,7 @@ class Tiled3dModelBucket implements Bucket { const nodeInfo = nodesInfo[i]; assert(nodeInfo.node.meshes.length > 0); const mesh = nodeInfo.node.meshes[0]; - const meshAabb = Aabb.applyTransform(mesh.aabb, nodeInfo.node.matrix); + const meshAabb = mesh.transformedAabb; if (x < meshAabb.min[0] || y < meshAabb.min[1] || x > meshAabb.max[0] || y > meshAabb.max[1]) continue; if (nodeInfo.node.hidden === true) return {height: 0.0, maxHeight: nodeInfo.feature.properties["height"], hidden: false, verticalScale: nodeInfo.evaluatedScale[2]}; diff --git a/3d-style/data/model.ts b/3d-style/data/model.ts index 455298fddd9..dc8712ee8f5 100644 --- a/3d-style/data/model.ts +++ b/3d-style/data/model.ts @@ -75,6 +75,7 @@ export type Mesh = { pbrBuffer: VertexBuffer; material: Material; aabb: Aabb; + transformedAabb: Aabb; segments: SegmentVector; centroid: vec3; heightmap: Float32Array; diff --git a/3d-style/render/draw_model.ts b/3d-style/render/draw_model.ts index e6d3b72a5d6..fbcce715513 100644 --- a/3d-style/render/draw_model.ts +++ b/3d-style/render/draw_model.ts @@ -824,7 +824,7 @@ function drawBatchedModels(painter: Painter, source: SourceCache, layer: ModelSt } const nodeAabb = () => { - const localBounds = nodeInfo.getLocalBounds(); + const localBounds = nodeInfo.aabb; // @ts-expect-error - TS2322 - Type 'number[]' is not assignable to type 'vec3'. aabb.min = [...localBounds.min]; // @ts-expect-error - TS2322 - Type 'number[]' is not assignable to type 'vec3'. @@ -874,8 +874,7 @@ function drawBatchedModels(painter: Painter, source: SourceCache, layer: ModelSt let opacity = layerOpacity; if (!isShadowPass) { if (frontCutoffEnabled) { - - opacity *= calculateFrontCutoffOpacity(tileModelMatrix as any, tr, nodeInfo.getLocalBounds(), frontCutoffParams); + opacity *= calculateFrontCutoffOpacity(tileModelMatrix as any, tr, nodeInfo.aabb, frontCutoffParams); } opacity *= calculateFarCutoffOpacity(cutoffParams, depth); From e12624ed4d50fcb8946b5261f8e651377cf91922 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Jul 2024 15:30:54 +0300 Subject: [PATCH 36/45] Bump the eslint-dependencies group with 5 updates (internal-1564) * Bump the eslint-dependencies group with 5 updates Bumps the eslint-dependencies group with 5 updates: | Package | From | To | | --- | --- | --- | | [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) | `7.14.1` | `7.15.0` | | [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) | `7.14.1` | `7.15.0` | | [eslint-config-mourner](https://github.com/mourner/eslint-config-mourner) | `3.0.0` | `4.0.1` | | [eslint-plugin-jsdoc](https://github.com/gajus/eslint-plugin-jsdoc) | `48.4.0` | `48.5.0` | | [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) | `7.14.1` | `7.15.0` | Updates `@typescript-eslint/eslint-plugin` from 7.14.1 to 7.15.0 - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v7.15.0/packages/eslint-plugin) Updates `@typescript-eslint/parser` from 7.14.1 to 7.15.0 - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v7.15.0/packages/parser) Updates `eslint-config-mourner` from 3.0.0 to 4.0.1 - [Release notes](https://github.com/mourner/eslint-config-mourner/releases) - [Commits](https://github.com/mourner/eslint-config-mourner/compare/v3.0.0...v4.0.1) Updates `eslint-plugin-jsdoc` from 48.4.0 to 48.5.0 - [Release notes](https://github.com/gajus/eslint-plugin-jsdoc/releases) - [Changelog](https://github.com/gajus/eslint-plugin-jsdoc/blob/main/.releaserc) - [Commits](https://github.com/gajus/eslint-plugin-jsdoc/compare/v48.4.0...v48.5.0) Updates `typescript-eslint` from 7.14.1 to 7.15.0 - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v7.15.0/packages/typescript-eslint) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-minor dependency-group: eslint-dependencies - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-minor dependency-group: eslint-dependencies - dependency-name: eslint-config-mourner dependency-type: direct:development update-type: version-update:semver-major dependency-group: eslint-dependencies - dependency-name: eslint-plugin-jsdoc dependency-type: direct:development update-type: version-update:semver-minor dependency-group: eslint-dependencies - dependency-name: typescript-eslint dependency-type: direct:development update-type: version-update:semver-minor dependency-group: eslint-dependencies ... Signed-off-by: dependabot[bot] * Downgrade eslint-config-mourner * fixup * fixup --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Stepan Kuzmin --- package-lock.json | 131 ++++++++++++++++++++++++++-------------------- package.json | 8 +-- 2 files changed, 77 insertions(+), 62 deletions(-) diff --git a/package-lock.json b/package-lock.json index e55d36c9b30..138c244aaf3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -59,8 +59,8 @@ "@types/node": "^20.14.9", "@types/offscreencanvas": "^2019.7.3", "@types/pbf": "^3.0.5", - "@typescript-eslint/eslint-plugin": "^7.14.1", - "@typescript-eslint/parser": "^7.14.1", + "@typescript-eslint/eslint-plugin": "^7.15.0", + "@typescript-eslint/parser": "^7.15.0", "@vitest/browser": "^1.6.0", "@vitest/ui": "^1.6.0", "address": "^2.0.3", @@ -80,7 +80,7 @@ "eslint-import-resolver-typescript": "^3.6.1", "eslint-plugin-html": "^8.1.1", "eslint-plugin-import": "^2.29.1", - "eslint-plugin-jsdoc": "^48.4.0", + "eslint-plugin-jsdoc": "^48.5.0", "glob": "^10.4.2", "is-builtin-module": "^4.0.0", "jest-extended": "^4.0.2", @@ -113,7 +113,7 @@ "testem": "^3.14.0", "tsx": "^4.16.0", "typescript": "^5.5.3", - "typescript-eslint": "^7.14.1", + "typescript-eslint": "^7.15.0", "utility-types": "^3.11.0", "vite-plugin-arraybuffer": "^0.0.8", "vitest": "^1.6.0" @@ -2409,16 +2409,17 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.14.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.14.1.tgz", - "integrity": "sha512-aAJd6bIf2vvQRjUG3ZkNXkmBpN+J7Wd0mfQiiVCJMu9Z5GcZZdcc0j8XwN/BM97Fl7e3SkTXODSk4VehUv7CGw==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.15.0.tgz", + "integrity": "sha512-uiNHpyjZtFrLwLDpHnzaDlP3Tt6sGMqTCiqmxaN4n4RP0EfYZDODJyddiFDF44Hjwxr5xAcaYxVKm9QKQFJFLA==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.14.1", - "@typescript-eslint/type-utils": "7.14.1", - "@typescript-eslint/utils": "7.14.1", - "@typescript-eslint/visitor-keys": "7.14.1", + "@typescript-eslint/scope-manager": "7.15.0", + "@typescript-eslint/type-utils": "7.15.0", + "@typescript-eslint/utils": "7.15.0", + "@typescript-eslint/visitor-keys": "7.15.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -2442,15 +2443,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "7.14.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.14.1.tgz", - "integrity": "sha512-8lKUOebNLcR0D7RvlcloOacTOWzOqemWEWkKSVpMZVF/XVcwjPR+3MD08QzbW9TCGJ+DwIc6zUSGZ9vd8cO1IA==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.15.0.tgz", + "integrity": "sha512-k9fYuQNnypLFcqORNClRykkGOMOj+pV6V91R4GO/l1FDGwpqmSwoOQrOHo3cGaH63e+D3ZiCAOsuS/D2c99j/A==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/scope-manager": "7.14.1", - "@typescript-eslint/types": "7.14.1", - "@typescript-eslint/typescript-estree": "7.14.1", - "@typescript-eslint/visitor-keys": "7.14.1", + "@typescript-eslint/scope-manager": "7.15.0", + "@typescript-eslint/types": "7.15.0", + "@typescript-eslint/typescript-estree": "7.15.0", + "@typescript-eslint/visitor-keys": "7.15.0", "debug": "^4.3.4" }, "engines": { @@ -2470,13 +2472,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "7.14.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.14.1.tgz", - "integrity": "sha512-gPrFSsoYcsffYXTOZ+hT7fyJr95rdVe4kGVX1ps/dJ+DfmlnjFN/GcMxXcVkeHDKqsq6uAcVaQaIi3cFffmAbA==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.15.0.tgz", + "integrity": "sha512-Q/1yrF/XbxOTvttNVPihxh1b9fxamjEoz2Os/Pe38OHwxC24CyCqXxGTOdpb4lt6HYtqw9HetA/Rf6gDGaMPlw==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.14.1", - "@typescript-eslint/visitor-keys": "7.14.1" + "@typescript-eslint/types": "7.15.0", + "@typescript-eslint/visitor-keys": "7.15.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -2487,13 +2490,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.14.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.14.1.tgz", - "integrity": "sha512-/MzmgNd3nnbDbOi3LfasXWWe292+iuo+umJ0bCCMCPc1jLO/z2BQmWUUUXvXLbrQey/JgzdF/OV+I5bzEGwJkQ==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.15.0.tgz", + "integrity": "sha512-SkgriaeV6PDvpA6253PDVep0qCqgbO1IOBiycjnXsszNTVQe5flN5wR5jiczoEoDEnAqYFSFFc9al9BSGVltkg==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "7.14.1", - "@typescript-eslint/utils": "7.14.1", + "@typescript-eslint/typescript-estree": "7.15.0", + "@typescript-eslint/utils": "7.15.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -2514,10 +2518,11 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "7.14.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.14.1.tgz", - "integrity": "sha512-mL7zNEOQybo5R3AavY+Am7KLv8BorIv7HCYS5rKoNZKQD9tsfGUpO4KdAn3sSUvTiS4PQkr2+K0KJbxj8H9NDg==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.15.0.tgz", + "integrity": "sha512-aV1+B1+ySXbQH0pLK0rx66I3IkiZNidYobyfn0WFsdGhSXw+P3YOqeTq5GED458SfB24tg+ux3S+9g118hjlTw==", "dev": true, + "license": "MIT", "engines": { "node": "^18.18.0 || >=20.0.0" }, @@ -2527,13 +2532,14 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.14.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.14.1.tgz", - "integrity": "sha512-k5d0VuxViE2ulIO6FbxxSZaxqDVUyMbXcidC8rHvii0I56XZPv8cq+EhMns+d/EVIL41sMXqRbK3D10Oza1bbA==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.15.0.tgz", + "integrity": "sha512-gjyB/rHAopL/XxfmYThQbXbzRMGhZzGw6KpcMbfe8Q3nNQKStpxnUKeXb0KiN/fFDR42Z43szs6rY7eHk0zdGQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "7.14.1", - "@typescript-eslint/visitor-keys": "7.14.1", + "@typescript-eslint/types": "7.15.0", + "@typescript-eslint/visitor-keys": "7.15.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -2559,6 +2565,7 @@ "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" } @@ -2568,6 +2575,7 @@ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, + "license": "MIT", "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -2584,10 +2592,11 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "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" }, @@ -2603,6 +2612,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -2615,20 +2625,22 @@ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@typescript-eslint/utils": { - "version": "7.14.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.14.1.tgz", - "integrity": "sha512-CMmVVELns3nak3cpJhZosDkm63n+DwBlDX8g0k4QUa9BMnF+lH2lr3d130M1Zt1xxmB3LLk3NV7KQCq86ZBBhQ==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.15.0.tgz", + "integrity": "sha512-hfDMDqaqOqsUVGiEPSMLR/AjTSCsmJwjpKkYQRo1FNbmW4tBwBspYDwO9eh7sKSTwMQgBw9/T4DHudPaqshRWA==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.14.1", - "@typescript-eslint/types": "7.14.1", - "@typescript-eslint/typescript-estree": "7.14.1" + "@typescript-eslint/scope-manager": "7.15.0", + "@typescript-eslint/types": "7.15.0", + "@typescript-eslint/typescript-estree": "7.15.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -2642,12 +2654,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.14.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.14.1.tgz", - "integrity": "sha512-Crb+F75U1JAEtBeQGxSKwI60hZmmzaqA3z9sYsVm8X7W5cwLEm5bRe0/uXS6+MR/y8CVpKSR/ontIAIEPFcEkA==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.15.0.tgz", + "integrity": "sha512-Hqgy/ETgpt2L5xueA/zHHIl4fJI2O4XUE9l4+OIfbJIRSnTJb/QscncdqqZzofQegIJugRIF57OJea1khw2SDw==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.14.1", + "@typescript-eslint/types": "7.15.0", "eslint-visitor-keys": "^3.4.3" }, "engines": { @@ -5706,10 +5719,11 @@ } }, "node_modules/eslint-plugin-jsdoc": { - "version": "48.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-48.4.0.tgz", - "integrity": "sha512-xBUxuAx03cKoEA7y+MYSUdwyN8AJyZHbAJ257sOFXgVgCScm574S4zEYJpBoARwaCu4chhCbvA+gdm+00whlxA==", + "version": "48.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-48.5.0.tgz", + "integrity": "sha512-ukXPNpGby3KjCveCizIS8t1EbuJEHYEu/tBg8GCbn/YbHcXwphyvYCdvRZ/oMRfTscGSSzfsWoZ+ZkAP0/6YMQ==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@es-joy/jsdoccomment": "~0.43.1", "are-docs-informative": "^0.0.2", @@ -13518,14 +13532,15 @@ } }, "node_modules/typescript-eslint": { - "version": "7.14.1", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-7.14.1.tgz", - "integrity": "sha512-Eo1X+Y0JgGPspcANKjeR6nIqXl4VL5ldXLc15k4m9upq+eY5fhU2IueiEZL6jmHrKH8aCfbIvM/v3IrX5Hg99w==", + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-7.15.0.tgz", + "integrity": "sha512-Ta40FhMXBCwHura4X4fncaCVkVcnJ9jnOq5+Lp4lN8F4DzHZtOwZdRvVBiNUGznUDHPwdGnrnwxmUOU2fFQqFA==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "7.14.1", - "@typescript-eslint/parser": "7.14.1", - "@typescript-eslint/utils": "7.14.1" + "@typescript-eslint/eslint-plugin": "7.15.0", + "@typescript-eslint/parser": "7.15.0", + "@typescript-eslint/utils": "7.15.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" diff --git a/package.json b/package.json index ea67fec6c5c..faeefcfbb33 100644 --- a/package.json +++ b/package.json @@ -62,8 +62,8 @@ "@types/node": "^20.14.9", "@types/offscreencanvas": "^2019.7.3", "@types/pbf": "^3.0.5", - "@typescript-eslint/eslint-plugin": "^7.14.1", - "@typescript-eslint/parser": "^7.14.1", + "@typescript-eslint/eslint-plugin": "^7.15.0", + "@typescript-eslint/parser": "^7.15.0", "@vitest/browser": "^1.6.0", "@vitest/ui": "^1.6.0", "address": "^2.0.3", @@ -83,7 +83,7 @@ "eslint-import-resolver-typescript": "^3.6.1", "eslint-plugin-html": "^8.1.1", "eslint-plugin-import": "^2.29.1", - "eslint-plugin-jsdoc": "^48.4.0", + "eslint-plugin-jsdoc": "^48.5.0", "glob": "^10.4.2", "is-builtin-module": "^4.0.0", "jest-extended": "^4.0.2", @@ -116,7 +116,7 @@ "testem": "^3.14.0", "tsx": "^4.16.0", "typescript": "^5.5.3", - "typescript-eslint": "^7.14.1", + "typescript-eslint": "^7.15.0", "utility-types": "^3.11.0", "vite-plugin-arraybuffer": "^0.0.8", "vitest": "^1.6.0" From 5ed64633be7115c82062aad70f1a6d77e82b5aa8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Jul 2024 16:52:31 +0300 Subject: [PATCH 37/45] Bump esbuild from 0.22.0 to 0.23.0 (internal-1576) Bumps [esbuild](https://github.com/evanw/esbuild) from 0.22.0 to 0.23.0. - [Release notes](https://github.com/evanw/esbuild/releases) - [Changelog](https://github.com/evanw/esbuild/blob/main/CHANGELOG.md) - [Commits](https://github.com/evanw/esbuild/compare/v0.22.0...v0.23.0) --- updated-dependencies: - dependency-name: esbuild dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 200 +++++++++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 101 insertions(+), 101 deletions(-) diff --git a/package-lock.json b/package-lock.json index 138c244aaf3..76d6c10b18f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -74,7 +74,7 @@ "dts-bundle-generator": "^9.5.1", "ejs": "^3.1.10", "envify": "^4.1.0", - "esbuild": "^0.22.0", + "esbuild": "^0.23.0", "eslint": "^8.57.0", "eslint-config-mourner": "^3.0.0", "eslint-import-resolver-typescript": "^3.6.1", @@ -341,9 +341,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.22.0.tgz", - "integrity": "sha512-uvQR2crZ/zgzSHDvdygHyNI+ze9zwS8mqz0YtGXotSqvEE0UkYE9s+FZKQNTt1VtT719mfP3vHrUdCpxBNQZhQ==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.0.tgz", + "integrity": "sha512-3sG8Zwa5fMcA9bgqB8AfWPQ+HFke6uD3h1s3RIwUNK8EG7a4buxvuFTs3j1IMs2NXAk9F30C/FF4vxRgQCcmoQ==", "cpu": [ "ppc64" ], @@ -357,9 +357,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.22.0.tgz", - "integrity": "sha512-PBnyP+r8vJE4ifxsWys9l+Mc2UY/yYZOpX82eoyGISXXb3dRr0M21v+s4fgRKWMFPMSf/iyowqPW/u7ScSUkjQ==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.0.tgz", + "integrity": "sha512-+KuOHTKKyIKgEEqKbGTK8W7mPp+hKinbMBeEnNzjJGyFcWsfrXjSTNluJHCY1RqhxFurdD8uNXQDei7qDlR6+g==", "cpu": [ "arm" ], @@ -373,9 +373,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.22.0.tgz", - "integrity": "sha512-UKhPb3o2gAB/bfXcl58ZXTn1q2oVu1rEu/bKrCtmm+Nj5MKUbrOwR5WAixE2v+lk0amWuwPvhnPpBRLIGiq7ig==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.0.tgz", + "integrity": "sha512-EuHFUYkAVfU4qBdyivULuu03FhJO4IJN9PGuABGrFy4vUuzk91P2d+npxHcFdpUnfYKy0PuV+n6bKIpHOB3prQ==", "cpu": [ "arm64" ], @@ -389,9 +389,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.22.0.tgz", - "integrity": "sha512-IjTYtvIrjhR41Ijy2dDPgYjQHWG/x/A4KXYbs1fiU3efpRdoxMChK3oEZV6GPzVEzJqxFgcuBaiX1kwEvWUxSw==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.0.tgz", + "integrity": "sha512-WRrmKidLoKDl56LsbBMhzTTBxrsVwTKdNbKDalbEZr0tcsBgCLbEtoNthOW6PX942YiYq8HzEnb4yWQMLQuipQ==", "cpu": [ "x64" ], @@ -405,9 +405,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.22.0.tgz", - "integrity": "sha512-mqt+Go4y9wRvEz81bhKd9RpHsQR1LwU8Xm6jZRUV/xpM7cIQFbFH6wBCLPTNsdELBvfoHeumud7X78jQQJv2TA==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.0.tgz", + "integrity": "sha512-YLntie/IdS31H54Ogdn+v50NuoWF5BDkEUFpiOChVa9UnKpftgwzZRrI4J132ETIi+D8n6xh9IviFV3eXdxfow==", "cpu": [ "arm64" ], @@ -421,9 +421,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.22.0.tgz", - "integrity": "sha512-vTaTQ9OgYc3VTaWtOE5pSuDT6H3d/qSRFRfSBbnxFfzAvYoB3pqKXA0LEbi/oT8GUOEAutspfRMqPj2ezdFaMw==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.0.tgz", + "integrity": "sha512-IMQ6eme4AfznElesHUPDZ+teuGwoRmVuuixu7sv92ZkdQcPbsNHzutd+rAfaBKo8YK3IrBEi9SLLKWJdEvJniQ==", "cpu": [ "x64" ], @@ -437,9 +437,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.22.0.tgz", - "integrity": "sha512-0e1ZgoobJzaGnR4reD7I9rYZ7ttqdh1KPvJWnquUoDJhL0rYwdneeLailBzd2/4g/U5p4e5TIHEWa68NF2hFpQ==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.0.tgz", + "integrity": "sha512-0muYWCng5vqaxobq6LB3YNtevDFSAZGlgtLoAc81PjUfiFz36n4KMpwhtAd4he8ToSI3TGyuhyx5xmiWNYZFyw==", "cpu": [ "arm64" ], @@ -453,9 +453,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.22.0.tgz", - "integrity": "sha512-BFgyYwlCwRWyPQJtkzqq2p6pJbiiWgp0P9PNf7a5FQ1itKY4czPuOMAlFVItirSmEpRPCeImuwePNScZS0pL5Q==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.0.tgz", + "integrity": "sha512-XKDVu8IsD0/q3foBzsXGt/KjD/yTKBCIwOHE1XwiXmrRwrX6Hbnd5Eqn/WvDekddK21tfszBSrE/WMaZh+1buQ==", "cpu": [ "x64" ], @@ -469,9 +469,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.22.0.tgz", - "integrity": "sha512-KEMWiA9aGuPUD4BH5yjlhElLgaRXe+Eri6gKBoDazoPBTo1BXc/e6IW5FcJO9DoL19FBeCxgONyh95hLDNepIg==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.0.tgz", + "integrity": "sha512-SEELSTEtOFu5LPykzA395Mc+54RMg1EUgXP+iw2SJ72+ooMwVsgfuwXo5Fn0wXNgWZsTVHwY2cg4Vi/bOD88qw==", "cpu": [ "arm" ], @@ -485,9 +485,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.22.0.tgz", - "integrity": "sha512-V/K2rctCUgC0PCXpN7AqT4hoazXKgIYugFGu/myk2+pfe6jTW2guz/TBwq4cZ7ESqusR/IzkcQaBkcjquuBWsw==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.0.tgz", + "integrity": "sha512-j1t5iG8jE7BhonbsEg5d9qOYcVZv/Rv6tghaXM/Ug9xahM0nX/H2gfu6X6z11QRTMT6+aywOMA8TDkhPo8aCGw==", "cpu": [ "arm64" ], @@ -501,9 +501,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.22.0.tgz", - "integrity": "sha512-r2ZZqkOMOrpUhzNwxI7uLAHIDwkfeqmTnrv1cjpL/rjllPWszgqmprd/om9oviKXUBpMqHbXmppvjAYgISb26Q==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.0.tgz", + "integrity": "sha512-P7O5Tkh2NbgIm2R6x1zGJJsnacDzTFcRWZyTTMgFdVit6E98LTxO+v8LCCLWRvPrjdzXHx9FEOA8oAZPyApWUA==", "cpu": [ "ia32" ], @@ -517,9 +517,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.22.0.tgz", - "integrity": "sha512-qaowLrV/YOMAL2RfKQ4C/VaDzAuLDuylM2sd/LH+4OFirMl6CuDpRlCq4u49ZBaVV8pkI/Y+hTdiibvQRhojCA==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.0.tgz", + "integrity": "sha512-InQwepswq6urikQiIC/kkx412fqUZudBO4SYKu0N+tGhXRWUqAx+Q+341tFV6QdBifpjYgUndV1hhMq3WeJi7A==", "cpu": [ "loong64" ], @@ -533,9 +533,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.22.0.tgz", - "integrity": "sha512-hgrezzjQTRxjkQ5k08J6rtZN5PNnkWx/Rz6Kmj9gnsdCAX1I4Dn4ZPqvFRkXo55Q3pnVQJBwbdtrTO7tMGtyVA==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.0.tgz", + "integrity": "sha512-J9rflLtqdYrxHv2FqXE2i1ELgNjT+JFURt/uDMoPQLcjWQA5wDKgQA4t/dTqGa88ZVECKaD0TctwsUfHbVoi4w==", "cpu": [ "mips64el" ], @@ -549,9 +549,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.22.0.tgz", - "integrity": "sha512-ewxg6FLLUio883XgSjfULEmDl3VPv/TYNnRprVAS3QeGFLdCYdx1tIudBcd7n9jIdk82v1Ajov4jx87qW7h9+g==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.0.tgz", + "integrity": "sha512-cShCXtEOVc5GxU0fM+dsFD10qZ5UpcQ8AM22bYj0u/yaAykWnqXJDpd77ublcX6vdDsWLuweeuSNZk4yUxZwtw==", "cpu": [ "ppc64" ], @@ -565,9 +565,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.22.0.tgz", - "integrity": "sha512-Az5XbgSJC2lE8XK8pdcutsf9RgdafWdTpUK/+6uaDdfkviw/B4JCwAfh1qVeRWwOohwdsl4ywZrWBNWxwrPLFg==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.0.tgz", + "integrity": "sha512-HEtaN7Y5UB4tZPeQmgz/UhzoEyYftbMXrBCUjINGjh3uil+rB/QzzpMshz3cNUxqXN7Vr93zzVtpIDL99t9aRw==", "cpu": [ "riscv64" ], @@ -581,9 +581,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.22.0.tgz", - "integrity": "sha512-8j4a2ChT9+V34NNNY9c/gMldutaJFmfMacTPq4KfNKwv2fitBCLYjee7c+Vxaha2nUhPK7cXcZpJtJ3+Y7ZdVQ==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.0.tgz", + "integrity": "sha512-WDi3+NVAuyjg/Wxi+o5KPqRbZY0QhI9TjrEEm+8dmpY9Xir8+HE/HNx2JoLckhKbFopW0RdO2D72w8trZOV+Wg==", "cpu": [ "s390x" ], @@ -597,9 +597,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.22.0.tgz", - "integrity": "sha512-JUQyOnpbAkkRFOk/AhsEemz5TfWN4FJZxVObUlnlNCbe7QBl61ZNfM4cwBXayQA6laMJMUcqLHaYQHAB6YQ95Q==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.0.tgz", + "integrity": "sha512-a3pMQhUEJkITgAw6e0bWA+F+vFtCciMjW/LPtoj99MhVt+Mfb6bbL9hu2wmTZgNd994qTAEw+U/r6k3qHWWaOQ==", "cpu": [ "x64" ], @@ -613,9 +613,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.22.0.tgz", - "integrity": "sha512-11PoCoHXo4HFNbLsXuMB6bpMPWGDiw7xETji6COdJss4SQZLvcgNoeSqWtATRm10Jj1uEHiaIk4N0PiN6x4Fcg==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.0.tgz", + "integrity": "sha512-cRK+YDem7lFTs2Q5nEv/HHc4LnrfBCbH5+JHu6wm2eP+d8OZNoSMYgPZJq78vqQ9g+9+nMuIsAO7skzphRXHyw==", "cpu": [ "x64" ], @@ -629,9 +629,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.22.0.tgz", - "integrity": "sha512-Ezlhu/YyITmXwKSB+Zu/QqD7cxrjrpiw85cc0Rbd3AWr2wsgp+dWbWOE8MqHaLW9NKMZvuL0DhbJbvzR7F6Zvg==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.0.tgz", + "integrity": "sha512-suXjq53gERueVWu0OKxzWqk7NxiUWSUlrxoZK7usiF50C6ipColGR5qie2496iKGYNLhDZkPxBI3erbnYkU0rQ==", "cpu": [ "arm64" ], @@ -645,9 +645,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.22.0.tgz", - "integrity": "sha512-ufjdW5tFJGUjlH9j/5cCE9lrwRffyZh+T4vYvoDKoYsC6IXbwaFeV/ENxeNXcxotF0P8CDzoICXVSbJaGBhkrw==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.0.tgz", + "integrity": "sha512-6p3nHpby0DM/v15IFKMjAaayFhqnXV52aEmv1whZHX56pdkK+MEaLoQWj+H42ssFarP1PcomVhbsR4pkz09qBg==", "cpu": [ "x64" ], @@ -661,9 +661,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.22.0.tgz", - "integrity": "sha512-zY6ly/AoSmKnmNTowDJsK5ehra153/5ZhqxNLfq9NRsTTltetr+yHHcQ4RW7QDqw4JC8A1uC1YmeSfK9NRcK1w==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.0.tgz", + "integrity": "sha512-BFelBGfrBwk6LVrmFzCq1u1dZbG4zy/Kp93w2+y83Q5UGYF1d8sCzeLI9NXjKyujjBBniQa8R8PzLFAUrSM9OA==", "cpu": [ "x64" ], @@ -677,9 +677,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.22.0.tgz", - "integrity": "sha512-Kml5F7tv/1Maam0pbbCrvkk9vj046dPej30kFzlhXnhuCtYYBP6FGy/cLbc5yUT1lkZznGLf2OvuvmLjscO5rw==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.0.tgz", + "integrity": "sha512-lY6AC8p4Cnb7xYHuIxQ6iYPe6MfO2CC43XXKo9nBXDb35krYt7KGhQnOkRGar5psxYkircpCqfbNDB4uJbS2jQ==", "cpu": [ "arm64" ], @@ -693,9 +693,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.22.0.tgz", - "integrity": "sha512-IOgwn+mYTM3RrcydP4Og5IpXh+ftN8oF+HELTXSmbWBlujuci4Qa3DTeO+LEErceisI7KUSfEIiX+WOUlpELkw==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.0.tgz", + "integrity": "sha512-7L1bHlOTcO4ByvI7OXVI5pNN6HSu6pUQq9yodga8izeuB1KcT2UkHaH6118QJwopExPn0rMHIseCTx1CRo/uNA==", "cpu": [ "ia32" ], @@ -709,9 +709,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.22.0.tgz", - "integrity": "sha512-4bDHJrk2WHBXJPhy1y80X7/5b5iZTZP3LGcKIlAP1J+KqZ4zQAPMLEzftGyjjfcKbA4JDlPt/+2R/F1ZTeRgrw==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.0.tgz", + "integrity": "sha512-Arm+WgUFLUATuoxCJcahGuk6Yj9Pzxd6l11Zb/2aAuv5kWWvvfhLFo2fni4uSK5vzlUdCGZ/BdV5tH8klj8p8g==", "cpu": [ "x64" ], @@ -5457,9 +5457,9 @@ } }, "node_modules/esbuild": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.22.0.tgz", - "integrity": "sha512-zNYA6bFZsVnsU481FnGAQjLDW0Pl/8BGG7EvAp15RzUvGC+ME7hf1q7LvIfStEQBz/iEHuBJCYcOwPmNCf1Tlw==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.0.tgz", + "integrity": "sha512-1lvV17H2bMYda/WaFb2jLPeHU3zml2k4/yagNMG8Q/YtfMjCwEUZa2eXXMgZTVSL5q1n4H7sQ0X6CdJDqqeCFA==", "dev": true, "hasInstallScript": true, "bin": { @@ -5469,30 +5469,30 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.22.0", - "@esbuild/android-arm": "0.22.0", - "@esbuild/android-arm64": "0.22.0", - "@esbuild/android-x64": "0.22.0", - "@esbuild/darwin-arm64": "0.22.0", - "@esbuild/darwin-x64": "0.22.0", - "@esbuild/freebsd-arm64": "0.22.0", - "@esbuild/freebsd-x64": "0.22.0", - "@esbuild/linux-arm": "0.22.0", - "@esbuild/linux-arm64": "0.22.0", - "@esbuild/linux-ia32": "0.22.0", - "@esbuild/linux-loong64": "0.22.0", - "@esbuild/linux-mips64el": "0.22.0", - "@esbuild/linux-ppc64": "0.22.0", - "@esbuild/linux-riscv64": "0.22.0", - "@esbuild/linux-s390x": "0.22.0", - "@esbuild/linux-x64": "0.22.0", - "@esbuild/netbsd-x64": "0.22.0", - "@esbuild/openbsd-arm64": "0.22.0", - "@esbuild/openbsd-x64": "0.22.0", - "@esbuild/sunos-x64": "0.22.0", - "@esbuild/win32-arm64": "0.22.0", - "@esbuild/win32-ia32": "0.22.0", - "@esbuild/win32-x64": "0.22.0" + "@esbuild/aix-ppc64": "0.23.0", + "@esbuild/android-arm": "0.23.0", + "@esbuild/android-arm64": "0.23.0", + "@esbuild/android-x64": "0.23.0", + "@esbuild/darwin-arm64": "0.23.0", + "@esbuild/darwin-x64": "0.23.0", + "@esbuild/freebsd-arm64": "0.23.0", + "@esbuild/freebsd-x64": "0.23.0", + "@esbuild/linux-arm": "0.23.0", + "@esbuild/linux-arm64": "0.23.0", + "@esbuild/linux-ia32": "0.23.0", + "@esbuild/linux-loong64": "0.23.0", + "@esbuild/linux-mips64el": "0.23.0", + "@esbuild/linux-ppc64": "0.23.0", + "@esbuild/linux-riscv64": "0.23.0", + "@esbuild/linux-s390x": "0.23.0", + "@esbuild/linux-x64": "0.23.0", + "@esbuild/netbsd-x64": "0.23.0", + "@esbuild/openbsd-arm64": "0.23.0", + "@esbuild/openbsd-x64": "0.23.0", + "@esbuild/sunos-x64": "0.23.0", + "@esbuild/win32-arm64": "0.23.0", + "@esbuild/win32-ia32": "0.23.0", + "@esbuild/win32-x64": "0.23.0" } }, "node_modules/escalade": { diff --git a/package.json b/package.json index faeefcfbb33..f15d7cd1d56 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "dts-bundle-generator": "^9.5.1", "ejs": "^3.1.10", "envify": "^4.1.0", - "esbuild": "^0.22.0", + "esbuild": "^0.23.0", "eslint": "^8.57.0", "eslint-config-mourner": "^3.0.0", "eslint-import-resolver-typescript": "^3.6.1", From c852f9543b03a937926e648806ac954fdadfbdce Mon Sep 17 00:00:00 2001 From: Stepan Kuzmin Date: Tue, 2 Jul 2024 17:13:56 +0300 Subject: [PATCH 38/45] Improve unit tests in CI (internal-1574) * Retry unit tests in CI * Add CI reporters * add `vite:preloadError` handler --- .circleci/config.yml | 8 +++++++- package.json | 1 - test/unit/setup.ts | 10 +++++++++- test/unit/style/style_imports.test.ts | 10 ++++++++++ vitest.config.base.ts | 9 ++++++--- 5 files changed, 32 insertions(+), 6 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 1108be06c2d..5d52de54e0a 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -357,8 +357,14 @@ jobs: - attach_workspace: at: ~/ - run: - command: npm run test-unit + name: Run unit tests + command: | + npm run test-unit no_output_timeout: 5m + - store_artifacts: + path: test/unit/vitest + - store_test_results: + path: test/unit/test-results.xml test-query: <<: *linux-defaults diff --git a/package.json b/package.json index f15d7cd1d56..61fc9088f1f 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,6 @@ "devDependencies": { "@mapbox/mvt-fixtures": "^3.10.0", "@octokit/rest": "^21.0.0", - "@rollup/plugin-alias": "^5.1.0", "@rollup/plugin-commonjs": "^26.0.1", "@rollup/plugin-json": "^6.1.0", "@rollup/plugin-node-resolve": "^15.2.3", diff --git a/test/unit/setup.ts b/test/unit/setup.ts index a3bca01cca9..59c2a3f7968 100644 --- a/test/unit/setup.ts +++ b/test/unit/setup.ts @@ -3,11 +3,19 @@ import {toHaveBeenCalledBefore, toHaveBeenCalledAfter} from 'jest-extended'; import {expect} from '../util/vitest'; + +// Load Error Handling +// https://vitejs.dev/guide/build#load-error-handling +window.addEventListener('vite:preloadError', (event) => { + console.log('vite:preloadError', event); + window.location.reload(); +}); + import mapboxgl from '../../src/index'; if (!globalThis.defined) { mapboxgl.workerParams = { - type: "module" + type: 'module' }; mapboxgl.workerUrl = '/src/source/worker.ts'; diff --git a/test/unit/style/style_imports.test.ts b/test/unit/style/style_imports.test.ts index 561e714d22e..5eb8d2e8fb9 100644 --- a/test/unit/style/style_imports.test.ts +++ b/test/unit/style/style_imports.test.ts @@ -1225,6 +1225,7 @@ describe('Style#moveLayer', () => { }); }); }); + describe('Style#_mergeLayers', () => { test('supports slots', async () => { const style = new Style(new StubMap()); @@ -1556,6 +1557,7 @@ describe('Style#_mergeLayers', () => { ]); }); }); + describe('Style#getLights', () => { test('root style resolves lights from import', async () => { const style = new Style(new StubMap()); @@ -1966,6 +1968,7 @@ describe('Terrain', () => { expect(style.getTerrain().exaggeration).toEqual(2); }); }); + describe('Style#getFog', () => { test('resolves fog from import', async () => { const style = new Style(new StubMap()); @@ -2032,6 +2035,7 @@ describe('Style#getFog', () => { expect(fog['horizon-blend']).toEqual(0); }); }); + describe('Camera', () => { test('resolves camera from import', async () => { const map = new StubMap(); @@ -2136,6 +2140,7 @@ describe('Camera', () => { } ); }); + describe('Projection', () => { test('resolves projection from import', async () => { const map = new StubMap(); @@ -2199,6 +2204,7 @@ describe('Projection', () => { } ); }); + describe('Transition', () => { test('resolves transition from import', async () => { const style = new Style(new StubMap()); @@ -2230,6 +2236,7 @@ describe('Transition', () => { expect(style.transition).toEqual({duration: 600, delay: 100}); }); }); + describe('Glyphs', () => { test('fallbacks to the default glyphs URL', async () => { const style = new Style(new StubMap()); @@ -2445,6 +2452,7 @@ test('Style#setPaintProperty', () => { expect(spy).toHaveBeenCalledTimes(2); }); }); + test('Style#setLayerZoomRange', () => { const style = new Style(new StubMap()); @@ -2590,6 +2598,7 @@ describe('Style#setConfigProperty', () => { expect(layer.getLayoutProperty('visibility')).toEqual('visible'); }); }); + describe('Style#setState', () => { test('Adds fragment', async () => { const map = new StubMap(); @@ -2894,6 +2903,7 @@ describe('Style#setState', () => { ]); }); }); + test('Style#serialize', async () => { const style = new Style(new StubMap()); diff --git a/vitest.config.base.ts b/vitest.config.base.ts index 7034baea9e2..07a098e6620 100644 --- a/vitest.config.base.ts +++ b/vitest.config.base.ts @@ -1,10 +1,8 @@ // @ts-nocheck import {readFile} from 'node:fs/promises'; -import {fileURLToPath} from 'node:url'; import {defineConfig} from 'vite'; import {createFilter} from '@rollup/pluginutils'; -import alias from '@rollup/plugin-alias'; import arraybuffer from 'vite-plugin-arraybuffer'; function glsl(include: string[]) { @@ -38,6 +36,7 @@ function fixAssertUtil(regexp = /node_modules\/assert/) { } export default defineConfig({ + retry: 2, pool: 'threads', poolOptions: { threads: { @@ -57,7 +56,11 @@ export default defineConfig({ fileParallelism: false, }, restoreMocks: true, - unstubGlobals: true + unstubGlobals: true, + reporters: process.env.CI ? [ + ['html', {outputFile: './test/unit/vitest/index.html'}], + ['junit', {outputFile: './test/unit/test-results.xml'}], + ] : ['basic'], }, optimizeDeps: { esbuildOptions: { From dddcee846f760ed20a619c02f47fb76f38db09b0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Jul 2024 17:30:45 +0300 Subject: [PATCH 39/45] Bump tweakpane from 4.0.3 to 4.0.4 (internal-1573) Bumps [tweakpane](https://github.com/cocopon/tweakpane) from 4.0.3 to 4.0.4. - [Release notes](https://github.com/cocopon/tweakpane/releases) - [Commits](https://github.com/cocopon/tweakpane/compare/4.0.3...4.0.4) --- updated-dependencies: - dependency-name: tweakpane dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Volodymyr Agafonkin --- 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 76d6c10b18f..452a02d06fa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -37,7 +37,7 @@ "supercluster": "^8.0.1", "tiny-lru": "^11.2.6", "tinyqueue": "^2.0.3", - "tweakpane": "^4.0.3", + "tweakpane": "^4.0.4", "vt-pbf": "^3.1.3" }, "devDependencies": { @@ -13386,9 +13386,9 @@ "dev": true }, "node_modules/tweakpane": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/tweakpane/-/tweakpane-4.0.3.tgz", - "integrity": "sha512-BlcWOAe8oe4c+k9pmLBARGdWB6MVZMszayekkixQXTgkxTaYoTUpHpwVEp+3HkoamZkomodpbBf0CkguIHTgLg==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/tweakpane/-/tweakpane-4.0.4.tgz", + "integrity": "sha512-RkWD54zDlEbnN01wQPk0ANHGbdCvlJx/E8A1QxhTfCbX+ROWos1Ws2MnhOm39aUGMOh+36TjUwpDmLfmwTr1Fg==", "funding": { "url": "https://github.com/sponsors/cocopon" } diff --git a/package.json b/package.json index 61fc9088f1f..7561ba536ee 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "supercluster": "^8.0.1", "tiny-lru": "^11.2.6", "tinyqueue": "^2.0.3", - "tweakpane": "^4.0.3", + "tweakpane": "^4.0.4", "vt-pbf": "^3.1.3" }, "devDependencies": { From f45080bb439cfa7ecf161d9acb44308b31ffb1ab Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Jul 2024 17:45:44 +0300 Subject: [PATCH 40/45] Bump testem from 3.14.0 to 3.15.0 (internal-1568) Bumps [testem](https://github.com/testem/testem) from 3.14.0 to 3.15.0. - [Release notes](https://github.com/testem/testem/releases) - [Commits](https://github.com/testem/testem/compare/v3.14.0...v3.15.0) --- updated-dependencies: - dependency-name: testem dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 10 +++++----- package.json | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 452a02d06fa..2468fb3d6d1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -110,7 +110,7 @@ "stylelint-config-standard": "^36.0.1", "tape": "^5.8.1", "tape-filter": "^1.0.4", - "testem": "^3.14.0", + "testem": "^3.15.0", "tsx": "^4.16.0", "typescript": "^5.5.3", "typescript-eslint": "^7.15.0", @@ -12725,9 +12725,9 @@ "dev": true }, "node_modules/testem": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/testem/-/testem-3.14.0.tgz", - "integrity": "sha512-hpybTZhio6DXUM7s0HsE8EOnN8zuA6LdNcz3EsTpQSnD56Cj6gSuFQx82wDKZQ6OmM1kvIBebxP+rEoOYBgCOA==", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/testem/-/testem-3.15.0.tgz", + "integrity": "sha512-vI1oQsjJW4QdVaH6ZmfNErzH7nzs0KzHJluocnfvbz1XRYGJKkIMGKWfsbD8MGGJOg+uzXcEek0/2W7BmGR4ug==", "dev": true, "dependencies": { "@xmldom/xmldom": "^0.8.0", @@ -12739,7 +12739,7 @@ "consolidate": "^0.16.0", "execa": "^1.0.0", "express": "^4.10.7", - "fireworm": "^0.7.0", + "fireworm": "^0.7.2", "glob": "^7.0.4", "http-proxy": "^1.13.1", "js-yaml": "^3.2.5", diff --git a/package.json b/package.json index 7561ba536ee..b6040e637cb 100644 --- a/package.json +++ b/package.json @@ -112,7 +112,7 @@ "stylelint-config-standard": "^36.0.1", "tape": "^5.8.1", "tape-filter": "^1.0.4", - "testem": "^3.14.0", + "testem": "^3.15.0", "tsx": "^4.16.0", "typescript": "^5.5.3", "typescript-eslint": "^7.15.0", From cfca8a2a3ba6ef89d1f8212719ae60f51b987a32 Mon Sep 17 00:00:00 2001 From: Stepan Kuzmin Date: Tue, 2 Jul 2024 18:06:35 +0300 Subject: [PATCH 41/45] Fix missing `style` property on style.load event (internal-1578) * Fix missing `style` property on style.load event * add unit test --- src/source/query_features.ts | 8 +- src/source/tile.ts | 8 +- src/style-spec/feature_filter/index.ts | 17 +++-- src/style/style.ts | 9 ++- src/ui/map.ts | 102 ++++++++++++++----------- src/util/evented.ts | 22 +++--- test/build/typings/index.ts | 4 +- test/unit/ui/map_events.test.ts | 10 +++ 8 files changed, 108 insertions(+), 72 deletions(-) diff --git a/src/source/query_features.ts b/src/source/query_features.ts index 3f709d0ee30..c0fc680ea4e 100644 --- a/src/source/query_features.ts +++ b/src/source/query_features.ts @@ -9,7 +9,7 @@ import type Transform from '../geo/transform'; import type {OverscaledTileID} from './tile_id'; import type {RetainedQueryData} from '../symbol/placement'; import type {QueryGeometry, TilespaceQueryGeometry} from '../style/query_geometry'; -import type {LayerSpecification, FilterSpecification} from '../style-spec/types'; +import type {LayerSpecification, FilterSpecification, ExpressionSpecification} from '../style-spec/types'; // we augment GeoJSON with custom properties in query*Features results export interface QueryFeature extends GeoJSON.Feature { @@ -196,7 +196,11 @@ export function queryRenderedSymbols( return result; } -export function querySourceFeatures(sourceCache: SourceCache, params: any): Array { +export function querySourceFeatures(sourceCache: SourceCache, params?: { + sourceLayer?: string; + filter?: FilterSpecification | ExpressionSpecification; + validate?: boolean; +}): Array { const tiles = sourceCache.getRenderableIds().map((id) => { return sourceCache.getTileByID(id); }); diff --git a/src/source/tile.ts b/src/source/tile.ts index c5f358b4711..5e333e0563a 100644 --- a/src/source/tile.ts +++ b/src/source/tile.ts @@ -45,7 +45,7 @@ import type Framebuffer from '../gl/framebuffer'; import type Transform from '../geo/transform'; import type {LayerFeatureStates} from './source_state'; import type {Cancelable} from '../types/cancelable'; -import type {FilterSpecification} from '../style-spec/types'; +import type {FilterSpecification, ExpressionSpecification} from '../style-spec/types'; import type {TilespaceQueryGeometry} from '../style/query_geometry'; import type VertexBuffer from '../gl/vertex_buffer'; import type IndexBuffer from '../gl/index_buffer'; @@ -480,7 +480,11 @@ class Tile { }, layers, serializedLayers, sourceFeatureState); } - querySourceFeatures(result: Array, params: any) { + querySourceFeatures(result: Array, params?: { + sourceLayer?: string; + filter?: FilterSpecification | ExpressionSpecification; + validate?: boolean; + }) { const featureIndex = this.latestFeatureIndex; if (!featureIndex || !featureIndex.rawTileData) return; diff --git a/src/style-spec/feature_filter/index.ts b/src/style-spec/feature_filter/index.ts index a517beeae96..a04d6cffcd2 100644 --- a/src/style-spec/feature_filter/index.ts +++ b/src/style-spec/feature_filter/index.ts @@ -1,10 +1,12 @@ +import type Point from '@mapbox/point-geometry'; +import latest from '../reference/latest'; + +import {deepUnbundle} from '../util/unbundle_jsonlint'; import {createExpression} from '../expression/index'; import {isFeatureConstant} from '../expression/is_constant'; -import {deepUnbundle} from '../util/unbundle_jsonlint'; -import latest from '../reference/latest'; -import type {GlobalProperties, Feature} from '../expression/index'; import type {CanonicalTileID} from '../types/tile_id'; -import type Point from '@mapbox/point-geometry'; +import type {GlobalProperties, Feature} from '../expression/index'; +import type {FilterSpecification, ExpressionSpecification} from '../types'; export type FeatureDistanceData = { bearing: [number, number]; @@ -28,7 +30,7 @@ export type FeatureFilter = { export default createFilter; export {isExpressionFilter, isDynamicFilter, extractStaticFilter}; -function isExpressionFilter(filter: any): boolean { +function isExpressionFilter(filter: unknown): boolean { if (filter === true || filter === false) { return true; } @@ -80,14 +82,15 @@ function isExpressionFilter(filter: any): boolean { * @param {string} layerType the type of the layer this filter will be applied to. * @returns {Function} filter-evaluating function */ -function createFilter(filter: any, layerType: string = 'fill'): FeatureFilter { +function createFilter(filter?: FilterSpecification | ExpressionSpecification, layerType: string = 'fill'): FeatureFilter { if (filter === null || filter === undefined) { return {filter: () => true, needGeometry: false, needFeature: false}; } if (!isExpressionFilter(filter)) { - filter = convertFilter(filter); + filter = convertFilter(filter) as ExpressionSpecification; } + const filterExp = (filter as string[] | string | boolean); let staticFilter = true; diff --git a/src/style/style.ts b/src/style/style.ts index 6a5fac99273..66e10196e46 100644 --- a/src/style/style.ts +++ b/src/style/style.ts @@ -70,6 +70,7 @@ import {RGBAImage} from '../util/image'; import type {ColorThemeSpecification, LayerSpecification, FilterSpecification, + ExpressionSpecification, StyleSpecification, ImportSpecification, LightSpecification, @@ -84,7 +85,7 @@ import type {ColorThemeSpecification, ConfigSpecification, SchemaSpecification, CameraSpecification -} from "../style-spec/types"; +} from '../style-spec/types'; import {evaluateColorThemeProperties} from '../util/lut'; // We're skipping validation errors with the `source.canvas` identifier in order @@ -2749,10 +2750,10 @@ class Style extends Evented { querySourceFeatures( sourceID: string, params?: { - sourceLayer: string | null | undefined; - filter?: Array | null | undefined; + sourceLayer?: string; + filter?: FilterSpecification | ExpressionSpecification; validate?: boolean; - } | null, + }, ): Array { if (params && params.filter) { this._validate(validateFilter, 'querySourceFeatures.filter', params.filter, null, params); diff --git a/src/ui/map.ts b/src/ui/map.ts index 405e67ed778..fdea240c55e 100644 --- a/src/ui/map.ts +++ b/src/ui/map.ts @@ -82,10 +82,11 @@ import type { ImportSpecification, ConfigSpecification, SchemaSpecification, - ColorThemeSpecification + ColorThemeSpecification, + ExpressionSpecification } from '../style-spec/types'; import type StyleLayer from '../style/style_layer'; -import type {Source} from '../source/source'; +import type {Source, SourceClass} from '../source/source'; import type {EasingOptions} from './camera'; import type {ContextOptions} from '../gl/context'; import type {QueryFeature, QueryRenderedFeaturesParams} from '../source/query_features'; @@ -93,6 +94,7 @@ import type {QueryFeature, QueryRenderedFeaturesParams} from '../source/query_fe import {TrackedParameters} from '../tracked-parameters/tracked_parameters'; import {TrackedParametersMock} from '../tracked-parameters/tracked_parameters_base'; import type {ITrackedParameters} from '../tracked-parameters/tracked_parameters_base'; +import type {Callback} from 'src/types/callback'; export type ControlPosition = 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right'; /* eslint-disable no-use-before-define */ @@ -115,6 +117,12 @@ export type SetStyleOptions = { localIdeographFontFamily: StyleOptions['localIdeographFontFamily']; }; +type DelegatedListener = { + layers: Set; + listener: Listener; + delegates: {[K in MapEvent]?: Listener}; +}; + export type FeatureSelector = { id: string | number; source: string; @@ -127,7 +135,7 @@ export const AVERAGE_ELEVATION_EASE_THRESHOLD = 1; // meters export const AVERAGE_ELEVATION_CHANGE_THRESHOLD = 1e-4; // meters export type MapOptions = { - style?: StyleSpecification | string | undefined; + style?: StyleSpecification | string; config?: { [key: string]: ConfigSpecification; }; @@ -148,10 +156,10 @@ export type MapOptions = { maxBounds?: LngLatBoundsLike; fitBoundsOptions?: EasingOptions; scrollZoom?: boolean; - minZoom?: number | null | undefined; - maxZoom?: number | null | undefined; - minPitch?: number | null | undefined; - maxPitch?: number | null | undefined; + minZoom?: number; + maxZoom?: number; + minPitch?: number; + maxPitch?: number; boxZoom?: boolean; dragRotate?: boolean; dragPan?: boolean | DragPanOptions; @@ -171,8 +179,8 @@ export type MapOptions = { maxTileCacheSize?: number; transformRequest?: RequestTransformFunction; accessToken?: string; - testMode?: boolean | null | undefined; - locale?: any; + testMode?: boolean; + locale?: Partial; language?: string; worldview?: string; crossSourceCollisions?: boolean; @@ -444,7 +452,7 @@ export class Map extends Camera { _antialias: boolean; _refreshExpiredTiles: boolean; _hash: Hash; - _delegatedListeners: any; + _delegatedListeners: {[type: string]: DelegatedListener[]}; _fullscreenchangeEvent: 'fullscreenchange' | 'webkitfullscreenchange'; _isInitialLoad: boolean; _shouldCheckAccess: boolean; @@ -461,7 +469,7 @@ export class Map extends Camera { _localIdeographFontFamily: string; _localFontFamily: string | null | undefined; _requestManager: RequestManager; - _locale: any; + _locale: Partial; _removed: boolean; _speedIndexTiming: boolean; _clickTolerance: number; @@ -753,7 +761,7 @@ export class Map extends Camera { this.on('style.load', () => { if (this.transform.unmodified) { - this.jumpTo((this.style.stylesheet as any)); + this.jumpTo((this.style.stylesheet as unknown)); } this._postStyleLoadEvent(); }); @@ -920,7 +928,7 @@ export class Map extends Camera { * const mapDiv = document.getElementById('map'); * if (mapDiv.style.visibility === true) map.resize(); */ - resize(eventData?: any): this { + resize(eventData?: object): this { this._updateContainerDimensions(); // do nothing if container remained the same size @@ -1505,7 +1513,7 @@ export class Map extends Camera { return (this.handlers && this.handlers._isDragging()) || false; } - _createDelegatedListener(type: MapEvent, layers: Array, listener: any): any { + _createDelegatedListener(type: MapEvent, layers: Array, listener: Listener): DelegatedListener { if (type === 'mouseenter' || type === 'mouseover') { let mousein = false; const mousemove = (e: MapMouseEvent) => { @@ -1674,9 +1682,12 @@ export class Map extends Camera { * @see [Example: Create a hover effect](https://docs.mapbox.com/mapbox-gl-js/example/hover-styles/) * @see [Example: Display popup on click](https://docs.mapbox.com/mapbox-gl-js/example/popup-on-click/) */ - on(type: MapEvent, layerIds: any, listener?: Listener): this { - if (listener === undefined) { - return super.on(type, layerIds); + on(type: MapEvent, listener: Listener): this; + on(type: MapEvent, layerIds: string | string[], listener: Listener): this; + + on(type: MapEvent, layerIds: string | string[] | Listener, listener?: Listener): this { + if (typeof layerIds === 'function' || listener === undefined) { + return super.on(type, layerIds as Listener); } if (!Array.isArray(layerIds)) { @@ -1698,7 +1709,7 @@ export class Map extends Camera { this._delegatedListeners[type].push(delegatedListener); for (const event in delegatedListener.delegates) { - this.on((event as any), delegatedListener.delegates[event]); + this.on(event as MapEvent, delegatedListener.delegates[event]); } return this; @@ -1748,9 +1759,9 @@ export class Map extends Camera { once(type: MapEvent, layerIds: string | string[]): Promise; once(type: MapEvent, layerIds: string | string[], listener: Listener): this; - once(type: MapEvent, layerIds?: any, listener?: Listener): this | Promise { - if (listener === undefined) { - return super.once(type, layerIds); + once(type: MapEvent, layerIds?: string | string[] | Listener, listener?: Listener): this | Promise { + if (typeof layerIds === 'function' || listener === undefined) { + return super.once(type, layerIds as Listener); } if (!Array.isArray(layerIds)) { @@ -1768,7 +1779,7 @@ export class Map extends Camera { const delegatedListener = this._createDelegatedListener(type, layerIds, listener); for (const event in delegatedListener.delegates) { - this.once((event as any), delegatedListener.delegates[event]); + this.once(event as MapEvent, delegatedListener.delegates[event]); } return this; @@ -1799,19 +1810,23 @@ export class Map extends Camera { * }); * @see [Example: Create a draggable point](https://docs.mapbox.com/mapbox-gl-js/example/drag-a-point/) */ - off(type: MapEvent, layerIds: any, listener?: Listener): this { - if (listener === undefined) { - return super.off(type, layerIds); + off(type: MapEvent, listener: Listener): this; + off(type: MapEvent, layerIds: string | string[], listener: Listener): this; + + off(type: MapEvent, layerIds: string | string[] | Listener, listener?: Listener): this { + if (typeof layerIds === 'function' || listener === undefined) { + return super.off(type, layerIds as Listener); } - layerIds = new Set(Array.isArray(layerIds) ? layerIds : [layerIds]); - for (const layerId of layerIds) { + const uniqLayerIds = new Set(Array.isArray(layerIds) ? layerIds : [layerIds]); + + for (const layerId of uniqLayerIds) { if (!this._isValidId(layerId)) { return this; } } - const areLayerArraysEqual = (hash1: Set, hash2: Set) => { + const areLayerIdsEqual = (hash1: Set, hash2: Set) => { if (hash1.size !== hash2.size) { return false; // at-least 1 arr has duplicate value(s) } @@ -1823,12 +1838,12 @@ export class Map extends Camera { return true; }; - const removeDelegatedListeners = (listeners: Array) => { + const removeDelegatedListeners = (listeners: Array) => { for (let i = 0; i < listeners.length; i++) { const delegatedListener = listeners[i]; - if (delegatedListener.listener === listener && areLayerArraysEqual(delegatedListener.layers, layerIds)) { + if (delegatedListener.listener === listener && areLayerIdsEqual(delegatedListener.layers, uniqLayerIds)) { for (const event in delegatedListener.delegates) { - this.off((event as any), delegatedListener.delegates[event]); + this.off(event as MapEvent, delegatedListener.delegates[event]); } listeners.splice(i, 1); return this; @@ -1939,7 +1954,7 @@ export class Map extends Camera { } if (options === undefined && geometry !== undefined && !(geometry instanceof Point) && !Array.isArray(geometry)) { - options = (geometry as any); + options = geometry; geometry = undefined; } @@ -1997,10 +2012,10 @@ export class Map extends Camera { querySourceFeatures( sourceId: string, parameters?: { - sourceLayer: string | null | undefined; - filter?: Array | null | undefined; + sourceLayer?: string; + filter?: FilterSpecification | ExpressionSpecification; validate?: boolean; - } | null, + }, ): Array { if (!this._isValidId(sourceId)) { return []; @@ -2108,7 +2123,7 @@ export class Map extends Camera { return str; } - _updateStyle(style: StyleSpecification | string | null, options?: SetStyleOptions): this { + _updateStyle(style?: StyleSpecification | string, options?: SetStyleOptions): this { if (this.style) { this.style.setEventedParent(null); this.style._remove(); @@ -2124,9 +2139,8 @@ export class Map extends Camera { delete styleOptions.config; } - this.style = new Style(this, styleOptions) - .setEventedParent(this, {style: this.style}) - .load(style); + this.style = new Style(this, styleOptions).load(style); + this.style.setEventedParent(this, {style: this.style}); } this._updateTerrain(); @@ -2275,7 +2289,7 @@ export class Map extends Camera { * @param {Function} SourceType A {@link Source} constructor. * @param {Function} callback Called when the source type is ready or with an error argument if there is an error. */ - addSourceType(name: string, SourceType: any, callback: any) { + addSourceType(name: string, SourceType: SourceClass, callback: Callback) { this._lazyInitEmptyStyle(); this.style.addSourceType(name, SourceType, callback); } @@ -2454,10 +2468,8 @@ export class Map extends Camera { 'The map has no image with that id. If you are adding a new image use `map.addImage(...)` instead.'))); return; } - const imageData = (image instanceof HTMLImageElement || (ImageBitmap && image instanceof ImageBitmap)) ? browser.getImageData(image) : image; - const {width, height} = imageData; - // Flow can't refine the type enough to exclude ImageBitmap - const data = ((imageData as any).data as Uint8Array | Uint8ClampedArray); + const imageData = (image instanceof HTMLImageElement || (ImageBitmap && image instanceof ImageBitmap)) ? browser.getImageData(image) : image as ImageData; + const {width, height, data} = imageData; if (width === undefined || height === undefined) { this.fire(new ErrorEvent(new Error( @@ -2537,7 +2549,7 @@ export class Map extends Camera { * * @see [Example: Add an icon to the map](https://www.mapbox.com/mapbox-gl-js/example/add-image/) */ - loadImage(url: string, callback: any) { + loadImage(url: string, callback: Callback) { // @ts-expect-error - TS2345 - Argument of type 'string' is not assignable to parameter of type '"Unknown" | "Style" | "Source" | "Tile" | "Glyphs" | "SpriteImage" | "SpriteJSON" | "Image" | "Model"'. getImage(this._requestManager.transformRequest(url, ResourceType.Image), (err, img) => { callback(err, img instanceof HTMLImageElement ? browser.getImageData(img) : img); diff --git a/src/util/evented.ts b/src/util/evented.ts index 4b5df1c8983..cffcd86377e 100644 --- a/src/util/evented.ts +++ b/src/util/evented.ts @@ -24,9 +24,10 @@ function _removeEventListener(type: string, listener: Listener, listenerList: Li } export class Event { + target: unknown; readonly type: string; - constructor(type: string, data: any = {}) { + constructor(type: string, data: object = {}) { extend(this, data); this.type = type; } @@ -56,8 +57,8 @@ export class ErrorEvent extends Event { export class Evented { _listeners: Listeners; _oneTimeListeners: Listeners; - _eventedParent: Evented | null | undefined; - _eventedParentData: any | (() => any) | null | undefined; + _eventedParent?: Evented; + _eventedParentData?: unknown | (() => unknown); /** * Adds a listener to a specified event type. @@ -113,7 +114,7 @@ export class Evented { return this; } - fire(event: Event | string, properties?: any): this { + fire(event: Event | string, properties?: object): this { // Compatibility with (type: string, properties: Object) signature from previous versions. // See https://github.com/mapbox/mapbox-gl-js/issues/6522, // https://github.com/mapbox/mapbox-gl-draw/issues/766 @@ -124,7 +125,7 @@ export class Evented { const type = event.type; if (this.listens(type)) { - (event as any).target = this; + event.target = this; // make sure adding or removing listeners inside other listeners won't cause an infinite loop const listeners = this._listeners && this._listeners[type] ? this._listeners[type].slice() : []; @@ -141,10 +142,11 @@ export class Evented { const parent = this._eventedParent; if (parent) { - extend( - event, - typeof this._eventedParentData === 'function' ? this._eventedParentData() : this._eventedParentData - ); + const eventedParentData = typeof this._eventedParentData === 'function' ? + this._eventedParentData() : + this._eventedParentData; + + extend(event, eventedParentData); parent.fire(event); } @@ -178,7 +180,7 @@ export class Evented { * @returns {Object} `this` * @private */ - setEventedParent(parent?: Evented | null, data?: any | (() => any)): this { + setEventedParent(parent?: Evented, data?: unknown | (() => unknown)): this { this._eventedParent = parent; this._eventedParentData = data; diff --git a/test/build/typings/index.ts b/test/build/typings/index.ts index a102fe5e6fa..c1619d762f7 100644 --- a/test/build/typings/index.ts +++ b/test/build/typings/index.ts @@ -144,8 +144,8 @@ map.setTerrain({'source': 'mapbox-dem', 'exaggeration': 1.5}); // Query features // -const features1 = map.queryRenderedFeatures([0, 0], {layers: ['layer-id']}); -const features2 = map.querySourceFeatures('sourceId', {sourceLayer: 'sourceLayer', filter: [], validate: true}); +const features1 = map.queryRenderedFeatures([0, 0], {layers: ['layer-id'], filter: ['>=', 'area', 80000], validate: true}); +const features2 = map.querySourceFeatures('sourceId', {sourceLayer: 'sourceLayer', filter: ['>=', 'area', 80000], validate: true}); // // Set state diff --git a/test/unit/ui/map_events.test.ts b/test/unit/ui/map_events.test.ts index 65f1630f877..513dadcf316 100644 --- a/test/unit/ui/map_events.test.ts +++ b/test/unit/ui/map_events.test.ts @@ -1077,3 +1077,13 @@ test('Map#off distinguishes distinct listeners - multiple layers', () => { expect(spy).not.toHaveBeenCalled(); }); }); + +test('Map#on style.load event has style property', async () => { + const map = createMap(); + await new Promise(resolve => { + map.once('style.load', (event) => { + expect(event.style).toEqual(map.style); + resolve(); + }); + }); +}); From 92501bf34c12b879e48d2af5d514fcfa532c1473 Mon Sep 17 00:00:00 2001 From: Aleksandr Shoronov Date: Wed, 3 Jul 2024 14:18:51 +0300 Subject: [PATCH 42/45] [GLJS-837] Fix queryRenderedFeatures if DEM tiles are missed (internal-1579) --- src/geo/projection/projection.ts | 2 +- .../terrain/missed-tiles/expected.json | 25 +++++++ .../terrain/missed-tiles/style.json | 75 +++++++++++++++++++ 3 files changed, 101 insertions(+), 1 deletion(-) create mode 100644 test/integration/query-tests/terrain/missed-tiles/expected.json create mode 100644 test/integration/query-tests/terrain/missed-tiles/style.json diff --git a/src/geo/projection/projection.ts b/src/geo/projection/projection.ts index bdd22b8151c..0e9ed12ca92 100644 --- a/src/geo/projection/projection.ts +++ b/src/geo/projection/projection.ts @@ -112,7 +112,7 @@ export default class Projection { } isPointAboveHorizon(tr: Transform, p: Point): boolean { - if (tr.elevation) { + if (tr.elevation && tr.elevation.visibleDemTiles.length) { const raycastOnTerrain = this.pointCoordinate3D(tr, p.x, p.y); return !raycastOnTerrain; } diff --git a/test/integration/query-tests/terrain/missed-tiles/expected.json b/test/integration/query-tests/terrain/missed-tiles/expected.json new file mode 100644 index 00000000000..1b4764d0c80 --- /dev/null +++ b/test/integration/query-tests/terrain/missed-tiles/expected.json @@ -0,0 +1,25 @@ +[ + { + "geometry": { + "coordinates": [ + [ + -113.3269464969635, + 35.933558016730615 + ], + [ + -113.33341598510742, + 35.929422840516594 + ], + [ + -113.32208633422852, + 35.94187983750328 + ] + ], + "type": "MultiPoint" + }, + "properties": {}, + "source": "geojson", + "state": {}, + "type": "Feature" + } +] diff --git a/test/integration/query-tests/terrain/missed-tiles/style.json b/test/integration/query-tests/terrain/missed-tiles/style.json new file mode 100644 index 00000000000..59be4e4e2a4 --- /dev/null +++ b/test/integration/query-tests/terrain/missed-tiles/style.json @@ -0,0 +1,75 @@ +{ + "version": 8, + "metadata": { + "test": { + "height": 100, + "width": 200, + "queryGeometry": [98, 57] + } + }, + "center": [-113.32694547094238, 35.93455626259847], + "zoom": 12, + "pitch": 0, + "bearing": -20, + "terrain": { + "source": "rgbterrain" + }, + "sources": { + "rgbterrain": { + "type": "raster-dem", + "tiles": [ + "local://tiles-missed/{z}-{x}-{y}.terrain.png" + ], + "maxzoom": 12, + "tileSize": 256 + }, + "satellite": { + "type": "raster", + "tiles": [ + "local://tiles/{z}-{x}-{y}.satellite.png" + ], + "maxzoom": 17, + "tileSize": 256 + }, + "geojson": { + "type": "geojson", + "data": { + "type": "MultiPoint", + "coordinates": [ + [ + -113.32694547094238, + 35.93355626259847 + ], + [ + -113.33341462261518, + 35.9294218694216 + ], + [ + -113.3220882006336, + 35.9418831745696 + ] + ] + } + } + }, + "layers": [ + { + "id": "raster", + "type": "raster", + "source": "satellite", + "paint": { + "raster-fade-duration": 0 + } + }, + { + "id": "circle", + "type": "circle", + "source": "geojson", + "paint": { + "circle-radius": 5, + "circle-color": "#ff0000", + "circle-pitch-alignment": "map" + } + } + ] +} From 61396530e9b10c776daa7fb03a739e50485bb47b Mon Sep 17 00:00:00 2001 From: Stepan Kuzmin Date: Wed, 3 Jul 2024 16:00:12 +0300 Subject: [PATCH 43/45] Add `Map#getSlots` (internal-1580) --- src/style/style.ts | 32 +++++++++------------ src/ui/map.ts | 12 ++++++++ test/unit/style/style_imports.test.ts | 41 +++++++++++++++++++++++++++ 3 files changed, 67 insertions(+), 18 deletions(-) diff --git a/src/style/style.ts b/src/style/style.ts index 66e10196e46..b71dee72b07 100644 --- a/src/style/style.ts +++ b/src/style/style.ts @@ -230,18 +230,11 @@ class Style extends Evented { // Merged layers and sources _mergedOrder: Array; - _mergedLayers: { - [_: string]: StyleLayer; - }; - _mergedSourceCaches: { - [_: string]: SourceCache; - }; - _mergedOtherSourceCaches: { - [_: string]: SourceCache; - }; - _mergedSymbolSourceCaches: { - [_: string]: SourceCache; - }; + _mergedLayers: Record; + _mergedSlots: Array; + _mergedSourceCaches: Record; + _mergedOtherSourceCaches: Record; + _mergedSymbolSourceCaches: Record; _clipLayerIndices: Array; _request: Cancelable | null | undefined; @@ -985,14 +978,11 @@ class Style extends Evented { } mergeLayers() { - const slots: { - [key: string]: StyleLayer[]; - } = {}; + const slots: Record = {}; const mergedOrder: StyleLayer[] = []; - const mergedLayers: { - [key: string]: StyleLayer; - } = {}; + const mergedLayers: Record = {}; + this._mergedSlots = []; this._has3DLayers = false; this._hasCircleLayers = false; this._hasSymbolLayers = false; @@ -1024,6 +1014,7 @@ class Style extends Evented { if (layer.type === 'slot') { const slotName = getNameFromFQID(layer.id); if (slots[slotName]) sort(slots[slotName]); + this._mergedSlots.push(slotName); } else { const fqid = makeFQID(layer.id, layer.scope); this._mergedOrder.push(fqid); @@ -2327,6 +2318,11 @@ class Style extends Evented { this._updateLayer(layer); } + getSlots(): string[] { + this._checkLoaded(); + return this._mergedSlots; + } + setSlot(layerId: string, slot?: string | null) { this._checkLoaded(); diff --git a/src/ui/map.ts b/src/ui/map.ts index fdea240c55e..3b20b62aa47 100644 --- a/src/ui/map.ts +++ b/src/ui/map.ts @@ -3047,6 +3047,18 @@ export class Map extends Camera { return this.style.getOwnLayer(id); } + /** + * Returns the IDs of all slots in the map's style. + * + * @returns {Array} The IDs of all slots in the map's style. + * + * @example + * const slots = map.getSlots(); + */ + getSlots(): Array { + return this.style.getSlots(); + } + /** * Sets the zoom extent for the specified style layer. The zoom extent includes the * [minimum zoom level](https://docs.mapbox.com/mapbox-gl-js/style-spec/#layer-minzoom) diff --git a/test/unit/style/style_imports.test.ts b/test/unit/style/style_imports.test.ts index 5eb8d2e8fb9..a189212f4c0 100644 --- a/test/unit/style/style_imports.test.ts +++ b/test/unit/style/style_imports.test.ts @@ -1115,6 +1115,7 @@ describe('Style#addLayer', () => { }); }); }); + describe('Style#removeLayer', () => { test('same id in different scope is intact', async () => { const style = new Style(new StubMap()); @@ -1162,6 +1163,7 @@ describe('Style#removeLayer', () => { }); }); }); + describe('Style#moveLayer', () => { test('reorders layers', async () => { const style = new Style(new StubMap()); @@ -1558,6 +1560,45 @@ describe('Style#_mergeLayers', () => { }); }); +test('Style#getSlots', async () => { + const style = new Style(new StubMap()); + + const initialStyle = createStyleJSON({ + imports: [ + { + id: 'basemap', + url: '', + data: { + version: 8, + sources: {}, + layers: [ + {id: 'layer-0', type: 'background'}, + {id: 'bottom', type: 'slot'}, + {id: 'layer-1', type: 'background'}, + {id: 'middle', type: 'slot'}, + {id: 'layer-2', type: 'background'}, + {id: 'top', type: 'slot'}, + {id: 'layer-3', type: 'background'} + ] + } + } + ], + sources: {}, + layers: [ + {id: 'user-slot-1', type: 'slot', 'slot': 'middle'}, + {id: 'user-slot-2', type: 'slot'}, + {id: 'user-layer-1', type: 'background'} + ] + }); + + style.loadJSON(initialStyle); + await waitFor(style, 'style.load'); + expect(style.getSlots()).toEqual(['bottom', 'user-slot-1', 'middle', 'top', 'user-slot-2']); + + style.addLayer({id: 'runtime-slot-1', type: 'slot', slot: 'top'}); + expect(style.getSlots()).toEqual(['bottom', 'user-slot-1', 'middle', 'runtime-slot-1', 'top', 'user-slot-2']); +}); + describe('Style#getLights', () => { test('root style resolves lights from import', async () => { const style = new Style(new StubMap()); From bf0bf4c46850789159affa110f1a10ef37ddeb85 Mon Sep 17 00:00:00 2001 From: Volodymyr Agafonkin Date: Wed, 3 Jul 2024 17:46:16 +0300 Subject: [PATCH 44/45] v3.5.0 --- CHANGELOG.md | 16 ++++++++++++--- package-lock.json | 39 +++---------------------------------- package.json | 2 +- src/style-spec/package.json | 2 +- 4 files changed, 18 insertions(+), 41 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index aa7e7f8c17a..7d3019ea7a6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,20 +1,30 @@ -## 3.5.0-beta.1 +## 3.5.0 ### Breaking changes ⚠️ - This release marks a significant transition for GL JS, moving from [Flow](https://flow.org/) to [TypeScript](https://www.typescriptlang.org/). While we have maintained backward compatibility where possible, the community typings `@types/mapbox-gl` are not fully compatible with the new first-class typings. Users relying on the community typings may experience breaking changes. Please remove the `@types/mapbox-gl` dependency and refer to the [v3.5.0 migration guide](https://github.com/mapbox/mapbox-gl-js/issues/13203) for instructions on upgrading, resolving common issues, and asking questions regarding the migration to the first-class typings. We welcome your feedback and contributions to make Mapbox GL JS better. ### Features and improvements ✨ -- Add `color-theme` property to enable colorization with a lookup table (LUT) images. +- Add `color-theme` property and `Map` `setColorTheme` method to enable colorization with a lookup table (LUT) images. +- Significantly improve performance of `updateData` for `GeoJSON` sources in `dynamic` mode. - Add `icon-occlusion-opacity` and `text-occlusion-opacity` properties to fade symbols behind models and landmarks. - Add `line-occlusion-opacity` property to fade lines behind 3D objects. - Add experimental `clip` layer to filter out rendering data. - Add experimental `line-z-offset` property for a non-globe view. -- Add `model-cutoff-fade-range` property support to control fade out of faraway 3D buildings. +- Add `model-cutoff-fade-range` property to control fade out of faraway 3D buildings. +- Improve precision of `line-pattern` on long lines and higher zooms. +- Add experimental `line-trim-color` and `line-trim-fade-range` properties to customize rendering of lines trimmed with `line-trim-offset`. +- Add `Map` `getSlots` method for listing available slots of a style. ### Bug fixes 🐞 +- Fix a performance regression in Standard style introduced in v3.4.0. - Fix icon rotation during globe transition. - Fix GeoJSON data loss due to frequent `updateData` calls. - Improve `raster-particle` layer animation. +- Fix `model-front-cutoff` property for Meshopt-encoded models. +- Fix errors in the console on empty 3D tiles. +- Fix not properly detecting fingerprinting protection when adding terrain through `setTerrain`. +- Fix `style.load` event missing `style` property. +- Fix errors when using `queryRenderedFeatures` on areas with missing DEM tiles when terrain is enabled. ## 3.4.0 diff --git a/package-lock.json b/package-lock.json index 2468fb3d6d1..1cd1b81e912 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "mapbox-gl", - "version": "3.5.0-beta.1", + "version": "3.5.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "mapbox-gl", - "version": "3.5.0-beta.1", + "version": "3.5.0", "license": "SEE LICENSE IN LICENSE.txt", "workspaces": [ "src/style-spec" @@ -43,7 +43,6 @@ "devDependencies": { "@mapbox/mvt-fixtures": "^3.10.0", "@octokit/rest": "^21.0.0", - "@rollup/plugin-alias": "^5.1.0", "@rollup/plugin-commonjs": "^26.0.1", "@rollup/plugin-json": "^6.1.0", "@rollup/plugin-node-resolve": "^15.2.3", @@ -1778,26 +1777,6 @@ "integrity": "sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==", "dev": true }, - "node_modules/@rollup/plugin-alias": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-alias/-/plugin-alias-5.1.0.tgz", - "integrity": "sha512-lpA3RZ9PdIG7qqhEfv79tBffNaoDuukFDrmhLqg9ifv99u/ehn+lOg30x2zmhf8AQqQUZaMk/B9fZraQ6/acDQ==", - "dev": true, - "dependencies": { - "slash": "^4.0.0" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, "node_modules/@rollup/plugin-commonjs": { "version": "26.0.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-26.0.1.tgz", @@ -11531,18 +11510,6 @@ "node": ">= 10" } }, - "node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/slashes": { "version": "3.0.12", "resolved": "https://registry.npmjs.org/slashes/-/slashes-3.0.12.tgz", @@ -14838,7 +14805,7 @@ }, "src/style-spec": { "name": "@mapbox/mapbox-gl-style-spec", - "version": "14.5.0-beta.1", + "version": "14.5.0", "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { "@mapbox/jsonlint-lines-primitives": "~2.0.2", diff --git a/package.json b/package.json index b6040e637cb..f9a8a0ab268 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "mapbox-gl", "description": "A WebGL interactive maps library", - "version": "3.5.0-beta.1", + "version": "3.5.0", "main": "dist/mapbox-gl.js", "style": "dist/mapbox-gl.css", "types": "dist/mapbox-gl.d.ts", diff --git a/src/style-spec/package.json b/src/style-spec/package.json index 2cd2af9d6f5..911f83e8929 100644 --- a/src/style-spec/package.json +++ b/src/style-spec/package.json @@ -1,6 +1,6 @@ { "name": "@mapbox/mapbox-gl-style-spec", - "version": "14.5.0-beta.1", + "version": "14.5.0", "description": "a specification for mapbox gl styles", "author": "Mapbox", "license": "SEE LICENSE IN LICENSE.txt", From 860bbd0f57aa784163b757cb12bca5fa5fa64273 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Wed, 3 Jul 2024 18:01:27 +0300 Subject: [PATCH 45/45] change the repo for check-ts-suppressions check --- build/check-ts-suppressions.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/check-ts-suppressions.js b/build/check-ts-suppressions.js index 7827f6e9110..6c958596ccb 100755 --- a/build/check-ts-suppressions.js +++ b/build/check-ts-suppressions.js @@ -8,7 +8,7 @@ import {Octokit} from '@octokit/rest'; import {execSync} from 'child_process'; const owner = 'mapbox'; -const repo = 'mapbox-gl-js-internal'; +const repo = 'mapbox-gl-js'; const branch = process.env['CIRCLE_BRANCH'] || execSync('git rev-parse --abbrev-ref HEAD').toString().trim(); async function getBannedTsComments() {