diff --git a/3d-style/data/bucket/model_bucket.ts b/3d-style/data/bucket/model_bucket.ts index f27faf4a27d..6f091f84936 100644 --- a/3d-style/data/bucket/model_bucket.ts +++ b/3d-style/data/bucket/model_bucket.ts @@ -169,10 +169,8 @@ class ModelBucket implements Bucket { id: featureId, sourceLayerIndex, index, - // @ts-expect-error - TS2345 - Argument of type 'VectorTileFeature' is not assignable to parameter of type 'FeatureWithGeometry'. geometry: needGeometry ? evaluationFeature.geometry : loadGeometry(feature, canonical, tileTransform), properties: feature.properties, - // @ts-expect-error - TS2322 - Type '0 | 2 | 1 | 3' is not assignable to type '2 | 1 | 3'. type: feature.type, patterns: {} }; diff --git a/3d-style/data/model.ts b/3d-style/data/model.ts index cefd919f201..cfd7cbe8457 100644 --- a/3d-style/data/model.ts +++ b/3d-style/data/model.ts @@ -316,7 +316,7 @@ export default class Model { } export function uploadTexture(texture: ModelTexture, context: Context, useSingleChannelTexture: boolean = false) { - const textureFormat = useSingleChannelTexture ? context.gl.R8 : context.gl.RGBA; + const textureFormat = useSingleChannelTexture ? context.gl.R8 : context.gl.RGBA8; if (!texture.uploaded) { const useMipmap = texture.sampler.minFilter >= context.gl.NEAREST_MIPMAP_NEAREST; texture.gfxTexture = new Texture(context, texture.image, textureFormat, {useMipmap}); diff --git a/3d-style/render/draw_model.ts b/3d-style/render/draw_model.ts index 51949dedbdd..d26aed6b2f7 100644 --- a/3d-style/render/draw_model.ts +++ b/3d-style/render/draw_model.ts @@ -110,7 +110,7 @@ function setupMeshDraw(definesValues: Array, dynamicBuffers: Array), dynamicBuffers, mesh, painter, layer.lut); if (!hasMapboxFeatures) { - // @ts-expect-error programOptions.defines.push('DIFFUSE_SHADED'); } if (singleCascade) { - // @ts-expect-error programOptions.defines.push('SHADOWS_SINGLE_CASCADE'); } @@ -1030,7 +1028,6 @@ function drawBatchedModels(painter: Painter, source: SourceCache, layer: ModelSt // Handle Texture transform if (material.occlusionTexture && material.occlusionTexture.offsetScale) { occlusionTextureTransform = material.occlusionTexture.offsetScale; - // @ts-expect-error programOptions.defines.push('OCCLUSION_TEXTURE_TRANSFORM'); } diff --git a/3d-style/render/program/model_program.ts b/3d-style/render/program/model_program.ts index 0ac066da46d..cf67f2fead2 100644 --- a/3d-style/render/program/model_program.ts +++ b/3d-style/render/program/model_program.ts @@ -45,6 +45,8 @@ export type ModelUniformsType = { ['u_occlusionTextureTransform']: Uniform4f; }; +export type ModelDefinesType = 'DIFFUSE_SHADED' | 'SHADOWS_SINGLE_CASCADE' | 'OCCLUSION_TEXTURE_TRANSFORM'; + const modelUniforms = (context: Context): ModelUniformsType => ({ 'u_matrix': new UniformMatrix4f(context), 'u_lighting_matrix': new UniformMatrix4f(context), diff --git a/3d-style/render/shadow_renderer.ts b/3d-style/render/shadow_renderer.ts index 15859c8da00..0b0d312c504 100644 --- a/3d-style/render/shadow_renderer.ts +++ b/3d-style/render/shadow_renderer.ts @@ -220,11 +220,11 @@ export class ShadowRenderer { const gl = context.gl; const fbo = context.createFramebuffer(width, height, useColor, 'texture'); - const depthTexture = new Texture(context, {width, height, data: null}, gl.DEPTH_COMPONENT); + const depthTexture = new Texture(context, {width, height, data: null}, gl.DEPTH_COMPONENT16); fbo.depthAttachment.set(depthTexture.texture); if (useColor) { - const colorTexture = new Texture(context, {width, height, data: null}, gl.RGBA); + const colorTexture = new Texture(context, {width, height, data: null}, gl.RGBA8); fbo.colorAttachment.set(colorTexture.texture); } @@ -357,7 +357,6 @@ export class ShadowRenderer { const coords = sourceCache ? sourceCoords[sourceCache.id] : undefined; if (layer.type !== 'model' && !(coords && coords.length)) continue; - // @ts-expect-error - TS2345 - Argument of type 'void | SourceCache' is not assignable to parameter of type 'SourceCache'. painter.renderLayer(painter, sourceCache, layer, coords); } } diff --git a/3d-style/style/lights.ts b/3d-style/style/lights.ts index 06b8021c3d1..f21f1e1ee93 100644 --- a/3d-style/style/lights.ts +++ b/3d-style/style/lights.ts @@ -47,8 +47,7 @@ class Lights

extends Evented { } get(): LightsSpecification { - // @ts-expect-error - this._options.properties = this._transitionable.serialize(); + this._options.properties = this._transitionable.serialize() as LightsSpecification['properties']; return this._options; } diff --git a/CHANGELOG.md b/CHANGELOG.md index ef5ebac4032..42608072e87 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,10 @@ -## v3.7.0-beta.1 +## v3.7.0 ### Features and improvements ✨ +- Add `background-pitch-alignment` property of the `background` layer, which is set to `map` by default but can now be set to `viewport`. Useful for highlighting individual features by dimming the rest of the map with a semitransparent background. +- Add new control positions (`top`, `right`, `bottom`, and `left`) (h/t [@Ethan-Guttman](https://github.com/Ethan-Guttman)). +- Add `retainPadding` option for camera movement methods, which can be set to `false` for pre-v3.4 padding behavior. - Add `config` expression support in layer filter. - Add symbol elevation properties: `symbol-z-offset` and `symbol-elevation-reference`. - Add the `fill-z-offset` property for fill layers. @@ -13,6 +16,7 @@ - Improve type checking for the `Map#setPaintProperty` and `Map#setLayoutProperty` methods. - Allow the `string` event type in Map event handlers. - Expose `RequestTransformFunction`, `ResourceType`, and `RequestParameters` types. +- Improve texture memory footprint on some platforms. ### Bug fixes 🐞 - Fix feature filtering when using 3D lights. @@ -22,6 +26,9 @@ - Fix the issue where `minzoom` and `maxzoom` properties were ignored by `clip` layers. - Fix handling previously hidden models in `clip` layers. - Fix directional light `cast-shadows` property type. +- Fix an edge case that could produce `setStencilMode`-related error in the console with the dev build. +- Fix an issue where some fill extrusions could temporarily disappear when zooming quickly in certain areas. +- Fix an edge case that could cause flickering on a far plane on high zooms. ## 3.6.0 diff --git a/README.md b/README.md index 4b24f201598..13dfecb2a2a 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,7 @@ native SDKs. For code and issues specific to the native SDKs, see the - [Style documentation](https://docs.mapbox.com/mapbox-gl-js/style-spec/) - [Open source styles](https://github.com/mapbox/mapbox-gl-styles) - [Contributor documentation](./CONTRIBUTING.md) +- [Browser Data Storage](./STORAGE.md) [Mapbox GL JS gallery of map images](https://www.mapbox.com/mapbox-gljs) @@ -34,4 +35,4 @@ Mapbox Web SDK Copyright © 2021 - 2023 Mapbox, Inc. All rights reserved. -The software and files in this repository (collectively, “Software”) are licensed under the Mapbox TOS for use only with the relevant Mapbox product(s) listed at www.mapbox.com/pricing. This license allows developers with a current active Mapbox account to use and modify the authorized portions of the Software as needed for use only with the relevant Mapbox product(s) through their Mapbox account in accordance with the Mapbox TOS. This license terminates automatically if a developer no longer has a Mapbox account in good standing or breaches the Mapbox TOS. For the license terms, please see the Mapbox TOS at https://www.mapbox.com/legal/tos/ which incorporates the Mapbox Product Terms at www.mapbox.com/legal/service-terms. If this Software is a SDK, modifications that change or interfere with marked portions of the code related to billing, accounting, or data collection are not authorized and the SDK sends limited de-identified location and usage data which is used in accordance with the Mapbox TOS. [Updated 2023-01] \ No newline at end of file +The software and files in this repository (collectively, “Software”) are licensed under the Mapbox TOS for use only with the relevant Mapbox product(s) listed at www.mapbox.com/pricing. This license allows developers with a current active Mapbox account to use and modify the authorized portions of the Software as needed for use only with the relevant Mapbox product(s) through their Mapbox account in accordance with the Mapbox TOS. This license terminates automatically if a developer no longer has a Mapbox account in good standing or breaches the Mapbox TOS. For the license terms, please see the Mapbox TOS at https://www.mapbox.com/legal/tos/ which incorporates the Mapbox Product Terms at www.mapbox.com/legal/service-terms. If this Software is a SDK, modifications that change or interfere with marked portions of the code related to billing, accounting, or data collection are not authorized and the SDK sends limited de-identified location and usage data which is used in accordance with the Mapbox TOS. [Updated 2023-01] diff --git a/STORAGE.md b/STORAGE.md new file mode 100644 index 00000000000..ed933d1c953 --- /dev/null +++ b/STORAGE.md @@ -0,0 +1,2 @@ +# Browser Data Storage +Mapbox GL JS SDK uses the browser [local storage](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage) system and keys prefixed with `mapbox.eventData` to store telemetry-related data. This data includes a randomly-generated ID that is included in telemetry events that are sent to Mapbox in order to calculate aggregate usage statistics; as well as metadata about telemetry events that is only used locally. This data is not sold to third parties, nor does Mapbox use the data (either alone or in combination with any personal identifiers) for advertising, tracking end users, or creating profiles of individual end users. diff --git a/debug/animate-point-along-route.html b/debug/animate-point-along-route.html index a5511ae5cae..0b2be412f92 100644 --- a/debug/animate-point-along-route.html +++ b/debug/animate-point-along-route.html @@ -8,6 +8,7 @@ body { margin: 0; padding: 0; } #map { position: absolute; top: 0; bottom: 0; width: 100%; } + + diff --git a/debug/projections.html b/debug/projections.html index 27ba5673402..2e53b6f1ecb 100644 --- a/debug/projections.html +++ b/debug/projections.html @@ -59,6 +59,7 @@

diff --git a/debug/walls.html b/debug/walls.html index d3c698a9247..b4e4131cc75 100644 --- a/debug/walls.html +++ b/debug/walls.html @@ -426,6 +426,16 @@ } }); + map.addLayer({ + "type": "background", + "id": "dimming-background", + "paint": { + "background-pitch-alignment": "viewport", + "background-color": "black", + "background-opacity": 0.5 + } + }); + map.addLayer({ "type": "fill", "id": "floors", diff --git a/package-lock.json b/package-lock.json index 7eb9bff99cc..e6312316192 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "mapbox-gl", - "version": "3.7.0-beta.1", + "version": "3.7.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "mapbox-gl", - "version": "3.7.0-beta.1", + "version": "3.7.0", "license": "SEE LICENSE IN LICENSE.txt", "workspaces": [ "src/style-spec", @@ -45,24 +45,24 @@ "devDependencies": { "@mapbox/mvt-fixtures": "^3.10.0", "@octokit/rest": "^21.0.2", - "@rollup/plugin-commonjs": "^26.0.1", + "@rollup/plugin-commonjs": "^28.0.0", "@rollup/plugin-json": "^6.1.0", - "@rollup/plugin-node-resolve": "^15.2.3", - "@rollup/plugin-replace": "^5.0.7", + "@rollup/plugin-node-resolve": "^15.3.0", + "@rollup/plugin-replace": "^6.0.1", "@rollup/plugin-strip": "^3.0.4", "@rollup/plugin-terser": "^0.4.4", "@tweakpane/core": "^2.0.4", - "@types/jest": "^29.5.12", - "@types/node": "^22.5.4", + "@types/jest": "^29.5.13", + "@types/node": "^22.6.1", "@types/offscreencanvas": "^2019.7.3", - "@typescript-eslint/eslint-plugin": "^8.5.0", - "@typescript-eslint/parser": "^8.5.0", - "@vitest/browser": "^2.0.5", + "@typescript-eslint/eslint-plugin": "^8.7.0", + "@typescript-eslint/parser": "^8.7.0", + "@vitest/browser": "^2.1.1", "@vitest/ui": "^2.0.3", "address": "^2.0.3", "browserify": "^17.0.0", "chalk": "^5.0.1", - "chokidar": "^3.6.0", + "chokidar": "^4.0.1", "cross-env": "^7.0.3", "cssnano": "^7.0.6", "d3-queue": "^3.0.7", @@ -70,13 +70,13 @@ "dts-bundle-generator": "^9.5.1", "ejs": "^3.1.10", "envify": "^4.1.0", - "esbuild": "^0.23.1", - "eslint": "^8.57.0", + "esbuild": "^0.24.0", + "eslint": "^8.57.1", "eslint-config-mourner": "^3.0.0", "eslint-import-resolver-typescript": "^3.6.3", - "eslint-plugin-html": "^8.1.1", + "eslint-plugin-html": "^8.1.2", "eslint-plugin-import": "^2.30.0", - "eslint-plugin-jsdoc": "^50.2.2", + "eslint-plugin-jsdoc": "^50.2.4", "glob": "^11.0.0", "is-builtin-module": "^4.0.0", "jest-extended": "^4.0.2", @@ -90,8 +90,8 @@ "npm-font-open-sans": "^1.1.0", "npm-run-all": "^4.1.5", "pixelmatch": "^6.0.0", - "playwright": "^1.47.0", - "postcss": "^8.4.45", + "playwright": "^1.47.2", + "postcss": "^8.4.47", "postcss-cli": "^11.0.0", "postcss-inline-svg": "^6.0.0", "pretty-bytes": "^6.0.0", @@ -99,18 +99,18 @@ "rollup": "^4.18.0", "rollup-plugin-esbuild": "^6.1.1", "rollup-plugin-unassert": "^0.6.0", - "serve-static": "^1.15.0", + "serve-static": "^1.16.2", "shuffle-seed": "^1.1.6", "st": "^3.0.0", "stylelint": "^16.9.0", "stylelint-config-standard": "^36.0.1", - "tape": "^5.8.1", + "tape": "^5.9.0", "tape-filter": "^1.0.4", - "testem": "^3.15.1", - "tsx": "^4.19.0", + "testem": "^3.15.2", + "tsx": "^4.19.1", "tweakpane": "^4.0.4", "typescript": "^5.6.2", - "typescript-eslint": "^8.5.0", + "typescript-eslint": "^8.7.0", "utility-types": "^3.11.0", "vite-plugin-arraybuffer": "^0.0.8", "vitest": "^2.0.3" @@ -126,19 +126,6 @@ "node": ">=0.10.0" } }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@babel/code-frame": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", @@ -381,9 +368,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", - "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", + "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", "cpu": [ "ppc64" ], @@ -397,9 +384,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", - "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", + "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", "cpu": [ "arm" ], @@ -413,9 +400,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", - "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", + "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", "cpu": [ "arm64" ], @@ -429,9 +416,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", - "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", + "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", "cpu": [ "x64" ], @@ -445,9 +432,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", - "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", + "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", "cpu": [ "arm64" ], @@ -461,9 +448,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", - "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", + "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", "cpu": [ "x64" ], @@ -477,9 +464,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", - "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", + "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", "cpu": [ "arm64" ], @@ -493,9 +480,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", - "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", + "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", "cpu": [ "x64" ], @@ -509,9 +496,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", - "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", + "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", "cpu": [ "arm" ], @@ -525,9 +512,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", - "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", + "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", "cpu": [ "arm64" ], @@ -541,9 +528,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", - "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", + "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", "cpu": [ "ia32" ], @@ -557,9 +544,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", - "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", + "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", "cpu": [ "loong64" ], @@ -573,9 +560,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", - "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", + "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", "cpu": [ "mips64el" ], @@ -589,9 +576,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", - "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", + "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", "cpu": [ "ppc64" ], @@ -605,9 +592,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", - "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", + "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", "cpu": [ "riscv64" ], @@ -621,9 +608,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", - "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", + "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", "cpu": [ "s390x" ], @@ -637,9 +624,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", - "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", + "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==", "cpu": [ "x64" ], @@ -653,9 +640,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", - "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", + "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", "cpu": [ "x64" ], @@ -669,9 +656,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz", - "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", + "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", "cpu": [ "arm64" ], @@ -685,9 +672,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", - "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", + "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", "cpu": [ "x64" ], @@ -701,9 +688,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", - "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", + "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", "cpu": [ "x64" ], @@ -717,9 +704,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", - "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", + "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", "cpu": [ "arm64" ], @@ -733,9 +720,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", - "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", + "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", "cpu": [ "ia32" ], @@ -749,9 +736,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz", - "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", + "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", "cpu": [ "x64" ], @@ -839,24 +826,22 @@ } }, "node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", "dev": true, - "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", "deprecated": "Use @eslint/config-array instead", "dev": true, - "license": "Apache-2.0", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", + "@humanwhocodes/object-schema": "^2.0.3", "debug": "^4.3.1", "minimatch": "^3.0.5" }, @@ -869,7 +854,6 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -880,7 +864,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -907,8 +890,7 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", "deprecated": "Use @eslint/object-schema instead", - "dev": true, - "license": "BSD-3-Clause" + "dev": true }, "node_modules/@inquirer/confirm": { "version": "3.1.0", @@ -1347,11 +1329,10 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true, - "license": "MIT" + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", @@ -1949,18 +1930,18 @@ "dev": true }, "node_modules/@rollup/plugin-commonjs": { - "version": "26.0.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-26.0.1.tgz", - "integrity": "sha512-UnsKoZK6/aGIH6AdkptXhNvhaqftcjq3zZdT+LY5Ftms6JR06nADcDsYp5hTU9E2lbJUEOhdlY5J4DNTneM+jQ==", + "version": "28.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-28.0.0.tgz", + "integrity": "sha512-BJcu+a+Mpq476DMXG+hevgPSl56bkUoi88dKT8t3RyUp8kGuOh+2bU8Gs7zXDlu+fyZggnJ+iOBGrb/O1SorYg==", "dev": true, - "license": "MIT", "dependencies": { "@rollup/pluginutils": "^5.0.1", "commondir": "^1.0.1", "estree-walker": "^2.0.2", - "glob": "^10.4.1", + "fdir": "^6.1.1", "is-reference": "1.2.1", - "magic-string": "^0.30.3" + "magic-string": "^0.30.3", + "picomatch": "^2.3.1" }, "engines": { "node": ">=16.0.0 || 14 >= 14.17" @@ -1974,61 +1955,16 @@ } } }, - "node_modules/@rollup/plugin-commonjs/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@rollup/plugin-commonjs/node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/@rollup/plugin-commonjs/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true - }, - "node_modules/@rollup/plugin-commonjs/node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "node_modules/@rollup/plugin-commonjs/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, "engines": { - "node": ">=16 || 14 >=14.18" + "node": ">=8.6" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/@rollup/plugin-json": { @@ -2053,16 +1989,14 @@ } }, "node_modules/@rollup/plugin-node-resolve": { - "version": "15.2.3", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz", - "integrity": "sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==", + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.0.tgz", + "integrity": "sha512-9eO5McEICxMzJpDW9OnMYSv4Sta3hmt7VtBFz5zR9273suNOydOyq/FrGeGy+KsTRFm8w0SLVhzig2ILFT63Ag==", "dev": true, - "license": "MIT", "dependencies": { "@rollup/pluginutils": "^5.0.1", "@types/resolve": "1.20.2", "deepmerge": "^4.2.2", - "is-builtin-module": "^3.2.1", "is-module": "^1.0.0", "resolve": "^1.22.1" }, @@ -2078,41 +2012,11 @@ } } }, - "node_modules/@rollup/plugin-node-resolve/node_modules/builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@rollup/plugin-node-resolve/node_modules/is-builtin-module": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", - "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", - "dev": true, - "license": "MIT", - "dependencies": { - "builtin-modules": "^3.3.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@rollup/plugin-replace": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-5.0.7.tgz", - "integrity": "sha512-PqxSfuorkHz/SPpyngLyg5GCEkOcee9M1bkxiVDr41Pd61mqP1PLOoDPbpl44SB2mQGKwV/In74gqQmGITOhEQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-6.0.1.tgz", + "integrity": "sha512-2sPh9b73dj5IxuMmDAsQWVFT7mR+yoHweBaXG2W/R8vQ+IWZlnaI7BR7J6EguVQUp1hd8Z7XuozpDjEKQAAC2Q==", "dev": true, - "license": "MIT", "dependencies": { "@rollup/pluginutils": "^5.0.1", "magic-string": "^0.30.3" @@ -2198,225 +2102,221 @@ } } }, + "node_modules/@rollup/pluginutils/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz", - "integrity": "sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.3.tgz", + "integrity": "sha512-MmKSfaB9GX+zXl6E8z4koOr/xU63AMVleLEa64v7R0QF/ZloMs5vcD1sHgM64GXXS1csaJutG+ddtzcueI/BLg==", "cpu": [ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz", - "integrity": "sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.3.tgz", + "integrity": "sha512-zrt8ecH07PE3sB4jPOggweBjJMzI1JG5xI2DIsUbkA+7K+Gkjys6eV7i9pOenNSDJH3eOr/jLb/PzqtmdwDq5g==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz", - "integrity": "sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.3.tgz", + "integrity": "sha512-P0UxIOrKNBFTQaXTxOH4RxuEBVCgEA5UTNV6Yz7z9QHnUJ7eLX9reOd/NYMO3+XZO2cco19mXTxDMXxit4R/eQ==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz", - "integrity": "sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.3.tgz", + "integrity": "sha512-L1M0vKGO5ASKntqtsFEjTq/fD91vAqnzeaF6sfNAy55aD+Hi2pBI5DKwCO+UNDQHWsDViJLqshxOahXyLSh3EA==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz", - "integrity": "sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.3.tgz", + "integrity": "sha512-btVgIsCjuYFKUjopPoWiDqmoUXQDiW2A4C3Mtmp5vACm7/GnyuprqIDPNczeyR5W8rTXEbkmrJux7cJmD99D2g==", "cpu": [ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz", - "integrity": "sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.3.tgz", + "integrity": "sha512-zmjbSphplZlau6ZTkxd3+NMtE4UKVy7U4aVFMmHcgO5CUbw17ZP6QCgyxhzGaU/wFFdTfiojjbLG3/0p9HhAqA==", "cpu": [ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz", - "integrity": "sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.3.tgz", + "integrity": "sha512-nSZfcZtAnQPRZmUkUQwZq2OjQciR6tEoJaZVFvLHsj0MF6QhNMg0fQ6mUOsiCUpTqxTx0/O6gX0V/nYc7LrgPw==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz", - "integrity": "sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.3.tgz", + "integrity": "sha512-MnvSPGO8KJXIMGlQDYfvYS3IosFN2rKsvxRpPO2l2cum+Z3exiExLwVU+GExL96pn8IP+GdH8Tz70EpBhO0sIQ==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz", - "integrity": "sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.3.tgz", + "integrity": "sha512-+W+p/9QNDr2vE2AXU0qIy0qQE75E8RTwTwgqS2G5CRQ11vzq0tbnfBd6brWhS9bCRjAjepJe2fvvkvS3dno+iw==", "cpu": [ "ppc64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz", - "integrity": "sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.3.tgz", + "integrity": "sha512-yXH6K6KfqGXaxHrtr+Uoy+JpNlUlI46BKVyonGiaD74ravdnF9BUNC+vV+SIuB96hUMGShhKV693rF9QDfO6nQ==", "cpu": [ "riscv64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz", - "integrity": "sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.3.tgz", + "integrity": "sha512-R8cwY9wcnApN/KDYWTH4gV/ypvy9yZUHlbJvfaiXSB48JO3KpwSpjOGqO4jnGkLDSk1hgjYkTbTt6Q7uvPf8eg==", "cpu": [ "s390x" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz", - "integrity": "sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.3.tgz", + "integrity": "sha512-kZPbX/NOPh0vhS5sI+dR8L1bU2cSO9FgxwM8r7wHzGydzfSjLRCFAT87GR5U9scj2rhzN3JPYVC7NoBbl4FZ0g==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz", - "integrity": "sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.3.tgz", + "integrity": "sha512-S0Yq+xA1VEH66uiMNhijsWAafffydd2X5b77eLHfRmfLsRSpbiAWiRHV6DEpz6aOToPsgid7TI9rGd6zB1rhbg==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz", - "integrity": "sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.3.tgz", + "integrity": "sha512-9isNzeL34yquCPyerog+IMCNxKR8XYmGd0tHSV+OVx0TmE0aJOo9uw4fZfUuk2qxobP5sug6vNdZR6u7Mw7Q+Q==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz", - "integrity": "sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.3.tgz", + "integrity": "sha512-nMIdKnfZfzn1Vsk+RuOvl43ONTZXoAPUUxgcU0tXooqg4YrAqzfKzVenqqk2g5efWh46/D28cKFrOzDSW28gTA==", "cpu": [ "ia32" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz", - "integrity": "sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.3.tgz", + "integrity": "sha512-fOvu7PCQjAj4eWDEuD8Xz5gpzFqXzGlxHZozHP4b9Jxv9APtdxL6STqztDzMLuRXEc4UpXGGhx029Xgm91QBeA==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" @@ -2657,11 +2557,10 @@ } }, "node_modules/@types/jest": { - "version": "29.5.12", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", - "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", + "version": "29.5.13", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.13.tgz", + "integrity": "sha512-wd+MVEZCHt23V0/L642O5APvspWply/rGY5BcW4SUETo2UzPU3Z26qr8jC2qxpimI2jjx9h7+2cj2FwIr01bXg==", "dev": true, - "license": "MIT", "dependencies": { "expect": "^29.0.0", "pretty-format": "^29.0.0" @@ -2702,9 +2601,9 @@ } }, "node_modules/@types/node": { - "version": "22.5.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.4.tgz", - "integrity": "sha512-FDuKUJQm/ju9fT/SeX/6+gBzoPzlVCzfzmGkwKvRHQVxi4BntVbyIwf6a4Xn62mrvndLiml6z/UBXIdEVjQLXg==", + "version": "22.6.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.6.1.tgz", + "integrity": "sha512-V48tCfcKb/e6cVUigLAaJDAILdMP0fUW6BidkPK4GpGjXcfbnoHasCZDwz3N3yVt5we2RHm4XTQCpv0KJz9zqw==", "dev": true, "dependencies": { "undici-types": "~6.19.2" @@ -2784,16 +2683,16 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.5.0.tgz", - "integrity": "sha512-lHS5hvz33iUFQKuPFGheAB84LwcJ60G8vKnEhnfcK1l8kGVLro2SFYW6K0/tj8FUhRJ0VHyg1oAfg50QGbPPHw==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.7.0.tgz", + "integrity": "sha512-RIHOoznhA3CCfSTFiB6kBGLQtB/sox+pJ6jeFu6FxJvqL8qRxq/FfGO/UhsGgQM9oGdXkV4xUgli+dt26biB6A==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.5.0", - "@typescript-eslint/type-utils": "8.5.0", - "@typescript-eslint/utils": "8.5.0", - "@typescript-eslint/visitor-keys": "8.5.0", + "@typescript-eslint/scope-manager": "8.7.0", + "@typescript-eslint/type-utils": "8.7.0", + "@typescript-eslint/utils": "8.7.0", + "@typescript-eslint/visitor-keys": "8.7.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -2817,15 +2716,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.5.0.tgz", - "integrity": "sha512-gF77eNv0Xz2UJg/NbpWJ0kqAm35UMsvZf1GHj8D9MRFTj/V3tAciIWXfmPLsAAF/vUlpWPvUDyH1jjsr0cMVWw==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.7.0.tgz", + "integrity": "sha512-lN0btVpj2unxHlNYLI//BQ7nzbMJYBVQX5+pbNXvGYazdlgYonMn4AhhHifQ+J4fGRYA/m1DjaQjx+fDetqBOQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "8.5.0", - "@typescript-eslint/types": "8.5.0", - "@typescript-eslint/typescript-estree": "8.5.0", - "@typescript-eslint/visitor-keys": "8.5.0", + "@typescript-eslint/scope-manager": "8.7.0", + "@typescript-eslint/types": "8.7.0", + "@typescript-eslint/typescript-estree": "8.7.0", + "@typescript-eslint/visitor-keys": "8.7.0", "debug": "^4.3.4" }, "engines": { @@ -2845,13 +2744,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.5.0.tgz", - "integrity": "sha512-06JOQ9Qgj33yvBEx6tpC8ecP9o860rsR22hWMEd12WcTRrfaFgHr2RB/CA/B+7BMhHkXT4chg2MyboGdFGawYg==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.7.0.tgz", + "integrity": "sha512-87rC0k3ZlDOuz82zzXRtQ7Akv3GKhHs0ti4YcbAJtaomllXoSO8hi7Ix3ccEvCd824dy9aIX+j3d2UMAfCtVpg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "8.5.0", - "@typescript-eslint/visitor-keys": "8.5.0" + "@typescript-eslint/types": "8.7.0", + "@typescript-eslint/visitor-keys": "8.7.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2862,13 +2761,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.5.0.tgz", - "integrity": "sha512-N1K8Ix+lUM+cIDhL2uekVn/ZD7TZW+9/rwz8DclQpcQ9rk4sIL5CAlBC0CugWKREmDjBzI/kQqU4wkg46jWLYA==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.7.0.tgz", + "integrity": "sha512-tl0N0Mj3hMSkEYhLkjREp54OSb/FI6qyCzfiiclvJvOqre6hsZTGSnHtmFLDU8TIM62G7ygEa1bI08lcuRwEnQ==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "8.5.0", - "@typescript-eslint/utils": "8.5.0", + "@typescript-eslint/typescript-estree": "8.7.0", + "@typescript-eslint/utils": "8.7.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -2886,9 +2785,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.5.0.tgz", - "integrity": "sha512-qjkormnQS5wF9pjSi6q60bKUHH44j2APxfh9TQRXK8wbYVeDYYdYJGIROL87LGZZ2gz3Rbmjc736qyL8deVtdw==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.7.0.tgz", + "integrity": "sha512-LLt4BLHFwSfASHSF2K29SZ+ZCsbQOM+LuarPjRUuHm+Qd09hSe3GCeaQbcCr+Mik+0QFRmep/FyZBO6fJ64U3w==", "dev": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2899,13 +2798,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.5.0.tgz", - "integrity": "sha512-vEG2Sf9P8BPQ+d0pxdfndw3xIXaoSjliG0/Ejk7UggByZPKXmJmw3GW5jV2gHNQNawBUyfahoSiCFVov0Ruf7Q==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.7.0.tgz", + "integrity": "sha512-MC8nmcGHsmfAKxwnluTQpNqceniT8SteVwd2voYlmiSWGOtjvGXdPl17dYu2797GVscK30Z04WRM28CrKS9WOg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "8.5.0", - "@typescript-eslint/visitor-keys": "8.5.0", + "@typescript-eslint/types": "8.7.0", + "@typescript-eslint/visitor-keys": "8.7.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -2927,15 +2826,15 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.5.0.tgz", - "integrity": "sha512-6yyGYVL0e+VzGYp60wvkBHiqDWOpT63pdMV2CVG4LVDd5uR6q1qQN/7LafBZtAtNIn/mqXjsSeS5ggv/P0iECw==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.7.0.tgz", + "integrity": "sha512-ZbdUdwsl2X/s3CiyAu3gOlfQzpbuG3nTWKPoIvAu1pu5r8viiJvv2NPN2AqArL35NCYtw/lrPPfM4gxrMLNLPw==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.5.0", - "@typescript-eslint/types": "8.5.0", - "@typescript-eslint/typescript-estree": "8.5.0" + "@typescript-eslint/scope-manager": "8.7.0", + "@typescript-eslint/types": "8.7.0", + "@typescript-eslint/typescript-estree": "8.7.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2949,12 +2848,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.5.0.tgz", - "integrity": "sha512-yTPqMnbAZJNy2Xq2XU8AdtOW9tJIr+UQb64aXB9f3B1498Zx9JorVgFJcZpEc9UBuCCrdzKID2RGAMkYcDtZOw==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.7.0.tgz", + "integrity": "sha512-b1tx0orFCCh/THWPQa2ZwWzvOeyzzp36vkJYOpVg0u8UVOIsfVrnuC9FqAw9gRKn+rG2VmWQ/zDJZzkxUnj/XQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "8.5.0", + "@typescript-eslint/types": "8.7.0", "eslint-visitor-keys": "^3.4.3" }, "engines": { @@ -2973,17 +2872,19 @@ "license": "ISC" }, "node_modules/@vitest/browser": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-2.0.5.tgz", - "integrity": "sha512-VbOYtu/6R3d7ASZREcrJmRY/sQuRFO9wMVsEDqfYbWiJRh2fDNi8CL1Csn7Ux31pOcPmmM5QvzFCMpiojvVh8g==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-2.1.1.tgz", + "integrity": "sha512-wLKqohwlZI24xMIEZAPwv9SVliv1avaIBeE0ou471D++BRPhiw2mubKBczFFIDHXuSL7UXb8/JQK9Ui6ttW9bQ==", "dev": true, "dependencies": { "@testing-library/dom": "^10.4.0", "@testing-library/user-event": "^14.5.2", - "@vitest/utils": "2.0.5", - "magic-string": "^0.30.10", - "msw": "^2.3.2", + "@vitest/mocker": "2.1.1", + "@vitest/utils": "2.1.1", + "magic-string": "^0.30.11", + "msw": "^2.3.5", "sirv": "^2.0.4", + "tinyrainbow": "^1.2.0", "ws": "^8.18.0" }, "funding": { @@ -2991,7 +2892,7 @@ }, "peerDependencies": { "playwright": "*", - "vitest": "2.0.5", + "vitest": "2.1.1", "webdriverio": "*" }, "peerDependenciesMeta": { @@ -3028,13 +2929,13 @@ } }, "node_modules/@vitest/expect": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.0.5.tgz", - "integrity": "sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.1.tgz", + "integrity": "sha512-YeueunS0HiHiQxk+KEOnq/QMzlUuOzbU1Go+PgAsHvvv3tUkJPm9xWt+6ITNTlzsMXUjmgm5T+U7KBPK2qQV6w==", "dev": true, "dependencies": { - "@vitest/spy": "2.0.5", - "@vitest/utils": "2.0.5", + "@vitest/spy": "2.1.1", + "@vitest/utils": "2.1.1", "chai": "^5.1.1", "tinyrainbow": "^1.2.0" }, @@ -3042,10 +2943,46 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/@vitest/mocker": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.1.tgz", + "integrity": "sha512-LNN5VwOEdJqCmJ/2XJBywB11DLlkbY0ooDJW3uRX5cZyYCrc4PI/ePX0iQhE3BiEGiQmK4GE7Q/PqCkkaiPnrA==", + "dev": true, + "dependencies": { + "@vitest/spy": "^2.1.0-beta.1", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.11" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@vitest/spy": "2.1.1", + "msw": "^2.3.5", + "vite": "^5.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/mocker/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0" + } + }, "node_modules/@vitest/pretty-format": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.0.5.tgz", - "integrity": "sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.1.tgz", + "integrity": "sha512-SjxPFOtuINDUW8/UkElJYQSFtnWX7tMksSGW0vfjxMneFqxVr8YJ979QpMbDW7g+BIiq88RAGDjf7en6rvLPPQ==", "dev": true, "dependencies": { "tinyrainbow": "^1.2.0" @@ -3055,12 +2992,12 @@ } }, "node_modules/@vitest/runner": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.0.5.tgz", - "integrity": "sha512-TfRfZa6Bkk9ky4tW0z20WKXFEwwvWhRY+84CnSEtq4+3ZvDlJyY32oNTJtM7AW9ihW90tX/1Q78cb6FjoAs+ig==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.1.tgz", + "integrity": "sha512-uTPuY6PWOYitIkLPidaY5L3t0JJITdGTSwBtwMjKzo5O6RCOEncz9PUN+0pDidX8kTHYjO0EwUIvhlGpnGpxmA==", "dev": true, "dependencies": { - "@vitest/utils": "2.0.5", + "@vitest/utils": "2.1.1", "pathe": "^1.1.2" }, "funding": { @@ -3068,13 +3005,13 @@ } }, "node_modules/@vitest/snapshot": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.0.5.tgz", - "integrity": "sha512-SgCPUeDFLaM0mIUHfaArq8fD2WbaXG/zVXjRupthYfYGzc8ztbFbu6dUNOblBG7XLMR1kEhS/DNnfCZ2IhdDew==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.1.tgz", + "integrity": "sha512-BnSku1WFy7r4mm96ha2FzN99AZJgpZOWrAhtQfoxjUU5YMRpq1zmHRq7a5K9/NjqonebO7iVDla+VvZS8BOWMw==", "dev": true, "dependencies": { - "@vitest/pretty-format": "2.0.5", - "magic-string": "^0.30.10", + "@vitest/pretty-format": "2.1.1", + "magic-string": "^0.30.11", "pathe": "^1.1.2" }, "funding": { @@ -3082,9 +3019,9 @@ } }, "node_modules/@vitest/spy": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.0.5.tgz", - "integrity": "sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.1.tgz", + "integrity": "sha512-ZM39BnZ9t/xZ/nF4UwRH5il0Sw93QnZXd9NAZGRpIgj0yvVwPpLd702s/Cx955rGaMlyBQkZJ2Ir7qyY48VZ+g==", "dev": true, "dependencies": { "tinyspy": "^3.0.0" @@ -3094,34 +3031,33 @@ } }, "node_modules/@vitest/ui": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-2.0.5.tgz", - "integrity": "sha512-m+ZpVt/PVi/nbeRKEjdiYeoh0aOfI9zr3Ria9LO7V2PlMETtAXJS3uETEZkc8Be2oOl8mhd7Ew+5SRBXRYncNw==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-2.1.1.tgz", + "integrity": "sha512-IIxo2LkQDA+1TZdPLYPclzsXukBWd5dX2CKpGqH8CCt8Wh0ZuDn4+vuQ9qlppEju6/igDGzjWF/zyorfsf+nHg==", "dev": true, "dependencies": { - "@vitest/utils": "2.0.5", - "fast-glob": "^3.3.2", + "@vitest/utils": "2.1.1", "fflate": "^0.8.2", "flatted": "^3.3.1", "pathe": "^1.1.2", "sirv": "^2.0.4", + "tinyglobby": "^0.2.6", "tinyrainbow": "^1.2.0" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "vitest": "2.0.5" + "vitest": "2.1.1" } }, "node_modules/@vitest/utils": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.0.5.tgz", - "integrity": "sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.1.tgz", + "integrity": "sha512-Y6Q9TsI+qJ2CC0ZKj6VBb+T8UPz593N113nnUykqwANqhgf3QkZeHFlusgKLTqrnVHbj/XDKZcDHol+dxVT+rQ==", "dev": true, "dependencies": { - "@vitest/pretty-format": "2.0.5", - "estree-walker": "^3.0.3", + "@vitest/pretty-format": "2.1.1", "loupe": "^3.1.1", "tinyrainbow": "^1.2.0" }, @@ -3129,15 +3065,6 @@ "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/utils/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "dependencies": { - "@types/estree": "^1.0.0" - } - }, "node_modules/@xmldom/xmldom": { "version": "0.8.10", "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", @@ -3313,7 +3240,6 @@ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, - "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -3322,6 +3248,18 @@ "node": ">= 8" } }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/aproba": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", @@ -3714,7 +3652,6 @@ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" }, @@ -4323,28 +4260,18 @@ } }, "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", + "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", "dev": true, - "license": "MIT", "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "readdirp": "^4.0.1" }, "engines": { - "node": ">= 8.10.0" + "node": ">= 14.16.0" }, "funding": { "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" } }, "node_modules/ci-info": { @@ -5962,9 +5889,9 @@ } }, "node_modules/esbuild": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", - "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", + "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", "dev": true, "hasInstallScript": true, "bin": { @@ -5974,30 +5901,30 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.23.1", - "@esbuild/android-arm": "0.23.1", - "@esbuild/android-arm64": "0.23.1", - "@esbuild/android-x64": "0.23.1", - "@esbuild/darwin-arm64": "0.23.1", - "@esbuild/darwin-x64": "0.23.1", - "@esbuild/freebsd-arm64": "0.23.1", - "@esbuild/freebsd-x64": "0.23.1", - "@esbuild/linux-arm": "0.23.1", - "@esbuild/linux-arm64": "0.23.1", - "@esbuild/linux-ia32": "0.23.1", - "@esbuild/linux-loong64": "0.23.1", - "@esbuild/linux-mips64el": "0.23.1", - "@esbuild/linux-ppc64": "0.23.1", - "@esbuild/linux-riscv64": "0.23.1", - "@esbuild/linux-s390x": "0.23.1", - "@esbuild/linux-x64": "0.23.1", - "@esbuild/netbsd-x64": "0.23.1", - "@esbuild/openbsd-arm64": "0.23.1", - "@esbuild/openbsd-x64": "0.23.1", - "@esbuild/sunos-x64": "0.23.1", - "@esbuild/win32-arm64": "0.23.1", - "@esbuild/win32-ia32": "0.23.1", - "@esbuild/win32-x64": "0.23.1" + "@esbuild/aix-ppc64": "0.24.0", + "@esbuild/android-arm": "0.24.0", + "@esbuild/android-arm64": "0.24.0", + "@esbuild/android-x64": "0.24.0", + "@esbuild/darwin-arm64": "0.24.0", + "@esbuild/darwin-x64": "0.24.0", + "@esbuild/freebsd-arm64": "0.24.0", + "@esbuild/freebsd-x64": "0.24.0", + "@esbuild/linux-arm": "0.24.0", + "@esbuild/linux-arm64": "0.24.0", + "@esbuild/linux-ia32": "0.24.0", + "@esbuild/linux-loong64": "0.24.0", + "@esbuild/linux-mips64el": "0.24.0", + "@esbuild/linux-ppc64": "0.24.0", + "@esbuild/linux-riscv64": "0.24.0", + "@esbuild/linux-s390x": "0.24.0", + "@esbuild/linux-x64": "0.24.0", + "@esbuild/netbsd-x64": "0.24.0", + "@esbuild/openbsd-arm64": "0.24.0", + "@esbuild/openbsd-x64": "0.24.0", + "@esbuild/sunos-x64": "0.24.0", + "@esbuild/win32-arm64": "0.24.0", + "@esbuild/win32-ia32": "0.24.0", + "@esbuild/win32-x64": "0.24.0" } }, "node_modules/escalade": { @@ -6031,17 +5958,16 @@ } }, "node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", @@ -6178,11 +6104,10 @@ } }, "node_modules/eslint-plugin-html": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-html/-/eslint-plugin-html-8.1.1.tgz", - "integrity": "sha512-6qmlJsc40D2m3Dn9oEH+0PAOkJhxVu0f5sVItqpCE0YWgYnyP4xCjBc3UWTHaJcY9ARkWOLIIuXLq0ndRnQOHw==", + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-html/-/eslint-plugin-html-8.1.2.tgz", + "integrity": "sha512-pbRchDV2SmqbCi/Ev/q3aAikzG9BcFe0IjjqjtMn8eTLq71ZUggyJB6CDmuwGAXmYZHrXI12XTfCqvgcnPRqGw==", "dev": true, - "license": "ISC", "dependencies": { "htmlparser2": "^9.1.0" }, @@ -6280,9 +6205,9 @@ } }, "node_modules/eslint-plugin-jsdoc": { - "version": "50.2.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-50.2.2.tgz", - "integrity": "sha512-i0ZMWA199DG7sjxlzXn5AeYZxpRfMJjDPUl7lL9eJJX8TPRoIaxJU4ys/joP5faM5AXE1eqW/dslCj3uj4Nqpg==", + "version": "50.2.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-50.2.4.tgz", + "integrity": "sha512-020jA+dXaXdb+TML3ZJBvpPmzwbNROjnYuTYi/g6A5QEmEjhptz4oPJDKkOGMIByNxsPpdTLzSU1HYVqebOX1w==", "dev": true, "dependencies": { "@es-joy/jsdoccomment": "~0.48.0", @@ -6775,6 +6700,21 @@ "dev": true, "license": "MIT" }, + "node_modules/express/node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -6847,6 +6787,20 @@ "dev": true, "license": "MIT" }, + "node_modules/fdir": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.3.0.tgz", + "integrity": "sha512-QOnuT+BOtivR77wYvCWHfGt9s4Pz1VIMbD463vegT5MLqNXy8rYFT/lPVEqf/bhYeT6qmqrNHhsX+rWwe3rOCQ==", + "dev": true, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, "node_modules/fflate": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", @@ -7824,15 +7778,6 @@ "dev": true, "license": "MIT" }, - "node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", - "dev": true, - "engines": { - "node": ">=16.17.0" - } - }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -8044,7 +7989,6 @@ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, - "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" }, @@ -8935,6 +8879,18 @@ "dev": true, "license": "MIT" }, + "node_modules/jest-util/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -9326,12 +9282,12 @@ } }, "node_modules/magic-string": { - "version": "0.30.10", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", - "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", + "version": "0.30.11", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", + "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", "dev": true, "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" + "@jridgewell/sourcemap-codec": "^1.5.0" } }, "node_modules/mapbox-gl": { @@ -9464,12 +9420,6 @@ "dev": true, "license": "MIT" }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -9503,6 +9453,18 @@ "node": ">=8.6" } }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/miller-rabin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", @@ -9560,18 +9522,6 @@ "node": ">= 0.6" } }, - "node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -9651,18 +9601,18 @@ "license": "MIT" }, "node_modules/mock-property": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/mock-property/-/mock-property-1.0.3.tgz", - "integrity": "sha512-2emPTb1reeLLYwHxyVx993iYyCHEiRRO+y8NFXFPL5kl5q14sgTK76cXyEKkeKCHeRw35SfdkUJ10Q1KfHuiIQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mock-property/-/mock-property-1.1.0.tgz", + "integrity": "sha512-1/JjbLoGwv87xVsutkX0XJc0M0W4kb40cZl/K41xtTViBOD9JuFPKfyMNTrLJ/ivYAd0aPqu/vduamXO0emTFQ==", "dev": true, - "license": "MIT", "dependencies": { - "define-data-property": "^1.1.1", + "define-data-property": "^1.1.4", "functions-have-names": "^1.2.3", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "hasown": "^2.0.0", - "isarray": "^2.0.5" + "has-property-descriptors": "^1.0.2", + "hasown": "^2.0.2", + "isarray": "^2.0.5", + "object-inspect": "^1.13.2" }, "engines": { "node": ">= 0.4" @@ -9675,8 +9625,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/module-deps": { "version": "6.2.3", @@ -10220,11 +10169,13 @@ } }, "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", "dev": true, - "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -10360,21 +10311,6 @@ "wrappy": "1" } }, - "node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/optionator": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", @@ -10684,20 +10620,18 @@ } }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", - "dev": true, - "license": "ISC" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", + "dev": true }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true, - "license": "MIT", "engines": { - "node": ">=8.6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" @@ -10740,12 +10674,12 @@ } }, "node_modules/playwright": { - "version": "1.47.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.47.0.tgz", - "integrity": "sha512-jOWiRq2pdNAX/mwLiwFYnPHpEZ4rM+fRSQpRHwEwZlP2PUANvL3+aJOF/bvISMhFD30rqMxUB4RJx9aQbfh4Ww==", + "version": "1.47.2", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.47.2.tgz", + "integrity": "sha512-nx1cLMmQWqmA3UsnjaaokyoUpdVaaDhJhMoxX2qj3McpjnsqFHs516QAKYhqHAgOP+oCFTEOCOAaD1RgD/RQfA==", "dev": true, "dependencies": { - "playwright-core": "1.47.0" + "playwright-core": "1.47.2" }, "bin": { "playwright": "cli.js" @@ -10758,9 +10692,9 @@ } }, "node_modules/playwright-core": { - "version": "1.47.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.47.0.tgz", - "integrity": "sha512-1DyHT8OqkcfCkYUD9zzUTfg7EfTd+6a8MkD/NWOvjo0u/SCNd5YmY/lJwFvUZOxJbWNds+ei7ic2+R/cRz/PDg==", + "version": "1.47.2", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.47.2.tgz", + "integrity": "sha512-3JvMfF+9LJfe16l7AbSmU555PaTl2tPyQsVInqm3id16pdDfvZ8TTZ/pyzmkbDrZTQefyzU7AIHlZqQnxpqHVQ==", "dev": true, "bin": { "playwright-core": "cli.js" @@ -10805,9 +10739,9 @@ } }, "node_modules/postcss": { - "version": "8.4.45", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.45.tgz", - "integrity": "sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==", + "version": "8.4.47", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", + "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", "dev": true, "funding": [ { @@ -10825,8 +10759,8 @@ ], "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" + "picocolors": "^1.1.0", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -10878,6 +10812,30 @@ "postcss": "^8.0.0" } }, + "node_modules/postcss-cli/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, "node_modules/postcss-cli/node_modules/globby": { "version": "14.0.1", "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.1.tgz", @@ -10912,6 +10870,30 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/postcss-cli/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss-cli/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, "node_modules/postcss-cli/node_modules/slash": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", @@ -11862,16 +11844,16 @@ } }, "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.1.tgz", + "integrity": "sha512-GkMg9uOTpIWWKbSsgwb5fA4EavTR+SG/PMPoAY8hkhHfEEY0/vqljY+XHqtDf2cr2IJtoNRDbrrEpZUiZCkYRw==", "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, "engines": { - "node": ">=8.10.0" + "node": ">= 14.16.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, "node_modules/regenerator-runtime": { @@ -12059,11 +12041,10 @@ } }, "node_modules/rollup": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.0.tgz", - "integrity": "sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.3.tgz", + "integrity": "sha512-7sqRtBNnEbcBtMeRVc6VRsJMmpI+JU1z9VTvW8D4gXIYQFz0aLcsE6rRkyghZkLfEgUZgVvOG7A5CVz/VW5GIA==", "dev": true, - "license": "MIT", "dependencies": { "@types/estree": "1.0.5" }, @@ -12075,22 +12056,22 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.18.0", - "@rollup/rollup-android-arm64": "4.18.0", - "@rollup/rollup-darwin-arm64": "4.18.0", - "@rollup/rollup-darwin-x64": "4.18.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.18.0", - "@rollup/rollup-linux-arm-musleabihf": "4.18.0", - "@rollup/rollup-linux-arm64-gnu": "4.18.0", - "@rollup/rollup-linux-arm64-musl": "4.18.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.18.0", - "@rollup/rollup-linux-riscv64-gnu": "4.18.0", - "@rollup/rollup-linux-s390x-gnu": "4.18.0", - "@rollup/rollup-linux-x64-gnu": "4.18.0", - "@rollup/rollup-linux-x64-musl": "4.18.0", - "@rollup/rollup-win32-arm64-msvc": "4.18.0", - "@rollup/rollup-win32-ia32-msvc": "4.18.0", - "@rollup/rollup-win32-x64-msvc": "4.18.0", + "@rollup/rollup-android-arm-eabi": "4.21.3", + "@rollup/rollup-android-arm64": "4.21.3", + "@rollup/rollup-darwin-arm64": "4.21.3", + "@rollup/rollup-darwin-x64": "4.21.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.21.3", + "@rollup/rollup-linux-arm-musleabihf": "4.21.3", + "@rollup/rollup-linux-arm64-gnu": "4.21.3", + "@rollup/rollup-linux-arm64-musl": "4.21.3", + "@rollup/rollup-linux-powerpc64le-gnu": "4.21.3", + "@rollup/rollup-linux-riscv64-gnu": "4.21.3", + "@rollup/rollup-linux-s390x-gnu": "4.21.3", + "@rollup/rollup-linux-x64-gnu": "4.21.3", + "@rollup/rollup-linux-x64-musl": "4.21.3", + "@rollup/rollup-win32-arm64-msvc": "4.21.3", + "@rollup/rollup-win32-ia32-msvc": "4.21.3", + "@rollup/rollup-win32-x64-msvc": "4.21.3", "fsevents": "~2.3.2" } }, @@ -12150,6 +12131,18 @@ "dev": true, "license": "MIT" }, + "node_modules/rollup-plugin-unassert/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/run-async": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", @@ -12350,50 +12343,112 @@ } }, "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "dev": true, - "license": "MIT", "dependencies": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "0.19.0" }, "engines": { "node": ">= 0.8.0" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "node_modules/serve-static/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "license": "ISC" + "dependencies": { + "ms": "2.0.0" + } }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "node_modules/serve-static/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/serve-static/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, "engines": { - "node": ">= 0.4" + "node": ">= 0.8" } }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "node_modules/serve-static/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/serve-static/node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-static/node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true, + "license": "ISC" + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12692,11 +12747,10 @@ } }, "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -13149,18 +13203,6 @@ "node": ">=0.10.0" } }, - "node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -13666,11 +13708,10 @@ } }, "node_modules/tape": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/tape/-/tape-5.8.1.tgz", - "integrity": "sha512-pUzADXBVYm5Jkneh9hfXnirADrzQrDA3vddKbPOc/ZLORj4dFQ6GR1KdGWX0/NvOLDcYkVgeMdw78Uf6BzO3KA==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/tape/-/tape-5.9.0.tgz", + "integrity": "sha512-czbGgxSVwRlbB3Ly/aqQrNwrDAzKHDW/kVXegp4hSFmR2c8qqm3hCgZbUy1+3QAQFGhPDG7J56UsV1uNilBFCA==", "dev": true, - "license": "MIT", "dependencies": { "@ljharb/resumer": "^0.1.3", "@ljharb/through": "^2.3.13", @@ -13687,8 +13728,8 @@ "inherits": "^2.0.4", "is-regex": "^1.1.4", "minimist": "^1.2.8", - "mock-property": "^1.0.3", - "object-inspect": "^1.13.1", + "mock-property": "^1.1.0", + "object-inspect": "^1.13.2", "object-is": "^1.1.6", "object-keys": "^1.1.1", "object.assign": "^4.1.5", @@ -13803,9 +13844,9 @@ "license": "MIT" }, "node_modules/testem": { - "version": "3.15.1", - "resolved": "https://registry.npmjs.org/testem/-/testem-3.15.1.tgz", - "integrity": "sha512-532OJy6VVsnDFEGZBdWVywvceNWdjdxJruC6qCDzLH586+eh1duWk5ju6QSRqQdP6gZB7zNiUJU9dSQdHPzFuA==", + "version": "3.15.2", + "resolved": "https://registry.npmjs.org/testem/-/testem-3.15.2.tgz", + "integrity": "sha512-mRzqZktqTCWi/rUP/RQOKXvMtuvY3lxuzBVb1xGXPnRNGMEj/1DaLGn6X447yOsz6SlWxSsZfcNuiE7fT1MOKg==", "dev": true, "dependencies": { "@xmldom/xmldom": "^0.8.0", @@ -13963,11 +14004,30 @@ } }, "node_modules/tinybench": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.8.0.tgz", - "integrity": "sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true + }, + "node_modules/tinyexec": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.0.tgz", + "integrity": "sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==", "dev": true }, + "node_modules/tinyglobby": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.6.tgz", + "integrity": "sha512-NbBoFBpqfcgd1tCiO8Lkfdk+xrA7mlLR9zgvZcZWQQwU63XAfUePyd6wZBaU93Hqw347lHnwFzttAkemHzzz4g==", + "dev": true, + "dependencies": { + "fdir": "^6.3.0", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/tinypool": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.0.tgz", @@ -13993,9 +14053,9 @@ } }, "node_modules/tinyspy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.0.tgz", - "integrity": "sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", + "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", "dev": true, "engines": { "node": ">=14.0.0" @@ -14112,9 +14172,9 @@ "dev": true }, "node_modules/tsx": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.0.tgz", - "integrity": "sha512-bV30kM7bsLZKZIOCHeMNVMJ32/LuJzLVajkQI/qf92J2Qr08ueLQvW00PUZGiuLPP760UINwupgUj8qrSCPUKg==", + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.1.tgz", + "integrity": "sha512-0flMz1lh74BR4wOvBjuh9olbnwqCPc35OOlfyzHba0Dc+QNUeWX/Gq2YTbnwcWPO3BMd8fkzRVrHcsR+a7z7rA==", "dev": true, "dependencies": { "esbuild": "~0.23.0", @@ -14130,122 +14190,545 @@ "fsevents": "~2.3.3" } }, - "node_modules/tty-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", - "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", - "dev": true, - "license": "MIT" - }, - "node_modules/tweakpane": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/tweakpane/-/tweakpane-4.0.4.tgz", - "integrity": "sha512-RkWD54zDlEbnN01wQPk0ANHGbdCvlJx/E8A1QxhTfCbX+ROWos1Ws2MnhOm39aUGMOh+36TjUwpDmLfmwTr1Fg==", + "node_modules/tsx/node_modules/@esbuild/aix-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", + "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", + "cpu": [ + "ppc64" + ], "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/cocopon" + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" } }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "node_modules/tsx/node_modules/@esbuild/android-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", + "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", + "cpu": [ + "arm" + ], "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">= 0.8.0" + "node": ">=18" } }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "node_modules/tsx/node_modules/@esbuild/android-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", + "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "(MIT OR CC0-1.0)", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "node_modules/tsx/node_modules/@esbuild/android-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", + "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">= 0.6" + "node": ">=18" } }, - "node_modules/typed-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", + "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">= 0.4" + "node": ">=18" } }, - "node_modules/typed-array-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "node_modules/tsx/node_modules/@esbuild/darwin-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", + "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=18" } }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", + "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=18" } }, - "node_modules/typed-array-length": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", + "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", + "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", + "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", + "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-loong64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", + "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", + "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", + "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", + "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-s390x": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", + "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", + "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", + "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openbsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz", + "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", + "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/sunos-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", + "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", + "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", + "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz", + "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/esbuild": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", + "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.23.1", + "@esbuild/android-arm": "0.23.1", + "@esbuild/android-arm64": "0.23.1", + "@esbuild/android-x64": "0.23.1", + "@esbuild/darwin-arm64": "0.23.1", + "@esbuild/darwin-x64": "0.23.1", + "@esbuild/freebsd-arm64": "0.23.1", + "@esbuild/freebsd-x64": "0.23.1", + "@esbuild/linux-arm": "0.23.1", + "@esbuild/linux-arm64": "0.23.1", + "@esbuild/linux-ia32": "0.23.1", + "@esbuild/linux-loong64": "0.23.1", + "@esbuild/linux-mips64el": "0.23.1", + "@esbuild/linux-ppc64": "0.23.1", + "@esbuild/linux-riscv64": "0.23.1", + "@esbuild/linux-s390x": "0.23.1", + "@esbuild/linux-x64": "0.23.1", + "@esbuild/netbsd-x64": "0.23.1", + "@esbuild/openbsd-arm64": "0.23.1", + "@esbuild/openbsd-x64": "0.23.1", + "@esbuild/sunos-x64": "0.23.1", + "@esbuild/win32-arm64": "0.23.1", + "@esbuild/win32-ia32": "0.23.1", + "@esbuild/win32-x64": "0.23.1" + } + }, + "node_modules/tty-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tweakpane": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/tweakpane/-/tweakpane-4.0.4.tgz", + "integrity": "sha512-RkWD54zDlEbnN01wQPk0ANHGbdCvlJx/E8A1QxhTfCbX+ROWos1Ws2MnhOm39aUGMOh+36TjUwpDmLfmwTr1Fg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/cocopon" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", "dev": true, "license": "MIT", @@ -14285,14 +14768,14 @@ } }, "node_modules/typescript-eslint": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.5.0.tgz", - "integrity": "sha512-uD+XxEoSIvqtm4KE97etm32Tn5MfaZWgWfMMREStLxR6JzvHkc2Tkj7zhTEK5XmtpTmKHNnG8Sot6qDfhHtR1Q==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.7.0.tgz", + "integrity": "sha512-nEHbEYJyHwsuf7c3V3RS7Saq+1+la3i0ieR3qP0yjqWSzVmh8Drp47uOl9LjbPANac4S7EFSqvcYIKXUUwIfIQ==", "dev": true, "dependencies": { - "@typescript-eslint/eslint-plugin": "8.5.0", - "@typescript-eslint/parser": "8.5.0", - "@typescript-eslint/utils": "8.5.0" + "@typescript-eslint/eslint-plugin": "8.7.0", + "@typescript-eslint/parser": "8.7.0", + "@typescript-eslint/utils": "8.7.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -14585,14 +15068,14 @@ } }, "node_modules/vite": { - "version": "5.3.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.5.tgz", - "integrity": "sha512-MdjglKR6AQXQb9JGiS7Rc2wC6uMjcm7Go/NHNO63EwiJXfuk9PgqiP/n5IDJCziMkfw9n4Ubp7lttNwz+8ZVKA==", + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.6.tgz", + "integrity": "sha512-IeL5f8OO5nylsgzd9tq4qD2QqI0k2CQLGrWD0rCN0EQJZpBK5vJAx0I+GDkMOXxQX/OfFHMuLIx6ddAxGX/k+Q==", "dev": true, "dependencies": { "esbuild": "^0.21.3", - "postcss": "^8.4.39", - "rollup": "^4.13.0" + "postcss": "^8.4.43", + "rollup": "^4.20.0" }, "bin": { "vite": "bin/vite.js" @@ -14611,6 +15094,7 @@ "less": "*", "lightningcss": "^1.21.0", "sass": "*", + "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" @@ -14628,6 +15112,9 @@ "sass": { "optional": true }, + "sass-embedded": { + "optional": true + }, "stylus": { "optional": true }, @@ -14640,15 +15127,14 @@ } }, "node_modules/vite-node": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.0.5.tgz", - "integrity": "sha512-LdsW4pxj0Ot69FAoXZ1yTnA9bjGohr2yNBU7QKRxpz8ITSkhuDl6h3zS/tvgz4qrNjeRnvrWeXQ8ZF7Um4W00Q==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.1.tgz", + "integrity": "sha512-N/mGckI1suG/5wQI35XeR9rsMsPqKXzq1CdUndzVstBj/HvyxxGctwnK6WX43NGt5L3Z5tcRf83g4TITKJhPrA==", "dev": true, "dependencies": { "cac": "^6.7.14", - "debug": "^4.3.5", + "debug": "^4.3.6", "pathe": "^1.1.2", - "tinyrainbow": "^1.2.0", "vite": "^5.0.0" }, "bin": { @@ -15075,29 +15561,29 @@ } }, "node_modules/vitest": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.0.5.tgz", - "integrity": "sha512-8GUxONfauuIdeSl5f9GTgVEpg5BTOlplET4WEDaeY2QBiN8wSm68vxN/tb5z405OwppfoCavnwXafiaYBC/xOA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.1.tgz", + "integrity": "sha512-97We7/VC0e9X5zBVkvt7SGQMGrRtn3KtySFQG5fpaMlS+l62eeXRQO633AYhSTC3z7IMebnPPNjGXVGNRFlxBA==", "dev": true, "dependencies": { - "@ampproject/remapping": "^2.3.0", - "@vitest/expect": "2.0.5", - "@vitest/pretty-format": "^2.0.5", - "@vitest/runner": "2.0.5", - "@vitest/snapshot": "2.0.5", - "@vitest/spy": "2.0.5", - "@vitest/utils": "2.0.5", + "@vitest/expect": "2.1.1", + "@vitest/mocker": "2.1.1", + "@vitest/pretty-format": "^2.1.1", + "@vitest/runner": "2.1.1", + "@vitest/snapshot": "2.1.1", + "@vitest/spy": "2.1.1", + "@vitest/utils": "2.1.1", "chai": "^5.1.1", - "debug": "^4.3.5", - "execa": "^8.0.1", - "magic-string": "^0.30.10", + "debug": "^4.3.6", + "magic-string": "^0.30.11", "pathe": "^1.1.2", "std-env": "^3.7.0", - "tinybench": "^2.8.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.0", "tinypool": "^1.0.0", "tinyrainbow": "^1.2.0", "vite": "^5.0.0", - "vite-node": "2.0.5", + "vite-node": "2.1.1", "why-is-node-running": "^2.3.0" }, "bin": { @@ -15112,8 +15598,8 @@ "peerDependencies": { "@edge-runtime/vm": "*", "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "2.0.5", - "@vitest/ui": "2.0.5", + "@vitest/browser": "2.1.1", + "@vitest/ui": "2.1.1", "happy-dom": "*", "jsdom": "*" }, @@ -15138,80 +15624,6 @@ } } }, - "node_modules/vitest/node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/vitest/node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "dev": true, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vitest/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vitest/node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", - "dev": true, - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vitest/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", @@ -15636,7 +16048,7 @@ }, "src/style-spec": { "name": "@mapbox/mapbox-gl-style-spec", - "version": "14.7.0-beta.1", + "version": "14.7.0", "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { "@mapbox/jsonlint-lines-primitives": "~2.0.2", diff --git a/package.json b/package.json index c5b38878000..01ac5bd0ecc 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "mapbox-gl", "description": "A WebGL interactive maps library", - "version": "3.7.0-beta.1", + "version": "3.7.0", "main": "dist/mapbox-gl.js", "style": "dist/mapbox-gl.css", "types": "dist/mapbox-gl.d.ts", @@ -48,24 +48,24 @@ "devDependencies": { "@mapbox/mvt-fixtures": "^3.10.0", "@octokit/rest": "^21.0.2", - "@rollup/plugin-commonjs": "^26.0.1", + "@rollup/plugin-commonjs": "^28.0.0", "@rollup/plugin-json": "^6.1.0", - "@rollup/plugin-node-resolve": "^15.2.3", - "@rollup/plugin-replace": "^5.0.7", + "@rollup/plugin-node-resolve": "^15.3.0", + "@rollup/plugin-replace": "^6.0.1", "@rollup/plugin-strip": "^3.0.4", "@rollup/plugin-terser": "^0.4.4", "@tweakpane/core": "^2.0.4", - "@types/jest": "^29.5.12", - "@types/node": "^22.5.4", + "@types/jest": "^29.5.13", + "@types/node": "^22.6.1", "@types/offscreencanvas": "^2019.7.3", - "@typescript-eslint/eslint-plugin": "^8.5.0", - "@typescript-eslint/parser": "^8.5.0", - "@vitest/browser": "^2.0.5", + "@typescript-eslint/eslint-plugin": "^8.7.0", + "@typescript-eslint/parser": "^8.7.0", + "@vitest/browser": "^2.1.1", "@vitest/ui": "^2.0.3", "address": "^2.0.3", "browserify": "^17.0.0", "chalk": "^5.0.1", - "chokidar": "^3.6.0", + "chokidar": "^4.0.1", "cross-env": "^7.0.3", "cssnano": "^7.0.6", "d3-queue": "^3.0.7", @@ -73,13 +73,13 @@ "dts-bundle-generator": "^9.5.1", "ejs": "^3.1.10", "envify": "^4.1.0", - "esbuild": "^0.23.1", - "eslint": "^8.57.0", + "esbuild": "^0.24.0", + "eslint": "^8.57.1", "eslint-config-mourner": "^3.0.0", "eslint-import-resolver-typescript": "^3.6.3", - "eslint-plugin-html": "^8.1.1", + "eslint-plugin-html": "^8.1.2", "eslint-plugin-import": "^2.30.0", - "eslint-plugin-jsdoc": "^50.2.2", + "eslint-plugin-jsdoc": "^50.2.4", "glob": "^11.0.0", "is-builtin-module": "^4.0.0", "jest-extended": "^4.0.2", @@ -93,8 +93,8 @@ "npm-font-open-sans": "^1.1.0", "npm-run-all": "^4.1.5", "pixelmatch": "^6.0.0", - "playwright": "^1.47.0", - "postcss": "^8.4.45", + "playwright": "^1.47.2", + "postcss": "^8.4.47", "postcss-cli": "^11.0.0", "postcss-inline-svg": "^6.0.0", "pretty-bytes": "^6.0.0", @@ -102,18 +102,18 @@ "rollup": "^4.18.0", "rollup-plugin-esbuild": "^6.1.1", "rollup-plugin-unassert": "^0.6.0", - "serve-static": "^1.15.0", + "serve-static": "^1.16.2", "shuffle-seed": "^1.1.6", "st": "^3.0.0", "stylelint": "^16.9.0", "stylelint-config-standard": "^36.0.1", - "tape": "^5.8.1", + "tape": "^5.9.0", "tape-filter": "^1.0.4", - "testem": "^3.15.1", - "tsx": "^4.19.0", + "testem": "^3.15.2", + "tsx": "^4.19.1", "tweakpane": "^4.0.4", "typescript": "^5.6.2", - "typescript-eslint": "^8.5.0", + "typescript-eslint": "^8.7.0", "utility-types": "^3.11.0", "vite-plugin-arraybuffer": "^0.0.8", "vitest": "^2.0.3" diff --git a/src/data/bucket.ts b/src/data/bucket.ts index 9990c927ddc..9aa4d2a56fb 100644 --- a/src/data/bucket.ts +++ b/src/data/bucket.ts @@ -55,7 +55,7 @@ export type BucketFeature = { sourceLayerIndex: number; geometry: Array>; properties: any; - type: 1 | 2 | 3; + type: 0 | 1 | 2 | 3; id?: any; readonly patterns: { [_: string]: string; diff --git a/src/data/bucket/circle_bucket.ts b/src/data/bucket/circle_bucket.ts index c6abc60de34..15b97922f1e 100644 --- a/src/data/bucket/circle_bucket.ts +++ b/src/data/bucket/circle_bucket.ts @@ -122,11 +122,9 @@ class CircleBucket implement const bucketFeature: BucketFeature = { id, properties: feature.properties, - // @ts-expect-error - TS2322 - Type '0 | 2 | 1 | 3' is not assignable to type '2 | 1 | 3'. type: feature.type, sourceLayerIndex, index, - // @ts-expect-error - TS2345 - Argument of type 'VectorTileFeature' is not assignable to parameter of type 'FeatureWithGeometry'. geometry: needGeometry ? evaluationFeature.geometry : loadGeometry(feature, canonical, tileTransform), patterns: {}, sortKey diff --git a/src/data/bucket/clip_bucket.ts b/src/data/bucket/clip_bucket.ts index 5065e2547c2..3bd8a1623f6 100644 --- a/src/data/bucket/clip_bucket.ts +++ b/src/data/bucket/clip_bucket.ts @@ -68,11 +68,9 @@ class ClipBucket implements Bucket { const bucketFeature: BucketFeature = { id, properties: feature.properties, - // @ts-expect-error - TS2322 - Type '0 | 2 | 1 | 3' is not assignable to type '2 | 1 | 3'. type: feature.type, sourceLayerIndex, index, - // @ts-expect-error - TS2345 - Argument of type 'VectorTileFeature' is not assignable to parameter of type 'FeatureWithGeometry'. geometry: needGeometry ? evaluationFeature.geometry : loadGeometry(feature, canonical, tileTransform), patterns: {} }; diff --git a/src/data/bucket/fill_bucket.ts b/src/data/bucket/fill_bucket.ts index 853b83f9813..9f7282e5ff8 100644 --- a/src/data/bucket/fill_bucket.ts +++ b/src/data/bucket/fill_bucket.ts @@ -101,11 +101,9 @@ class FillBucket implements Bucket { const bucketFeature: BucketFeature = { id, properties: feature.properties, - // @ts-expect-error - TS2322 - Type '0 | 2 | 1 | 3' is not assignable to type '2 | 1 | 3'. type: feature.type, sourceLayerIndex, index, - // @ts-expect-error - TS2345 - Argument of type 'VectorTileFeature' is not assignable to parameter of type 'FeatureWithGeometry'. geometry: needGeometry ? evaluationFeature.geometry : loadGeometry(feature, canonical, tileTransform), patterns: {}, sortKey diff --git a/src/data/bucket/fill_extrusion_bucket.ts b/src/data/bucket/fill_extrusion_bucket.ts index 2e70d353799..e4f1c280fd2 100644 --- a/src/data/bucket/fill_extrusion_bucket.ts +++ b/src/data/bucket/fill_extrusion_bucket.ts @@ -66,7 +66,8 @@ export const fillExtrusionDefaultDataDrivenProperties: Array = [ 'fill-extrusion-color', 'fill-extrusion-pattern', 'fill-extrusion-flood-light-wall-radius', - 'fill-extrusion-line-width' + 'fill-extrusion-line-width', + 'fill-extrusion-emissive-strength' ]; export const fillExtrusionGroundDataDrivenProperties: Array = [ @@ -741,10 +742,8 @@ class FillExtrusionBucket implements Bucket { id, sourceLayerIndex, index, - // @ts-expect-error - TS2345 - Argument of type 'VectorTileFeature' is not assignable to parameter of type 'FeatureWithGeometry'. geometry: needGeometry ? evaluationFeature.geometry : loadGeometry(feature, canonical, tileTransform), properties: feature.properties, - // @ts-expect-error - TS2322 - Type '0 | 2 | 1 | 3' is not assignable to type '2 | 1 | 3'. type: feature.type, patterns: {} }; @@ -863,7 +862,7 @@ class FillExtrusionBucket implements Bucket { const floodLightRadius = this.layers[0].paint.get('fill-extrusion-flood-light-ground-radius').evaluate(feature, {}); const maxRadius = floodLightRadius / this.tileToMeter; - const tileBounds = [new Point(0, 0), new Point(EXTENT, EXTENT)]; + const tileBounds: [Point, Point] = [new Point(0, 0), new Point(EXTENT, EXTENT)]; const projection = tileTransform.projection; const isGlobe = projection.name === 'globe'; // If wallMode is used, LineString geometries will be converted into polygons @@ -923,12 +922,10 @@ class FillExtrusionBucket implements Bucket { // for a tile depends on the zoom level. For example tile with z=0 requires 2⁴ // subdivisions, tile with z=1 2³ etc. The subdivision is done in polar coordinates // instead of tile coordinates. - // @ts-expect-error - TS2345 - Argument of type 'Point[]' is not assignable to parameter of type '[Point, Point]'. clippedPolygons = resampleFillExtrusionPolygonsForGlobe(polygons, tileBounds, canonical); } else { clippedPolygons = []; for (const polygon of polygons) { - // @ts-expect-error - TS2322 - Type 'Point[]' is not assignable to type '[Point, Point]'. clippedPolygons.push({polygon, bounds: tileBounds}); } } diff --git a/src/data/bucket/line_bucket.ts b/src/data/bucket/line_bucket.ts index 9dc7611089e..129b19e1dba 100644 --- a/src/data/bucket/line_bucket.ts +++ b/src/data/bucket/line_bucket.ts @@ -204,11 +204,9 @@ class LineBucket implements Bucket { const bucketFeature: BucketFeature = { id, properties: feature.properties, - // @ts-expect-error - TS2322 - Type '0 | 2 | 1 | 3' is not assignable to type '2 | 1 | 3'. type: feature.type, sourceLayerIndex, index, - // @ts-expect-error - TS2345 - Argument of type 'VectorTileFeature' is not assignable to parameter of type 'FeatureWithGeometry'. geometry: needGeometry ? evaluationFeature.geometry : loadGeometry(feature, canonical, tileTransform), patterns: {}, sortKey diff --git a/src/data/bucket/symbol_bucket.ts b/src/data/bucket/symbol_bucket.ts index ee22242a175..eb73e3c8279 100644 --- a/src/data/bucket/symbol_bucket.ts +++ b/src/data/bucket/symbol_bucket.ts @@ -112,7 +112,7 @@ export type SymbolFeature = { sourceLayerIndex: number; geometry: Array>; properties: any; - type: 'Point' | 'LineString' | 'Polygon'; + type: 'Unknown' | 'Point' | 'LineString' | 'Polygon'; id?: any; }; @@ -597,7 +597,6 @@ class SymbolBucket implements Bucket { continue; } - // @ts-expect-error - TS2345 - Argument of type 'VectorTileFeature' is not assignable to parameter of type 'FeatureWithGeometry'. if (!needGeometry) evaluationFeature.geometry = loadGeometry(feature, canonical, tileTransform); if (isGlobe && feature.type !== 1 && canonical.z <= 5) { @@ -668,7 +667,6 @@ class SymbolBucket implements Bucket { sourceLayerIndex, geometry: evaluationFeature.geometry, properties: feature.properties, - // @ts-expect-error - TS2322 - Type '"Polygon" | "Point" | "LineString" | "Unknown"' is not assignable to type '"Polygon" | "Point" | "LineString"'. type: vectorTileFeatureTypes[feature.type], sortKey }; diff --git a/src/data/dem_data.ts b/src/data/dem_data.ts index 73e34e89666..241eb6498d1 100644 --- a/src/data/dem_data.ts +++ b/src/data/dem_data.ts @@ -22,7 +22,7 @@ import type {DEMSourceEncoding} from '../source/worker_source'; const unpackVectors = { mapbox: [6553.6, 25.6, 0.1, 10000.0], terrarium: [256.0, 1.0, 1.0 / 256.0, 32768.0] -}; +} as const; function unpackMapbox(r: number, g: number, b: number): number { // unpacking formula for mapbox.terrain-rgb: @@ -64,10 +64,11 @@ export default class DEMData { // debugger; this.uid = uid; if (data.height !== data.width) throw new RangeError('DEM tiles must be square'); - // @ts-expect-error - TS2322 - Type 'void' is not assignable to type 'DEMData'. | TS2409 - Return type of constructor signature must be assignable to the instance type of the class. - if (sourceEncoding && sourceEncoding !== "mapbox" && sourceEncoding !== "terrarium") return warnOnce( - `"${sourceEncoding}" is not a valid encoding type. Valid types include "mapbox" and "terrarium".` - ); + if (sourceEncoding && sourceEncoding !== "mapbox" && sourceEncoding !== "terrarium") { + warnOnce(`"${sourceEncoding}" is not a valid encoding type. Valid types include "mapbox" and "terrarium".`); + return; + } + this.stride = data.height; const dim = this.dim = data.height - 2; const values = new Uint32Array(data.data.buffer); @@ -130,8 +131,7 @@ export default class DEMData { return v - p; } - static getUnpackVector(encoding: DEMSourceEncoding): [number, number, number, number] { - // @ts-expect-error - TS2322 - Type 'number[]' is not assignable to type '[number, number, number, number]'. + static getUnpackVector(encoding: DEMSourceEncoding) { return unpackVectors[encoding]; } @@ -141,7 +141,7 @@ export default class DEMData { } static pack(altitude: number, encoding: DEMSourceEncoding): [number, number, number, number] { - const color = [0, 0, 0, 0]; + const color: [number, number, number, number] = [0, 0, 0, 0]; const vector = DEMData.getUnpackVector(encoding); let v = Math.floor((altitude + vector[3]) / vector[2]); color[2] = v % 256; @@ -149,7 +149,6 @@ export default class DEMData { color[1] = v % 256; v = Math.floor(v / 256); color[0] = v; - // @ts-expect-error - TS2322 - Type 'number[]' is not assignable to type '[number, number, number, number]'. return color; } diff --git a/src/data/evaluation_feature.ts b/src/data/evaluation_feature.ts index ec7dffa5903..5e052d9ddf3 100644 --- a/src/data/evaluation_feature.ts +++ b/src/data/evaluation_feature.ts @@ -4,7 +4,7 @@ import type Point from '@mapbox/point-geometry'; import type {VectorTileFeature} from '@mapbox/vector-tile'; export type EvaluationFeature = { - readonly type: 1 | 2 | 3 | 'Unknown' | 'Point' | 'LineString' | 'Polygon'; + readonly type: 0 | 1 | 2 | 3 | 'Unknown' | 'Point' | 'LineString' | 'Polygon'; readonly id?: any; readonly properties: { [_: string]: any; @@ -23,10 +23,10 @@ export type EvaluationFeature = { * @private */ export default function toEvaluationFeature(feature: VectorTileFeature, needGeometry: boolean): EvaluationFeature { -// @ts-expect-error - TS2322 - Type '0 | 2 | 1 | 3' is not assignable to type '2 | 1 | 3 | "Polygon" | "Point" | "LineString" | "Unknown"'. - return {type: feature.type, + return { + type: feature.type, id: feature.id, properties:feature.properties, - // @ts-expect-error - TS2345 - Argument of type 'VectorTileFeature' is not assignable to parameter of type 'FeatureWithGeometry'. - geometry: needGeometry ? loadGeometry(feature) : []}; + geometry: needGeometry ? loadGeometry(feature) : [] + }; } diff --git a/src/data/feature_index.ts b/src/data/feature_index.ts index 0fe9736d957..2e411c78c8e 100644 --- a/src/data/feature_index.ts +++ b/src/data/feature_index.ts @@ -134,18 +134,13 @@ class FeatureIndex { // Finds non-symbol features in this tile at a particular position. query( args: QueryParameters, - styleLayers: { - [_: string]: StyleLayer; - }, - serializedLayers: { - [_: string]: any; - }, + styleLayers: {[_: string]: StyleLayer}, + serializedLayers: {[_: string]: any}, sourceFeatureState: SourceFeatureState, ): QueryResult { this.loadVTLayers(); - const params = args.params || {}, - // @ts-expect-error - TS2339 - Property 'filter' does not exist on type '{}'. - filter = featureFilter(params.filter); + const params = args.params || ({} as Partial); + const filter = featureFilter(params.filter); const tilespaceGeometry = args.tileResult; const transform = args.transform; @@ -189,16 +184,13 @@ class FeatureIndex { result, match, filter, - // @ts-expect-error - TS2339 - Property 'layers' does not exist on type '{}'. params.layers, - // @ts-expect-error - TS2339 - Property 'availableImages' does not exist on type '{}'. params.availableImages, styleLayers, serializedLayers, sourceFeatureState, (feature: VectorTileFeature, styleLayer: StyleLayer, featureState: any, layoutVertexArrayOffset: number = 0) => { if (!featureGeometry) { - // @ts-expect-error - TS2345 - Argument of type 'VectorTileFeature' is not assignable to parameter of type 'FeatureWithGeometry'. featureGeometry = loadGeometry(feature, this.tileID.canonical, args.tileTransform); } @@ -244,7 +236,6 @@ class FeatureIndex { if (!filter.filter(new EvaluationParameters(this.tileID.overscaledZ), evaluationFeature, this.tileID.canonical)) { return; } - // @ts-expect-error - TS2345 - Argument of type 'VectorTileFeature' is not assignable to parameter of type 'Feature'. } else if (!filter.filter(new EvaluationParameters(this.tileID.overscaledZ), feature)) { return; } diff --git a/src/data/load_geometry.ts b/src/data/load_geometry.ts index 757c5f7c870..607f29fedae 100644 --- a/src/data/load_geometry.ts +++ b/src/data/load_geometry.ts @@ -31,7 +31,7 @@ function preparePoint(point: Point, scale: number) { // a subset of VectorTileGeometry interface FeatureWithGeometry { extent: number; - type: 1 | 2 | 3; + type: 0 | 1 | 2 | 3; loadGeometry: () => Array>; } diff --git a/src/data/program_configuration.ts b/src/data/program_configuration.ts index cdacfb17bd7..10986d3c0c8 100644 --- a/src/data/program_configuration.ts +++ b/src/data/program_configuration.ts @@ -525,7 +525,6 @@ export default class ProgramConfiguration { const state = featureStates[id.toString()]; featureMap.eachPosition(id, (index, start, end) => { const feature = vtLayer.feature(index); - // @ts-expect-error - TS2345 - Argument of type 'VectorTileFeature' is not assignable to parameter of type 'Feature'. (binder as AttributeBinder).updatePaintArray(start, end, feature, state, availableImages, imagePositions, brightness); }); } @@ -534,7 +533,6 @@ export default class ProgramConfiguration { const state = featureStates[id.toString()]; featureMapWithoutIds.eachPosition(id, (index, start, end) => { const feature = vtLayer.feature(index); - // @ts-expect-error - TS2345 - Argument of type 'VectorTileFeature' is not assignable to parameter of type 'Feature'. (binder as AttributeBinder).updatePaintArray(start, end, feature, state, availableImages, imagePositions, brightness); }); } @@ -609,8 +607,7 @@ export default class ProgramConfiguration { // Uniform state bindings are owned by the Program, but we set them // from within the ProgramConfiguration's binder members. for (const {name, property, binding} of binderUniforms) { - // @ts-expect-error - TS2345 - Argument of type 'string' is not assignable to parameter of type 'keyof Properties'. - (this.binders[property] as any).setUniform(program, binding, globals, properties.get(property), name); + (this.binders[property] as any).setUniform(program, binding, globals, properties.get(property as keyof Properties), name); } } diff --git a/src/geo/lng_lat.ts b/src/geo/lng_lat.ts index b7f16cd9f66..9dca39670f9 100644 --- a/src/geo/lng_lat.ts +++ b/src/geo/lng_lat.ts @@ -13,7 +13,7 @@ export function csLatLngToECEF(cosLat: number, sinLat: number, lng: number, radi return [sx, sy, sz]; } -export function ecefToLatLng([x, y, z]: [any, any, any]): LngLat { +export function ecefToLatLng([x, y, z]: [number, number, number]): LngLat { const radius = Math.hypot(x, y, z); const lng = Math.atan2(x, z); const lat = Math.PI * 0.5 - Math.acos(-y / radius); @@ -503,8 +503,8 @@ export class LngLatBounds { * console.log(llb); // = LngLatBounds {_sw: LngLat {lng: -73.9876, lat: 40.7661}, _ne: LngLat {lng: -73.9397, lat: 40.8002}} */ static convert(input: LngLatBoundsLike): LngLatBounds { - // @ts-expect-error - TS2322 - Type 'LngLatBoundsLike' is not assignable to type 'LngLatBounds'. - if (!input || input instanceof LngLatBounds) return input; + if (!input) return; + if (input instanceof LngLatBounds) return input; return new LngLatBounds(input); } } diff --git a/src/geo/projection/far_z.ts b/src/geo/projection/far_z.ts index 289bad1e5b6..88f63a2a903 100644 --- a/src/geo/projection/far_z.ts +++ b/src/geo/projection/far_z.ts @@ -19,10 +19,16 @@ export function farthestPixelDistanceOnPlane(tr: Transform, pixelsPerMeter: numb const topHalfSurfaceDistance = Math.sin(fovAboveCenter) * cameraToSeaLevelDistance / Math.sin(Math.max(Math.PI / 2.0 - tr._pitch - fovAboveCenter, 0.01)); // Calculate z distance of the farthest fragment that should be rendered. - const furthestDistance = Math.sin(tr._pitch) * topHalfSurfaceDistance + cameraToSeaLevelDistance; + let furthestDistance = Math.sin(tr._pitch) * topHalfSurfaceDistance + cameraToSeaLevelDistance; const horizonDistance = cameraToSeaLevelDistance * (1 / tr._horizonShift); // Add a bit extra to avoid precision problems when a fragment's distance is exactly `furthestDistance` + // Due to precision of sources with low maxZoom, content is prone to flickering on zoom above 18. + // Use larger furthest distance also on pitch before the horizon, especially on higher zoom to limit + // the performance and depth range resolution impact. + if (!tr.elevation || tr.elevation.exaggeration() === 0) { + furthestDistance *= (1.0 + Math.max(tr.zoom - 17, 0)); + } return Math.min(furthestDistance * 1.01, horizonDistance); } diff --git a/src/gl/types.ts b/src/gl/types.ts index 3ca385f4b81..7bbdf731ece 100644 --- a/src/gl/types.ts +++ b/src/gl/types.ts @@ -51,7 +51,7 @@ export type StencilTest = { mask: number; } | { func: WebGL2RenderingContext['ALWAYS']; - mask: 0; + mask: 0 | 0xFF; }; export type CullFaceModeType = WebGL2RenderingContext['FRONT'] | WebGL2RenderingContext['BACK'] | WebGL2RenderingContext['FRONT_AND_BACK']; diff --git a/src/render/draw_background.ts b/src/render/draw_background.ts index 36b2dcb409d..1024e733ed1 100644 --- a/src/render/draw_background.ts +++ b/src/render/draw_background.ts @@ -6,8 +6,9 @@ import { backgroundUniformValues, backgroundPatternUniformValues } from './program/background_program'; +import {OverscaledTileID} from '../source/tile_id'; +import {mat4} from 'gl-matrix'; -import type {OverscaledTileID} from '../source/tile_id'; import type Painter from './painter'; import type SourceCache from '../source/source_cache'; import type BackgroundStyleLayer from '../style/style_layer/background_style_layer'; @@ -19,6 +20,7 @@ function drawBackground(painter: Painter, sourceCache: SourceCache, layer: Backg const color = layer.paint.get('background-color'); const opacity = layer.paint.get('background-opacity'); const emissiveStrength = layer.paint.get('background-emissive-strength'); + const isViewportPitch = layer.paint.get('background-pitch-alignment') === 'viewport'; if (opacity === 0) return; @@ -60,6 +62,23 @@ function drawBackground(painter: Painter, sourceCache: SourceCache, layer: Backg painter.imageManager.bind(painter.context, layer.scope); } + if (isViewportPitch) { + // Set overrideRtt to ignore 3D lights + const program = painter.getOrCreateProgram(programName, {overrideFog: false, overrideRtt: true}); + const matrix = new Float32Array(mat4.identity([] as any)); + const tileID = new OverscaledTileID(0, 0, 0, 0, 0); + + const uniformValues = image ? + backgroundPatternUniformValues(matrix, emissiveStrength, opacity, painter, image, layer.scope, patternPosition, isViewportPitch, {tileID, tileSize}) : + backgroundUniformValues(matrix, emissiveStrength, opacity, color.toRenderColor(layer.lut)); + + // @ts-expect-error - TS2554 - Expected 12-16 arguments, but got 11. + program.draw(painter, gl.TRIANGLES, depthMode, stencilMode, colorMode, CullFaceMode.disabled, + uniformValues, layer.id, painter.viewportBuffer, + painter.quadTriangleIndexBuffer, painter.viewportSegments); + return; + } + for (const tileID of tileIDs) { const affectedByFog = painter.isTileAffectedByFog(tileID); const program = painter.getOrCreateProgram(programName, {overrideFog: affectedByFog}); @@ -72,7 +91,7 @@ function drawBackground(painter: Painter, sourceCache: SourceCache, layer: Backg const uniformValues = image ? - backgroundPatternUniformValues(matrix, emissiveStrength, opacity, painter, image, layer.scope, patternPosition, {tileID, tileSize}) : + backgroundPatternUniformValues(matrix, emissiveStrength, opacity, painter, image, layer.scope, patternPosition, isViewportPitch, {tileID, tileSize}) : backgroundUniformValues(matrix, emissiveStrength, opacity, color.toRenderColor(layer.lut)); diff --git a/src/render/draw_debug.ts b/src/render/draw_debug.ts index a8cd1d3210b..4eade631d11 100644 --- a/src/render/draw_debug.ts +++ b/src/render/draw_debug.ts @@ -11,6 +11,7 @@ import {mat4} from 'gl-matrix'; import type Painter from './painter'; import type SourceCache from '../source/source_cache'; import type {OverscaledTileID} from '../source/tile_id'; +import type {DynamicDefinesType} from './program/program_uniforms'; const topColor = new Color(1, 0, 0, 1); const btmColor = new Color(0, 1, 0, 1); @@ -63,7 +64,7 @@ function drawDebugTile(painter: Painter, sourceCache: SourceCache, coord: Oversc const gl = context.gl; const isGlobeProjection = tr.projection.name === 'globe'; - const definesValues = isGlobeProjection ? ['PROJECTION_GLOBE_VIEW'] : []; + const definesValues: DynamicDefinesType[] = isGlobeProjection ? ['PROJECTION_GLOBE_VIEW'] : []; let posMatrix = mat4.clone(coord.projMatrix); @@ -86,7 +87,6 @@ function drawDebugTile(painter: Painter, sourceCache: SourceCache, coord: Oversc mat4.multiply(posMatrix, jitterMatrix, posMatrix); - // @ts-expect-error - TS2322 - Type 'string[]' is not assignable to type 'DynamicDefinesType[]'. const program = painter.getOrCreateProgram('debug', {defines: definesValues}); const tile = sourceCache.getTileByID(coord.key); if (painter.terrain) painter.terrain.setupElevationDraw(tile, program); diff --git a/src/render/draw_fill.ts b/src/render/draw_fill.ts index cf3c4c43665..1965197abb8 100644 --- a/src/render/draw_fill.ts +++ b/src/render/draw_fill.ts @@ -7,6 +7,7 @@ import { fillOutlineUniformValues, fillOutlinePatternUniformValues } from './program/fill_program'; +import StencilMode from '../gl/stencil_mode'; import type Painter from './painter'; import type SourceCache from '../source/source_cache'; @@ -69,7 +70,7 @@ function drawFillTiles(painter: Painter, sourceCache: SourceCache, layer: FillSt const patternProperty = layer.paint.get('fill-pattern'); const is3D = layer.is3D(); - const stencilFor3D = painter.stencilModeFor3D(); + const stencilFor3D = is3D ? painter.stencilModeFor3D() : StencilMode.disabled; const image = patternProperty && patternProperty.constantOr((1 as any)); let drawMode, programName, uniformValues, indexBuffer, segments; diff --git a/src/render/draw_fill_extrusion.ts b/src/render/draw_fill_extrusion.ts index 787fc68240e..519a3ea2948 100644 --- a/src/render/draw_fill_extrusion.ts +++ b/src/render/draw_fill_extrusion.ts @@ -153,7 +153,6 @@ function draw(painter: Painter, source: SourceCache, layer: FillExtrusionStyleLa if (!showOverdraw) { // Mark the alpha channel with the DF values (that determine the intensity of the effects). No color is written. - // @ts-expect-error - TS2345 - Argument of type '{ func: 519; mask: 255; }' is not assignable to parameter of type 'StencilTest'. const stencilSdfPass = new StencilMode({func: gl.ALWAYS, mask: 0xFF}, 0xFF, 0xFF, gl.KEEP, gl.KEEP, gl.REPLACE); const colorSdfPass = new ColorMode([gl.ONE, gl.ONE, gl.ONE, gl.ONE], Color.transparent, [false, false, false, true], gl.MIN); @@ -187,7 +186,6 @@ function draw(painter: Painter, source: SourceCache, layer: FillExtrusionStyleLa { // Mark the alpha channel with the DF values (that determine the intensity of the effects). No color is written. - // @ts-expect-error - TS2345 - Argument of type '{ func: 519; mask: 255; }' is not assignable to parameter of type 'StencilTest'. const stencilSdfPass = new StencilMode({func: gl.ALWAYS, mask: 0xFF}, 0xFF, 0xFF, gl.KEEP, gl.KEEP, gl.REPLACE); const colorSdfPass = new ColorMode([gl.ONE, gl.ONE, gl.ONE, gl.ONE], Color.transparent, [false, false, false, true], gl.MIN); @@ -227,7 +225,7 @@ function draw(painter: Painter, source: SourceCache, layer: FillExtrusionStyleLa if (!framebufferCopyTexture || (framebufferCopyTexture && (framebufferCopyTexture.size[0] !== width || framebufferCopyTexture.size[1] !== height))) { if (framebufferCopyTexture) framebufferCopyTexture.destroy(); framebufferCopyTexture = terrain.framebufferCopyTexture = new Texture(context, - new RGBAImage({width, height}), gl.RGBA); + new RGBAImage({width, height}), gl.RGBA8); } framebufferCopyTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); gl.copyTexImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 0, 0, width, height, 0); @@ -287,7 +285,6 @@ function drawExtrusionTiles(painter: Painter, source: SourceCache, layer: FillEx const wallMode = layer.paint.get('fill-extrusion-line-width').constantOr(1.0) !== 0.0; const cutoffParams = getCutoffParams(painter, layer.paint.get('fill-extrusion-cutoff-fade-range')); - const emissiveStrength = layer.paint.get('fill-extrusion-emissive-strength'); const baseDefines = ([] as any); if (isGlobeProjection) { baseDefines.push('PROJECTION_GLOBE_VIEW'); @@ -403,7 +400,7 @@ function drawExtrusionTiles(painter: Painter, source: SourceCache, layer: FillEx } else { // @ts-expect-error - TS2345 - Argument of type 'unknown' is not assignable to parameter of type 'boolean'. uniformValues = fillExtrusionUniformValues(matrix, painter, shouldUseVerticalGradient, opacity, ao, roofEdgeRadius, lineWidthScale, coord, - heightLift, globeToMercator, mercatorCenter, invMatrix, floodLightColor, verticalScale, floodLightIntensity, groundShadowFactor, emissiveStrength); + heightLift, globeToMercator, mercatorCenter, invMatrix, floodLightColor, verticalScale, floodLightIntensity, groundShadowFactor); } } @@ -733,7 +730,7 @@ function updateBorders(context: Context, source: SourceCache, coord: OverscaledT const saveIb = ib; let count = 0; while (true) { - // Collect all parts overlapping parta on the edge, to make sure it is only one. + // Collect all parts overlapping parts on the edge, to make sure it is only one. assert(partB.borders); const partBBorderRange = (partB.borders)[j]; if (partBBorderRange[0] > partABorderRange[1] - error) { @@ -746,7 +743,8 @@ function updateBorders(context: Context, source: SourceCache, coord: OverscaledT partB = nBucket.featuresOnBorder[b[ib]]; } partB = nBucket.featuresOnBorder[b[saveIb]]; - if (count > 1) { + let doReconcile = false; + if (count >= 1) { // if it can be concluded that it is the piece of the same feature, // use it, even following features (inner details) overlap on border edge. assert(partB.borders); @@ -754,6 +752,9 @@ function updateBorders(context: Context, source: SourceCache, coord: OverscaledT if (Math.abs(partABorderRange[0] - partBBorderRange[0]) < error && Math.abs(partABorderRange[1] - partBBorderRange[1]) < error) { count = 1; + // In some cases count could be 1 but a different feature, here we make sure + // we are reconciling the same feature + doReconcile = true; ib = saveIb + 1; } } else if (count === 0) { @@ -763,7 +764,7 @@ function updateBorders(context: Context, source: SourceCache, coord: OverscaledT } const centroidB = nBucket.centroidData[partB.centroidDataIndex]; - if (reconcileReplacementState && count === 1) { + if (reconcileReplacementState && doReconcile) { reconcileReplacement(centroidA, centroidB); } diff --git a/src/render/draw_heatmap.ts b/src/render/draw_heatmap.ts index b7d2ee76092..c0ec0d69521 100644 --- a/src/render/draw_heatmap.ts +++ b/src/render/draw_heatmap.ts @@ -17,6 +17,7 @@ import type SourceCache from '../source/source_cache'; import type HeatmapStyleLayer from '../style/style_layer/heatmap_style_layer'; import type HeatmapBucket from '../data/bucket/heatmap_bucket'; import type {OverscaledTileID} from '../source/tile_id'; +import type {DynamicDefinesType} from './program/program_uniforms'; export default drawHeatmap; @@ -44,10 +45,10 @@ function drawHeatmap(painter: Painter, sourceCache: SourceCache, layer: HeatmapS const isGlobeProjection = tr.projection.name === 'globe'; - const definesValues = isGlobeProjection ? ['PROJECTION_GLOBE_VIEW'] : []; + const definesValues: DynamicDefinesType[] = isGlobeProjection ? ['PROJECTION_GLOBE_VIEW'] : []; const cullMode = isGlobeProjection ? CullFaceMode.frontCCW : CullFaceMode.disabled; - const mercatorCenter = [mercatorXfromLng(tr.center.lng), mercatorYfromLat(tr.center.lat)]; + const mercatorCenter: [number, number] = [mercatorXfromLng(tr.center.lng), mercatorYfromLat(tr.center.lat)]; for (let i = 0; i < coords.length; i++) { const coord = coords[i]; @@ -63,7 +64,6 @@ function drawHeatmap(painter: Painter, sourceCache: SourceCache, layer: HeatmapS const affectedByFog = painter.isTileAffectedByFog(coord); const programConfiguration = bucket.programConfigurations.get(layer.id); - // @ts-expect-error - TS2322 - Type 'string[]' is not assignable to type 'DynamicDefinesType[]'. const program = painter.getOrCreateProgram('heatmap', {config: programConfiguration, defines: definesValues, overrideFog: affectedByFog}); const {zoom} = painter.transform; if (painter.terrain) painter.terrain.setupElevationDraw(tile, program); @@ -74,7 +74,6 @@ function drawHeatmap(painter: Painter, sourceCache: SourceCache, layer: HeatmapS program.draw(painter, gl.TRIANGLES, DepthMode.disabled, stencilMode, colorMode, cullMode, heatmapUniformValues(painter, coord, - // @ts-expect-error - TS2345 - Argument of type 'number[]' is not assignable to parameter of type '[number, number]'. tile, invMatrix, mercatorCenter, zoom, layer.paint.get('heatmap-intensity')), layer.id, bucket.layoutVertexBuffer, bucket.indexBuffer, bucket.segments, layer.paint, painter.transform.zoom, @@ -143,7 +142,7 @@ function renderTextureToMap(painter: Painter, layer: HeatmapStyleLayer) { context.activeTexture.set(gl.TEXTURE1); let colorRampTexture = layer.colorRampTexture; if (!colorRampTexture) { - colorRampTexture = layer.colorRampTexture = new Texture(context, layer.colorRamp, gl.RGBA); + colorRampTexture = layer.colorRampTexture = new Texture(context, layer.colorRamp, gl.RGBA8); } colorRampTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); diff --git a/src/render/draw_hillshade.ts b/src/render/draw_hillshade.ts index 77d42a51eac..418c4802072 100644 --- a/src/render/draw_hillshade.ts +++ b/src/render/draw_hillshade.ts @@ -114,7 +114,7 @@ function prepareHillshade(painter: Painter, tile: Tile, layer: HillshadeStyleLay context.activeTexture.set(gl.TEXTURE0); let fbo = tile.hillshadeFBO; if (!fbo) { - const renderTexture = new Texture(context, {width: tileSize, height: tileSize, data: null}, gl.RGBA); + const renderTexture = new Texture(context, {width: tileSize, height: tileSize, data: null}, gl.RGBA8); renderTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); fbo = tile.hillshadeFBO = context.createFramebuffer(tileSize, tileSize, true, 'renderbuffer'); diff --git a/src/render/draw_line.ts b/src/render/draw_line.ts index d4d9c66b7e9..a977c7619b7 100644 --- a/src/render/draw_line.ts +++ b/src/render/draw_line.ts @@ -167,7 +167,7 @@ export default function drawLine(painter: Painter, sourceCache: SourceCache, lay if (layerGradient.texture) { layerGradient.texture.update(layerGradient.gradient); } else { - layerGradient.texture = new Texture(context, layerGradient.gradient, gl.RGBA); + layerGradient.texture = new Texture(context, layerGradient.gradient, gl.RGBA8); } layerGradient.version = layer.gradientVersion; gradientTexture = layerGradient.texture; diff --git a/src/render/draw_raster.ts b/src/render/draw_raster.ts index c8774232aab..085d6add950 100644 --- a/src/render/draw_raster.ts +++ b/src/render/draw_raster.ts @@ -514,7 +514,7 @@ function configureRaster( layer.updateColorRamp(range); let tex = layer.colorRampTexture; - if (!tex) tex = layer.colorRampTexture = new Texture(context, layer.colorRamp, gl.RGBA); + if (!tex) tex = layer.colorRampTexture = new Texture(context, layer.colorRamp, gl.RGBA8); tex.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); } diff --git a/src/render/draw_raster_particle.ts b/src/render/draw_raster_particle.ts index c86e8e2b498..13a62f2f274 100644 --- a/src/render/draw_raster_particle.ts +++ b/src/render/draw_raster_particle.ts @@ -177,7 +177,7 @@ function renderParticlesToTexture(painter: Painter, sourceCache: SourceCache, la // Allocate a texture if not allocated context.activeTexture.set(gl.TEXTURE0 + RASTER_COLOR_TEXTURE_UNIT); let tex = layer.colorRampTexture; - if (!tex) tex = layer.colorRampTexture = new Texture(context, layer.colorRamp, gl.RGBA); + if (!tex) tex = layer.colorRampTexture = new Texture(context, layer.colorRamp, gl.RGBA8); tex.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); } diff --git a/src/render/draw_sky.ts b/src/render/draw_sky.ts index 0a2b7eaa128..9474e1262a9 100644 --- a/src/render/draw_sky.ts +++ b/src/render/draw_sky.ts @@ -63,7 +63,7 @@ function drawSkyboxGradient(painter: Painter, layer: SkyLayer, depthMode: DepthM context.activeTexture.set(gl.TEXTURE0); let colorRampTexture = layer.colorRampTexture; if (!colorRampTexture) { - colorRampTexture = layer.colorRampTexture = new Texture(context, layer.colorRamp, gl.RGBA); + colorRampTexture = layer.colorRampTexture = new Texture(context, layer.colorRamp, gl.RGBA8); } colorRampTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); const uniformValues = skyboxGradientUniformValues( diff --git a/src/render/image_atlas.ts b/src/render/image_atlas.ts index fde3218ff65..eec258ae087 100644 --- a/src/render/image_atlas.ts +++ b/src/render/image_atlas.ts @@ -173,8 +173,7 @@ export default class ImageAtlas { position.version = image.version; const [x, y] = position.tl; - const hasPattern = !!Object.keys(this.patternPositions).length; - texture.update(image.data, {useMipmap: hasPattern}, {x, y}); + texture.update(image.data, {position: {x, y}}); } } diff --git a/src/render/image_manager.ts b/src/render/image_manager.ts index a03b78a493a..36096e71c96 100644 --- a/src/render/image_manager.ts +++ b/src/render/image_manager.ts @@ -298,7 +298,7 @@ class ImageManager extends Evented { let atlasTexture = this.atlasTexture[scope]; if (!atlasTexture) { - atlasTexture = new Texture(context, this.atlasImage[scope], gl.RGBA); + atlasTexture = new Texture(context, this.atlasImage[scope], gl.RGBA8); this.atlasTexture[scope] = atlasTexture; } else if (this.dirty) { atlasTexture.update(this.atlasImage[scope]); diff --git a/src/render/line_atlas.ts b/src/render/line_atlas.ts index 31b71e163d8..01b37a5248a 100644 --- a/src/render/line_atlas.ts +++ b/src/render/line_atlas.ts @@ -207,10 +207,8 @@ class LineAtlas { const pos = { tl: [y, n], br: [length, 0] - }; - // @ts-expect-error - TS2322 - Type '{ tl: number[]; br: number[]; }' is not assignable to type 'SpritePosition'. + } as SpritePosition; this.positions[key] = pos; - // @ts-expect-error - TS2322 - Type '{ tl: number[]; br: number[]; }' is not assignable to type 'SpritePosition'. return pos; } } diff --git a/src/render/painter.ts b/src/render/painter.ts index 0934811bf1f..82b5bdef4a9 100644 --- a/src/render/painter.ts +++ b/src/render/painter.ts @@ -334,7 +334,7 @@ class Painter { this.layersWithOcclusionOpacity = []; const emptyDepth = new RGBAImage({width: 1, height: 1}, Uint8Array.of(0, 0, 0, 0)); - this.emptyDepthTexture = new Texture(this.context, emptyDepth, gl.RGBA); + this.emptyDepthTexture = new Texture(this.context, emptyDepth, gl.RGBA8); this._clippingActiveLastFrame = false; } @@ -468,7 +468,7 @@ class Painter { this.debugIndexBuffer = context.createIndexBuffer(tileLineStripIndices); this.emptyTexture = new Texture(context, - new RGBAImage({width: 1, height: 1}, Uint8Array.of(0, 0, 0, 0)), context.gl.RGBA); + new RGBAImage({width: 1, height: 1}, Uint8Array.of(0, 0, 0, 0)), context.gl.RGBA8); // @ts-expect-error - TS2322 - Type 'mat4' is not assignable to type 'Float32Array'. this.identityMat = mat4.create(); @@ -702,7 +702,7 @@ class Painter { if (depthWidth !== 0 && depthHeight !== 0) { this.depthFBO = new Framebuffer(this.context, depthWidth, depthHeight, false, 'texture'); - this.depthTexture = new Texture(this.context, {width: depthWidth, height: depthHeight, data: null}, gl.DEPTH_STENCIL); + this.depthTexture = new Texture(this.context, {width: depthWidth, height: depthHeight, data: null}, gl.DEPTH24_STENCIL8); this.depthFBO.depthAttachment.set(this.depthTexture.texture); } } @@ -1020,7 +1020,6 @@ class Painter { const coords = sourceCache ? coordsDescending[sourceCache.id] : undefined; if (!(layer.type === 'custom' || layer.type === 'raster' || layer.type === 'raster-particle' || layer.isSky()) && !(coords && coords.length)) continue; - // @ts-expect-error - TS2345 - Argument of type 'void | SourceCache' is not assignable to parameter of type 'SourceCache'. this.renderLayer(this, sourceCache, layer, coords); } @@ -1085,9 +1084,7 @@ class Painter { const sourceCache = style.getLayerSourceCache(layer); if (layer.isSky()) continue; const coords = sourceCache ? (layer.is3D() ? coordsSortedByDistance : coordsDescending)[sourceCache.id] : undefined; - // @ts-expect-error - TS2345 - Argument of type 'void | SourceCache' is not assignable to parameter of type 'SourceCache'. this._renderTileClippingMasks(layer, sourceCache, coords); - // @ts-expect-error - TS2345 - Argument of type 'void | SourceCache' is not assignable to parameter of type 'SourceCache'. this.renderLayer(this, sourceCache, layer, coords); } } @@ -1109,7 +1106,6 @@ class Painter { if (!layer.isSky()) continue; const coords = sourceCache ? coordsDescending[sourceCache.id] : undefined; - // @ts-expect-error - TS2345 - Argument of type 'void | SourceCache' is not assignable to parameter of type 'SourceCache'. this.renderLayer(this, sourceCache, layer, coords); } } @@ -1142,7 +1138,6 @@ class Painter { const layer = orderedLayers[this.currentLayer]; if (layer.type === "raster" || layer.type === "raster-particle") { const sourceCache = style.getLayerSourceCache(layer); - // @ts-expect-error - TS2345 - Argument of type 'void | SourceCache' is not assignable to parameter of type 'SourceCache'. | TS2345 - Argument of type 'void | SourceCache' is not assignable to parameter of type 'SourceCache'. this.renderLayer(this, sourceCache, layer, coordsForTranslucentLayer(layer, sourceCache)); } ++this.currentLayer; @@ -1217,10 +1212,8 @@ class Painter { } if (!layer.is3D() && !this.terrain) { - // @ts-expect-error - TS2345 - Argument of type 'void | SourceCache' is not assignable to parameter of type 'SourceCache'. this._renderTileClippingMasks(layer, sourceCache, sourceCache ? coordsAscending[sourceCache.id] : undefined); } - // @ts-expect-error - TS2345 - Argument of type 'void | SourceCache' is not assignable to parameter of type 'SourceCache'. | TS2345 - Argument of type 'void | SourceCache' is not assignable to parameter of type 'SourceCache'. this.renderLayer(this, sourceCache, layer, coordsForTranslucentLayer(layer, sourceCache)); // Render ground shadows after the last shadow caster layer @@ -1236,7 +1229,6 @@ class Painter { const sourceCache = style.getLayerSourceCache(layer); const coords = sourceCache ? coordsDescending[sourceCache.id] : undefined; - // @ts-expect-error - TS2345 - Argument of type 'void | SourceCache' is not assignable to parameter of type 'SourceCache'. this.renderLayer(this, sourceCache, layer, coords); } this.currentLayer = saveCurrentLayer; @@ -1254,10 +1246,8 @@ class Painter { const sourceCache = style.getLayerSourceCache(layer); const coords = sourceCache ? coordsDescending[sourceCache.id] : undefined; if (!layer.is3D() && !this.terrain) { - // @ts-expect-error - TS2345 - Argument of type 'void | SourceCache' is not assignable to parameter of type 'SourceCache'. this._renderTileClippingMasks(layer, sourceCache, sourceCache ? coordsAscending[sourceCache.id] : undefined); } - // @ts-expect-error - TS2345 - Argument of type 'void | SourceCache' is not assignable to parameter of type 'SourceCache'. this.renderLayer(this, sourceCache, layer, coords); } this.depthOcclusion = false; @@ -1339,7 +1329,7 @@ class Painter { this.gpuTimingEnd(); } - renderLayer(painter: Painter, sourceCache: SourceCache | null | undefined, layer: StyleLayer, coords?: Array) { + renderLayer(painter: Painter, sourceCache: SourceCache | undefined, layer: StyleLayer, coords?: Array) { if (layer.isHidden(this.transform.zoom)) return; if (layer.type !== 'background' && layer.type !== 'sky' && layer.type !== 'custom' && layer.type !== 'model' && layer.type !== 'raster' && layer.type !== 'raster-particle' && !(coords && coords.length)) return; @@ -1609,7 +1599,7 @@ class Painter { this.debugOverlayCanvas.width = 512; this.debugOverlayCanvas.height = 512; const gl = this.context.gl; - this.debugOverlayTexture = new Texture(this.context, this.debugOverlayCanvas, gl.RGBA); + this.debugOverlayTexture = new Texture(this.context, this.debugOverlayCanvas, gl.RGBA8); } } diff --git a/src/render/program/background_program.ts b/src/render/program/background_program.ts index ac9a8a7f175..dfd18af628b 100644 --- a/src/render/program/background_program.ts +++ b/src/render/program/background_program.ts @@ -35,7 +35,7 @@ export type BackgroundPatternUniformsType = { ['u_pattern_size']: Uniform2f; ['u_pixel_coord_upper']: Uniform2f; ['u_pixel_coord_lower']: Uniform2f; - ['u_tile_units_to_pixels']: Uniform1f; + ['u_pattern_units_to_pixels']: Uniform2f; }; const backgroundUniforms = (context: Context): BackgroundUniformsType => ({ @@ -56,7 +56,7 @@ const backgroundPatternUniforms = (context: Context): BackgroundPatternUniformsT 'u_pattern_size': new Uniform2f(context), 'u_pixel_coord_upper': new Uniform2f(context), 'u_pixel_coord_lower': new Uniform2f(context), - 'u_tile_units_to_pixels': new Uniform1f(context) + 'u_pattern_units_to_pixels': new Uniform2f(context) }); const backgroundUniformValues = ( @@ -79,12 +79,13 @@ const backgroundPatternUniformValues = ( image: ResolvedImage, scope: string, patternPosition: ImagePosition | null | undefined, + isViewport: boolean, tile: { tileID: OverscaledTileID; tileSize: number; }, ): UniformValues => extend( - bgPatternUniformValues(image, scope, patternPosition, painter, tile), + bgPatternUniformValues(image, scope, patternPosition, painter, isViewport, tile), { 'u_matrix': matrix, 'u_emissive_strength': emissiveStrength, diff --git a/src/render/program/fill_extrusion_program.ts b/src/render/program/fill_extrusion_program.ts index 9af946fad75..c908f5d8f59 100644 --- a/src/render/program/fill_extrusion_program.ts +++ b/src/render/program/fill_extrusion_program.ts @@ -38,7 +38,6 @@ export type FillExtrusionUniformsType = { ['u_vertical_scale']: Uniform1f; ['u_flood_light_intensity']: Uniform1f; ['u_ground_shadow_factor']: Uniform3f; - ['u_emissive_strength']: Uniform1f; }; export type FillExtrusionDepthUniformsType = { @@ -108,8 +107,7 @@ const fillExtrusionUniforms = (context: Context): FillExtrusionUniformsType => ( 'u_flood_light_color': new Uniform3f(context), 'u_vertical_scale': new Uniform1f(context), 'u_flood_light_intensity': new Uniform1f(context), - 'u_ground_shadow_factor': new Uniform3f(context), - 'u_emissive_strength': new Uniform1f(context) + 'u_ground_shadow_factor': new Uniform3f(context) }); const fillExtrusionDepthUniforms = (context: Context): FillExtrusionDepthUniformsType => ({ @@ -178,8 +176,7 @@ const fillExtrusionUniformValues = ( floodLightColor: [number, number, number], verticalScale: number, floodLightIntensity: number, - groundShadowFactor: [number, number, number], - emissiveStrength: number, + groundShadowFactor: [number, number, number] ): UniformValues => { const light = painter.style.light; const _lp = light.properties.get('position'); @@ -214,8 +211,7 @@ const fillExtrusionUniformValues = ( 'u_flood_light_color': floodLightColor, 'u_vertical_scale': verticalScale, 'u_flood_light_intensity': floodLightIntensity, - 'u_ground_shadow_factor': groundShadowFactor, - 'u_emissive_strength': emissiveStrength + 'u_ground_shadow_factor': groundShadowFactor }; if (tr.projection.name === 'globe') { @@ -258,7 +254,7 @@ const fillExtrusionPatternUniformValues = ( ): UniformValues => { const uniformValues = fillExtrusionUniformValues( matrix, painter, shouldUseVerticalGradient, opacity, aoIntensityRadius, edgeRadius, lineWidthScale, coord, - heightLift, zoomTransition, mercatorCenter, invMatrix, floodLightColor, verticalScale, 1.0, [0, 0, 0], 0); + heightLift, zoomTransition, mercatorCenter, invMatrix, floodLightColor, verticalScale, 1.0, [0, 0, 0]); const heightFactorUniform = { 'u_height_factor': -Math.pow(2, coord.overscaledZ) / tile.tileSize / 8 }; diff --git a/src/render/program/pattern.ts b/src/render/program/pattern.ts index 8b1de3c8c53..8959e26c507 100644 --- a/src/render/program/pattern.ts +++ b/src/render/program/pattern.ts @@ -20,7 +20,7 @@ type BackgroundPatternUniformsType = { ['u_pattern_size']: Uniform2f; ['u_pixel_coord_upper']: Uniform2f; ['u_pixel_coord_lower']: Uniform2f; - ['u_tile_units_to_pixels']: Uniform1f; + ['u_pattern_units_to_pixels']: Uniform2f; }; export type PatternUniformsType = { @@ -54,6 +54,7 @@ function bgPatternUniformValues( scope: string, patternPosition: ImagePosition | null | undefined, painter: Painter, + isViewport: boolean, tile: { tileID: OverscaledTileID; tileSize: number; @@ -74,7 +75,7 @@ function bgPatternUniformValues( 'u_pattern_br': (patternPosition as any).br, 'u_texsize': [width, height], 'u_pattern_size': (patternPosition as any).displaySize, - 'u_tile_units_to_pixels': 1 / pixelsToTileUnits(tile, 1, painter.transform.tileZoom), + 'u_pattern_units_to_pixels': isViewport ? [painter.transform.width, -1.0 * painter.transform.height] : [1 / pixelsToTileUnits(tile, 1, painter.transform.tileZoom), 1 / pixelsToTileUnits(tile, 1, painter.transform.tileZoom)], // split the pixel coord into two pairs of 16 bit numbers. The glsl spec only guarantees 16 bits of precision. 'u_pixel_coord_upper': [pixelX >> 16, pixelY >> 16], 'u_pixel_coord_lower': [pixelX & 0xFFFF, pixelY & 0xFFFF] diff --git a/src/render/program/program_uniforms.ts b/src/render/program/program_uniforms.ts index c8a5c886a14..0148f0207da 100644 --- a/src/render/program/program_uniforms.ts +++ b/src/render/program/program_uniforms.ts @@ -28,10 +28,22 @@ import type {SymbolDefinesType} from './symbol_program'; import type {RasterParticleDefinesType} from './raster_particle_program'; import type {RasterDefinesType} from './raster_program'; import type {CircleDefinesType} from './circle_program'; +import type {ModelDefinesType} from '../../../3d-style/render/program/model_program'; export type FogDefinesType = ['FOG', 'FOG_DITHERING']; export type TerrainDepthAccessDefinesType = 'DEPTH_D24' | 'DEPTH_OCCLUSION'; -export type DynamicDefinesType = CircleDefinesType | SymbolDefinesType | LineDefinesType | HeatmapDefinesType | GlobeDefinesType | RasterDefinesType | RasterParticleDefinesType | FogDefinesType | HillshadeDefinesType | TerrainDepthAccessDefinesType; +export type DynamicDefinesType = + | CircleDefinesType + | SymbolDefinesType + | LineDefinesType + | HeatmapDefinesType + | GlobeDefinesType + | RasterDefinesType + | RasterParticleDefinesType + | FogDefinesType + | HillshadeDefinesType + | TerrainDepthAccessDefinesType + | ModelDefinesType; export const programUniforms = { fillExtrusion: fillExtrusionUniforms, diff --git a/src/render/raster_particle_state.ts b/src/render/raster_particle_state.ts index 84eaf2dc950..3f032f8ce8c 100644 --- a/src/render/raster_particle_state.ts +++ b/src/render/raster_particle_state.ts @@ -34,8 +34,8 @@ class RasterParticleState { data: null }; const gl = context.gl; - this.targetColorTexture = new Texture(context, emptyImage, gl.RGBA, {useMipmap: false}); - this.backgroundColorTexture = new Texture(context, emptyImage, gl.RGBA, {useMipmap: false}); + this.targetColorTexture = new Texture(context, emptyImage, gl.RGBA8, {useMipmap: false}); + this.backgroundColorTexture = new Texture(context, emptyImage, gl.RGBA8, {useMipmap: false}); this.context = context; this.updateParticleTexture(id, RGBAPositions); @@ -60,8 +60,8 @@ class RasterParticleState { const numParticles = RGBAPositions.width * RGBAPositions.height; - this.particleTexture0 = new Texture(this.context, RGBAPositions, gl.RGBA, {premultiply: false, useMipmap: false}); - this.particleTexture1 = new Texture(this.context, RGBAPositions, gl.RGBA, {premultiply: false, useMipmap: false}); + this.particleTexture0 = new Texture(this.context, RGBAPositions, gl.RGBA8, {premultiply: false, useMipmap: false}); + this.particleTexture1 = new Texture(this.context, RGBAPositions, gl.RGBA8, {premultiply: false, useMipmap: false}); const particleIndices = new ParticleIndexLayoutArray(); particleIndices.reserve(numParticles); diff --git a/src/render/texture.ts b/src/render/texture.ts index ef863cf889e..d5d45caf849 100644 --- a/src/render/texture.ts +++ b/src/render/texture.ts @@ -4,10 +4,29 @@ import assert from 'assert'; import type Context from '../gl/context'; import type {RGBAImage, AlphaImage} from '../util/image'; -export type TextureFormat = WebGL2RenderingContext['RGBA'] | WebGL2RenderingContext['DEPTH_COMPONENT'] | WebGL2RenderingContext['DEPTH_STENCIL'] | WebGL2RenderingContext['R8'] | WebGL2RenderingContext['R32F'] | WebGL2RenderingContext['RED']; -export type TextureType = WebGL2RenderingContext['UNSIGNED_INT_24_8'] | WebGL2RenderingContext['UNSIGNED_BYTE'] | WebGL2RenderingContext['UNSIGNED_SHORT'] | WebGL2RenderingContext['FLOAT']; -export type TextureFilter = WebGL2RenderingContext['LINEAR'] | WebGL2RenderingContext['NEAREST_MIPMAP_NEAREST'] | WebGL2RenderingContext['LINEAR_MIPMAP_NEAREST'] | WebGL2RenderingContext['NEAREST_MIPMAP_LINEAR'] | WebGL2RenderingContext['LINEAR_MIPMAP_LINEAR'] | WebGL2RenderingContext['NEAREST']; -export type TextureWrap = WebGL2RenderingContext['REPEAT'] | WebGL2RenderingContext['CLAMP_TO_EDGE'] | WebGL2RenderingContext['MIRRORED_REPEAT']; +export type TextureFormat = WebGL2RenderingContext['RGBA8' | 'DEPTH_COMPONENT16' | 'DEPTH24_STENCIL8' | 'R8' | 'R32F']; +export type TextureType = WebGL2RenderingContext['UNSIGNED_BYTE' | 'UNSIGNED_SHORT' | 'UNSIGNED_INT_24_8' | 'FLOAT']; +export type TextureFilter = WebGL2RenderingContext['LINEAR' | 'NEAREST_MIPMAP_NEAREST' | 'LINEAR_MIPMAP_NEAREST' | 'NEAREST_MIPMAP_LINEAR' | 'LINEAR_MIPMAP_LINEAR' | 'NEAREST']; +export type TextureWrap = WebGL2RenderingContext['REPEAT' | 'CLAMP_TO_EDGE' | 'MIRRORED_REPEAT']; + +function _getLegacyFormat(format: TextureFormat): number { + switch (format) { + case WebGL2RenderingContext['RGBA8']: return WebGL2RenderingContext['RGBA']; + case WebGL2RenderingContext['DEPTH_COMPONENT16']: return WebGL2RenderingContext['DEPTH_COMPONENT']; + case WebGL2RenderingContext['DEPTH24_STENCIL8']: return WebGL2RenderingContext['DEPTH_STENCIL']; + case WebGL2RenderingContext['R8']: return WebGL2RenderingContext['RED']; + case WebGL2RenderingContext['R32F']: return WebGL2RenderingContext['RED']; + } +} +function _getType(format: TextureFormat): TextureType { + switch (format) { + case WebGL2RenderingContext['RGBA8']: return WebGL2RenderingContext['UNSIGNED_BYTE']; + case WebGL2RenderingContext['DEPTH_COMPONENT16']: return WebGL2RenderingContext['UNSIGNED_SHORT']; + case WebGL2RenderingContext['DEPTH24_STENCIL8']: return WebGL2RenderingContext['UNSIGNED_INT_24_8']; + case WebGL2RenderingContext['R8']: return WebGL2RenderingContext['UNSIGNED_BYTE']; + case WebGL2RenderingContext['R32F']: return WebGL2RenderingContext['FLOAT']; + } +} type EmptyImage = { width: number; @@ -29,91 +48,57 @@ class Texture { useMipmap: boolean; constructor(context: Context, image: TextureImage, format: TextureFormat, options?: { - premultiply?: boolean; useMipmap?: boolean; + premultiply?: boolean; } | null) { this.context = context; this.format = format; - this.texture = (context.gl.createTexture()); - this.update(image, options); + this.useMipmap = options && options.useMipmap; + this.texture = context.gl.createTexture(); + this.update(image, {premultiply: options && options.premultiply}); } - update(image: TextureImage, options?: { - premultiply?: boolean; - useMipmap?: boolean; - } | null, position?: { - x: number; - y: number; - }) { - const {width, height} = image; + update(image: TextureImage, options?: { premultiply?: boolean; position?: {x: number; y: number;} } | null) { + const srcWidth = (image && image instanceof HTMLVideoElement && image.width === 0) ? image.videoWidth : image.width; + const srcHeight = (image && image instanceof HTMLVideoElement && image.height === 0) ? image.videoHeight : image.height; const {context} = this; const {gl} = context; + const {x, y} = options && options.position ? options.position : {x: 0, y: 0}; + const width = Math.max(x + srcWidth, this.size ? this.size[0] : 0); + const height = Math.max(y + srcHeight, this.size ? this.size[1] : 0); + + if (this.size && (this.size[0] !== width || this.size[1] !== height)) { + gl.bindTexture(gl.TEXTURE_2D, null); + gl.deleteTexture(this.texture); + this.texture = gl.createTexture(); + this.size = null; + } gl.bindTexture(gl.TEXTURE_2D, this.texture); context.pixelStoreUnpackFlipY.set(false); context.pixelStoreUnpack.set(1); - context.pixelStoreUnpackPremultiplyAlpha.set(this.format === gl.RGBA && (!options || options.premultiply !== false)); + context.pixelStoreUnpackPremultiplyAlpha.set(this.format === gl.RGBA8 && (!options || options.premultiply !== false)); - this.useMipmap = Boolean(options && options.useMipmap); + const externalImage = image instanceof HTMLImageElement || image instanceof HTMLCanvasElement || image instanceof HTMLVideoElement || image instanceof ImageData || (ImageBitmap && image instanceof ImageBitmap); + assert(!externalImage || this.format === gl.R8 || this.format === gl.RGBA8, "Texture format needs to be RGBA8 when using external source"); - if (!position && (!this.size || this.size[0] !== width || this.size[1] !== height)) { + if (!this.size && width > 0 && height > 0) { + // from spec for texStorage2D + const numLevels = this.useMipmap ? Math.floor(Math.log2(Math.max(width, height))) + 1 : 1; + gl.texStorage2D(gl.TEXTURE_2D, numLevels, this.format, width, height); this.size = [width, height]; + } - if (image instanceof HTMLImageElement || image instanceof HTMLCanvasElement || image instanceof HTMLVideoElement || image instanceof ImageData || (ImageBitmap && image instanceof ImageBitmap)) { - let baseFormat = this.format; - if (this.format === gl.R8) { - baseFormat = gl.RED; - } - gl.texImage2D(gl.TEXTURE_2D, 0, this.format, baseFormat, gl.UNSIGNED_BYTE, image); - } else { - let internalFormat = this.format; - let format = this.format; - let type: TextureType = gl.UNSIGNED_BYTE; - let preferTexStorage = false; - - if (this.format === gl.DEPTH_COMPONENT) { - // @ts-expect-error - TS2322 - Type '33189' is not assignable to type 'TextureFormat'. - internalFormat = gl.DEPTH_COMPONENT16; - type = gl.UNSIGNED_SHORT; - } - if (this.format === gl.DEPTH_STENCIL) { - // @ts-expect-error - TS2322 - Type '33189' is not assignable to type 'TextureFormat'. - internalFormat = gl.DEPTH24_STENCIL8; - type = gl.UNSIGNED_INT_24_8; - preferTexStorage = true; - } - if (this.format === gl.R8) { - format = gl.RED; - } - if (this.format === gl.R32F) { - assert(image instanceof Float32Image); - type = gl.FLOAT; - format = gl.RED; - } - if (!this.useMipmap && preferTexStorage) { - gl.texStorage2D(gl.TEXTURE_2D, 1, internalFormat, width, height); - } else { - // @ts-expect-error - TS2339 - Property 'data' does not exist on type 'ImageBitmap | RGBAImage | AlphaImage | Float32Image | EmptyImage'. - gl.texImage2D(gl.TEXTURE_2D, 0, internalFormat, width, height, 0, format, type, image.data); - } - } - } else { - const {x, y} = position || {x: 0, y: 0}; - if (image instanceof HTMLImageElement || image instanceof HTMLCanvasElement || image instanceof HTMLVideoElement || image instanceof ImageData || (ImageBitmap && image instanceof ImageBitmap)) { - gl.texSubImage2D(gl.TEXTURE_2D, 0, x, y, gl.RGBA, gl.UNSIGNED_BYTE, image); + if (this.size) { + if (externalImage) { + gl.texSubImage2D(gl.TEXTURE_2D, 0, x, y, _getLegacyFormat(this.format), _getType(this.format), image); } else { - let format = this.format; - let type: TextureType = gl.UNSIGNED_BYTE; - - if (this.format === gl.R32F) { - assert(image instanceof Float32Image); - - format = gl.RED; - type = gl.FLOAT; - } // @ts-expect-error - TS2339 - Property 'data' does not exist on type 'ImageBitmap | RGBAImage | AlphaImage | Float32Image | EmptyImage'. - gl.texSubImage2D(gl.TEXTURE_2D, 0, x, y, width, height, format, type, image.data); + const pixels = image.data; + if (pixels) { + gl.texSubImage2D(gl.TEXTURE_2D, 0, x, y, srcWidth, srcHeight, _getLegacyFormat(this.format), _getType(this.format), pixels); + } } } @@ -202,28 +187,13 @@ export class Texture3D { context.pixelStoreUnpack.set(1); context.pixelStoreUnpackPremultiplyAlpha.set(false); - let internalFormat = this.format; - let type: TextureType = gl.UNSIGNED_BYTE; - - if (this.format === gl.DEPTH_COMPONENT) { - // @ts-expect-error - TS2322 - Type '33189' is not assignable to type 'TextureFormat'. - internalFormat = gl.DEPTH_COMPONENT16; - type = gl.UNSIGNED_SHORT; - } - if (this.format === gl.R8) { - format = gl.RED; - } - if (this.format === gl.R32F) { - assert(image instanceof Float32Image); - type = gl.FLOAT; - format = gl.RED; - } + assert(this.format !== gl.R32F || image instanceof Float32Image); assert(image.width === (image.height * image.height)); assert(image.height === height); assert(image.width === width * depth); // @ts-expect-error - TS2339 - Property 'data' does not exist on type 'TextureImage'. - gl.texImage3D(gl.TEXTURE_3D, 0, internalFormat, width, height, depth, 0, format, type, image.data); + gl.texImage3D(gl.TEXTURE_3D, 0, this.format, width, height, depth, 0, _getLegacyFormat(this.format), _getType(this.format), image.data); } bind(filter: TextureFilter, wrap: TextureWrap) { diff --git a/src/shaders/_prelude.vertex.glsl b/src/shaders/_prelude.vertex.glsl index 4d2d06f6dd1..171cd88b9fb 100644 --- a/src/shaders/_prelude.vertex.glsl +++ b/src/shaders/_prelude.vertex.glsl @@ -92,10 +92,15 @@ vec4 unpack_mix_color(const vec4 packedColors, const float t) { // // The offset is calculated in a series of steps that should preserve this precision: vec2 get_pattern_pos(const vec2 pixel_coord_upper, const vec2 pixel_coord_lower, - const vec2 pattern_size, const float tile_units_to_pixels, const vec2 pos) { + const vec2 pattern_size, const vec2 units_to_pixels, const vec2 pos) { vec2 offset = mod(mod(mod(pixel_coord_upper, pattern_size) * 256.0, pattern_size) * 256.0 + pixel_coord_lower, pattern_size); - return (tile_units_to_pixels * pos + offset) / pattern_size; + return (units_to_pixels * pos + offset) / pattern_size; +} + +vec2 get_pattern_pos(const vec2 pixel_coord_upper, const vec2 pixel_coord_lower, + const vec2 pattern_size, const float tile_units_to_pixels, const vec2 pos) { + return get_pattern_pos(pixel_coord_upper, pixel_coord_lower, pattern_size, vec2(tile_units_to_pixels), pos); } float mercatorXfromLng(float lng) { diff --git a/src/shaders/background_pattern.vertex.glsl b/src/shaders/background_pattern.vertex.glsl index 5247977dbfd..6bb398b935b 100644 --- a/src/shaders/background_pattern.vertex.glsl +++ b/src/shaders/background_pattern.vertex.glsl @@ -4,7 +4,7 @@ uniform mat4 u_matrix; uniform vec2 u_pattern_size; uniform vec2 u_pixel_coord_upper; uniform vec2 u_pixel_coord_lower; -uniform float u_tile_units_to_pixels; +uniform vec2 u_pattern_units_to_pixels; in vec2 a_pos; @@ -13,7 +13,7 @@ out highp vec2 v_pos; void main() { gl_Position = u_matrix * vec4(a_pos, 0, 1); - v_pos = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_pattern_size, u_tile_units_to_pixels, a_pos); + v_pos = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_pattern_size, u_pattern_units_to_pixels, a_pos); #ifdef FOG v_fog_pos = fog_position(a_pos); diff --git a/src/shaders/fill_extrusion.fragment.glsl b/src/shaders/fill_extrusion.fragment.glsl index 4fe59140cc7..24adc0af69e 100644 --- a/src/shaders/fill_extrusion.fragment.glsl +++ b/src/shaders/fill_extrusion.fragment.glsl @@ -35,11 +35,12 @@ in float v_flood_radius; in float v_has_floodlight; #endif -uniform float u_emissive_strength; - in float v_height; +#pragma mapbox: define highp float emissive_strength + void main() { + #pragma mapbox: initialize highp float emissive_strength #if defined(ZERO_ROOF_RADIUS) || defined(RENDER_SHADOWS) || defined(LIGHTING_3D_MODE) vec3 normal = normalize(v_normal); @@ -120,7 +121,7 @@ float flood_radiance = 0.0; #endif // FLOOD_LIGHT #endif // !RENDER_SHADOWS - color.rgb = mix(color.rgb, v_flat.rgb, u_emissive_strength); + color.rgb = mix(color.rgb, v_flat.rgb, emissive_strength); color *= u_opacity; #endif // LIGHTING_3D_MODE diff --git a/src/shaders/fill_extrusion.vertex.glsl b/src/shaders/fill_extrusion.vertex.glsl index cee20246b85..bbcbdfd6003 100644 --- a/src/shaders/fill_extrusion.vertex.glsl +++ b/src/shaders/fill_extrusion.vertex.glsl @@ -71,6 +71,7 @@ out float v_height; #pragma mapbox: define highp vec4 color #pragma mapbox: define highp float flood_light_wall_radius #pragma mapbox: define highp float line_width +#pragma mapbox: define highp float emissive_strength void main() { #pragma mapbox: initialize highp float base @@ -78,6 +79,7 @@ void main() { #pragma mapbox: initialize highp vec4 color #pragma mapbox: initialize highp float flood_light_wall_radius #pragma mapbox: initialize highp float line_width + #pragma mapbox: initialize highp float emissive_strength base *= u_vertical_scale; height *= u_vertical_scale; diff --git a/src/shaders/line.vertex.glsl b/src/shaders/line.vertex.glsl index e674efff9b5..30e5483d9f4 100644 --- a/src/shaders/line.vertex.glsl +++ b/src/shaders/line.vertex.glsl @@ -11,7 +11,7 @@ in vec2 a_pos_normal; in vec4 a_data; -#if defined(ELEVATED) +#if defined(ELEVATED) || defined(ELEVATED_ROADS) in float a_z_offset; #endif @@ -107,7 +107,11 @@ void main() { float hidden = float(opacity == 0.0); vec4 projected_extrude = u_matrix * vec4(dist * u_pixels_to_tile_units, 0.0, 0.0); -#if defined(ELEVATED) +#ifdef ELEVATED_ROADS + // Apply slight vertical offset (1cm) for elevated vertices above the ground plane + gl_Position = u_matrix * vec4(pos + offset2 * u_pixels_to_tile_units, a_z_offset + 0.01 * step(0.01, a_z_offset), 1.0) + projected_extrude; +#else // ELEVATED_ROADS +#ifdef ELEVATED vec2 offsetTile = offset2 * u_pixels_to_tile_units; // forward or backward along the line, perpendicular to offset vec2 halfCellProgress = normal.yx * 32.0; @@ -123,9 +127,10 @@ void main() { float zbias = max(0.00005, (pow(z, 0.8) - z) * 0.1 * u_exaggeration); gl_Position.z -= (gl_Position.w * zbias); gl_Position = mix(gl_Position, AWAY, hidden); -#else +#else // ELEVATED gl_Position = mix(u_matrix * vec4(pos + offset2 * u_pixels_to_tile_units, 0.0, 1.0) + projected_extrude, AWAY, hidden); -#endif +#endif // ELEVATED +#endif // ELEVATED_ROADS #ifndef RENDER_TO_TEXTURE // calculate how much the perspective view squishes or stretches the extrude diff --git a/src/shaders/line_pattern.vertex.glsl b/src/shaders/line_pattern.vertex.glsl index dd143bd4378..99848cb88bc 100644 --- a/src/shaders/line_pattern.vertex.glsl +++ b/src/shaders/line_pattern.vertex.glsl @@ -11,7 +11,7 @@ in vec2 a_pos_normal; in vec4 a_data; -#if defined(ELEVATED) +#if defined(ELEVATED) || defined(ELEVATED_ROADS) in float a_z_offset; #endif // Includes in order: a_uv_x, a_split_index, a_clip_start, a_clip_end @@ -100,7 +100,11 @@ void main() { float hidden = float(opacity == 0.0); vec4 projected_extrude = u_matrix * vec4(dist * u_pixels_to_tile_units, 0.0, 0.0); -#if defined(ELEVATED) +#ifdef ELEVATED_ROADS + // Apply slight vertical offset (1cm) for elevated vertices above the ground plane + gl_Position = u_matrix * vec4(pos + offset2 * u_pixels_to_tile_units, a_z_offset + 0.01 * step(0.01, a_z_offset), 1.0) + projected_extrude; +#else // ELEVATED_ROADS +#ifdef ELEVATED vec2 offsetTile = offset2 * u_pixels_to_tile_units; // forward or backward along the line, perpendicular to offset vec2 halfCellProgress = normal.yx * 32.0; @@ -116,10 +120,10 @@ void main() { float zbias = max(0.00005, (pow(z, 0.8) - z) * 0.1 * u_exaggeration); gl_Position.z -= (gl_Position.w * zbias); gl_Position = mix(gl_Position, AWAY, hidden); -#else +#else // ELEVATED gl_Position = mix(u_matrix * vec4(pos + offset2 * u_pixels_to_tile_units, 0.0, 1.0) + projected_extrude, AWAY, hidden); -#endif - +#endif // ELEVATED +#endif // ELEVATED_ROADS #ifndef RENDER_TO_TEXTURE // calculate how much the perspective view squishes or stretches the extrude diff --git a/src/source/canvas_source.ts b/src/source/canvas_source.ts index 59772abc0bf..c2c169fe40d 100644 --- a/src/source/canvas_source.ts +++ b/src/source/canvas_source.ts @@ -204,7 +204,7 @@ class CanvasSource extends ImageSource<'canvas'> { const context = this.map.painter.context; if (!this.texture) { - this.texture = new Texture(context, this.canvas, context.gl.RGBA, {premultiply: true}); + this.texture = new Texture(context, this.canvas, context.gl.RGBA8, {premultiply: true}); } else if ((resize || this._playing) && !(this.texture instanceof UserManagedTexture)) { this.texture.update(this.canvas, {premultiply: true}); } diff --git a/src/source/geojson_worker_source.ts b/src/source/geojson_worker_source.ts index 8a7b212f6f8..21ed92fabe1 100644 --- a/src/source/geojson_worker_source.ts +++ b/src/source/geojson_worker_source.ts @@ -47,16 +47,18 @@ export interface GeoJSONIndex { getLeaves?: (clusterId: number, limit: number, offset: number) => Array; } -function loadGeoJSONTile(params: RequestedTileParameters, callback: LoadVectorDataCallback) { +function loadGeoJSONTile(params: RequestedTileParameters, callback: LoadVectorDataCallback): undefined { const canonical = params.tileID.canonical; if (!this._geoJSONIndex) { - return callback(null, null); // we couldn't load the file + callback(null, null); // we couldn't load the file + return; } const geoJSONTile = this._geoJSONIndex.getTile(canonical.z, canonical.x, canonical.y); if (!geoJSONTile) { - return callback(null, null); // nothing in the given tile + callback(null, null); // nothing in the given tile + return; } const geojsonWrapper = new GeoJSONWrapper(geoJSONTile.features); @@ -97,7 +99,6 @@ class GeoJSONWorkerSource extends VectorTileWorkerSource { * @private */ constructor(actor: Actor, layerIndex: StyleLayerIndex, availableImages: Array, isSpriteLoaded: boolean, loadGeoJSON?: LoadGeoJSON | null, brightness?: number | null) { - // @ts-expect-error - TS2345 - Argument of type '(params: RequestedTileParameters, callback: LoadVectorDataCallback) => void' is not assignable to parameter of type 'LoadVectorData'. super(actor, layerIndex, availableImages, isSpriteLoaded, loadGeoJSONTile, brightness); if (loadGeoJSON) { this.loadGeoJSON = loadGeoJSON; diff --git a/src/source/image_source.ts b/src/source/image_source.ts index 07631d6f102..52a1b06f505 100644 --- a/src/source/image_source.ts +++ b/src/source/image_source.ts @@ -701,7 +701,7 @@ class ImageSource extends Event if (this._dirty && !(this.texture instanceof UserManagedTexture)) { if (!this.texture) { - this.texture = new Texture(context, this.image, gl.RGBA); + this.texture = new Texture(context, this.image, gl.RGBA8); this.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); } else { this.texture.update(this.image); diff --git a/src/source/load_vector_tile.ts b/src/source/load_vector_tile.ts index fb91984a7bc..69ea24366f5 100644 --- a/src/source/load_vector_tile.ts +++ b/src/source/load_vector_tile.ts @@ -23,7 +23,7 @@ export type LoadVectorTileResult = { export type LoadVectorDataCallback = Callback; export type AbortVectorData = () => void; -export type LoadVectorData = (params: RequestedTileParameters, callback: LoadVectorDataCallback) => AbortVectorData | null | undefined; +export type LoadVectorData = (params: RequestedTileParameters, callback: LoadVectorDataCallback) => AbortVectorData | undefined; export class DedupedRequest { entries: { [key: string]: any; diff --git a/src/source/raster_array_tile.ts b/src/source/raster_array_tile.ts index 22ff71efefd..7db52172149 100644 --- a/src/source/raster_array_tile.ts +++ b/src/source/raster_array_tile.ts @@ -119,9 +119,9 @@ class RasterArrayTile extends Tile { this.texture = this.texture || painter.getTileTexture(img.width); if (this.texture && this.texture instanceof Texture) { - this.texture.update(img, {useMipmap: false, premultiply: false}); + this.texture.update(img, {premultiply: false}); } else { - this.texture = new Texture(context, img, gl.RGBA, {useMipmap: false, premultiply: false}); + this.texture = new Texture(context, img, gl.RGBA8, {premultiply: false}); } } @@ -289,7 +289,7 @@ class RasterArrayTile extends Tile { const texture = this.texture; if (texture && texture instanceof Texture) { - texture.update(img, {useMipmap: false, premultiply: false}); + texture.update(img, {premultiply: false}); } this.textureDescriptor = { diff --git a/src/source/tile.ts b/src/source/tile.ts index b2cac767a9f..9f9c7b381cf 100644 --- a/src/source/tile.ts +++ b/src/source/tile.ts @@ -401,7 +401,7 @@ class Tile { const atlas = this.imageAtlas; if (atlas && !atlas.uploaded) { const hasPattern = !!Object.keys(atlas.patternPositions).length; - this.imageAtlasTexture = new Texture(context, atlas.image, gl.RGBA, {useMipmap: hasPattern}); + this.imageAtlasTexture = new Texture(context, atlas.image, gl.RGBA8, {useMipmap: hasPattern}); (this.imageAtlas).uploaded = true; } @@ -508,7 +508,6 @@ class Tile { const evaluationFeature = toEvaluationFeature(feature, true); if (!filter.filter(new EvaluationParameters(this.tileID.overscaledZ), evaluationFeature, this.tileID.canonical)) continue; - // @ts-expect-error - TS2345 - Argument of type 'VectorTileFeature' is not assignable to parameter of type 'Feature'. } else if (!filter.filter(new EvaluationParameters(this.tileID.overscaledZ), feature)) { continue; } @@ -653,9 +652,9 @@ class Tile { const gl = context.gl; this.texture = this.texture || painter.getTileTexture(img.width); if (this.texture && this.texture instanceof Texture) { - this.texture.update(img, {useMipmap: true}); + this.texture.update(img); } else { - this.texture = new Texture(context, img, gl.RGBA, {useMipmap: true}); + this.texture = new Texture(context, img, gl.RGBA8, {useMipmap: true}); this.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); } } diff --git a/src/source/vector_tile_worker_source.ts b/src/source/vector_tile_worker_source.ts index bd556987c91..1c0adccce49 100644 --- a/src/source/vector_tile_worker_source.ts +++ b/src/source/vector_tile_worker_source.ts @@ -79,7 +79,6 @@ class VectorTileWorkerSource extends Evented implements WorkerSource { const workerTile = this.loading[uid] = new WorkerTile(params); workerTile.abort = this.loadVectorData(params, (err, response) => { - const aborted = !this.loading[uid]; delete this.loading[uid]; diff --git a/src/source/video_source.ts b/src/source/video_source.ts index 4e42decf712..99daf95aac2 100644 --- a/src/source/video_source.ts +++ b/src/source/video_source.ts @@ -204,11 +204,10 @@ class VideoSource extends ImageSource<'video'> { const gl = context.gl; if (!this.texture) { - this.texture = new Texture(context, this.video, gl.RGBA); + this.texture = new Texture(context, this.video, gl.RGBA8); this.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); this.width = this.video.videoWidth; this.height = this.video.videoHeight; - } else if (!this.video.paused) { this.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, gl.RGBA, gl.UNSIGNED_BYTE, this.video); diff --git a/src/style-spec/expression/index.ts b/src/style-spec/expression/index.ts index a9a51bfcc47..4906236f6e5 100644 --- a/src/style-spec/expression/index.ts +++ b/src/style-spec/expression/index.ts @@ -36,7 +36,7 @@ import type {FeatureDistanceData} from '../feature_filter/index'; import type {ConfigOptions} from '../types/config_options'; export interface Feature { - readonly type: 1 | 2 | 3 | 'Unknown' | 'Point' | 'LineString' | 'Polygon'; + readonly type: 0 | 1 | 2 | 3 | 'Unknown' | 'Point' | 'LineString' | 'Polygon'; readonly id?: number | null; readonly properties: { [_: string]: any; diff --git a/src/style-spec/package.json b/src/style-spec/package.json index f70012f103a..677a9901c97 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.7.0-beta.1", + "version": "14.7.0", "description": "a specification for mapbox gl styles", "author": "Mapbox", "license": "SEE LICENSE IN LICENSE.txt", diff --git a/src/style-spec/reference/v8.json b/src/style-spec/reference/v8.json index a0699c1cf5a..543b5807ad5 100644 --- a/src/style-spec/reference/v8.json +++ b/src/style-spec/reference/v8.json @@ -6053,16 +6053,22 @@ "js": "3.0.0", "android": "11.0.0", "ios": "11.0.0" + }, + "data-driven styling": { + "js": "3.8.0", + "android": "11.8.0", + "ios": "11.8.0" } }, "expression": { "interpolated": true, "parameters": [ "zoom", - "measure-light" + "measure-light", + "feature-state" ] }, - "property-type": "data-constant" + "property-type": "data-driven" }, "fill-extrusion-line-width": { "type": "number", @@ -7232,7 +7238,8 @@ "interpolated": true, "parameters": [ "zoom", - "measure-light" + "measure-light", + "feature-state" ] }, "property-type": "data-driven" @@ -7263,7 +7270,8 @@ "interpolated": true, "parameters": [ "zoom", - "measure-light" + "measure-light", + "feature-state" ] }, "property-type": "data-driven" @@ -8524,6 +8532,31 @@ } }, "paint_background": { + "background-pitch-alignment": { + "type": "enum", + "values": { + "map": { + "doc": "The background is aligned to the plane of the map." + }, + "viewport": { + "doc": "The background is aligned to the plane of the viewport, covering the whole screen." + } + }, + "default": "map", + "doc": "Orientation of background layer.", + "sdk-support": { + "basic functionality": { + "js": "3.8.0", + "android": "11.8.0", + "ios": "11.8.0" + } + }, + "expression": { + "interpolated": false, + "parameters": [] + }, + "property-type": "data-constant" + }, "background-color": { "type": "color", "default": "#000000", @@ -9187,9 +9220,7 @@ "doc": "An array for configuring the fade-out effect for the front cutoff of content on pitched map views. It contains three values: start, range and final opacity. The start parameter defines the point at which the fade-out effect begins, with smaller values causing the effect to start earlier. The range parameter specifies how long the fade-out effect will last. A value of 0.0 for range makes content disappear immediately without a fade-out effect. The final opacity determines content opacity at the end of the fade-out effect. A value of 1.0 for final opacity means that the cutoff is completely disabled.", "sdk-support": { "basic functionality": { - "js": "3.5.0", - "android": "11.5.0", - "ios": "11.5.0" + "js": "3.5.0" } } } diff --git a/src/style-spec/types.ts b/src/style-spec/types.ts index efc9ff32a5f..b790aa4a6ea 100644 --- a/src/style-spec/types.ts +++ b/src/style-spec/types.ts @@ -742,7 +742,7 @@ export type FillExtrusionLayerSpecification = { */ "fill-extrusion-rounded-roof"?: PropertyValueSpecification, "fill-extrusion-cutoff-fade-range"?: ExpressionSpecification, - "fill-extrusion-emissive-strength"?: PropertyValueSpecification, + "fill-extrusion-emissive-strength"?: DataDrivenPropertyValueSpecification, "fill-extrusion-emissive-strength-transition"?: TransitionSpecification, "fill-extrusion-line-width"?: DataDrivenPropertyValueSpecification, "fill-extrusion-line-width-transition"?: TransitionSpecification, @@ -958,6 +958,7 @@ export type BackgroundLayerSpecification = { "visibility"?: "visible" | "none" | ExpressionSpecification }, "paint"?: { + "background-pitch-alignment"?: "map" | "viewport" | ExpressionSpecification, "background-color"?: PropertyValueSpecification, "background-color-transition"?: TransitionSpecification, "background-pattern"?: PropertyValueSpecification, diff --git a/src/style/style.ts b/src/style/style.ts index 0ed1befdeea..ebd34736b89 100644 --- a/src/style/style.ts +++ b/src/style/style.ts @@ -1360,7 +1360,6 @@ class Style extends Evented { isLayerDraped(layer: StyleLayer): boolean { if (!this.terrain) return false; - // @ts-expect-error - TS2345 - Argument of type 'void | SourceCache' is not assignable to parameter of type 'SourceCache'. return layer.isDraped(this.getLayerSourceCache(layer)); } @@ -2663,7 +2662,7 @@ class Style extends Evented { // This means that that the line_layer feature is above the extrusion_layer_b feature despite // it being in an earlier layer. - const isLayer3D = (layerId: string) => this._mergedLayers[layerId].type === 'fill-extrusion' || this._mergedLayers[layerId].type === 'model'; + const isLayer3D = (layerId: string) => this._mergedLayers[layerId].is3D(); const order = this.order; @@ -3537,7 +3536,7 @@ class Style extends Evented { return this._mergedOtherSourceCaches[fqid]; } - getLayerSourceCache(layer: StyleLayer): SourceCache | void { + getLayerSourceCache(layer: StyleLayer): SourceCache | undefined { const fqid = makeFQID(layer.source, layer.scope); return layer.type === 'symbol' ? this._mergedSymbolSourceCaches[fqid] : diff --git a/src/style/style_layer/background_style_layer.ts b/src/style/style_layer/background_style_layer.ts index 99d1d01f1f2..3ab6e1d040e 100644 --- a/src/style/style_layer/background_style_layer.ts +++ b/src/style/style_layer/background_style_layer.ts @@ -31,6 +31,10 @@ class BackgroundStyleLayer extends StyleLayer { overrideFog: false }; } + + is3D(): boolean { + return this.paint.get('background-pitch-alignment') === 'viewport'; + } } export default BackgroundStyleLayer; diff --git a/src/style/style_layer/background_style_layer_properties.ts b/src/style/style_layer/background_style_layer_properties.ts index db1329b4017..502d8bf5b9e 100644 --- a/src/style/style_layer/background_style_layer_properties.ts +++ b/src/style/style_layer/background_style_layer_properties.ts @@ -25,6 +25,7 @@ export const getLayoutProperties = (): Properties => layout || (lay })); export type PaintProps = { + "background-pitch-alignment": DataConstantProperty<"map" | "viewport">; "background-color": DataConstantProperty; "background-pattern": DataConstantProperty; "background-opacity": DataConstantProperty; @@ -33,6 +34,7 @@ export type PaintProps = { let paint: Properties; export const getPaintProperties = (): Properties => paint || (paint = new Properties({ + "background-pitch-alignment": new DataConstantProperty(styleSpec["paint_background"]["background-pitch-alignment"]), "background-color": new DataConstantProperty(styleSpec["paint_background"]["background-color"]), "background-pattern": new DataConstantProperty(styleSpec["paint_background"]["background-pattern"]), "background-opacity": new DataConstantProperty(styleSpec["paint_background"]["background-opacity"]), diff --git a/src/style/style_layer/circle_style_layer.ts b/src/style/style_layer/circle_style_layer.ts index 55cab1386f3..3791358ecde 100644 --- a/src/style/style_layer/circle_style_layer.ts +++ b/src/style/style_layer/circle_style_layer.ts @@ -63,16 +63,13 @@ class CircleStyleLayer extends StyleLayer { pixelPosMatrix: Float32Array, elevationHelper?: DEMSampler | null, ): boolean { - const translation = tilespaceTranslate( - this.paint.get('circle-translate'), this.paint.get('circle-translate-anchor'), - transform.angle, queryGeometry.pixelToTileUnitsFactor); + transform.angle, queryGeometry.pixelToTileUnitsFactor + ); - // @ts-expect-error - TS2339 - Property 'evaluate' does not exist on type 'unknown'. const size = this.paint.get('circle-radius').evaluate(feature, featureState) + - // @ts-expect-error - TS2339 - Property 'evaluate' does not exist on type 'unknown'. this.paint.get('circle-stroke-width').evaluate(feature, featureState); return queryIntersectsCircle(queryGeometry, geometry, transform, pixelPosMatrix, elevationHelper, diff --git a/src/style/style_layer/fill_extrusion_style_layer.ts b/src/style/style_layer/fill_extrusion_style_layer.ts index b31e5d8a0ce..dc84ef22227 100644 --- a/src/style/style_layer/fill_extrusion_style_layer.ts +++ b/src/style/style_layer/fill_extrusion_style_layer.ts @@ -80,14 +80,11 @@ class FillExtrusionStyleLayer extends StyleLayer { elevationHelper: DEMSampler | null | undefined, layoutVertexArrayOffset: number, ): boolean | number { - const translation = tilespaceTranslate(this.paint.get('fill-extrusion-translate'), this.paint.get('fill-extrusion-translate-anchor'), transform.angle, queryGeometry.pixelToTileUnitsFactor); - // @ts-expect-error - TS2339 - Property 'evaluate' does not exist on type 'unknown'. const height = this.paint.get('fill-extrusion-height').evaluate(feature, featureState); - // @ts-expect-error - TS2339 - Property 'evaluate' does not exist on type 'unknown'. const base = this.paint.get('fill-extrusion-base').evaluate(feature, featureState); const centroid = [0, 0]; diff --git a/src/style/style_layer/fill_extrusion_style_layer_properties.ts b/src/style/style_layer/fill_extrusion_style_layer_properties.ts index 183bcaa8462..d83e7008ef6 100644 --- a/src/style/style_layer/fill_extrusion_style_layer_properties.ts +++ b/src/style/style_layer/fill_extrusion_style_layer_properties.ts @@ -48,7 +48,7 @@ export type PaintProps = { "fill-extrusion-vertical-scale": DataConstantProperty; "fill-extrusion-rounded-roof": DataConstantProperty; "fill-extrusion-cutoff-fade-range": DataConstantProperty; - "fill-extrusion-emissive-strength": DataConstantProperty; + "fill-extrusion-emissive-strength": DataDrivenProperty; "fill-extrusion-line-width": DataDrivenProperty; "fill-extrusion-cast-shadows": DataConstantProperty; }; @@ -76,7 +76,7 @@ export const getPaintProperties = (): Properties => paint || (paint "fill-extrusion-vertical-scale": new DataConstantProperty(styleSpec["paint_fill-extrusion"]["fill-extrusion-vertical-scale"]), "fill-extrusion-rounded-roof": new DataConstantProperty(styleSpec["paint_fill-extrusion"]["fill-extrusion-rounded-roof"]), "fill-extrusion-cutoff-fade-range": new DataConstantProperty(styleSpec["paint_fill-extrusion"]["fill-extrusion-cutoff-fade-range"]), - "fill-extrusion-emissive-strength": new DataConstantProperty(styleSpec["paint_fill-extrusion"]["fill-extrusion-emissive-strength"]), + "fill-extrusion-emissive-strength": new DataDrivenProperty(styleSpec["paint_fill-extrusion"]["fill-extrusion-emissive-strength"]), "fill-extrusion-line-width": new DataDrivenProperty(styleSpec["paint_fill-extrusion"]["fill-extrusion-line-width"]), "fill-extrusion-cast-shadows": new DataConstantProperty(styleSpec["paint_fill-extrusion"]["fill-extrusion-cast-shadows"]), })); diff --git a/src/style/style_layer/heatmap_style_layer.ts b/src/style/style_layer/heatmap_style_layer.ts index 9a2eb80a7b2..a8a95e051d5 100644 --- a/src/style/style_layer/heatmap_style_layer.ts +++ b/src/style/style_layer/heatmap_style_layer.ts @@ -85,8 +85,6 @@ class HeatmapStyleLayer extends StyleLayer { pixelPosMatrix: Float32Array, elevationHelper?: DEMSampler | null, ): boolean { - - // @ts-expect-error - TS2339 - Property 'evaluate' does not exist on type 'unknown'. const size = this.paint.get('heatmap-radius').evaluate(feature, featureState); return queryIntersectsCircle( queryGeometry, geometry, transform, pixelPosMatrix, elevationHelper, diff --git a/src/style/style_layer/line_style_layer.ts b/src/style/style_layer/line_style_layer.ts index 505d8d34ae7..31fc41ac2b1 100644 --- a/src/style/style_layer/line_style_layer.ts +++ b/src/style/style_layer/line_style_layer.ts @@ -170,11 +170,8 @@ class LineStyleLayer extends StyleLayer { this.paint.get('line-translate-anchor'), transform.angle, queryGeometry.pixelToTileUnitsFactor); const halfWidth = queryGeometry.pixelToTileUnitsFactor / 2 * getLineWidth( - // @ts-expect-error - TS2339 - Property 'evaluate' does not exist on type 'unknown'. this.paint.get('line-width').evaluate(feature, featureState), - // @ts-expect-error - TS2339 - Property 'evaluate' does not exist on type 'unknown'. this.paint.get('line-gap-width').evaluate(feature, featureState)); - // @ts-expect-error - TS2339 - Property 'evaluate' does not exist on type 'unknown'. const lineOffset = this.paint.get('line-offset').evaluate(feature, featureState); if (lineOffset) { geometry = offsetLine(geometry, lineOffset * queryGeometry.pixelToTileUnitsFactor); diff --git a/src/terrain/draw_terrain_raster.ts b/src/terrain/draw_terrain_raster.ts index a647a3f4721..0888d196c4d 100644 --- a/src/terrain/draw_terrain_raster.ts +++ b/src/terrain/draw_terrain_raster.ts @@ -30,6 +30,7 @@ import type {OverscaledTileID, CanonicalTileID} from '../source/tile_id'; import type SourceCache from '../source/source_cache'; import type Painter from '../render/painter'; import type Tile from '../source/tile'; +import type {DynamicDefinesType} from '../render/program/program_uniforms'; export { drawTerrainRaster @@ -233,10 +234,9 @@ function drawTerrainForGlobe(painter: Painter, terrain: Terrain, sourceCache: So // Render the poles. if (sharedBuffers && (painter.renderDefaultNorthPole || painter.renderDefaultSouthPole)) { - const defines = ['GLOBE_POLES', 'PROJECTION_GLOBE_VIEW']; + const defines: DynamicDefinesType[] = ['GLOBE_POLES', 'PROJECTION_GLOBE_VIEW']; if (useCustomAntialiasing) defines.push('CUSTOM_ANTIALIASING'); - // @ts-expect-error - TS2322 - Type 'string[]' is not assignable to type 'DynamicDefinesType[]'. program = painter.getOrCreateProgram('globeRaster', {defines}); for (const coord of tileIDs) { // Fill poles by extrapolating adjacent border tiles diff --git a/src/terrain/terrain.ts b/src/terrain/terrain.ts index 2ea0c61436d..7ec6db71008 100644 --- a/src/terrain/terrain.ts +++ b/src/terrain/terrain.ts @@ -686,23 +686,13 @@ export class Terrain extends Elevation { context.activeTexture.set(gl.TEXTURE2); const min = this._getLoadedAreaMinimum(); - - const getTextureParameters = () => { - const image = new Float32Image( - {width: 1, height: 1}, - new Float32Array([min])); - return [gl.R32F, image]; - }; - - const [internalFormat, image] = getTextureParameters(); + const image = new Float32Image({width: 1, height: 1}, new Float32Array([min])); this._emptyDEMTextureDirty = false; let texture = this._emptyDEMTexture; if (!texture) { - // @ts-expect-error - TS2345 - Argument of type '33326 | Float32Image' is not assignable to parameter of type 'TextureImage'. - texture = this._emptyDEMTexture = new Texture(context, image, internalFormat, {premultiply: false}); + texture = this._emptyDEMTexture = new Texture(context, image, gl.R32F, {premultiply: false}); } else { - // @ts-expect-error - TS2345 - Argument of type '33326 | Float32Image' is not assignable to parameter of type 'TextureImage'. texture.update(image, {premultiply: false}); } return texture; @@ -896,11 +886,9 @@ export class Terrain extends Elevation { const coords = (proxiedCoords as Array); context.viewport.set([0, 0, fbo.fb.width, fbo.fb.height]); if (currentStencilSource !== (sourceCache ? sourceCache.id : null)) { - // @ts-expect-error - TS2345 - Argument of type 'void | SourceCache' is not assignable to parameter of type 'SourceCache'. this._setupStencil(fbo, proxiedCoords, layer, sourceCache); currentStencilSource = sourceCache ? sourceCache.id : null; } - // @ts-expect-error - TS2345 - Argument of type 'void | SourceCache' is not assignable to parameter of type 'SourceCache'. painter.renderLayer(painter, sourceCache, layer, coords); } @@ -917,11 +905,9 @@ export class Terrain extends Elevation { const coords = (proxiedCoords as Array); context.viewport.set([0, 0, fbo.fb.width, fbo.fb.height]); if (currentStencilSource !== (sourceCache ? sourceCache.id : null)) { - // @ts-expect-error - TS2345 - Argument of type 'void | SourceCache' is not assignable to parameter of type 'SourceCache'. this._setupStencil(fbo, proxiedCoords, layer, sourceCache); currentStencilSource = sourceCache ? sourceCache.id : null; } - // @ts-expect-error - TS2345 - Argument of type 'void | SourceCache' is not assignable to parameter of type 'SourceCache'. painter.renderLayer(painter, sourceCache, layer, coords); } } @@ -1037,7 +1023,7 @@ export class Terrain extends Elevation { const gl = context.gl; const bufferSize = this.drapeBufferSize; context.activeTexture.set(gl.TEXTURE0); - const tex = new Texture(context, {width: bufferSize[0], height: bufferSize[1], data: null}, gl.RGBA); + const tex = new Texture(context, {width: bufferSize[0], height: bufferSize[1], data: null}, gl.RGBA8); tex.bind(gl.LINEAR, gl.CLAMP_TO_EDGE); const fb = context.createFramebuffer(bufferSize[0], bufferSize[1], true, null); fb.colorAttachment.set(tex.texture); diff --git a/src/ui/camera.ts b/src/ui/camera.ts index 0b6633b8cf3..b00cddbefa2 100644 --- a/src/ui/camera.ts +++ b/src/ui/camera.ts @@ -60,7 +60,8 @@ import type {LngLatLike, LngLatBoundsLike} from '../geo/lng_lat'; * `center` is ignored if `around` is included. * @property {PaddingOptions} padding Dimensions in pixels applied on each side of the viewport for shifting the vanishing point. * Note that when `padding` is used with `jumpTo`, `easeTo`, and `flyTo`, it also sets the global map padding as a side effect, - * affecting all subsequent camera movements until the padding is reset. + * affecting all subsequent camera movements until the padding is reset. To avoid this, add the `retainPadding: false` option. + * @property {boolean} retainPadding If `false`, the value provided with the `padding` option will not be retained as the global map padding. This is `true` by default. * @example * // set the map's initial perspective with CameraOptions * const map = new mapboxgl.Map({ @@ -83,14 +84,16 @@ export type CameraOptions = { pitch?: number; around?: LngLatLike; padding?: number | PaddingOptions; + minZoom?: number; maxZoom?: number; + retainPadding?: boolean; }; -export type FullCameraOptions = { +export type FullCameraOptions = CameraOptions & { maxZoom: number; offset: PointLike; padding: Required; -} & CameraOptions; +}; /** * Options common to map movement methods that involve animation, such as {@link Map#panBy} and @@ -191,10 +194,7 @@ class Camera extends Evented { _bearingSnap: number; _easeStart: number; - _easeOptions: { - duration: number; - easing: (_: number) => number; - }; + _easeOptions: EasingOptions; _easeId: string | undefined; _respectPrefersReducedMotion: boolean; @@ -636,8 +636,7 @@ class Camera extends Evented { options.padding = this._extendPadding(options.padding); - // @ts-expect-error - TS2322 - Type 'CameraOptions' is not assignable to type 'FullCameraOptions'. - return options; + return options as FullCameraOptions; } _minimumAABBFrustumDistance(tr: Transform, aabb: Aabb): number { @@ -679,7 +678,7 @@ class Camera extends Evented { const xAxis = vec3.normalize([] as any, vec3.cross([] as any, zAxis, [0, 1, 0])); const yAxis = vec3.cross([] as any, xAxis, zAxis); - const aabbOrientation = [ + const aabbOrientation: mat4 = [ xAxis[0], xAxis[1], xAxis[2], 0, yAxis[0], yAxis[1], yAxis[2], 0, zAxis[0], zAxis[1], zAxis[2], 0, @@ -702,7 +701,7 @@ class Camera extends Evented { let aabb = Aabb.fromPoints(ecefCoords.map(p => [vec3.dot(xAxis, p), vec3.dot(yAxis, p), vec3.dot(zAxis, p)])); - const center = vec3.transformMat4([] as any, aabb.center, aabbOrientation as [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number]); + const center = vec3.transformMat4([] as unknown as vec3, aabb.center, aabbOrientation) as [number, number, number]; if (vec3.squaredLength(center) === 0) { vec3.set(center, 0, 0, 1); @@ -710,14 +709,12 @@ class Camera extends Evented { vec3.normalize(center, center); vec3.scale(center, center, GLOBE_RADIUS); - // @ts-expect-error - TS2345 - Argument of type 'vec3' is not assignable to parameter of type '[any, any, any]'. tr.center = ecefToLatLng(center); const worldToCamera = tr.getWorldToCameraMatrix(); - // @ts-expect-error - TS2345 - Argument of type 'Float64Array' is not assignable to parameter of type 'mat4'. - const cameraToWorld = mat4.invert(new Float64Array(16), worldToCamera); + const cameraToWorld = mat4.invert(new Float64Array(16) as unknown as mat4, worldToCamera); - aabb = Aabb.applyTransform(aabb, mat4.multiply([] as any, worldToCamera, aabbOrientation as [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number])); + aabb = Aabb.applyTransform(aabb, mat4.multiply([] as any, worldToCamera, aabbOrientation)); const extendedAabb = this._extendAABB(aabb, tr, eOptions, bearing); if (!extendedAabb) { warnOnce('Map cannot fit within canvas with the given bounds, padding, and/or offset.'); @@ -787,8 +784,7 @@ class Camera extends Evented { const width = tr.width - (left + right); const height = tr.height - (top + bottom); - // @ts-expect-error - TS2322 - Type 'vec3' is not assignable to type '[number, number, number]'. - const aabbSize: [number, number, number] = vec3.sub(([] as any), aabb.max, aabb.min); + const aabbSize = vec3.sub([] as unknown as vec3, aabb.max, aabb.min) as [number, number, number]; const scaleX = width / aabbSize[0]; const scaleY = height / aabbSize[1]; @@ -807,10 +803,8 @@ class Camera extends Evented { [aabb.max[0] + right * scaleRatio, aabb.max[1] + top * scaleRatio, aabb.max[2]] ); - // @ts-expect-error - TS2339 - Property 'x' does not exist on type 'PointLike'. | TS2339 - Property 'y' does not exist on type 'PointLike'. - const centerOffset = (typeof options.offset.x === 'number' && typeof options.offset.y === 'number') ? - // @ts-expect-error - TS2339 - Property 'x' does not exist on type 'PointLike'. | TS2339 - Property 'y' does not exist on type 'PointLike'. - new Point(options.offset.x, options.offset.y) : + const centerOffset = (typeof (options.offset as Point).x === 'number' && typeof (options.offset as Point).y === 'number') ? + new Point((options.offset as Point).x, (options.offset as Point).y) : Point.convert(options.offset); const rotatedOffset = centerOffset.rotate(-degToRad(bearing)); @@ -905,17 +899,15 @@ class Camera extends Evented { const z2 = this.queryTerrainElevation(coord2); const z3 = this.queryTerrainElevation(coord3); - const worldCoords = [ + const worldCoords: vec3[] = [ [p0world.x, p0world.y, Math.min(z0 || 0, z1 || 0, z2 || 0, z3 || 0)], [p1world.x, p1world.y, Math.max(z0 || 0, z1 || 0, z2 || 0, z3 || 0)] ]; - // @ts-expect-error - TS2345 - Argument of type 'number[][]' is not assignable to parameter of type 'vec3[]'. let aabb = Aabb.fromPoints(worldCoords); const worldToCamera = tr.getWorldToCameraMatrix(); - // @ts-expect-error - TS2345 - Argument of type 'Float64Array' is not assignable to parameter of type 'mat4'. - const cameraToWorld = mat4.invert(new Float64Array(16), worldToCamera); + const cameraToWorld = mat4.invert(new Float64Array(16) as unknown as mat4, worldToCamera); aabb = Aabb.applyTransform(aabb, worldToCamera); const extendedAabb = this._extendAABB(aabb, tr, eOptions, bearing); @@ -929,14 +921,13 @@ class Camera extends Evented { const aabbHalfExtentZ = size[2] * 0.5; const frustumDistance = this._minimumAABBFrustumDistance(tr, aabb); - const normalZ = [0, 0, 1, 0]; + const normalZ: vec4 = [0, 0, 1, 0]; - vec4.transformMat4(normalZ as [number, number, number, number], normalZ as [number, number, number, number], worldToCamera); - vec4.normalize(normalZ as [number, number, number, number], normalZ as [number, number, number, number]); + vec4.transformMat4(normalZ, normalZ, worldToCamera); + vec4.normalize(normalZ, normalZ); - // @ts-expect-error - TS2345 - Argument of type '[number, number, number, number]' is not assignable to parameter of type 'ReadonlyVec3'. - const offset = vec3.scale([] as any, normalZ as [number, number, number, number], frustumDistance + aabbHalfExtentZ); - const cameraPosition = vec3.add([] as any, aabb.center, offset); + const offset = vec3.scale([] as unknown as vec3, normalZ as unknown as vec3, frustumDistance + aabbHalfExtentZ); + const cameraPosition = vec3.add([] as unknown as vec3, aabb.center, offset); vec3.transformMat4(aabb.center, aabb.center, cameraToWorld); vec3.transformMat4(cameraPosition, cameraPosition, cameraToWorld); @@ -1045,18 +1036,17 @@ class Camera extends Evented { const lnglat2 = this.transform.pointLocation3D(new Point(min.x, max.y)); const lnglat3 = this.transform.pointLocation3D(new Point(max.x, min.y)); - const p0coord = [ + const p0coord: LngLatLike = [ Math.min(lnglat0.lng, lnglat1.lng, lnglat2.lng, lnglat3.lng), Math.min(lnglat0.lat, lnglat1.lat, lnglat2.lat, lnglat3.lat), ]; - const p1coord = [ + const p1coord: LngLatLike = [ Math.max(lnglat0.lng, lnglat1.lng, lnglat2.lng, lnglat3.lng), Math.max(lnglat0.lat, lnglat1.lat, lnglat2.lat, lnglat3.lat), ]; const pitch = options && options.pitch ? options.pitch : this.getPitch(); - // @ts-expect-error - TS2345 - Argument of type 'number[]' is not assignable to parameter of type 'LngLatLike'. const cameraPlacement = this._cameraForBounds(this.transform, p0coord, p1coord, bearing, pitch, options); return this._fitInternal(cameraPlacement, options, eventData); } @@ -1135,12 +1125,18 @@ class Camera extends Evented { tr.pitch = +options.pitch; } - if (options.padding != null) { - const padding = typeof options.padding === 'number' ? - this._extendPadding(options.padding) : - options.padding; + const padding = typeof options.padding === 'number' ? + this._extendPadding(options.padding) : + options.padding; - if (!tr.isPaddingEqual(padding)) tr.padding = padding; + if (options.padding != null && !tr.isPaddingEqual(padding)) { + if (options.retainPadding === false) { + const transformForPadding = tr.clone(); + transformForPadding.padding = padding; + tr.setLocationAtPoint(tr.center, transformForPadding.centerPoint); + } else { + tr.padding = padding; + } } if (options.preloadOnly) { @@ -1321,6 +1317,7 @@ class Camera extends Evented { easeTo( options: EasingOptions & { easeId?: string; + noMoveStart?: boolean; }, eventData?: EventData, ): this { @@ -1389,6 +1386,8 @@ class Camera extends Evented { const pitchChanged = this._pitching || (pitch !== startPitch); const paddingChanged = !tr.isPaddingEqual(padding); + const transformForPadding = options.retainPadding === false ? tr.clone() : tr; + const frame = (tr: Transform) => (k: number) => { if (zoomChanged) { tr.zoom = interpolate(startZoom, zoom, k); @@ -1400,10 +1399,10 @@ class Camera extends Evented { tr.pitch = interpolate(startPitch, pitch, k); } if (paddingChanged) { - tr.interpolatePadding(startPadding, padding, k); + transformForPadding.interpolatePadding(startPadding, padding, k); // When padding is being applied, Transform#centerPoint is changing continuously, // thus we need to recalculate offsetPoint every fra,e - pointAtOffset = tr.centerPoint.add(offsetAsPoint); + pointAtOffset = transformForPadding.centerPoint.add(offsetAsPoint); } if (around) { @@ -1444,13 +1443,11 @@ class Camera extends Evented { this._padding = paddingChanged; this._easeId = options.easeId; - // @ts-expect-error - TS2339 - Property 'noMoveStart' does not exist on type 'CameraOptions & AnimationOptions & { easeId?: string; }'. this._prepareEase(eventData, options.noMoveStart, currently); this._ease(frame(tr), (interruptingEaseId?: string) => { if (tr.cameraElevationReference === "sea") tr.recenterOnTerrain(); this._afterEase(eventData, interruptingEaseId); - // @ts-expect-error - TS2345 - Argument of type 'CameraOptions & AnimationOptions & { easeId?: string; }' is not assignable to parameter of type '{ animate: boolean; duration: number; easing: (_: number) => number; }'. }, options); return this; @@ -1584,7 +1581,7 @@ class Camera extends Evented { flyTo(options: EasingOptions, eventData?: EventData): this { // Fall through to jumpTo if user has set prefers-reduced-motion if (this._prefersReducedMotion(options)) { - const coercedOptions = pick(options, ['center', 'zoom', 'bearing', 'pitch', 'around', 'padding']); + const coercedOptions = pick(options, ['center', 'zoom', 'bearing', 'pitch', 'around', 'padding', 'retainPadding']); return this.jumpTo(coercedOptions, eventData); } @@ -1637,7 +1634,6 @@ class Camera extends Evented { u1 = delta.mag(); if ('minZoom' in options) { - // @ts-expect-error - TS2345 - Argument of type 'unknown' is not assignable to parameter of type 'number'. const minZoom = clamp(Math.min(options.minZoom, startZoom, zoom), tr.minZoom, tr.maxZoom); // wm: Maximum visible span, measured in pixels with respect to the initial // scale. @@ -1709,6 +1705,8 @@ class Camera extends Evented { const pitchChanged = (pitch !== startPitch); const paddingChanged = !tr.isPaddingEqual(padding); + const transformForPadding = options.retainPadding === false ? tr.clone() : tr; + const frame = (tr: Transform) => (k: number) => { // s: The distance traveled along the flight path, measured in ρ-screenfuls. const s = k * S; @@ -1722,10 +1720,10 @@ class Camera extends Evented { tr.pitch = interpolate(startPitch, pitch, k); } if (paddingChanged) { - tr.interpolatePadding(startPadding, padding, k); + transformForPadding.interpolatePadding(startPadding, padding, k); // When padding is being applied, Transform#centerPoint is changing continuously, // thus we need to recalculate offsetPoint every frame - pointAtOffset = tr.centerPoint.add(offsetAsPoint); + pointAtOffset = transformForPadding.centerPoint.add(offsetAsPoint); } const newCenter = k === 1 ? center : tr.unproject(from.add(delta.mult(u(s))).mult(scale)); @@ -1751,7 +1749,6 @@ class Camera extends Evented { this._padding = paddingChanged; this._prepareEase(eventData, false); - // @ts-expect-error - TS2345 - Argument of type 'EasingOptions' is not assignable to parameter of type '{ animate: boolean; duration: number; easing: (_: number) => number; }'. this._ease(frame(tr), () => this._afterEase(eventData), options); return this; @@ -1773,7 +1770,7 @@ class Camera extends Evented { return this._stop(); } - // @ts-expect-error - TS2355 - A function whose declared type is neither 'undefined', 'void', nor 'any' must return a value. + // @ts-expect-error - No-op in the Camera class, implemented by the Map class _requestRenderFrame(_callback: () => void): TaskID {} // No-op in the Camera class, implemented by the Map class @@ -1801,13 +1798,11 @@ class Camera extends Evented { return this; } - _ease(frame: (_: number) => Transform | void, - finish: () => void, - options: { - animate: boolean; - duration: number; - easing: (_: number) => number; - }) { + _ease( + frame: (_: number) => Transform | void, + finish: () => void, + options: EasingOptions + ) { if (options.animate === false || options.duration === 0) { frame(1); finish(); diff --git a/src/ui/control/geolocate_control.ts b/src/ui/control/geolocate_control.ts index 35283224679..a325dfe7169 100644 --- a/src/ui/control/geolocate_control.ts +++ b/src/ui/control/geolocate_control.ts @@ -429,8 +429,7 @@ class GeolocateControl extends Evented implements IContr return; } this._container.addEventListener('contextmenu', (e: MouseEvent) => e.preventDefault()); - // @ts-expect-error - TS2322 - Type 'HTMLElement' is not assignable to type 'HTMLButtonElement'. - this._geolocateButton = DOM.create('button', `mapboxgl-ctrl-geolocate`, this._container); + this._geolocateButton = DOM.create('button', `mapboxgl-ctrl-geolocate`, this._container) as HTMLButtonElement; DOM.create('span', `mapboxgl-ctrl-icon`, this._geolocateButton).setAttribute('aria-hidden', 'true'); this._geolocateButton.type = 'button'; diff --git a/src/ui/control/navigation_control.ts b/src/ui/control/navigation_control.ts index 0ceffe1eaae..2f91004a41d 100644 --- a/src/ui/control/navigation_control.ts +++ b/src/ui/control/navigation_control.ts @@ -152,11 +152,9 @@ class NavigationControl implements IControl { } _createButton(className: string, fn: () => unknown): HTMLButtonElement { - const a = DOM.create('button', className, this._container); - // @ts-expect-error - TS2339 - Property 'type' does not exist on type 'HTMLElement'. + const a = DOM.create('button', className, this._container) as HTMLButtonElement; a.type = 'button'; a.addEventListener('click', fn); - // @ts-expect-error - TS2322 - Type 'HTMLElement' is not assignable to type 'HTMLButtonElement'. return a; } diff --git a/src/ui/handler/touch_zoom_rotate.ts b/src/ui/handler/touch_zoom_rotate.ts index 42c7b7afdac..60ace95d51f 100644 --- a/src/ui/handler/touch_zoom_rotate.ts +++ b/src/ui/handler/touch_zoom_rotate.ts @@ -243,8 +243,7 @@ export class TouchPitchHandler extends TwoTouchHandler { if (this._map._cooperativeGestures && !isFullscreen() && e.touches.length < 3) return; - // @ts-expect-error - TS2322 - Type 'boolean | void' is not assignable to type 'boolean'. - this._valid = this.gestureBeginsVertically(vectorA, vectorB, e.timeStamp); + this._valid = !!this.gestureBeginsVertically(vectorA, vectorB, e.timeStamp); if (!this._valid) return; diff --git a/src/ui/handler_manager.ts b/src/ui/handler_manager.ts index 5cbf77339f2..22d9bebf07e 100644 --- a/src/ui/handler_manager.ts +++ b/src/ui/handler_manager.ts @@ -113,7 +113,7 @@ class HandlerManager { _previousActiveHandlers: { [key: string]: Handler; }; - _listeners: Array<[HTMLElement | Document, string, undefined | AddEventListenerOptions]>; + _listeners: Array<[HTMLElement | Document | Window, string, undefined | AddEventListenerOptions]>; _trackingEllipsoid: TrackingEllipsoid; _dragOrigin: vec3 | null | undefined; _originalZoom: number | null | undefined; @@ -181,7 +181,6 @@ class HandlerManager { [el, 'wheel', {passive: false}], [el, 'contextmenu', undefined], - // @ts-expect-error - TS2322 - Type 'Window & typeof globalThis' is not assignable to type 'Document | HTMLElement'. [window, 'blur', undefined] ]; diff --git a/src/util/image.ts b/src/util/image.ts index 82fe0a2ff5e..2109d2e190d 100644 --- a/src/util/image.ts +++ b/src/util/image.ts @@ -9,11 +9,12 @@ export type Size = { height: number; }; -export interface SpritePosition { - readonly tl: [number, number]; - readonly br: [number, number]; - readonly pixelRatio?: number; -} +export type SpritePosition = Readonly<{ + tl: [number, number]; + br: [number, number]; + pixelRatio?: number; +}>; + export type SpritePositions = { [_: string]: SpritePosition; }; diff --git a/src/util/util.ts b/src/util/util.ts index dfd1883d43f..39c1d19ae15 100644 --- a/src/util/util.ts +++ b/src/util/util.ts @@ -39,7 +39,7 @@ export function radToDeg(a: number): number { return a * RAD_TO_DEG; } -const TILE_CORNERS = [[0, 0], [1, 0], [1, 1], [0, 1]]; +const TILE_CORNERS = [[0, 0], [1, 0], [1, 1], [0, 1]] as const; /** * Given a particular bearing, returns the corner of the tile thats farthest @@ -49,10 +49,9 @@ const TILE_CORNERS = [[0, 0], [1, 0], [1, 1], [0, 1]]; * @returns {QuadCorner} * @private */ -export function furthestTileCorner(bearing: number): [number, number] { +export function furthestTileCorner(bearing: number): Readonly<[number, number]> { const alignedBearing = ((bearing + 45) + 360) % 360; const cornerIdx = Math.round(alignedBearing / 90) % 4; - // @ts-expect-error - TS2322 - Type 'number[]' is not assignable to type '[number, number]'. return TILE_CORNERS[cornerIdx]; } @@ -871,7 +870,7 @@ export function computeColorAdjustmentMatrix( const sa = saturation / 3.0; const sb = 1.0 - 2.0 * sa; - const saturationMatrix = [ + const saturationMatrix: mat4 = [ sb, sa, sa, 0.0, sa, sb, sa, 0.0, sa, sa, sb, 0.0, @@ -879,7 +878,7 @@ export function computeColorAdjustmentMatrix( ]; const cs = 0.5 - 0.5 * contrast; - const contrastMatrix = [ + const contrastMatrix: mat4 = [ contrast, 0.0, 0.0, 0.0, 0.0, contrast, 0.0, 0.0, 0.0, 0.0, contrast, 0.0, @@ -887,19 +886,16 @@ export function computeColorAdjustmentMatrix( ]; const hl = brightnessMax - brightnessMin; - const brightnessMatrix = [ + const brightnessMatrix: mat4 = [ hl, 0.0, 0.0, 0.0, 0.0, hl, 0.0, 0.0, 0.0, 0.0, hl, 0.0, brightnessMin, brightnessMin, brightnessMin, 1.0 ]; - mat4.multiply(m, brightnessMatrix as [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number], contrastMatrix as [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number]); - mat4.multiply(m, m, saturationMatrix as [number, number, number, number, number, number, number, number, number, number, number, number, number, number, number, number]); - // mat4.multiply(m, m, hueMatrix); - - // @ts-expect-error - TS2322 - Type 'mat4' is not assignable to type 'Float32Array'. - return m; + mat4.multiply(m, brightnessMatrix, contrastMatrix); + mat4.multiply(m, m, saturationMatrix); + return m as Float32Array; } export {deepEqual}; diff --git a/src/util/web_worker_transfer.ts b/src/util/web_worker_transfer.ts index 9d085be42d0..d9071653b74 100644 --- a/src/util/web_worker_transfer.ts +++ b/src/util/web_worker_transfer.ts @@ -129,8 +129,7 @@ export function serialize(input: unknown, transferables?: Set | nu input instanceof String || input instanceof Date || input instanceof RegExp) { - // @ts-expect-error - TS2322 - Type 'unknown' is not assignable to type 'Serialized'. - return input; + return input as Serialized; } if (isArrayBuffer(input) || isImageBitmap(input)) { diff --git a/test/build/typings/compatibility-test.ts b/test/build/typings/compatibility-test.ts index f5bbf0924f7..02c4cf3f195 100644 --- a/test/build/typings/compatibility-test.ts +++ b/test/build/typings/compatibility-test.ts @@ -948,8 +948,7 @@ mercatorcoordinate.meterInMercatorCoordinateUnits() satisfies number; */ expectType((url: string) => ({url})); -// @ts-expect-error - incompatible -expectType((url: string, resourceTypeEnum: mapboxgl.ResourceTypeEnum) => ({ +expectType((url: string, resourceType: mapboxgl.ResourceType) => ({ url, credentials: "same-origin", headers: {"Accept-Encoding": "compress"}, diff --git a/test/ignores/all.js b/test/ignores/all.js index 3e77daa6903..407b2a33c29 100644 --- a/test/ignores/all.js +++ b/test/ignores/all.js @@ -34,6 +34,10 @@ const todo = [ // https://mapbox.atlassian.net/browse/MAPS3D-987 "render-tests/model-layer/landmark-shadows-terrain", + + // https://mapbox.atlassian.net/browse/GLJS-1005 + "expression-tests/image/two-arguments/available", + "render-tests/image-fallback-nested/add-image-after" ]; const skip = [ diff --git a/test/integration/README.md b/test/integration/README.md index dea50bd5941..385e96eb9da 100644 --- a/test/integration/README.md +++ b/test/integration/README.md @@ -160,7 +160,7 @@ Larger alloweds are acceptable for testing debug features that will not be direc If a test fails on a run with too large a difference to adjust the "allowed," it can be added to the corresponding [ignore file](../ignore) for the browser or operating system. -Ignores include tests under `"todo"` and `"skip"`. `"todo"` tests show up in test results but do not trigger a failing run. Most tests failing on one pltaform should be marked as "ignore." This allows us to notice if the tests start passing. +Ignores include tests under `"todo"` and `"skip"`. `"todo"` tests show up in test results but do not trigger a failing run. Most tests failing on one platform should be marked as "ignore." This allows us to notice if the tests start passing. Tests under `"skip"` will not run at all. Tests should be skipped if they trigger crashes or if they are flaky (to prevent falsely concluding that the test is a non-issue). diff --git a/test/integration/expression-tests/image/two-arguments/available/test.json b/test/integration/expression-tests/image/two-arguments/available/test.json new file mode 100644 index 00000000000..4b5372952dd --- /dev/null +++ b/test/integration/expression-tests/image/two-arguments/available/test.json @@ -0,0 +1,20 @@ +{ + "expression": ["to-boolean", ["image", "first", "second"]], + "propertySpec": {"type": "boolean"}, + "inputs": [ + [{}, {}], + [{"availableImages": ["first"]}, {}], + [{"availableImages": ["second"]}, {}], + [{"availableImages": ["first", "second"]}, {}] + ], + "expected": { + "compiled": { + "result": "success", + "isFeatureConstant": true, + "isZoomConstant": true, + "type": "boolean" + }, + "outputs": [false, false, false, true], + "serialized": ["to-boolean", ["image", "first", "second"]] + } +} diff --git a/test/integration/expression-tests/image/two-arguments/coalesce/test.json b/test/integration/expression-tests/image/two-arguments/coalesce/test.json new file mode 100644 index 00000000000..b39ecbe5e06 --- /dev/null +++ b/test/integration/expression-tests/image/two-arguments/coalesce/test.json @@ -0,0 +1,37 @@ +{ + "expression": ["coalesce", ["image", "first", "second"], ["image", "third", "fourth"]], + "propertySpec": {"type": "resolvedImage"}, + "inputs": [ + [{}, {}], + [{"availableImages": ["first"]}, {}], + [{"availableImages": ["second"]}, {}], + [{"availableImages": ["third"]}, {}], + [{"availableImages": ["fourth"]}, {}], + [{"availableImages": ["third", "fourth"]}, {}], + [{"availableImages": ["first", "third", "fourth"]}, {}], + [{"availableImages": ["second", "third", "fourth"]}, {}], + [{"availableImages": ["first", "second"]}, {}], + [{"availableImages": ["first", "second", "third", "fourth"]}, {}] + ], + "expected": { + "compiled": { + "result": "success", + "isFeatureConstant": true, + "isZoomConstant": true, + "type": "resolvedImage" + }, + "outputs": [ + {"namePrimary": "first", "nameSecondary": "second", "available": false}, + {"namePrimary": "first", "nameSecondary": "second", "available": false}, + {"namePrimary": "first", "nameSecondary": "second", "available": false}, + {"namePrimary": "first", "nameSecondary": "second", "available": false}, + {"namePrimary": "first", "nameSecondary": "second", "available": false}, + {"namePrimary": "third", "nameSecondary": "fourth", "available": true}, + {"namePrimary": "third", "nameSecondary": "fourth", "available": true}, + {"namePrimary": "third", "nameSecondary": "fourth", "available": true}, + {"namePrimary": "first", "nameSecondary": "second", "available": true}, + {"namePrimary": "first", "nameSecondary": "second", "available": true} + ], + "serialized": ["coalesce", ["image", "first", "second"], ["image", "third", "fourth"]] + } +} diff --git a/test/integration/lib/expression.js b/test/integration/lib/expression.js index a3b2d90b514..e16d56d6150 100644 --- a/test/integration/lib/expression.js +++ b/test/integration/lib/expression.js @@ -84,7 +84,7 @@ function deepEqual(a, b) { * deal with implementation-specific test exclusions and fudge-factors. * @param {Object} options * @param {Array} [options.tests] - Array of test names to run; tests not in the array will be skipped. - * @param {Array} [options.ignores] - Array of test names to ignore. + * @param {Array} [options.ignores] - Object with todo and skip arrays containing test names to ignore. * @param {} runExpressionTest - A function that runs a single expression test fixture. * @returns {undefined} Terminates the process when testing is complete. */ diff --git a/test/integration/lib/harness.js b/test/integration/lib/harness.js index 4c70ccf6d2e..977edea7e78 100644 --- a/test/integration/lib/harness.js +++ b/test/integration/lib/harness.js @@ -20,7 +20,7 @@ export default function (directory, implementation, options, run) { const server = createServer(); const tests = options.tests || []; - const ignores = options.ignores || {}; + const ignores = options.ignores || {'todo': [], 'skip': []}; let sequence = globSync(`**/${options.fixtureFilename || 'style.json'}`, {cwd: directory}) .sort((a, b) => a.localeCompare(b, 'en')) @@ -31,9 +31,10 @@ export default function (directory, implementation, options, run) { server.localizeURLs(style); style.metadata = style.metadata || {}; + let testName = `${path.basename(directory)}/${id}`; style.metadata.test = Object.assign({ id, - ignored: ignores[`${path.basename(directory)}/${id}`], + skip: ignores.skip.includes(testName) || ignores.todo.includes(testName), width: 512, height: 512, pixelRatio: 1, @@ -54,8 +55,8 @@ export default function (directory, implementation, options, run) { return false; } - if (/^skip/.test(test.ignored)) { - console.log(chalk.gray(`* skipped ${test.id} (${test.ignored})`)); + if (test.skip) { + console.log(chalk.gray(`* skipped ${test.id}`)); return false; } diff --git a/test/integration/render-tests/background-pitch-alignment/pattern-viewport-alignment-globe/expected.png b/test/integration/render-tests/background-pitch-alignment/pattern-viewport-alignment-globe/expected.png new file mode 100644 index 00000000000..b6e262d07ea Binary files /dev/null and b/test/integration/render-tests/background-pitch-alignment/pattern-viewport-alignment-globe/expected.png differ diff --git a/test/integration/render-tests/background-pitch-alignment/pattern-viewport-alignment-globe/style.json b/test/integration/render-tests/background-pitch-alignment/pattern-viewport-alignment-globe/style.json new file mode 100644 index 00000000000..7d9417484cc --- /dev/null +++ b/test/integration/render-tests/background-pitch-alignment/pattern-viewport-alignment-globe/style.json @@ -0,0 +1,43 @@ +{ + "version": 8, + "metadata": { + "test": { + "width": 512, + "height": 256, + "allowed": 0.0006, + "operations": [ + ["setProjection", "globe"], + ["wait"] + ] + } + }, + "sprite": "local://sprites/emerald", + "sources": { + "satellite": { + "type": "raster", + "tiles": [ + "local://tiles/{z}-{x}-{y}.satellite.png" + ], + "tileSize": 256 + } + }, + "fog": {}, + "layers": [ + { + "id": "satellite", + "type": "raster", + "source": "satellite", + "paint": { + "raster-fade-duration": 0 + } + }, + { + "id": "background", + "type": "background", + "paint": { + "background-pitch-alignment": "viewport", + "background-pattern": "cemetery_icon" + } + } + ] +} diff --git a/test/integration/render-tests/background-pitch-alignment/viewport-alignment-globe/expected.png b/test/integration/render-tests/background-pitch-alignment/viewport-alignment-globe/expected.png new file mode 100644 index 00000000000..c1886470f21 Binary files /dev/null and b/test/integration/render-tests/background-pitch-alignment/viewport-alignment-globe/expected.png differ diff --git a/test/integration/render-tests/background-pitch-alignment/viewport-alignment-globe/style.json b/test/integration/render-tests/background-pitch-alignment/viewport-alignment-globe/style.json new file mode 100644 index 00000000000..bf741d43d5c --- /dev/null +++ b/test/integration/render-tests/background-pitch-alignment/viewport-alignment-globe/style.json @@ -0,0 +1,43 @@ +{ + "version": 8, + "metadata": { + "test": { + "width": 512, + "height": 512, + "allowed": 0.0006, + "operations": [ + ["setProjection", "globe"], + ["wait"] + ] + } + }, + "sources": { + "satellite": { + "type": "raster", + "tiles": [ + "local://tiles/{z}-{x}-{y}.satellite.png" + ], + "tileSize": 256 + } + }, + "fog": {}, + "layers": [ + { + "id": "satellite", + "type": "raster", + "source": "satellite", + "paint": { + "raster-fade-duration": 0 + } + }, + { + "id": "background", + "type": "background", + "paint": { + "background-color": "yellow", + "background-opacity": 0.5, + "background-pitch-alignment": "viewport" + } + } + ] +} diff --git a/test/integration/render-tests/background-pitch-alignment/viewport-alignment-mercator-low-zoom/expected.png b/test/integration/render-tests/background-pitch-alignment/viewport-alignment-mercator-low-zoom/expected.png new file mode 100644 index 00000000000..7efffb6d4dd Binary files /dev/null and b/test/integration/render-tests/background-pitch-alignment/viewport-alignment-mercator-low-zoom/expected.png differ diff --git a/test/integration/render-tests/background-pitch-alignment/viewport-alignment-mercator-low-zoom/style.json b/test/integration/render-tests/background-pitch-alignment/viewport-alignment-mercator-low-zoom/style.json new file mode 100644 index 00000000000..db765a10f34 --- /dev/null +++ b/test/integration/render-tests/background-pitch-alignment/viewport-alignment-mercator-low-zoom/style.json @@ -0,0 +1,42 @@ +{ + "version": 8, + "metadata": { + "test": { + "width": 512, + "height": 512, + "allowed": 0.0006, + "operations": [ + ["wait"] + ] + } + }, + "sources": { + "satellite": { + "type": "raster", + "tiles": [ + "local://tiles/{z}-{x}-{y}.satellite.png" + ], + "tileSize": 256 + } + }, + "fog": {}, + "layers": [ + { + "id": "satellite", + "type": "raster", + "source": "satellite", + "paint": { + "raster-fade-duration": 0 + } + }, + { + "id": "background", + "type": "background", + "paint": { + "background-color": "yellow", + "background-opacity": 0.5, + "background-pitch-alignment": "viewport" + } + } + ] +} diff --git a/test/integration/render-tests/background-pitch-alignment/viewport-alignment-with-fill-extrusions/expected.png b/test/integration/render-tests/background-pitch-alignment/viewport-alignment-with-fill-extrusions/expected.png new file mode 100644 index 00000000000..8af06542bee Binary files /dev/null and b/test/integration/render-tests/background-pitch-alignment/viewport-alignment-with-fill-extrusions/expected.png differ diff --git a/test/integration/render-tests/background-pitch-alignment/viewport-alignment-with-fill-extrusions/style.json b/test/integration/render-tests/background-pitch-alignment/viewport-alignment-with-fill-extrusions/style.json new file mode 100644 index 00000000000..2229981ca39 --- /dev/null +++ b/test/integration/render-tests/background-pitch-alignment/viewport-alignment-with-fill-extrusions/style.json @@ -0,0 +1,120 @@ +{ + "version": 8, + "metadata": { + "test": { + "height": 256, + "allowed": 0.001 + } + }, + "sources": { + "geojson": { + "type": "geojson", + "buffer": 0, + "data": { + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": { + "property": 20 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -0.0004, + 0 + ], + [ + -0.0002, + 0.0002 + ], + [ + 0, + 0 + ], + [ + -0.0002, + -0.0002 + ], + [ + -0.0004, + 0 + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "property": 20 + }, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 0, + -0.0002 + ], + [ + 0, + 0.0002 + ], + [ + 0.0003, + 0.0002 + ], + [ + 0.0003, + -0.0002 + ], + [ + 0, + -0.0002 + ] + ] + ] + } + } + ] + } + } + }, + "sprite": "local://sprites/emerald", + "pitch": 75, + "zoom": 18, + "layers": [ + { + "id": "background", + "type": "background", + "paint": { + "background-color": "yellow" + } + }, + { + "id": "extrusion", + "type": "fill-extrusion", + "source": "geojson", + "paint": { + "fill-extrusion-pattern": "generic_icon", + "fill-extrusion-height": 10 + } + }, + { + "id": "background-overlay", + "type": "background", + "paint": { + "background-color": "blue", + "background-opacity": 0.5, + "background-pitch-alignment": "viewport" + } + } + ], + "fog": { + "range": [-0.5, 0.5], + "color": "white" + } +} diff --git a/test/integration/render-tests/background-pitch-alignment/viewport-terrain/expected.png b/test/integration/render-tests/background-pitch-alignment/viewport-terrain/expected.png new file mode 100644 index 00000000000..0ca1c51d749 Binary files /dev/null and b/test/integration/render-tests/background-pitch-alignment/viewport-terrain/expected.png differ diff --git a/test/integration/render-tests/background-pitch-alignment/viewport-terrain/style.json b/test/integration/render-tests/background-pitch-alignment/viewport-terrain/style.json new file mode 100644 index 00000000000..77fa461d3a4 --- /dev/null +++ b/test/integration/render-tests/background-pitch-alignment/viewport-terrain/style.json @@ -0,0 +1,209 @@ +{ + "version": 8, + "metadata": { + "test": { + "height": 300, + "width": 512, + "allowed": 0.0021 + } + }, + "center": [-113.32694547094238, 35.93455626259847], + "zoom": 12, + "pitch": 70, + "bearing": 90, + "terrain": { + "source": "rgbterrain" + }, + "sprite": "local://sprites/emerald", + "fog": {}, + "lights": [ + { + "type": "ambient", + "id": "test_ambient", + "properties": { + "color": "rgba(255, 255, 255, 1)", + "intensity": 0.2 + } + }, + { + "type": "directional", + "id": "test_directional", + "properties": { + "cast-shadows" : true, + "color": "rgba(255, 255, 255, 1)", + "intensity": 0.7 + } + } + ], + "sources": { + "rgbterrain": { + "type": "raster-dem", + "tiles": [ + "local://tiles/{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", + "lineMetrics": true, + "data": { + "type": "Feature", + "properties": { + "elevation": [10, 400, 100] + }, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [ + -113.35094547094238, + 35.91855626259847 + ], + [ + -113.35094547094238, + 35.93455626259847 + ], + [ + -113.35094547094238, + 35.95055626259847 + ] + ], + [ + [ + -113.32894547094237, + 35.91855626259847 + ], + [ + -113.32494547094238, + 35.95055626259847 + ], + [ + -113.32094547094238, + 35.91855626259847 + ] + ], + [ + [ + -113.31294547094238, + 35.91855626259847 + ], + [ + -113.31294547094238, + 35.95055626259847 + ], + [ + -113.31294547094238, + 35.93455626259847 + ] + ] + ] + } + } + }, + "geojson1": { + "type": "geojson", + "lineMetrics": true, + "data": { + "type": "Feature", + "properties": { + "elevation": [400, 400, 400, 0, 400, 400, 400] + }, + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [ + -113.33994547094238, + 35.91855626259847 + ], + [ + -113.33994547094238, + 35.93455626259847 + ], + [ + -113.33694547094238, + 35.95055626259847 + ] + ], + [ + [ + -113.30294547094238, + 35.91855626259847 + ], + [ + -113.30294547094238, + 35.95055626259847 + ], + [ + -113.30274547094238, + 35.91855626259847 + ] + ] + ] + } + } + } + }, + "layers": [ + { + "id": "raster", + "type": "raster", + "source": "satellite", + "paint": { + "raster-fade-duration": 0 + } + }, + { + "id": "line", + "type": "line", + "source": "geojson", + "layout": { + "line-join": "round", + "line-z-offset": [ + "at", + ["floor", ["*", [ "line-progress" ], 2.9]], + ["get", "elevation"] + ] + }, + "paint": { + "line-width": 12, + "line-color": "red" + } + }, + { + "id": "line1", + "type": "line", + "source": "geojson1", + "layout": { + "line-join": "none", + "line-z-offset": [ + "at", + ["floor", ["*", [ "line-progress" ], 6.9]], + ["get", "elevation"] + ] + }, + "paint": { + "line-width": 14, + "line-pattern": "dot" + } + }, + { + "id": "background", + "type": "background", + "paint": { + "background-pitch-alignment": "viewport", + "background-opacity": 0.5, + "background-color": "yellow" + } + } + ] +} \ No newline at end of file diff --git a/test/integration/render-tests/color-theme/red-chicago/expected.png b/test/integration/render-tests/color-theme/red-chicago/expected.png index a76945066ef..ac74dc9fadd 100644 Binary files a/test/integration/render-tests/color-theme/red-chicago/expected.png and b/test/integration/render-tests/color-theme/red-chicago/expected.png differ diff --git a/test/integration/render-tests/color-theme/red-chicago/style.json b/test/integration/render-tests/color-theme/red-chicago/style.json index c0906037342..31fa4b1d5ba 100644 --- a/test/integration/render-tests/color-theme/red-chicago/style.json +++ b/test/integration/render-tests/color-theme/red-chicago/style.json @@ -42,7 +42,6 @@ ] } }, - "pitch": 80, "bearing": 42, "sources": {}, "layers": [] diff --git a/test/integration/render-tests/debug/padding/ease-to-without-retain-padding/expected.png b/test/integration/render-tests/debug/padding/ease-to-without-retain-padding/expected.png new file mode 100644 index 00000000000..7715500e4bc Binary files /dev/null and b/test/integration/render-tests/debug/padding/ease-to-without-retain-padding/expected.png differ diff --git a/test/integration/render-tests/debug/padding/ease-to-without-retain-padding/style.json b/test/integration/render-tests/debug/padding/ease-to-without-retain-padding/style.json new file mode 100644 index 00000000000..9fd693bfc01 --- /dev/null +++ b/test/integration/render-tests/debug/padding/ease-to-without-retain-padding/style.json @@ -0,0 +1,84 @@ +{ + "version": 8, + "metadata": { + "test": { + "showPadding": true, + "height": 256, + "operations": [ + [ + "easeTo", + { + "duration": 0, + "padding": { + "top": 20, + "left": 125, + "bottom": 10, + "right": 15 + }, + "retainPadding": false + }, + ["wait"] + ] + ] + } + }, + "center": [ 0, 0 ], + "zoom": 8, + "pitch": 60, + "sources": { + "northward-road": { + "type": "geojson", + "data": { + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "geometry": { + "type": "LineString", + "coordinates": [ + [ 0, -25], + [ 0, 25] + ] + } + },{ + "type": "Feature", + "geometry": { + "type": "LineString", + "coordinates": [ + [ -0.2, -25], + [ -0.2, 25] + ] + } + },{ + "type": "Feature", + "geometry": { + "type": "LineString", + "coordinates": [ + [ 0.2, -25], + [ 0.2, 25] + ] + } + } + ] + } + } + }, + "layers": [ + { + "id": "background", + "type": "background", + "paint": { + "background-color": "white" + } + }, + { + "id": "line", + "type": "line", + "source": "northward-road", + "layout": {}, + "paint": { + "line-width": 10 + } + } + ] +} diff --git a/test/integration/render-tests/debug/padding/fit-bounds-without-retain-padding/expected.png b/test/integration/render-tests/debug/padding/fit-bounds-without-retain-padding/expected.png new file mode 100644 index 00000000000..e50cc2f4d0a Binary files /dev/null and b/test/integration/render-tests/debug/padding/fit-bounds-without-retain-padding/expected.png differ diff --git a/test/integration/render-tests/debug/padding/fit-bounds-without-retain-padding/style.json b/test/integration/render-tests/debug/padding/fit-bounds-without-retain-padding/style.json new file mode 100644 index 00000000000..60aa52e2e7c --- /dev/null +++ b/test/integration/render-tests/debug/padding/fit-bounds-without-retain-padding/style.json @@ -0,0 +1,91 @@ +{ + "version": 8, + "metadata": { + "test": { + "showPadding": true, + "height": 256, + "operations": [ + ["wait"], + [ + "fitBounds", + [ + [-0.83, 1.66], + [0.83, -0.46] + ], + { + "duration": 0, + "pitch": 60, + "zoom": 8, + "padding": { + "top": 20, + "left": 125, + "bottom": 10, + "right": 15 + }, + "retainPadding": false + }, + ["wait"] + ] + ] + } + }, + "center": [ 0, 0 ], + "zoom": 8, + "pitch": 60, + "sources": { + "northward-road": { + "type": "geojson", + "data": { + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "geometry": { + "type": "LineString", + "coordinates": [ + [ 0, -25], + [ 0, 25] + ] + } + },{ + "type": "Feature", + "geometry": { + "type": "LineString", + "coordinates": [ + [ -0.2, -25], + [ -0.2, 25] + ] + } + },{ + "type": "Feature", + "geometry": { + "type": "LineString", + "coordinates": [ + [ 0.2, -25], + [ 0.2, 25] + ] + } + } + ] + } + } + }, + "layers": [ + { + "id": "background", + "type": "background", + "paint": { + "background-color": "white" + } + }, + { + "id": "line", + "type": "line", + "source": "northward-road", + "layout": {}, + "paint": { + "line-width": 10 + } + } + ] +} diff --git a/test/integration/render-tests/debug/padding/fit-bounds/expected.png b/test/integration/render-tests/debug/padding/fit-bounds/expected.png new file mode 100644 index 00000000000..81449310045 Binary files /dev/null and b/test/integration/render-tests/debug/padding/fit-bounds/expected.png differ diff --git a/test/integration/render-tests/debug/padding/fit-bounds/style.json b/test/integration/render-tests/debug/padding/fit-bounds/style.json new file mode 100644 index 00000000000..06ef922547e --- /dev/null +++ b/test/integration/render-tests/debug/padding/fit-bounds/style.json @@ -0,0 +1,89 @@ +{ + "version": 8, + "metadata": { + "test": { + "showPadding": true, + "height": 256, + "operations": [ + [ + "fitBounds", + [ + [-0.8318058060173144, 1.6633779071501493], + [0.8318058060195597, -0.4682150311384845] + ], + { + "duration": 0, + "pitch": 60, + "zoom": 8, + "padding": { + "top": 20, + "left": 125, + "bottom": 10, + "right": 15 + } + }, + ["wait", 500] + ] + ] + } + }, + "center": [ 0, 0 ], + "zoom": 8, + "pitch": 60, + "sources": { + "northward-road": { + "type": "geojson", + "data": { + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "geometry": { + "type": "LineString", + "coordinates": [ + [ 0, -25], + [ 0, 25] + ] + } + },{ + "type": "Feature", + "geometry": { + "type": "LineString", + "coordinates": [ + [ -0.2, -25], + [ -0.2, 25] + ] + } + },{ + "type": "Feature", + "geometry": { + "type": "LineString", + "coordinates": [ + [ 0.2, -25], + [ 0.2, 25] + ] + } + } + ] + } + } + }, + "layers": [ + { + "id": "background", + "type": "background", + "paint": { + "background-color": "white" + } + }, + { + "id": "line", + "type": "line", + "source": "northward-road", + "layout": {}, + "paint": { + "line-width": 10 + } + } + ] +} diff --git a/test/integration/render-tests/image-fallback-nested/add-image-after/expected.png b/test/integration/render-tests/image-fallback-nested/add-image-after/expected.png new file mode 100644 index 00000000000..de877fc5541 Binary files /dev/null and b/test/integration/render-tests/image-fallback-nested/add-image-after/expected.png differ diff --git a/test/integration/render-tests/image-fallback-nested/add-image-after/style.json b/test/integration/render-tests/image-fallback-nested/add-image-after/style.json new file mode 100644 index 00000000000..cea592bad35 --- /dev/null +++ b/test/integration/render-tests/image-fallback-nested/add-image-after/style.json @@ -0,0 +1,76 @@ +{ + "version": 8, + "metadata": { + "test": { + "height": 64, + "width": 128, + "operations": [ + [ + "addLayer", + { + "id": "text", + "type": "symbol", + "source": "geojson", + "layout": { + "text-allow-overlap": true, + "icon-allow-overlap": true, + "icon-image": [ + "coalesce", + ["image", "rocket"], + ["image", "fav-bicycle-18"] + ], + "text-field": [ + "case", + ["to-boolean", ["coalesce", ["image", "rocket"], ""]], + "beta sprite", + "fallback sprite" + ], + "text-font": ["Open Sans Semibold", "Arial Unicode MS Bold"], + "text-offset": [0, 0.6], + "text-anchor": "top" + }, + "paint": { + "text-color": [ + "case", + ["to-boolean", ["coalesce", ["image", "rocket"], ""]], + "blue", + "red" + ], + "text-opacity": [ + "case", + ["to-boolean", ["coalesce", ["image", "rocket"], ""]], + 0.2, + 1 + ] + } + } + ], + ["wait"], + ["addImage", "rocket", "./image/rocket.png"], + ["wait"] + ] + } + }, + "center": [0, 0], + "zoom": 0, + "sprite": "local://sprites/sprite", + "sources": { + "geojson": { + "type": "geojson", + "data": { + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [0, 0] + } + } + ] + } + } + }, + "glyphs": "local://glyphs/{fontstack}/{range}.pbf", + "layers": [] +} diff --git a/test/integration/render-tests/lighting-3d-mode/emissive-strength/fill-extrusion-data-driven/expected.png b/test/integration/render-tests/lighting-3d-mode/emissive-strength/fill-extrusion-data-driven/expected.png new file mode 100644 index 00000000000..d2fa45cfd7d Binary files /dev/null and b/test/integration/render-tests/lighting-3d-mode/emissive-strength/fill-extrusion-data-driven/expected.png differ diff --git a/test/integration/render-tests/lighting-3d-mode/emissive-strength/fill-extrusion-data-driven/style.json b/test/integration/render-tests/lighting-3d-mode/emissive-strength/fill-extrusion-data-driven/style.json new file mode 100644 index 00000000000..b6724ac98de --- /dev/null +++ b/test/integration/render-tests/lighting-3d-mode/emissive-strength/fill-extrusion-data-driven/style.json @@ -0,0 +1,120 @@ +{ + "version": 8, + "metadata": { + "test": { + "width": 64, + "height": 64, + "allowed": 0.002 + } + }, + "lights": [ + { + "type": "ambient", + "id": "test_ambient", + "properties": { + "color": "rgba(0, 0, 0, 1)", + "intensity": 1.0 + } + }, + { + "type": "directional", + "id": "test_directional", + "properties": { + "color": "rgba(0, 0, 0, 1)", + "intensity": 0.5 + } + } + ], + "pitch": 45.0, + "sources": { + "geojson": { + "type": "geojson", + "data": { + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + "id": 1, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 8, + 8 + ], + [ + 8, + 20 + ], + [ + 20, + 20 + ], + [ + 20, + 8 + ], + [ + 8, + 8 + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": {}, + "id": 2, + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + -15, + -15 + ], + [ + -15, + 8 + ], + [ + 8, + 8 + ], + [ + 8, + -15 + ], + [ + -15, + -15 + ] + ] + ] + } + } + ] + } + } + }, + "layers": [ + { + "id": "fill-extrusion", + "type": "fill-extrusion", + "source": "geojson", + "paint": { + "fill-extrusion-color": [ + "case", + ["==", ["id"], 2], + "purple", + "yellow" + ], + "fill-extrusion-emissive-strength": 1, + "fill-extrusion-height": 1000000.0 + } + } + ] +} \ No newline at end of file diff --git a/test/integration/render-tests/model-layer/environment-test/expected.png b/test/integration/render-tests/model-layer/environment-test/expected.png index 80aaf146cc3..2847698b3a2 100644 Binary files a/test/integration/render-tests/model-layer/environment-test/expected.png and b/test/integration/render-tests/model-layer/environment-test/expected.png differ diff --git a/test/integration/render-tests/model-layer/model-rotation/expected.png b/test/integration/render-tests/model-layer/model-rotation/expected.png index 8ae6870a73c..4103655c8af 100644 Binary files a/test/integration/render-tests/model-layer/model-rotation/expected.png and b/test/integration/render-tests/model-layer/model-rotation/expected.png differ diff --git a/test/integration/render-tests/model-layer/model-rts/expected.png b/test/integration/render-tests/model-layer/model-rts/expected.png index 999ef96344d..c73542f6cbb 100644 Binary files a/test/integration/render-tests/model-layer/model-rts/expected.png and b/test/integration/render-tests/model-layer/model-rts/expected.png differ diff --git a/test/integration/render-tests/model-layer/model-scale/expected.png b/test/integration/render-tests/model-layer/model-scale/expected.png index 6ad9791a993..90e011ecf41 100644 Binary files a/test/integration/render-tests/model-layer/model-scale/expected.png and b/test/integration/render-tests/model-layer/model-scale/expected.png differ diff --git a/test/integration/render-tests/text-color/missing-image-in-text-color-condition/expected.png b/test/integration/render-tests/text-color/missing-image-in-text-color-condition/expected.png new file mode 100644 index 00000000000..1c0cd588f6c Binary files /dev/null and b/test/integration/render-tests/text-color/missing-image-in-text-color-condition/expected.png differ diff --git a/test/integration/render-tests/text-color/missing-image-in-text-color-condition/style.json b/test/integration/render-tests/text-color/missing-image-in-text-color-condition/style.json new file mode 100644 index 00000000000..0da8ef1a9ed --- /dev/null +++ b/test/integration/render-tests/text-color/missing-image-in-text-color-condition/style.json @@ -0,0 +1,55 @@ +{ + "version": 8, + "metadata": { + "test": { + "height": 64, + "width": 128, + "operations": [ + [ + "addLayer", + { + "id": "test", + "type": "symbol", + "source": "geojson", + "layout": { + "text-field": "Hello", + "text-font": ["Open Sans Semibold", "Arial Unicode MS Bold"] + }, + "paint": { + "text-color": [ + "case", + ["to-boolean", ["coalesce", ["image", "rocket"], ""]], + "red", + "white" + ] + } + } + ], + ["wait"], + ["addImage", "rocket", "./image/rocket.png"], + ["wait"] + ] + } + }, + "center": [0, 0], + "zoom": 0, + "sources": { + "geojson": { + "type": "geojson", + "data": { + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [0, 0] + } + } + ] + } + } + }, + "glyphs": "local://glyphs/{fontstack}/{range}.pbf", + "layers": [] +} diff --git a/test/integration/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-map/expected.png b/test/integration/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-map/expected.png index ee664a61beb..8e46d3ebca7 100644 Binary files a/test/integration/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-map/expected.png and b/test/integration/render-tests/text-pitch-alignment/viewport-text-rotation-alignment-map/expected.png differ diff --git a/test/unit/geo/projection/far_z.test.ts b/test/unit/geo/projection/far_z.test.ts index 97923f69c17..26585f0cc10 100644 --- a/test/unit/geo/projection/far_z.test.ts +++ b/test/unit/geo/projection/far_z.test.ts @@ -27,9 +27,14 @@ describe('FarZ', () => { pixelsPerMeter = mercator.pixelsPerMeter(tr.center.lat, tr.worldSize); expect(farthestPixelDistanceOnPlane(tr, pixelsPerMeter).toFixed(3)).toBe("151.500"); - tr.zoom = 22.0; + tr.zoom = 17.0; pixelsPerMeter = mercator.pixelsPerMeter(tr.center.lat, tr.worldSize); expect(farthestPixelDistanceOnPlane(tr, pixelsPerMeter).toFixed(3)).toBe("151.500"); + + // Expanded furthest distance to prevent flicker on far plane + tr.zoom = 22.0; + pixelsPerMeter = mercator.pixelsPerMeter(tr.center.lat, tr.worldSize); + expect(farthestPixelDistanceOnPlane(tr, pixelsPerMeter).toFixed(3)).toBe("909.000"); }); test('farthestPixelDistanceOnSphere', () => { diff --git a/test/unit/ui/camera.test.ts b/test/unit/ui/camera.test.ts index b27da1f7a1e..45515d3951d 100644 --- a/test/unit/ui/camera.test.ts +++ b/test/unit/ui/camera.test.ts @@ -135,6 +135,15 @@ describe('camera', () => { camera.jumpTo({center: [1, 2]}); expect(!camera.isEasing()).toBeTruthy(); }); + + test('retain or not padding based on passed option', () => { + camera.jumpTo({padding: {top: 10, right: 10, bottom: 10, left: 10}}); + expect(camera.getPadding()).toEqual({top: 10, right: 10, bottom: 10, left: 10}); + camera.jumpTo({padding: {top: 20, right: 20, bottom: 20, left: 20}, retainPadding: true}); + expect(camera.getPadding()).toEqual({top: 20, right: 20, bottom: 20, left: 20}); + camera.jumpTo({padding: {top: 30, right: 30, bottom: 30, left: 30}, retainPadding: false}); + expect(camera.getPadding()).toEqual({top: 20, right: 20, bottom: 20, left: 20}); + }); }); describe('#setCenter', () => { @@ -1036,6 +1045,21 @@ describe('camera', () => { expect(camera.transform.padding).toEqual({top: 10, right: 75, bottom: 50, left: 25}); }); + test('retain or not padding based on provided padding option', () => { + const bb1 = [[-133, 11], [-68, 50]]; + const bb2 = [[-133, 13], [-68, 50]]; + const bb3 = [[-133, 17], [-68, 50]]; + const camera = createCamera(); + camera.fitBounds(bb1, {duration: 0, padding: {top: 100}}); + expect(camera.getPadding()).toEqual({top:100, bottom:0, left:0, right:0}); + + camera.fitBounds(bb2, {duration: 0, padding: {top: 200}, retainPadding: false}); + expect(camera.getPadding()).toEqual({top:100, bottom:0, left:0, right:0}); + + camera.fitBounds(bb3, {duration: 0, padding: {top: 300}, retainPadding: true}); + expect(camera.getPadding()).toEqual({top:300, bottom:0, left:0, right:0}); + }); + test('#12450', () => { const camera = createCamera(); diff --git a/test/unit/ui/camera/ease_to.test.ts b/test/unit/ui/camera/ease_to.test.ts index 71f749c03d8..97aba3af13f 100644 --- a/test/unit/ui/camera/ease_to.test.ts +++ b/test/unit/ui/camera/ease_to.test.ts @@ -417,6 +417,18 @@ describe('camera', () => { }); }); + test('retain or not padding based on provided padding option', () => { + const camera = createCamera(); + camera.easeTo({center: [100, 0], duration: 0, padding: {top: 100}}); + expect(camera.getPadding()).toEqual({top:100, bottom:0, left:0, right:0}); + + camera.easeTo({center: [120, 0], duration: 0, padding: {top: 200}, retainPadding: false}); + expect(camera.getPadding()).toEqual({top:100, bottom:0, left:0, right:0}); + + camera.easeTo({center: [80, 0], duration: 0, padding: {top: 300}, retainPadding: true}); + expect(camera.getPadding()).toEqual({top:300, bottom:0, left:0, right:0}); + }); + describe('Globe', () => { test('pans to specified location', () => { const camera = createCamera(); diff --git a/test/unit/ui/camera/fly_to.test.ts b/test/unit/ui/camera/fly_to.test.ts index 2c860f3d452..5e6e9474e32 100644 --- a/test/unit/ui/camera/fly_to.test.ts +++ b/test/unit/ui/camera/fly_to.test.ts @@ -745,5 +745,17 @@ describe('camera', () => { camera.flyTo({center: [100, 0], bearing: 90, animate: true}); }); }); + + test('retain or not padding based on provided padding option', () => { + const camera = createCamera(); + camera.flyTo({center: [100, 0], duration: 0, padding: {top: 100}}); + expect(camera.getPadding()).toEqual({top:100, bottom:0, left:0, right:0}); + + camera.flyTo({center: [120, 0], duration: 0, padding: {top: 200}, retainPadding: false}); + expect(camera.getPadding()).toEqual({top:100, bottom:0, left:0, right:0}); + + camera.flyTo({center: [80, 0], duration: 0, padding: {top: 300}, retainPadding: true}); + expect(camera.getPadding()).toEqual({top:300, bottom:0, left:0, right:0}); + }); }); });