diff --git a/example/googleMapsExample.js b/example/googleMapsExample.js index 711dc280..127fc53f 100644 --- a/example/googleMapsExample.js +++ b/example/googleMapsExample.js @@ -16,12 +16,12 @@ import { import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js'; import { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js'; import { GUI } from 'three/examples/jsm/libs/lil-gui.module.min.js'; -import { estimateBytesUsed } from 'three/examples/jsm/utils/BufferGeometryUtils.js'; import Stats from 'three/examples/jsm/libs/stats.module.js'; import { CameraTransitionManager } from './src/camera/CameraTransitionManager.js'; import { TileCompressionPlugin } from './src/plugins/TileCompressionPlugin.js'; import { UpdateOnChangePlugin } from './src/plugins/UpdateOnChangePlugin.js'; import { TilesFadePlugin } from './src/plugins/fade/TilesFadePlugin.js'; +import { BatchedTilesPlugin } from './src/plugins/batched/BatchedTilesPlugin.js'; let controls, scene, renderer, tiles, transition; let statsContainer, stats; @@ -35,8 +35,10 @@ const params = { enableCacheDisplay: false, enableRendererStats: false, apiKey: apiKey, + useBatchedMesh: Boolean( new URLSearchParams( window.location.hash.replace( /^#/, '' ) ).get( 'batched' ) ), + errorTarget: 40, - 'reload': reinstantiateTiles, + reload: reinstantiateTiles, }; @@ -59,7 +61,17 @@ function reinstantiateTiles() { tiles.registerPlugin( new GoogleCloudAuthPlugin( { apiToken: params.apiKey, autoRefreshToken: true } ) ); tiles.registerPlugin( new TileCompressionPlugin() ); tiles.registerPlugin( new UpdateOnChangePlugin() ); - tiles.registerPlugin( new TilesFadePlugin() ); + + if ( params.useBatchedMesh ) { + + tiles.registerPlugin( new BatchedTilesPlugin( { renderer } ) ); + + } else { + + tiles.registerPlugin( new TilesFadePlugin() ); + + } + tiles.group.rotation.x = - Math.PI / 2; // Note the DRACO compression files need to be supplied via an explicit source. @@ -138,13 +150,19 @@ function init() { } ); - const mapsOptions = gui.addFolder( 'Google Tiles' ); + const mapsOptions = gui.addFolder( 'Google Photorealistic Tiles' ); mapsOptions.add( params, 'apiKey' ); + mapsOptions.add( params, 'useBatchedMesh' ).listen(); mapsOptions.add( params, 'reload' ); const exampleOptions = gui.addFolder( 'Example Options' ); exampleOptions.add( params, 'enableCacheDisplay' ); exampleOptions.add( params, 'enableRendererStats' ); + exampleOptions.add( params, 'errorTarget', 5, 100, 1 ).onChange( () => { + + tiles.getPluginByName( 'UPDATE_ON_CHANGE_PLUGIN' ).needsUpdate = true; + + } ); statsContainer = document.createElement( 'div' ); document.getElementById( 'info' ).appendChild( statsContainer ); @@ -207,22 +225,34 @@ function updateHash() { cartographicResult.lon *= MathUtils.RAD2DEG; // update hash - const params = new URLSearchParams(); - params.set( 'lat', cartographicResult.lat.toFixed( 4 ) ); - params.set( 'lon', cartographicResult.lon.toFixed( 4 ) ); - params.set( 'height', cartographicResult.height.toFixed( 2 ) ); - params.set( 'az', orientationResult.azimuth.toFixed( 2 ) ); - params.set( 'el', orientationResult.elevation.toFixed( 2 ) ); - params.set( 'roll', orientationResult.roll.toFixed( 2 ) ); - window.history.replaceState( undefined, undefined, `#${ params }` ); + const urlParams = new URLSearchParams(); + urlParams.set( 'lat', cartographicResult.lat.toFixed( 4 ) ); + urlParams.set( 'lon', cartographicResult.lon.toFixed( 4 ) ); + urlParams.set( 'height', cartographicResult.height.toFixed( 2 ) ); + urlParams.set( 'az', orientationResult.azimuth.toFixed( 2 ) ); + urlParams.set( 'el', orientationResult.elevation.toFixed( 2 ) ); + urlParams.set( 'roll', orientationResult.roll.toFixed( 2 ) ); + + if ( params.useBatchedMesh ) { + + urlParams.set( 'batched', 1 ); + + } + window.history.replaceState( undefined, undefined, `#${ urlParams }` ); } function initFromHash() { const hash = window.location.hash.replace( /^#/, '' ); - const params = new URLSearchParams( hash ); - if ( ! params.has( 'lat' ) && ! params.has( 'lon' ) ) { + const urlParams = new URLSearchParams( hash ); + if ( urlParams.has( 'batched' ) ) { + + params.useBatchedMesh = Boolean( urlParams.get( 'batched' ) ); + + } + + if ( ! urlParams.has( 'lat' ) && ! urlParams.has( 'lon' ) ) { return; @@ -233,16 +263,16 @@ function initFromHash() { // get the position fields const camera = transition.camera; - const lat = parseFloat( params.get( 'lat' ) ); - const lon = parseFloat( params.get( 'lon' ) ); - const height = parseFloat( params.get( 'height' ) ) || 1000; + const lat = parseFloat( urlParams.get( 'lat' ) ); + const lon = parseFloat( urlParams.get( 'lon' ) ); + const height = parseFloat( urlParams.get( 'height' ) ) || 1000; - if ( params.has( 'az' ) && params.has( 'el' ) ) { + if ( urlParams.has( 'az' ) && urlParams.has( 'el' ) ) { // get the az el fields for rotation if present - const az = parseFloat( params.get( 'az' ) ); - const el = parseFloat( params.get( 'el' ) ); - const roll = parseFloat( params.get( 'roll' ) ) || 0; + const az = parseFloat( urlParams.get( 'az' ) ); + const el = parseFloat( urlParams.get( 'el' ) ); + const roll = parseFloat( urlParams.get( 'roll' ) ) || 0; // extract the east-north-up frame into matrix world WGS84_ELLIPSOID.getRotationMatrixFromAzElRoll( @@ -287,6 +317,7 @@ function animate() { // update tiles camera.updateMatrixWorld(); + tiles.errorTarget = params.errorTarget; tiles.update(); renderer.render( scene, camera ); @@ -299,48 +330,23 @@ function animate() { function updateHtml() { // render html text updates - const cacheFullness = tiles.lruCache.itemList.length / tiles.lruCache.maxSize; let str = ''; if ( params.enableCacheDisplay ) { + const lruCache = tiles.lruCache; + const cacheFullness = lruCache.cachedBytes / lruCache.maxBytesSize; str += `Downloading: ${ tiles.stats.downloading } Parsing: ${ tiles.stats.parsing } Visible: ${ tiles.visibleTiles.size }
`; - - const geomSet = new Set(); - tiles.traverse( tile => { - - const scene = tile.cached.scene; - if ( scene ) { - - scene.traverse( c => { - - if ( c.geometry ) { - - geomSet.add( c.geometry ); - - } - - } ); - - } - - } ); - - let count = 0; - geomSet.forEach( g => { - - count += estimateBytesUsed( g ); - - } ); - str += `Cache: ${ ( 100 * cacheFullness ).toFixed( 2 ) }% ~${ ( count / 1000 / 1000 ).toFixed( 2 ) }mb
`; + str += `Cache: ${ ( 100 * cacheFullness ).toFixed( 2 ) }% ~${ ( lruCache.cachedBytes / 1000 / 1000 ).toFixed( 2 ) }mb
`; } if ( params.enableRendererStats ) { const memory = renderer.info.memory; + const render = renderer.info.render; const programCount = renderer.info.programs.length; - str += `Geometries: ${ memory.geometries } Textures: ${ memory.textures } Programs: ${ programCount }`; + str += `Geometries: ${ memory.geometries } Textures: ${ memory.textures } Programs: ${ programCount } Draw Calls: ${ render.calls }`; } diff --git a/example/src/plugins/UpdateOnChangePlugin.js b/example/src/plugins/UpdateOnChangePlugin.js index e8ba1879..8256512a 100644 --- a/example/src/plugins/UpdateOnChangePlugin.js +++ b/example/src/plugins/UpdateOnChangePlugin.js @@ -5,6 +5,7 @@ export class UpdateOnChangePlugin { constructor() { + this.name = 'UPDATE_ON_CHANGE_PLUGIN'; this.tiles = null; this.needsUpdate = false; this.cameraMatrices = new Map(); diff --git a/example/src/plugins/batched/ArrayTextureCopyMaterial.js b/example/src/plugins/batched/ArrayTextureCopyMaterial.js deleted file mode 100644 index c254d9f2..00000000 --- a/example/src/plugins/batched/ArrayTextureCopyMaterial.js +++ /dev/null @@ -1,51 +0,0 @@ -import { MeshBasicMaterial } from 'three'; - -// A MeshBasicMaterial that supports taking a TextureArray and a layer to render -export class ArrayTextureCopyMaterial extends MeshBasicMaterial { - - set layer( v ) { - - this._layerUniform.value = v; - - } - - get layer() { - - return this._layerUniform.value; - - } - - constructor( ...args ) { - - super( ...args ); - this._layerUniform = { value: 0 }; - - } - - onBeforeCompile( shader ) { - - shader.uniforms.layer = this._layerUniform; - - shader.fragmentShader = shader.fragmentShader - .replace( - '#include ', - /* glsl */` - #ifdef USE_MAP - precision highp sampler2DArray; - uniform sampler2DArray map; - uniform int layer; - #endif - `, - ) - .replace( - '#include ', - /* glsl */` - #ifdef USE_MAP - diffuseColor *= texture( map, vec3( vMapUv, layer ) ); - #endif - ` - ); - - } - -} diff --git a/example/src/plugins/batched/BatchedTilesPlugin.js b/example/src/plugins/batched/BatchedTilesPlugin.js index c065fbef..9f1f87d5 100644 --- a/example/src/plugins/batched/BatchedTilesPlugin.js +++ b/example/src/plugins/batched/BatchedTilesPlugin.js @@ -1,11 +1,9 @@ import { WebGLArrayRenderTarget, MeshBasicMaterial, Group, DataTexture, REVISION } from 'three'; import { FullScreenQuad } from 'three/examples/jsm/postprocessing/Pass.js'; import { ExpandingBatchedMesh } from './ExpandingBatchedMesh.js'; -import { ArrayTextureCopyMaterial } from './ArrayTextureCopyMaterial.js'; import { convertMapToArrayTexture, isColorWhite } from './utilities.js'; const _textureRenderQuad = new FullScreenQuad( new MeshBasicMaterial() ); -const _layerCopyQuad = new FullScreenQuad( new ArrayTextureCopyMaterial() ); const _whiteTex = new DataTexture( new Uint8Array( [ 255, 255, 255, 255 ] ), 1, 1 ); _whiteTex.needsUpdate = true; @@ -133,11 +131,11 @@ export class BatchedTilesPlugin { const texture = material.map; if ( texture ) { - this.renderTextureToLayer( texture, instanceId ); + this.assignTextureToLayer( texture, instanceId ); } else { - this.renderTextureToLayer( _whiteTex, instanceId ); + this.assignTextureToLayer( _whiteTex, instanceId ); } @@ -205,7 +203,7 @@ export class BatchedTilesPlugin { } // init the batched mesh - const { instanceCount, vertexCount, indexCount, tiles } = this; + const { instanceCount, vertexCount, indexCount, tiles, renderer } = this; const material = this.material ? this.material : new target.material.constructor(); const batchedMesh = new ExpandingBatchedMesh( instanceCount, instanceCount * vertexCount, instanceCount * indexCount, material ); batchedMesh.name = 'BatchTilesPlugin'; @@ -215,7 +213,7 @@ export class BatchedTilesPlugin { // init the array texture render target const map = target.material.map; - const textureOptions = { + const textureOptions = { colorSpace: map.colorSpace, wrapS: map.wrapS, wrapT: map.wrapT, @@ -223,11 +221,12 @@ export class BatchedTilesPlugin { // TODO: Generating mipmaps for the volume every time a new texture is added is extremely slow // generateMipmaps: map.generateMipmaps, // minFilter: map.minFilter, - // magFilter: map.magFilter, + magFilter: map.magFilter, }; const arrayTarget = new WebGLArrayRenderTarget( map.image.width, map.image.height, instanceCount ); Object.assign( arrayTarget.texture, textureOptions ); + renderer.initRenderTarget( arrayTarget ); // init the material material.map = arrayTarget.texture; @@ -239,7 +238,7 @@ export class BatchedTilesPlugin { } // render the given into the given layer - renderTextureToLayer( texture, layer ) { + assignTextureToLayer( texture, layer ) { this.expandArrayTargetIfNeeded(); @@ -278,20 +277,9 @@ export class BatchedTilesPlugin { const newArrayTarget = new WebGLArrayRenderTarget( arrayTarget.width, arrayTarget.height, targetDepth ); Object.assign( newArrayTarget.texture, textureOptions ); - // render each old layer into the new texture target - const currentRenderTarget = renderer.getRenderTarget(); - for ( let i = 0; i < arrayTarget.depth; i ++ ) { - - _layerCopyQuad.material.map = arrayTarget.texture; - _layerCopyQuad.material.layer = i; - renderer.setRenderTarget( newArrayTarget, i ); - _layerCopyQuad.render( renderer ); - - } - - // reset the state - renderer.setRenderTarget( currentRenderTarget ); - _layerCopyQuad.material.map = null; + // copy the contents + renderer.initRenderTarget( newArrayTarget ); + renderer.copyTextureToTexture( arrayTarget.texture, newArrayTarget.texture ); // replace the old array target arrayTarget.dispose(); @@ -324,23 +312,25 @@ export class BatchedTilesPlugin { dispose() { - if ( this.arrayTarget ) { + const { arrayTarget, tiles, batchedMesh } = this; + if ( arrayTarget ) { - this.arrayTarget.dispose(); + arrayTarget.dispose(); } - if ( this.batchedMesh ) { + if ( batchedMesh ) { - this.batchedMesh.material.dispose(); - this.batchedMesh.dispose(); - this.batchedMesh.removeFromParent(); + batchedMesh.material.dispose(); + batchedMesh.geometry.dispose(); + batchedMesh.dispose(); + batchedMesh.removeFromParent(); } - this.tiles.removeEventListener( 'load-model', this._onLoadModel ); - this.tiles.removeEventListener( 'dispose-model', this._onDisposeModel ); - this.tiles.removeEventListener( 'tile-visibility-change', this._onVisibilityChange ); + tiles.removeEventListener( 'load-model', this._onLoadModel ); + tiles.removeEventListener( 'dispose-model', this._onDisposeModel ); + tiles.removeEventListener( 'tile-visibility-change', this._onVisibilityChange ); } diff --git a/example/src/plugins/batched/ExpandingBatchedMesh.js b/example/src/plugins/batched/ExpandingBatchedMesh.js index d1a62ccb..7e225db0 100644 --- a/example/src/plugins/batched/ExpandingBatchedMesh.js +++ b/example/src/plugins/batched/ExpandingBatchedMesh.js @@ -7,19 +7,12 @@ const _batchIntersects = []; // Implementation of BatchedMesh that automatically expands export class ExpandingBatchedMesh extends ModelViewBatchedMesh { - get instanceCount() { - - return this._currentInstances; - - } - constructor( ...args ) { super( ...args ); this.expandPercent = 0.25; this.maxInstanceExpansionSize = Infinity; - this._currentInstances = 0; // set of available geometry ids that are no longer being used this._freeGeometryIds = []; @@ -39,13 +32,13 @@ export class ExpandingBatchedMesh extends ModelViewBatchedMesh { freeGeometryIds.forEach( ( id, i ) => { // if indices are not needed then they default to - 1 - const reservedRange = this._reservedRanges[ id ]; - const { indexCount, vertexCount } = reservedRange; - if ( indexCount >= neededIndexCount && vertexCount >= neededVertexCount ) { + const geometryInfo = this.getGeometryRangeAt( id ); + const { reservedIndexCount, reservedVertexCount } = geometryInfo; + if ( reservedIndexCount >= neededIndexCount && reservedVertexCount >= neededVertexCount ) { // generate score that is a combination of how much unused space a geometry would have if used and pick the // one with the least amount of unused space. - const score = ( neededIndexCount - indexCount ) + ( neededVertexCount - vertexCount ); + const score = ( neededIndexCount - reservedIndexCount ) + ( neededVertexCount - reservedVertexCount ); if ( score < bestScore ) { bestIndex = i; @@ -90,12 +83,20 @@ export class ExpandingBatchedMesh extends ModelViewBatchedMesh { } else { - try { + const needsMoreSpace = () => { + + const vertexNeedsSpace = this.unusedVertexCount < reservedVertexRange; + const indexNeedsSpace = this.unusedIndexCount < reservedIndexRange; + return vertexNeedsSpace || indexNeedsSpace; - // try to add the geometry, catching the error if it cannot fit - resultId = super.addGeometry( geometry, reservedVertexRange, reservedIndexRange ); + }; - } catch { + const index = geometry.index; + const position = geometry.attributes.position; + reservedVertexRange = Math.max( reservedVertexRange, position.count ); + reservedIndexRange = Math.max( reservedIndexRange, index ? index.count : 0 ); + + if ( needsMoreSpace() ) { // shift all the unused geometries to try to make space _freeGeometryIds.forEach( id => this.deleteGeometry( id ) ); @@ -103,31 +104,45 @@ export class ExpandingBatchedMesh extends ModelViewBatchedMesh { this.optimize(); - try { - - // see if we can insert geometry now - resultId = super.addGeometry( geometry, reservedVertexRange, reservedIndexRange ); - - } catch { + if ( needsMoreSpace() ) { // lastly try to expand the batched mesh size so the new geometry fits + const batchedIndex = this.geometry.index; const batchedPosition = this.geometry.attributes.position; - const index = geometry.index; - const position = geometry.attributes.position; - const addIndexCount = batchedIndex ? Math.ceil( expandPercent * batchedIndex.count ) : - 1; - const newIndexCount = batchedIndex ? Math.max( addIndexCount, reservedIndexRange, index.count ) + batchedIndex.count : - 1; - const addVertexCount = Math.ceil( expandPercent * batchedPosition.count ); - const newVertexCount = Math.max( addVertexCount, reservedVertexRange, position.count ) + batchedPosition.count; + // compute the new geometry size to expand to accounting for the case where the geometry is not initialized + let newIndexCount, newVertexCount; + if ( batchedIndex ) { + + const addIndexCount = Math.ceil( expandPercent * batchedIndex.count ); + newIndexCount = Math.max( addIndexCount, reservedIndexRange, index.count ) + batchedIndex.count; + + } else { + + newIndexCount = Math.max( this.unusedIndexCount, reservedIndexRange ); + + } + + if ( batchedPosition ) { + + const addVertexCount = Math.ceil( expandPercent * batchedPosition.count ); + newVertexCount = Math.max( addVertexCount, reservedVertexRange, position.count ) + batchedPosition.count; + + } else { + + newVertexCount = Math.max( this.unusedVertexCount, reservedVertexRange ); + + } this.setGeometrySize( newVertexCount, newIndexCount ); - resultId = super.addGeometry( geometry, reservedVertexRange, reservedIndexRange ); } } + resultId = super.addGeometry( geometry, reservedVertexRange, reservedIndexRange ); + } return resultId; @@ -137,14 +152,13 @@ export class ExpandingBatchedMesh extends ModelViewBatchedMesh { // add an instance and automatically expand the number of instances if necessary addInstance( geometryId ) { - if ( this.maxInstanceCount === this._currentInstances ) { + if ( this.maxInstanceCount === this.instanceCount ) { const newCount = Math.ceil( this.maxInstanceCount * ( 1 + this.expandPercent ) ); this.setInstanceCount( Math.min( newCount, this.maxInstanceExpansionSize ) ); } - this._currentInstances ++; return super.addInstance( geometryId ); } @@ -152,15 +166,13 @@ export class ExpandingBatchedMesh extends ModelViewBatchedMesh { // delete an instance, keeping note that the geometry id is now unused deleteInstance( instanceId ) { - if ( this._drawInfo[ instanceId ].active === false ) { + const geometryId = this.getGeometryIdAt( instanceId ); + if ( geometryId !== - 1 ) { - // TODO: how is this happening? - return; + this._freeGeometryIds.push( geometryId ); } - this._freeGeometryIds.push( this.getGeometryIdAt( instanceId ) ); - this._currentInstances --; return super.deleteInstance( instanceId ); } diff --git a/example/src/plugins/batched/ModelViewBatchedMesh.js b/example/src/plugins/batched/ModelViewBatchedMesh.js index 48356202..0c379575 100644 --- a/example/src/plugins/batched/ModelViewBatchedMesh.js +++ b/example/src/plugins/batched/ModelViewBatchedMesh.js @@ -16,7 +16,6 @@ export class ModelViewBatchedMesh extends BatchedMesh { } - setMatrixAt( ...args ) { super.setMatrixAt( ...args ); @@ -59,11 +58,9 @@ export class ModelViewBatchedMesh extends BatchedMesh { if ( this._forceUpdate || vec1.distanceTo( vec2 ) > this.resetDistance ) { - // TODO: resize and re-instantiate the texture here if the size is different - const drawInfo = this._drawInfo; const matricesArray = matricesTexture.image.data; const modelViewArray = modelViewMatricesTexture.image.data; - for ( let i = 0; i < drawInfo.length; i ++ ) { + for ( let i = 0; i < this.maxInstanceCount; i ++ ) { matrix .fromArray( matricesArray, i * 16 ) @@ -101,6 +98,8 @@ export class ModelViewBatchedMesh extends BatchedMesh { dispose() { + super.dispose(); + if ( this._modelViewMatricesTexture ) { this._modelViewMatricesTexture.dispose(); diff --git a/package-lock.json b/package-lock.json index 4d2f064e..2d967271 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,6 +16,7 @@ "@types/three": "^0.166.0", "@typescript-eslint/eslint-plugin": "^7.14.1", "@typescript-eslint/parser": "^7.14.1", + "@vitejs/plugin-react": "^4.3.2", "babel-jest": "^29.5.0", "cesium": "^1.97.0", "concurrently": "^6.2.1", @@ -26,13 +27,12 @@ "jest": "^27.1.1", "jest-cli": "^27.1.1", "leva": "^0.9.35", - "three": "^0.166.0", + "three": "^0.170.0", "typescript": "^5.1.3", "vite": "^5.3.1" }, "optionalDependencies": { "@react-three/fiber": "^8.17.9", - "@vitejs/plugin-react": "^4.3.2", "react": "^18.3.1", "react-dom": "^18.3.1" }, @@ -44,7 +44,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "devOptional": true, + "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" @@ -57,7 +57,7 @@ "version": "7.25.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz", "integrity": "sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==", - "devOptional": true, + "dev": true, "dependencies": { "@babel/highlight": "^7.25.7", "picocolors": "^1.0.0" @@ -70,7 +70,7 @@ "version": "7.25.8", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.8.tgz", "integrity": "sha512-ZsysZyXY4Tlx+Q53XdnOFmqwfB9QDTHYxaZYajWRoBLuLEAwI2UIbtxOjWh/cFaa9IKUlcB+DDuoskLuKu56JA==", - "devOptional": true, + "dev": true, "engines": { "node": ">=6.9.0" } @@ -79,7 +79,7 @@ "version": "7.25.8", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.8.tgz", "integrity": "sha512-Oixnb+DzmRT30qu9d3tJSQkxuygWm32DFykT4bRoORPa9hZ/L4KhVB/XiRm6KG+roIEM7DBQlmg27kw2HZkdZg==", - "devOptional": true, + "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.25.7", @@ -109,7 +109,7 @@ "version": "7.25.7", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.7.tgz", "integrity": "sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==", - "devOptional": true, + "dev": true, "dependencies": { "@babel/types": "^7.25.7", "@jridgewell/gen-mapping": "^0.3.5", @@ -149,7 +149,7 @@ "version": "7.25.7", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.7.tgz", "integrity": "sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==", - "devOptional": true, + "dev": true, "dependencies": { "@babel/compat-data": "^7.25.7", "@babel/helper-validator-option": "^7.25.7", @@ -232,7 +232,7 @@ "version": "7.25.7", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz", "integrity": "sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==", - "devOptional": true, + "dev": true, "dependencies": { "@babel/traverse": "^7.25.7", "@babel/types": "^7.25.7" @@ -245,7 +245,7 @@ "version": "7.25.7", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.7.tgz", "integrity": "sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==", - "devOptional": true, + "dev": true, "dependencies": { "@babel/helper-module-imports": "^7.25.7", "@babel/helper-simple-access": "^7.25.7", @@ -275,7 +275,7 @@ "version": "7.25.7", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.7.tgz", "integrity": "sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==", - "devOptional": true, + "dev": true, "engines": { "node": ">=6.9.0" } @@ -318,7 +318,7 @@ "version": "7.25.7", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.7.tgz", "integrity": "sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==", - "devOptional": true, + "dev": true, "dependencies": { "@babel/traverse": "^7.25.7", "@babel/types": "^7.25.7" @@ -344,7 +344,7 @@ "version": "7.25.7", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz", "integrity": "sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==", - "devOptional": true, + "dev": true, "engines": { "node": ">=6.9.0" } @@ -353,7 +353,7 @@ "version": "7.25.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz", "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==", - "devOptional": true, + "dev": true, "engines": { "node": ">=6.9.0" } @@ -362,7 +362,7 @@ "version": "7.25.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.7.tgz", "integrity": "sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==", - "devOptional": true, + "dev": true, "engines": { "node": ">=6.9.0" } @@ -385,7 +385,7 @@ "version": "7.25.7", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.7.tgz", "integrity": "sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA==", - "devOptional": true, + "dev": true, "dependencies": { "@babel/template": "^7.25.7", "@babel/types": "^7.25.7" @@ -398,7 +398,7 @@ "version": "7.25.7", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.7.tgz", "integrity": "sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==", - "devOptional": true, + "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.25.7", "chalk": "^2.4.2", @@ -413,7 +413,7 @@ "version": "7.25.8", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.8.tgz", "integrity": "sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ==", - "devOptional": true, + "dev": true, "dependencies": { "@babel/types": "^7.25.8" }, @@ -1360,7 +1360,7 @@ "version": "7.25.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.7.tgz", "integrity": "sha512-JD9MUnLbPL0WdVK8AWC7F7tTG2OS6u/AKKnsK+NdRhUiVdnzyR1S3kKQCaRLOiaULvUiqK6Z4JQE635VgtCFeg==", - "optional": true, + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.25.7" }, @@ -1375,7 +1375,7 @@ "version": "7.25.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.7.tgz", "integrity": "sha512-S/JXG/KrbIY06iyJPKfxr0qRxnhNOdkNXYBl/rmwgDd72cQLH9tEGkDm/yJPGvcSIUoikzfjMios9i+xT/uv9w==", - "optional": true, + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.25.7" }, @@ -1668,7 +1668,7 @@ "version": "7.25.7", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.7.tgz", "integrity": "sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==", - "devOptional": true, + "dev": true, "dependencies": { "@babel/code-frame": "^7.25.7", "@babel/parser": "^7.25.7", @@ -1682,7 +1682,7 @@ "version": "7.25.7", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.7.tgz", "integrity": "sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==", - "devOptional": true, + "dev": true, "dependencies": { "@babel/code-frame": "^7.25.7", "@babel/generator": "^7.25.7", @@ -1700,7 +1700,7 @@ "version": "7.25.8", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.8.tgz", "integrity": "sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==", - "devOptional": true, + "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.25.7", "@babel/helper-validator-identifier": "^7.25.7", @@ -1778,6 +1778,7 @@ "cpu": [ "ppc64" ], + "dev": true, "optional": true, "os": [ "aix" @@ -1793,6 +1794,7 @@ "cpu": [ "arm" ], + "dev": true, "optional": true, "os": [ "android" @@ -1808,6 +1810,7 @@ "cpu": [ "arm64" ], + "dev": true, "optional": true, "os": [ "android" @@ -1823,6 +1826,7 @@ "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "android" @@ -1838,6 +1842,7 @@ "cpu": [ "arm64" ], + "dev": true, "optional": true, "os": [ "darwin" @@ -1853,6 +1858,7 @@ "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "darwin" @@ -1868,6 +1874,7 @@ "cpu": [ "arm64" ], + "dev": true, "optional": true, "os": [ "freebsd" @@ -1883,6 +1890,7 @@ "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "freebsd" @@ -1898,6 +1906,7 @@ "cpu": [ "arm" ], + "dev": true, "optional": true, "os": [ "linux" @@ -1913,6 +1922,7 @@ "cpu": [ "arm64" ], + "dev": true, "optional": true, "os": [ "linux" @@ -1928,6 +1938,7 @@ "cpu": [ "ia32" ], + "dev": true, "optional": true, "os": [ "linux" @@ -1943,6 +1954,7 @@ "cpu": [ "loong64" ], + "dev": true, "optional": true, "os": [ "linux" @@ -1958,6 +1970,7 @@ "cpu": [ "mips64el" ], + "dev": true, "optional": true, "os": [ "linux" @@ -1973,6 +1986,7 @@ "cpu": [ "ppc64" ], + "dev": true, "optional": true, "os": [ "linux" @@ -1988,6 +2002,7 @@ "cpu": [ "riscv64" ], + "dev": true, "optional": true, "os": [ "linux" @@ -2003,6 +2018,7 @@ "cpu": [ "s390x" ], + "dev": true, "optional": true, "os": [ "linux" @@ -2018,6 +2034,7 @@ "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "linux" @@ -2033,6 +2050,7 @@ "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "netbsd" @@ -2048,6 +2066,7 @@ "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "openbsd" @@ -2063,6 +2082,7 @@ "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "sunos" @@ -2078,6 +2098,7 @@ "cpu": [ "arm64" ], + "dev": true, "optional": true, "os": [ "win32" @@ -2093,6 +2114,7 @@ "cpu": [ "ia32" ], + "dev": true, "optional": true, "os": [ "win32" @@ -2108,6 +2130,7 @@ "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "win32" @@ -3807,7 +3830,7 @@ "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "devOptional": true, + "dev": true, "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -3821,7 +3844,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "devOptional": true, + "dev": true, "engines": { "node": ">=6.0.0" } @@ -3830,7 +3853,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "devOptional": true, + "dev": true, "engines": { "node": ">=6.0.0" } @@ -3839,13 +3862,13 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "devOptional": true + "dev": true }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "devOptional": true, + "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -4546,6 +4569,7 @@ "cpu": [ "arm" ], + "dev": true, "optional": true, "os": [ "android" @@ -4558,6 +4582,7 @@ "cpu": [ "arm64" ], + "dev": true, "optional": true, "os": [ "android" @@ -4570,6 +4595,7 @@ "cpu": [ "arm64" ], + "dev": true, "optional": true, "os": [ "darwin" @@ -4582,6 +4608,7 @@ "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "darwin" @@ -4594,6 +4621,7 @@ "cpu": [ "arm" ], + "dev": true, "optional": true, "os": [ "linux" @@ -4606,6 +4634,7 @@ "cpu": [ "arm" ], + "dev": true, "optional": true, "os": [ "linux" @@ -4618,6 +4647,7 @@ "cpu": [ "arm64" ], + "dev": true, "optional": true, "os": [ "linux" @@ -4630,6 +4660,7 @@ "cpu": [ "arm64" ], + "dev": true, "optional": true, "os": [ "linux" @@ -4642,6 +4673,7 @@ "cpu": [ "ppc64" ], + "dev": true, "optional": true, "os": [ "linux" @@ -4654,6 +4686,7 @@ "cpu": [ "riscv64" ], + "dev": true, "optional": true, "os": [ "linux" @@ -4666,6 +4699,7 @@ "cpu": [ "s390x" ], + "dev": true, "optional": true, "os": [ "linux" @@ -4678,6 +4712,7 @@ "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "linux" @@ -4690,6 +4725,7 @@ "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "linux" @@ -4702,6 +4738,7 @@ "cpu": [ "arm64" ], + "dev": true, "optional": true, "os": [ "win32" @@ -4714,6 +4751,7 @@ "cpu": [ "ia32" ], + "dev": true, "optional": true, "os": [ "win32" @@ -4726,6 +4764,7 @@ "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "win32" @@ -4783,7 +4822,7 @@ "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "devOptional": true, + "dev": true, "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", @@ -4796,7 +4835,7 @@ "version": "7.6.8", "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", - "devOptional": true, + "dev": true, "dependencies": { "@babel/types": "^7.0.0" } @@ -4805,7 +4844,7 @@ "version": "7.4.4", "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "devOptional": true, + "dev": true, "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" @@ -4815,7 +4854,7 @@ "version": "7.20.6", "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", - "devOptional": true, + "dev": true, "dependencies": { "@babel/types": "^7.20.7" } @@ -4846,7 +4885,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", - "devOptional": true + "dev": true }, "node_modules/@types/graceful-fs": { "version": "4.1.9", @@ -4891,7 +4930,7 @@ "version": "22.7.5", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", - "devOptional": true, + "dev": true, "dependencies": { "undici-types": "~6.19.2" } @@ -5205,7 +5244,7 @@ "version": "4.3.2", "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.2.tgz", "integrity": "sha512-hieu+o05v4glEBucTcKMK3dlES0OeJlD9YVOAPraVMOInBCwzumaIFiUjr4bHK7NPgnAHgiskUoceKercrN8vg==", - "optional": true, + "dev": true, "dependencies": { "@babel/core": "^7.25.2", "@babel/plugin-transform-react-jsx-self": "^7.24.7", @@ -5348,7 +5387,7 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "devOptional": true, + "dev": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -5840,7 +5879,7 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz", "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==", - "devOptional": true, + "dev": true, "funding": [ { "type": "opencollective", @@ -5957,7 +5996,7 @@ "version": "1.0.30001667", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001667.tgz", "integrity": "sha512-7LTwJjcRkzKFmtqGsibMeuXmvFDfZq/nzIjnmgCGzKKRVzjD72selLDK1oPF/Oxzmt4fNcPvTDvGqSDG4tCALw==", - "devOptional": true, + "dev": true, "funding": [ { "type": "opencollective", @@ -5990,7 +6029,7 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "devOptional": true, + "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -6061,7 +6100,7 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "devOptional": true, + "dev": true, "dependencies": { "color-name": "1.1.3" } @@ -6070,7 +6109,7 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "devOptional": true + "dev": true }, "node_modules/colord": { "version": "2.9.3", @@ -6213,7 +6252,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "devOptional": true + "dev": true }, "node_modules/core-js-compat": { "version": "3.38.1", @@ -6381,7 +6420,7 @@ "version": "4.3.7", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "devOptional": true, + "dev": true, "dependencies": { "ms": "^2.1.3" }, @@ -6570,7 +6609,7 @@ "version": "1.5.35", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.35.tgz", "integrity": "sha512-hOSRInrIDm0Brzp4IHW2F/VM+638qOL2CzE0DgpnGzKW27C95IqqeqgKz/hxHGnvPxvQGpHUGD5qRVC9EZY2+A==", - "devOptional": true + "dev": true }, "node_modules/emittery": { "version": "0.8.1", @@ -6761,7 +6800,7 @@ "version": "0.21.5", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "devOptional": true, + "dev": true, "hasInstallScript": true, "bin": { "esbuild": "bin/esbuild" @@ -6799,7 +6838,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "devOptional": true, + "dev": true, "engines": { "node": ">=6" } @@ -6808,7 +6847,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "devOptional": true, + "dev": true, "engines": { "node": ">=0.8.0" } @@ -7697,6 +7736,7 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -7746,7 +7786,7 @@ "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "devOptional": true, + "dev": true, "engines": { "node": ">=6.9.0" } @@ -7886,7 +7926,7 @@ "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "devOptional": true, + "dev": true, "engines": { "node": ">=4" } @@ -7976,7 +8016,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "devOptional": true, + "dev": true, "engines": { "node": ">=4" } @@ -12002,7 +12042,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", - "devOptional": true, + "dev": true, "bin": { "jsesc": "bin/jsesc" }, @@ -12041,7 +12081,7 @@ "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "devOptional": true, + "dev": true, "bin": { "json5": "lib/cli.js" }, @@ -12215,7 +12255,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "devOptional": true, + "dev": true, "dependencies": { "yallist": "^3.0.2" } @@ -12392,13 +12432,13 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "devOptional": true + "dev": true }, "node_modules/nanoid": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "devOptional": true, + "dev": true, "funding": [ { "type": "github", @@ -12428,7 +12468,7 @@ "version": "2.0.18", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", - "devOptional": true + "dev": true }, "node_modules/normalize-path": { "version": "3.0.0", @@ -12727,7 +12767,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", - "devOptional": true + "dev": true }, "node_modules/picomatch": { "version": "2.3.1", @@ -12775,7 +12815,7 @@ "version": "8.4.47", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", - "devOptional": true, + "dev": true, "funding": [ { "type": "opencollective", @@ -13060,7 +13100,7 @@ "version": "0.14.2", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", - "optional": true, + "dev": true, "engines": { "node": ">=0.10.0" } @@ -13273,7 +13313,7 @@ "version": "4.24.0", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.0.tgz", "integrity": "sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==", - "devOptional": true, + "dev": true, "dependencies": { "@types/estree": "1.0.6" }, @@ -13411,7 +13451,7 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "devOptional": true, + "dev": true, "bin": { "semver": "bin/semver.js" } @@ -13545,7 +13585,7 @@ "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==", - "devOptional": true, + "dev": true, "engines": { "node": ">=0.10.0" } @@ -13804,7 +13844,7 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "devOptional": true, + "dev": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -13933,9 +13973,9 @@ "peer": true }, "node_modules/three": { - "version": "0.166.1", - "resolved": "https://registry.npmjs.org/three/-/three-0.166.1.tgz", - "integrity": "sha512-LtuafkKHHzm61AQA1be2MAYIw1IjmhOUxhBa0prrLpEMWbV7ijvxCRHjSgHPGp2493wLBzwKV46tA9nivLEgKg==", + "version": "0.170.0", + "resolved": "https://registry.npmjs.org/three/-/three-0.170.0.tgz", + "integrity": "sha512-FQK+LEpYc0fBD+J8g6oSEyyNzjp+Q7Ks1C568WWaoMRLW+TkNNWmenWeGgJjV105Gd+p/2ql1ZcjYvNiPZBhuQ==", "devOptional": true }, "node_modules/three-mesh-bvh": { @@ -13987,7 +14027,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "devOptional": true, + "dev": true, "engines": { "node": ">=4" } @@ -14287,7 +14327,7 @@ "version": "6.19.8", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", - "devOptional": true + "dev": true }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.1", @@ -14342,7 +14382,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", - "devOptional": true, + "dev": true, "funding": [ { "type": "opencollective", @@ -14464,7 +14504,7 @@ "version": "5.4.8", "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.8.tgz", "integrity": "sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==", - "devOptional": true, + "dev": true, "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", @@ -14819,7 +14859,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "devOptional": true + "dev": true }, "node_modules/yargs": { "version": "16.2.0", diff --git a/package.json b/package.json index 5a84626f..113a96b3 100644 --- a/package.json +++ b/package.json @@ -49,6 +49,7 @@ "@types/three": "^0.166.0", "@typescript-eslint/eslint-plugin": "^7.14.1", "@typescript-eslint/parser": "^7.14.1", + "@vitejs/plugin-react": "^4.3.2", "babel-jest": "^29.5.0", "cesium": "^1.97.0", "concurrently": "^6.2.1", @@ -59,7 +60,7 @@ "jest": "^27.1.1", "jest-cli": "^27.1.1", "leva": "^0.9.35", - "three": "^0.166.0", + "three": "^0.170.0", "typescript": "^5.1.3", "vite": "^5.3.1" }, @@ -68,7 +69,6 @@ }, "optionalDependencies": { "@react-three/fiber": "^8.17.9", - "@vitejs/plugin-react": "^4.3.2", "react": "^18.3.1", "react-dom": "^18.3.1" } diff --git a/src/r3f/components/TilesRenderer.jsx b/src/r3f/components/TilesRenderer.jsx index e6d9b67d..8e9b5b9e 100644 --- a/src/r3f/components/TilesRenderer.jsx +++ b/src/r3f/components/TilesRenderer.jsx @@ -22,7 +22,6 @@ function TileSetRoot( { children } ) { } - }, [ tiles ] ); return { children };