diff --git a/.build/changelog.json b/.build/changelog.json index 703be0ba3dc..ba29559eb6a 100644 --- a/.build/changelog.json +++ b/.build/changelog.json @@ -1,6 +1,663 @@ { - "fromTag": "8.6.0", + "fromTag": "8.7.1", "changelog": { + "8.8.0": [], + "8.7.1": [ + { + "pr": "16603", + "title": "Expose limitVelocityDamping parameter in particle system editor", + "description": null, + "author": { + "name": "deltakosh", + "url": "https://github.com/deltakosh" + }, + "files": [ + "packages/dev/inspector/src/components/actionTabs/tabs/propertyGrids/particleSystems/particleSystemPropertyGridComponent.tsx" + ], + "tags": [ + "new feature" + ] + }, + { + "pr": "16599", + "title": "First installment of the Thin Maths", + "description": null, + "author": { + "name": "deltakosh", + "url": "https://github.com/deltakosh" + }, + "files": [ + "packages/dev/addons/src/msdfText/textRenderer.ts", + "packages/dev/core/package.json", + "packages/dev/core/src/Maths/ThinMaths/index.ts", + "packages/dev/core/src/Maths/ThinMaths/thinMath.matrix.functions.ts", + "packages/dev/core/src/Maths/ThinMaths/thinMath.matrix.ts", + "packages/dev/core/src/Maths/index.ts", + "packages/dev/core/src/Maths/math.vector.ts", + "packages/public/@babylonjs/core/package.json" + ], + "tags": [ + "new feature" + ] + }, + { + "pr": "16601", + "title": "Adding handling of InstacedMesh inside of addAllAssetsToContainer that was missing.", + "description": "AssetContainer.addAllAssetsToContainer was missing handling InstancedMeshes, so when one of those meshes existed in the node hierarchy, it was getting added to the transformNodes list instead of the meshes list.", + "author": { + "name": "VicenteCartas", + "url": "https://github.com/VicenteCartas" + }, + "files": [ + "packages/dev/core/src/assetContainer.ts" + ], + "tags": [ + "bug" + ] + }, + { + "pr": "16602", + "title": "FrameGraph: add support for motion blur", + "description": "Closes https://github.com/BabylonJS/ThePirateCove/issues/1242", + "author": { + "name": "Popov72", + "url": "https://github.com/Popov72" + }, + "files": [ + "packages/dev/core/src/Engines/constants.ts", + "packages/dev/core/src/FrameGraph/Node/Blocks/PostProcesses/motionBlurPostProcessBlock.ts", + "packages/dev/core/src/FrameGraph/Node/Blocks/index.ts", + "packages/dev/core/src/FrameGraph/Passes/renderPass.ts", + "packages/dev/core/src/FrameGraph/Tasks/PostProcesses/motionBlurTask.ts", + "packages/dev/core/src/FrameGraph/Tasks/Rendering/geometryRendererTask.ts", + "packages/dev/core/src/FrameGraph/index.ts", + "packages/dev/core/src/PostProcesses/RenderPipeline/Pipelines/ssrRenderingPipeline.ts", + "packages/dev/core/src/PostProcesses/index.ts", + "packages/dev/core/src/PostProcesses/motionBlurPostProcess.ts", + "packages/dev/core/src/PostProcesses/thinMotionBlurPostProcess.ts", + "packages/dev/core/src/PostProcesses/thinSSRPostProcess.ts", + "packages/dev/core/src/Rendering/depthRenderer.ts", + "packages/dev/core/src/Rendering/geometryBufferRenderer.ts", + "packages/dev/core/src/Rendering/prePassRenderer.ts", + "packages/dev/core/src/Shaders/ShadersInclude/screenSpaceRayTrace.fx", + "packages/dev/core/src/Shaders/motionBlur.fragment.fx", + "packages/dev/core/src/ShadersWGSL/ShadersInclude/bonesDeclaration.fx", + "packages/dev/core/src/ShadersWGSL/ShadersInclude/bonesVertex.fx", + "packages/dev/core/src/ShadersWGSL/ShadersInclude/prePassVertex.fx", + "packages/dev/core/src/ShadersWGSL/ShadersInclude/screenSpaceRayTrace.fx", + "packages/dev/core/src/ShadersWGSL/geometry.vertex.fx", + "packages/dev/core/src/ShadersWGSL/motionBlur.fragment.fx", + "packages/tools/nodeRenderGraphEditor/src/blockTools.ts", + "packages/tools/nodeRenderGraphEditor/src/components/nodeList/nodeListComponent.tsx", + "packages/tools/tests/test/visualization/ReferenceImages/FrameGraph-motion-blur-object-based.png", + "packages/tools/tests/test/visualization/ReferenceImages/FrameGraph-motion-blur-screen-based.png", + "packages/tools/tests/test/visualization/ReferenceImages/FrameGraph-motion-blur-skinned.png", + "packages/tools/tests/test/visualization/ReferenceImages/FrameGraph-nrge-motion-blur.png", + "packages/tools/tests/test/visualization/config.json" + ], + "tags": [ + "enhancement", + "frame graph" + ] + }, + { + "pr": "16596", + "title": "Add WebAudio node and microphone input sound sources to AudioEngineV2", + "description": "This change enables using any WebAudio node as a sound source in AudioEngineV2, and uses this new feature to implement microphone input sound sources.", + "author": { + "name": "docEdub", + "url": "https://github.com/docEdub" + }, + "files": [ + "packages/dev/core/src/AudioV2/abstractAudio/abstractSound.ts", + "packages/dev/core/src/AudioV2/abstractAudio/abstractSoundSource.ts", + "packages/dev/core/src/AudioV2/abstractAudio/audioEngineV2.ts", + "packages/dev/core/src/AudioV2/webAudio/index.ts", + "packages/dev/core/src/AudioV2/webAudio/webAudioEngine.ts", + "packages/dev/core/src/AudioV2/webAudio/webAudioSoundSource.ts", + "packages/dev/core/src/AudioV2/webAudio/webAudioStaticSound.ts", + "packages/tools/babylonServer/public/audiov2-test.js", + "packages/tools/tests/test/audioV2/soundSource.spatial.test.ts", + "packages/tools/tests/test/audioV2/soundSource.stereo.test.ts", + "packages/tools/tests/test/audioV2/soundSource.volume.test.ts", + "packages/tools/tests/test/audioV2/utils/audioV2.utils.ts" + ], + "tags": [ + "audio", + "new feature" + ] + }, + { + "pr": "16598", + "title": "fix shaders uninitialized members", + "description": "this commit https://github.com/BabylonJS/Babylon.js/commit/5366c302a1cd67d3528b67d06fabab4d70d82e3a#diff-8893fe3229ee62f0f24bbfb95ef900191b5b9b7e0eda83bb929f51da05c94eae introduced new struct members.\r\nWith D3D, uninitialized variables trigger an error with D3DCompile.\r\n```\r\nerror X4000: variable 'result' used without having been completely initialized\r\n```\r\n\r\nNewer versions of spriv-cross have an option to fix that issue. But updating our fork will take time (like, a lot!).\r\nAdding a traverser to visit Declarations need an update as well.\r\n\r\nSo, setting these new members to 0. BN Infrastructure update will catch these kind of issue.\r\n", + "author": { + "name": "CedricGuillemet", + "url": "https://github.com/CedricGuillemet" + }, + "files": [ + "packages/dev/core/src/Shaders/ShadersInclude/pbrDirectLightingSetupFunctions.fx" + ], + "tags": [ + "native" + ] + }, + { + "pr": "16595", + "title": "Fix screenshot tools fxaa background color", + "description": null, + "author": { + "name": "sebavan", + "url": "https://github.com/sebavan" + }, + "files": [ + "packages/dev/core/src/Misc/screenshotTools.ts" + ], + "tags": [] + }, + { + "pr": "16594", + "title": "USDZ Exporter: Some small fixes", + "description": "- Retrieve Normal vertex buffer\r\n- Retrieve correct UV set indices\r\n- Add clearcoat support for PBR materials\r\n- Allow export with an odd number of negative scales (aka flipped orientation). Not sure if it is the ideal fix, but my rationale is \r\n - This is what Three does, and seems to work OK.\r\n - This piece of documentation (last paragraph of https://openusd.org/release/api/usd_geom_page_front.html#UsdGeom_WindingOrder) seems to suggest that handling the orientation flip can be a run/load-time operation? Or, at least, I can't find anyplace where it says that this must be done at export-time. Someone please correct me if I'm wrong :)", + "author": { + "name": "alexchuber", + "url": "https://github.com/alexchuber" + }, + "files": [ + "packages/dev/serializers/src/USDZ/usdzExporter.ts" + ], + "tags": [] + }, + { + "pr": "16582", + "title": "Add new addon to render text using MSDF", + "description": "Some tests:\r\nhttps://playground.babylonjs.com/?snapshot=refs/pull/16582/merge#6RLCWP#35\r\nhttps://playground.babylonjs.com/?snapshot=refs/pull/16582/merge#6RLCWP#23\r\nhttps://playground.babylonjs.com/?snapshot=refs/pull/16582/merge#6RLCWP#21\r\n", + "author": { + "name": "deltakosh", + "url": "https://github.com/deltakosh" + }, + "files": [ + "packages/dev/addons/src/index.ts", + "packages/dev/addons/src/msdfText/fontAsset.ts", + "packages/dev/addons/src/msdfText/index.ts", + "packages/dev/addons/src/msdfText/paragraphOptions.ts", + "packages/dev/addons/src/msdfText/sdf/bmFont.ts", + "packages/dev/addons/src/msdfText/sdf/font.ts", + "packages/dev/addons/src/msdfText/sdf/glyph.ts", + "packages/dev/addons/src/msdfText/sdf/line.ts", + "packages/dev/addons/src/msdfText/sdf/paragraph.ts", + "packages/dev/addons/src/msdfText/textRenderer.ts", + "packages/dev/addons/src/msdfText/webgl/fragment.ts", + "packages/dev/addons/src/msdfText/webgl/vertex.ts", + "packages/dev/addons/src/msdfText/webgpu/fragment.ts", + "packages/dev/addons/src/msdfText/webgpu/vertex.ts", + "packages/tools/tests/test/visualization/ReferenceImages/msdf-billboard.png", + "packages/tools/tests/test/visualization/ReferenceImages/msdf.png", + "packages/tools/tests/test/visualization/config.json" + ], + "tags": [ + "new feature" + ] + }, + { + "pr": "16590", + "title": "Sandbox: fix pan speed when model was loaded via drag and drop", + "description": "There were previously 2 possible render loops depending on if you loaded from a URL or drag & drop. The previous fix for camera pan speed only applied to one of them, so if you didn't use a URL and just dragged and dropped in, you wouldn't get the corrected behavior. This change consolidates down to one render loop for both scenarios, so the camera behavior only has to be defined in one place. Specifically, FilesInput is no longer responsible for creating a render loop - it's now always done by renderingZone.tsx in either case.", + "author": { + "name": "AmoebaChant", + "url": "https://github.com/AmoebaChant" + }, + "files": [ + "packages/tools/sandbox/src/components/renderingZone.tsx" + ], + "tags": [] + }, + { + "pr": "16586", + "title": "Fix (very broken) BVH animation", + "description": "When I started testing the code with multiple animations, I noticed it was completely broken. I also hard coded lots of values that seemed right with the alien.bvh animation but are not necessary.\r\n\r\nAfter this fix, all the [CMU animations](https://mocap.cs.cmu.edu/) work perfectly.", + "author": { + "name": "yuripourre", + "url": "https://github.com/yuripourre" + }, + "files": [ + "packages/dev/loaders/src/BVH/bvhLoader.ts", + "packages/dev/loaders/test/integration/babylon.sceneLoader.test.ts", + "packages/dev/loaders/test/integration/testData.ts" + ], + "tags": [] + }, + { + "pr": "16579", + "title": "Clamp NdotV to 0.0 for diffuse roughness", + "description": "For prefiltered IBL, using the \"dominant direction\" approximation for diffuse roughness, slightly negative NdotV values weren't being handled, resulting in artifacts.\r\n\r\n\"Screenshot\r\n\r\n\"Screenshot\r\n", + "author": { + "name": "MiiBond", + "url": "https://github.com/MiiBond" + }, + "files": [ + "packages/dev/core/src/Shaders/ShadersInclude/pbrBlockReflection.fx", + "packages/dev/core/src/ShadersWGSL/ShadersInclude/pbrBlockReflection.fx" + ], + "tags": [] + }, + { + "pr": "16593", + "title": "Deleting particle system velocity limit throws error in console.", + "description": "Also fix #16592 ", + "author": { + "name": "deltakosh", + "url": "https://github.com/deltakosh" + }, + "files": [ + "packages/dev/inspector/src/components/actionTabs/tabs/propertyGrids/particleSystems/particleSystemPropertyGridComponent.tsx", + "packages/dev/inspector/src/components/actionTabs/tabs/propertyGrids/particleSystems/valueGradientGridComponent.tsx" + ], + "tags": [ + "bug" + ] + }, + { + "pr": "16588", + "title": "Removed hard coded value for cameraGizmo", + "description": "I browsed history but could not get the reason for that particular bug. Why the fix was valid in the first place or the meaning of the 1.5 value.\r\nThis PR removes it in the hope bug will re-surface and a proper fix will be done.\r\n\r\nhttps://forum.babylonjs.com/t/cameragizmo-changes-maxz-every-time-it-shows/57966/6", + "author": { + "name": "CedricGuillemet", + "url": "https://github.com/CedricGuillemet" + }, + "files": [ + "packages/dev/core/src/Gizmos/cameraGizmo.ts" + ], + "tags": [ + "skip changelog" + ] + }, + { + "pr": "16589", + "title": "Fix animation goToFrame with negative speedRatio", + "description": null, + "author": { + "name": "deltakosh", + "url": "https://github.com/deltakosh" + }, + "files": [ + "packages/dev/core/src/Animations/animatable.core.ts" + ], + "tags": [ + "bug", + "animations" + ] + }, + { + "pr": "16587", + "title": "bug fix - \"moveWithCollisions\" method parameter slideOnCollide==false now moves mesh to NEAR the collision point, instead of AT the collision point", + "description": "Issue - \"moveWithCollisions\" with the parameter slideOnCollide == false used to move the mesh up to the point of collision. Due to floating point inaccuracy, this sometimes meant just outside, and sometimes just inside penetration with the collided mesh. When just inside, subsequent calls to \"moveWithCollisions\" would snag on the mesh previously collided with.\r\n\r\nSolution - \"moveWithCollisions\" with the parameter slideOnCollide == false now moves the mesh NOT up to the point of collision, but up to a point just a small distance short of that collision. The small distance is based on \"AbstractEngine.CollisionsEpsilon\", the same distance considered \"close\" by other aspects of the collision system.\r\n", + "author": { + "name": "jon-heard", + "url": "https://github.com/jon-heard" + }, + "files": [ + "packages/dev/core/src/Collisions/collider.ts" + ], + "tags": [] + }, + { + "pr": "16584", + "title": "Make explicit the need for engine renderloop for end frame, and fix some small typos", + "description": "Make explicit the need for `engine.runRenderLoop(...)` as part of `engine.onEndFrameObservable`. \r\n\r\nDrive by fix of some small typos.", + "author": { + "name": "mthaddon", + "url": "https://github.com/mthaddon" + }, + "files": [ + "packages/dev/core/src/Culling/ray.core.ts", + "packages/dev/core/src/Engines/abstractEngine.ts", + "packages/dev/materials/src/water/readme.md" + ], + "tags": [] + }, + { + "pr": "16570", + "title": "IFlowable added", + "description": "Added an `IFlowable` interface and the `FlowMap:public processFlowable(flowable: IFlowable, strength = 1, flowMapSamplePosOrTransformationMatrix?: IVector3Like | Matrix)` function.", + "author": { + "name": "RolandCsibrei", + "url": "https://github.com/RolandCsibrei" + }, + "files": [ + "packages/dev/core/src/Particles/flowMap.ts", + "packages/dev/core/src/Particles/particleSystem.ts" + ], + "tags": [] + }, + { + "pr": "16581", + "title": "Add linear hex value to color picker when color is stored in linear mode", + "description": "Today if a material stores color in linear mode (Ex: PBR) the color picker will do an auto conversion to gamma mode. This results in confusion when copying the hex value into code (user needs to know to convert it to linear when passing the hex)\r\n\r\nThis change adds the linear hex in the UX as well as a more informative message instructing how to use the hex values.", + "author": { + "name": "georginahalpern", + "url": "https://github.com/georginahalpern" + }, + "files": [ + "packages/dev/sharedUiComponents/src/colorPicker/colorPicker.scss", + "packages/dev/sharedUiComponents/src/colorPicker/colorPicker.tsx" + ], + "tags": [ + "inspector", + "new feature" + ] + }, + { + "pr": "16580", + "title": "new feature - slideOnCollide parameter for \"abstractMesh.moveWithCollisions\" (defaults to true)", + "description": "Optional slideOnCollide parameter added to \"abstractMesh.moveWithCollisions\", and it's logic implemented", + "author": { + "name": "jon-heard", + "url": "https://github.com/jon-heard" + }, + "files": [ + "packages/dev/core/src/Collisions/collider.ts", + "packages/dev/core/src/Collisions/collisionCoordinator.ts", + "packages/dev/core/src/Meshes/abstractMesh.ts" + ], + "tags": [] + } + ], + "8.7.0": [ + { + "pr": "16577", + "title": "Fixes Area Lights for NME", + "description": "The samplers required by Area Lights are placed in files that might not always be included when using NME. I'm moving them to always be paired with the appropriate area Lights functions to make sure we always have the samplers available.\r\n\r\nFixes issue reported from forum: https://forum.babylonjs.com/t/triplanar-node-material-area-lights-issue/58296", + "author": { + "name": "SergioRZMasson", + "url": "https://github.com/SergioRZMasson" + }, + "files": [ + "packages/dev/core/src/Shaders/ShadersInclude/pbrDirectLightingSetupFunctions.fx", + "packages/dev/core/src/Shaders/ShadersInclude/pbrFragmentSamplersDeclaration.fx", + "packages/dev/core/src/ShadersWGSL/ShadersInclude/pbrDirectLightingSetupFunctions.fx", + "packages/dev/core/src/ShadersWGSL/ShadersInclude/pbrFragmentSamplersDeclaration.fx" + ], + "tags": [] + }, + { + "pr": "16576", + "title": "Small fix for waitAll in flow graph", + "description": null, + "author": { + "name": "RaananW", + "url": "https://github.com/RaananW" + }, + "files": [ + "packages/dev/core/src/FlowGraph/Blocks/Execution/ControlFlow/flowGraphWaitAllBlock.ts", + "packages/dev/loaders/src/glTF/2.0/Extensions/KHR_interactivity/declarationMapper.ts", + "packages/dev/loaders/test/unit/Interactivity/flow nodes.test.ts" + ], + "tags": [] + } + ], + "8.6.2": [ + { + "pr": "16572", + "title": "WebGPU: Make sure the depth texture is cleared with the right value at creation time", + "description": "See https://forum.babylonjs.com/t/webgpu-autoclear-and-autocleardepthandstencil/58267", + "author": { + "name": "Popov72", + "url": "https://github.com/Popov72" + }, + "files": [ + "packages/dev/core/src/Engines/webgpuEngine.ts" + ], + "tags": [ + "bug", + "WebGPU" + ] + }, + { + "pr": "16574", + "title": "Some fixes for glTF interactivity", + "description": "Fix 3 issues with flow/switch and flow/for", + "author": { + "name": "RaananW", + "url": "https://github.com/RaananW" + }, + "files": [ + "packages/dev/core/src/FlowGraph/Blocks/Execution/ControlFlow/flowGraphForLoopBlock.ts", + "packages/dev/loaders/src/glTF/2.0/Extensions/KHR_interactivity/declarationMapper.ts", + "packages/dev/loaders/src/glTF/2.0/Extensions/KHR_interactivity/interactivityGraphParser.ts" + ], + "tags": [] + }, + { + "pr": "16575", + "title": "Speed up a couple of vis tests", + "description": "I've updated a few visualization tests to just speed up their loading. The main performance culprit is the HDR preprocessing. I just lowered the resolution.", + "author": { + "name": "MiiBond", + "url": "https://github.com/MiiBond" + }, + "files": [ + "packages/tools/tests/test/visualization/ReferenceImages/ssShadowsLeftHanded.png", + "packages/tools/tests/test/visualization/ReferenceImages/ssShadowsRightHanded.png", + "packages/tools/tests/test/visualization/config.json" + ], + "tags": [] + }, + { + "pr": "16573", + "title": "Try to fix flacky test \"IBL radiance roughness\"", + "description": null, + "author": { + "name": "Popov72", + "url": "https://github.com/Popov72" + }, + "files": [ + "packages/tools/tests/test/visualization/config.json" + ], + "tags": [ + "skip changelog" + ] + }, + { + "pr": "16571", + "title": "NME Preview window does not pop out correctly", + "description": "Fixes #16569\nAdding onMounted functionality for the preview so that we know when it is mounted and when we can run the next init", + "author": { + "name": "RaananW", + "url": "https://github.com/RaananW" + }, + "files": [ + "packages/tools/nodeEditor/src/components/preview/previewAreaComponent.tsx", + "packages/tools/nodeEditor/src/components/preview/previewMeshControlComponent.tsx", + "packages/tools/nodeEditor/src/graphEditor.tsx", + "packages/tools/nodeGeometryEditor/src/components/preview/previewAreaComponent.tsx", + "packages/tools/nodeGeometryEditor/src/components/preview/previewMeshControlComponent.tsx", + "packages/tools/nodeGeometryEditor/src/graphEditor.tsx", + "packages/tools/nodeRenderGraphEditor/src/components/preview/previewAreaComponent.tsx", + "packages/tools/nodeRenderGraphEditor/src/components/preview/previewMeshControlComponent.tsx", + "packages/tools/nodeRenderGraphEditor/src/graphEditor.tsx" + ], + "tags": [] + }, + { + "pr": "16253", + "title": "Diffuse Roughness support", + "description": "This PR replaces https://github.com/BabylonJS/Babylon.js/pull/16183\r\n\r\nThis PR implements the base_diffuse_roughness parameter from the [OpenPBR specification](https://academysoftwarefoundation.github.io/OpenPBR/#model/basesubstrate).\r\n\r\nThe diffuse roughness is implemented for analytic lights, realtime-filtered IBL, prefiltered IBL and spherical harmonics.\r\nI've added a flag to a material to choose between Lambert, Burley and the new Energy Conserving Oren-Nayar (EON) model used by OpenPBR. The default is OpenPBR's EON model. \r\n\r\nThe previous behaviour was to use Burley diffuse for analytical lights and Lambert for IBL. Also, previously, specular roughness was applied to diffuse roughness for analytical lights while IBL didn't use it at all (because it was simply Lambertian). So, the new default slightly changes existing projects that used analytical lights but I question how noticeable that will be.\r\n\r\n**Analytical Light:**\r\nhttps://playground.babylonjs.com/?snapshot=refs/pull/16253/merge#MXACV7#3\r\n![roughnessCompare](https://github.com/user-attachments/assets/df0f6782-f1c9-42b3-8c82-d2e4ebc59f85)\r\n\r\n**Realtime IBL:**\r\nhttps://playground.babylonjs.com/?snapshot=refs/pull/16253/merge#MXACV7#5\r\n\"image\"\r\n\r\nThe diffuse roughness models are heavily dependent on the light direction and view direction and are therefore difficult to handle with a prefiltered IBL. I came up with two methods for approximating roughness with prefiltered IBL's. The first, if we prefiltered using CDF, we generate a dominant light direction to use in the BRDF calculations. It works reasonably well.\r\n\r\n**Prefiltered IBL with CDF:**\r\nhttps://playground.babylonjs.com/?snapshot=refs/pull/16253/merge#MXACV7#9\r\n\"image\"\r\n\r\nThe second approach, if you don't use CDF, is by approximating roughness by bending the surface normal towards the camera to add some of the retro-reflective behaviour that you get with EON. Because of this, you'll notice that Burley and EON are identical and the shadow terminator appears to move as diffuse roughness increases. In practice, however, this example uses an extreme IBL with a bright sunlight. With other IBL's, the effect tends to be more convincing.\r\n\r\n**Prefiltered IBL without CDF**\r\nhttps://playground.babylonjs.com/?snapshot=refs/pull/16253/merge#MXACV7#10\r\n\"image\"\r\n\r\nThe default IBL lighting in Sandbox uses spherical harmonics so we need to approximate diffuse roughness with this as well. I'm using the same bent normal technique as with prefiltered IBL without CDF.\r\n\r\n**Spherical Harmonics IBL**\r\nhttps://playground.babylonjs.com/?snapshot=refs/pull/16253/merge#MXACV7#11\r\n![image](https://github.com/user-attachments/assets/13543a47-62aa-4d26-a438-1a6031803027)\r\n", + "author": { + "name": "MiiBond", + "url": "https://github.com/MiiBond" + }, + "files": [ + "packages/dev/core/src/Engines/constants.ts", + "packages/dev/core/src/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.ts", + "packages/dev/core/src/Materials/Node/Blocks/PBR/reflectionBlock.ts", + "packages/dev/core/src/Materials/PBR/pbrBaseMaterial.ts", + "packages/dev/core/src/Materials/PBR/pbrMaterial.ts", + "packages/dev/core/src/Materials/Textures/Filtering/hdrIrradianceFiltering.ts", + "packages/dev/core/src/Materials/Textures/baseTexture.ts", + "packages/dev/core/src/Materials/materialFlags.ts", + "packages/dev/core/src/Rendering/IBLShadows/iblShadowsAccumulationPass.ts", + "packages/dev/core/src/Rendering/iblCdfGenerator.ts", + "packages/dev/core/src/Rendering/iblCdfGeneratorSceneComponent.ts", + "packages/dev/core/src/Rendering/index.ts", + "packages/dev/core/src/Shaders/ShadersInclude/hdrFilteringFunctions.fx", + "packages/dev/core/src/Shaders/ShadersInclude/lightFragment.fx", + "packages/dev/core/src/Shaders/ShadersInclude/pbrBRDFFunctions.fx", + "packages/dev/core/src/Shaders/ShadersInclude/pbrBlockAlbedoOpacity.fx", + "packages/dev/core/src/Shaders/ShadersInclude/pbrBlockReflection.fx", + "packages/dev/core/src/Shaders/ShadersInclude/pbrBlockReflectivity.fx", + "packages/dev/core/src/Shaders/ShadersInclude/pbrBlockSubSurface.fx", + "packages/dev/core/src/Shaders/ShadersInclude/pbrDirectLightingFunctions.fx", + "packages/dev/core/src/Shaders/ShadersInclude/pbrDirectLightingSetupFunctions.fx", + "packages/dev/core/src/Shaders/ShadersInclude/pbrFragmentDeclaration.fx", + "packages/dev/core/src/Shaders/ShadersInclude/pbrFragmentSamplersDeclaration.fx", + "packages/dev/core/src/Shaders/ShadersInclude/pbrUboDeclaration.fx", + "packages/dev/core/src/Shaders/ShadersInclude/pbrVertexDeclaration.fx", + "packages/dev/core/src/Shaders/hdrIrradianceFiltering.fragment.fx", + "packages/dev/core/src/Shaders/iblDominantDirection.fragment.fx", + "packages/dev/core/src/Shaders/pbr.fragment.fx", + "packages/dev/core/src/Shaders/pbr.vertex.fx", + "packages/dev/core/src/ShadersWGSL/ShadersInclude/hdrFilteringFunctions.fx", + "packages/dev/core/src/ShadersWGSL/ShadersInclude/lightFragment.fx", + "packages/dev/core/src/ShadersWGSL/ShadersInclude/pbrBRDFFunctions.fx", + "packages/dev/core/src/ShadersWGSL/ShadersInclude/pbrBlockAlbedoOpacity.fx", + "packages/dev/core/src/ShadersWGSL/ShadersInclude/pbrBlockReflection.fx", + "packages/dev/core/src/ShadersWGSL/ShadersInclude/pbrBlockReflectivity.fx", + "packages/dev/core/src/ShadersWGSL/ShadersInclude/pbrBlockSubSurface.fx", + "packages/dev/core/src/ShadersWGSL/ShadersInclude/pbrDirectLightingFunctions.fx", + "packages/dev/core/src/ShadersWGSL/ShadersInclude/pbrDirectLightingSetupFunctions.fx", + "packages/dev/core/src/ShadersWGSL/ShadersInclude/pbrFragmentSamplersDeclaration.fx", + "packages/dev/core/src/ShadersWGSL/ShadersInclude/pbrUboDeclaration.fx", + "packages/dev/core/src/ShadersWGSL/hdrIrradianceFiltering.fragment.fx", + "packages/dev/core/src/ShadersWGSL/iblDominantDirection.fragment.fx", + "packages/dev/core/src/ShadersWGSL/pbr.fragment.fx", + "packages/dev/core/src/ShadersWGSL/pbr.vertex.fx", + "packages/dev/inspector/src/components/actionTabs/tabs/propertyGrids/materials/pbrMaterialPropertyGridComponent.tsx", + "packages/dev/inspector/src/components/actionTabs/tabs/tools/gltfComponent.tsx", + "packages/dev/inspector/src/components/globalState.ts", + "packages/dev/loaders/src/glTF/2.0/Extensions/EXT_materials_diffuse_roughness.ts", + "packages/dev/loaders/src/glTF/2.0/Extensions/dynamic.ts", + "packages/dev/loaders/src/glTF/2.0/Extensions/index.ts", + "packages/dev/serializers/src/glTF/2.0/Extensions/EXT_materials_diffuse_roughness.ts", + "packages/dev/serializers/src/glTF/2.0/Extensions/index.ts", + "packages/public/glTF2Interface/babylon.glTF2Interface.d.ts", + "packages/tools/tests/test/visualization/ReferenceImages/iesprofile2.png", + "packages/tools/tests/test/visualization/ReferenceImages/normals.png", + "packages/tools/tests/test/visualization/ReferenceImages/openpbr-base-diffuse-roughness-prefiltered-ibl-with-cdf.png", + "packages/tools/tests/test/visualization/ReferenceImages/openpbr-base-diffuse-roughness-prefiltered-ibl.png", + "packages/tools/tests/test/visualization/ReferenceImages/openpbr-base-diffuse-roughness-realtime-ibl.png", + "packages/tools/tests/test/visualization/ReferenceImages/openpbr-base-diffuse-roughness-spherical-harmonics.png", + "packages/tools/tests/test/visualization/ReferenceImages/openpbr-base-diffuse-roughness.png", + "packages/tools/tests/test/visualization/ReferenceImages/voxelShadows.png", + "packages/tools/tests/test/visualization/ReferenceImages/voxelShadowsLeftHanded.png", + "packages/tools/tests/test/visualization/ReferenceImages/voxelShadowsRightHanded.png", + "packages/tools/tests/test/visualization/config.json" + ], + "tags": [] + }, + { + "pr": "16565", + "title": "BVH loader `loadAsserContainerAsync` support", + "description": "from #16540\r\n\r\nIn the current BVH loader, the skeleton will be added to the scene twice when load with `loadAssetContainerAsync`.\r\n\r\nTo solve this, I applied the same approach as the gltf loader's Skeleton creation method.\r\nhttps://github.com/BabylonJS/Babylon.js/blob/master/packages/dev/loaders/src/glTF/2.0/glTFLoader.ts#L1378-L1381", + "author": { + "name": "noname0310", + "url": "https://github.com/noname0310" + }, + "files": [ + "packages/dev/loaders/src/BVH/bvhFileLoader.ts", + "packages/dev/loaders/src/BVH/bvhLoader.ts" + ], + "tags": [] + }, + { + "pr": "16568", + "title": "gpuPicker optimization", + "description": "Some values (rtt size, dpr) were unnecesseraly recalculated in a loop in the `multiPickAsync` function. \r\n\r\nPR tested with:\r\n#XJKQOC#14\r\n#GAB1RS#63\r\n\r\nusing device pixel ratio values of 1,2 and 3.", + "author": { + "name": "RolandCsibrei", + "url": "https://github.com/RolandCsibrei" + }, + "files": [ + "packages/dev/core/src/Collisions/gpuPicker.ts" + ], + "tags": [] + }, + { + "pr": "16566", + "title": "Move back to old API till all use cases are clear", + "description": "The new change worked with standard http protocol, but is not back-compat with the file: protocol. In order to be 100% sure all use cases are covered, I am reverting the change for the time being.", + "author": { + "name": "RaananW", + "url": "https://github.com/RaananW" + }, + "files": [ + "packages/dev/core/src/Misc/assetsManager.ts", + "packages/tools/tests/test/visualization/config.json" + ], + "tags": [] + }, + { + "pr": "16567", + "title": "Allow moving engines when using offline storage", + "description": "There are a few issues addressed here.\n\nThe first - this issue cannot be reproduced on the playground because of the `indexOf(\".babylon\")`. In this case any file hostes on our CDNs will be \"true\", as it has `.babylonjs.com` in the URL.\n\nThe second - when NOT in the playground, WebGPU loads images as array buffers whereas WebGL engine loads images as Blobs. This is the way they are stored in the DB. So when WebGPU is the first engine, the data is stored as array buffer. Now, when moving to WebGL2 engine, the data will be loaded as ArrayBuffer and not a Blob.\n\nThis PR adds 2 fallbacks - if the file loaded is a blob and array buffer is needed, it does that, and if the image is loaded and requires a Blob, it will create a blob if the data is an ArrayBuffer.\n\nSolving https://forum.babylonjs.com/t/switching-engines-vs-createobjecturl/58247?u=raananw", + "author": { + "name": "RaananW", + "url": "https://github.com/RaananW" + }, + "files": [ + "packages/dev/core/src/Offline/database.ts", + "packages/tools/babylonServer/src/sceneJs.js" + ], + "tags": [] + }, + { + "pr": "16553", + "title": "Pass \"allowCanvas\" into override serialize functions.", + "description": "Fixes a bug with instances of BabylonJS running in a \"Canvas-less\" environment crashing when trying to serialize buttons.\r\n\r\nRight now, when using the serialize() function in buttons, they ignore the \"allowCanvas\" parameter which was added in #15033 \r\n\r\nLink to BabylonJS Forum discussion: \r\nhttps://forum.babylonjs.com/t/skip-canvas-being-used-during-control-serialize/49302/13?u=jamessimo\r\n\r\n", + "author": { + "name": "jamessimo", + "url": "https://github.com/jamessimo" + }, + "files": [ + "packages/dev/gui/src/2D/controls/button.ts", + "packages/dev/gui/src/2D/controls/grid.ts", + "packages/dev/gui/src/2D/controls/stackPanel.ts" + ], + "tags": [] + }, + { + "pr": "16563", + "title": "WebGPU: Port min/max redux shader to WGSL", + "description": "See https://forum.babylonjs.com/t/glslang-csp-issue/58177/11", + "author": { + "name": "Popov72", + "url": "https://github.com/Popov72" + }, + "files": [ + "packages/dev/core/src/Misc/minMaxReducer.ts", + "packages/dev/core/src/ShadersWGSL/minmaxRedux.fragment.fx" + ], + "tags": [ + "enhancement", + "WebGPU" + ] + }, + { + "pr": "16561", + "title": "Restore failing test", + "description": null, + "author": { + "name": "deltakosh", + "url": "https://github.com/deltakosh" + }, + "files": [ + "packages/tools/tests/test/visualization/config.json" + ], + "tags": [ + "skip changelog" + ] + } + ], "8.6.1": [ { "pr": "16560", diff --git a/.build/config.json b/.build/config.json index 906bb5baca5..f5ff9da1827 100644 --- a/.build/config.json +++ b/.build/config.json @@ -1,5 +1,5 @@ { - "versionDefinition": "patch", - "preid": "rc", - "nonce": 361 -} + "versionDefinition": "minor", + "preid": "rc", + "nonce": 365 +} \ No newline at end of file diff --git a/.eslintrc.js b/.eslintrc.js index 50910c15a9b..26ba9a7756c 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -158,6 +158,7 @@ const rules = { ], "prefer-rest-params": "off", // the following were enabled per default + "@typescript-eslint/require-await": "off", "@typescript-eslint/no-explicit-any": "off", "@typescript-eslint/no-unsafe-call": "off", "@typescript-eslint/no-unsafe-member-access": "off", @@ -167,7 +168,6 @@ const rules = { "@typescript-eslint/unbound-method": "off", "@typescript-eslint/no-base-to-string": "off", "@typescript-eslint/restrict-plus-operands": "off", - "@typescript-eslint/require-await": "off", "@typescript-eslint/no-unsafe-return": "off", "@typescript-eslint/no-unused-expressions": "off", "@typescript-eslint/no-unsafe-function-type": "off", @@ -181,37 +181,52 @@ const rules = { "@typescript-eslint/no-array-delete": "off", "@typescript-eslint/no-implied-eval": "off", "@typescript-eslint/no-duplicate-enum-values": "off", - "@typescript-eslint/prefer-promise-reject-errors": "off", "@typescript-eslint/only-throw-error": "off", "@typescript-eslint/no-for-in-array": "off", - "@typescript-eslint/no-floating-promises": "off", - "@typescript-eslint/no-misused-promises": "off", - "@typescript-eslint/promise-function-async": "off", "@typescript-eslint/no-deprecated": "off", "@typescript-eslint/no-unnecessary-type-assertion": "off", // till here + // async fun + "@typescript-eslint/promise-function-async": "error", + "@typescript-eslint/no-misused-promises": [ + "error", + { + checksConditionals: false, + checksVoidReturn: { + arguments: false, + attributes: false, + }, + }, + ], + "@typescript-eslint/no-floating-promises": "error", + "@typescript-eslint/return-await": ["error", "always"], + "no-await-in-loop": "error", + "@typescript-eslint/await-thenable": "error", + "@typescript-eslint/prefer-promise-reject-errors": "error", + "require-atomic-updates": "warn", + "github/no-then": "error", + // rest of the rules "@typescript-eslint/no-unused-vars": ["warn", { argsIgnorePattern: "^_" }], "@typescript-eslint/consistent-type-imports": ["error", { disallowTypeAnnotations: false, fixStyle: "separate-type-imports" }], "@typescript-eslint/no-this-alias": "error", - "@typescript-eslint/await-thenable": "error", "no-restricted-syntax": [ "error", - // { - // selector: "FunctionDeclaration[async=false][id.name=/Async$/]", - // message: "Function ending in 'Async' must be declared async", - // }, - // { - // selector: "MethodDefinition[value.async=false][key.name=/Async$/]", - // message: "Method ending in 'Async' must be declared async", - // }, - // { - // selector: "Property[value.type=/FunctionExpression$/][value.async=false][key.name=/Async$/]", - // message: "Function ending in 'Async' must be declared async", - // }, - // { - // selector: "VariableDeclarator[init.type=/FunctionExpression$/][init.async=false][id.name=/Async$/]", - // message: "Function ending in 'Async' must be declared async", - // }, + { + selector: "FunctionDeclaration[async=false][id.name=/Async$/]", + message: "Function ending in 'Async' must be declared async", + }, + { + selector: "MethodDefinition[value.async=false][key.name=/Async$/]", + message: "Method ending in 'Async' must be declared async", + }, + { + selector: "Property[value.type=/FunctionExpression$/][value.async=false][key.name=/Async$/]", + message: "Function ending in 'Async' must be declared async", + }, + { + selector: "VariableDeclarator[init.type=/FunctionExpression$/][init.async=false][id.name=/Async$/]", + message: "Function ending in 'Async' must be declared async", + }, { selector: "VariableDeclarator[init.type=/FunctionExpression$/][init.async=true][id.name!=/Async$/]", message: "Async function name must end in 'Async'", @@ -457,6 +472,7 @@ const rules = { // "@typescript-eslint" "babylonjs", "jsdoc", + "github", ], extends: [ "eslint:recommended", diff --git a/CHANGELOG.md b/CHANGELOG.md index a6745a8bc3d..e8a542d6903 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,86 @@ # Changelog +## 8.8.0 + +## 8.7.1 + +### Core + +- First installment of the Thin Maths - [_New Feature_] by [deltakosh](https://github.com/deltakosh) ([#16599](https://github.com/BabylonJS/Babylon.js/pull/16599)) +- Adding handling of InstacedMesh inside of addAllAssetsToContainer that was missing. - [_Bug Fix_] by [VicenteCartas](https://github.com/VicenteCartas) ([#16601](https://github.com/BabylonJS/Babylon.js/pull/16601)) +- FrameGraph: add support for motion blur - by [Popov72](https://github.com/Popov72) ([#16602](https://github.com/BabylonJS/Babylon.js/pull/16602)) +- Add WebAudio node and microphone input sound sources to AudioEngineV2 - [_New Feature_] by [docEdub](https://github.com/docEdub) ([#16596](https://github.com/BabylonJS/Babylon.js/pull/16596)) +- fix shaders uninitialized members - by [CedricGuillemet](https://github.com/CedricGuillemet) ([#16598](https://github.com/BabylonJS/Babylon.js/pull/16598)) +- Fix screenshot tools fxaa background color - by [sebavan](https://github.com/sebavan) ([#16595](https://github.com/BabylonJS/Babylon.js/pull/16595)) +- Clamp NdotV to 0.0 for diffuse roughness - by [MiiBond](https://github.com/MiiBond) ([#16579](https://github.com/BabylonJS/Babylon.js/pull/16579)) +- Fix animation goToFrame with negative speedRatio - [_Bug Fix_] by [deltakosh](https://github.com/deltakosh) ([#16589](https://github.com/BabylonJS/Babylon.js/pull/16589)) +- bug fix - "moveWithCollisions" method parameter slideOnCollide==false now moves mesh to NEAR the collision point, instead of AT the collision point - by [jon-heard](https://github.com/jon-heard) ([#16587](https://github.com/BabylonJS/Babylon.js/pull/16587)) +- Make explicit the need for engine renderloop for end frame, and fix some small typos - by [mthaddon](https://github.com/mthaddon) ([#16584](https://github.com/BabylonJS/Babylon.js/pull/16584)) +- IFlowable added - by [RolandCsibrei](https://github.com/RolandCsibrei) ([#16570](https://github.com/BabylonJS/Babylon.js/pull/16570)) +- new feature - slideOnCollide parameter for "abstractMesh.moveWithCollisions" (defaults to true) - by [jon-heard](https://github.com/jon-heard) ([#16580](https://github.com/BabylonJS/Babylon.js/pull/16580)) + +### Inspector + +- Expose limitVelocityDamping parameter in particle system editor - [_New Feature_] by [deltakosh](https://github.com/deltakosh) ([#16603](https://github.com/BabylonJS/Babylon.js/pull/16603)) +- Deleting particle system velocity limit throws error in console. - [_Bug Fix_] by [deltakosh](https://github.com/deltakosh) ([#16593](https://github.com/BabylonJS/Babylon.js/pull/16593)) + +### Loaders + +- Fix (very broken) BVH animation - by [yuripourre](https://github.com/yuripourre) ([#16586](https://github.com/BabylonJS/Babylon.js/pull/16586)) + +### Materials + +- Make explicit the need for engine renderloop for end frame, and fix some small typos - by [mthaddon](https://github.com/mthaddon) ([#16584](https://github.com/BabylonJS/Babylon.js/pull/16584)) + +### Serializers + +- USDZ Exporter: Some small fixes - by [alexchuber](https://github.com/alexchuber) ([#16594](https://github.com/BabylonJS/Babylon.js/pull/16594)) + +## 8.7.0 + +### Core + +- Fixes Area Lights for NME - by [SergioRZMasson](https://github.com/SergioRZMasson) ([#16577](https://github.com/BabylonJS/Babylon.js/pull/16577)) +- Small fix for waitAll in flow graph - by [RaananW](https://github.com/RaananW) ([#16576](https://github.com/BabylonJS/Babylon.js/pull/16576)) + +### Loaders + +- Small fix for waitAll in flow graph - by [RaananW](https://github.com/RaananW) ([#16576](https://github.com/BabylonJS/Babylon.js/pull/16576)) + +## 8.6.2 + +### Core + +- WebGPU: Make sure the depth texture is cleared with the right value at creation time - [_Bug Fix_] by [Popov72](https://github.com/Popov72) ([#16572](https://github.com/BabylonJS/Babylon.js/pull/16572)) +- Some fixes for glTF interactivity - by [RaananW](https://github.com/RaananW) ([#16574](https://github.com/BabylonJS/Babylon.js/pull/16574)) +- Diffuse Roughness support - by [MiiBond](https://github.com/MiiBond) ([#16253](https://github.com/BabylonJS/Babylon.js/pull/16253)) +- gpuPicker optimization - by [RolandCsibrei](https://github.com/RolandCsibrei) ([#16568](https://github.com/BabylonJS/Babylon.js/pull/16568)) +- Move back to old API till all use cases are clear - by [RaananW](https://github.com/RaananW) ([#16566](https://github.com/BabylonJS/Babylon.js/pull/16566)) +- Allow moving engines when using offline storage - by [RaananW](https://github.com/RaananW) ([#16567](https://github.com/BabylonJS/Babylon.js/pull/16567)) +- WebGPU: Port min/max redux shader to WGSL - by [Popov72](https://github.com/Popov72) ([#16563](https://github.com/BabylonJS/Babylon.js/pull/16563)) + +### GUI + +- Pass "allowCanvas" into override serialize functions. - by [jamessimo](https://github.com/jamessimo) ([#16553](https://github.com/BabylonJS/Babylon.js/pull/16553)) + +### Inspector + +- Diffuse Roughness support - by [MiiBond](https://github.com/MiiBond) ([#16253](https://github.com/BabylonJS/Babylon.js/pull/16253)) + +### Loaders + +- Some fixes for glTF interactivity - by [RaananW](https://github.com/RaananW) ([#16574](https://github.com/BabylonJS/Babylon.js/pull/16574)) +- Diffuse Roughness support - by [MiiBond](https://github.com/MiiBond) ([#16253](https://github.com/BabylonJS/Babylon.js/pull/16253)) +- BVH loader `loadAsserContainerAsync` support - by [noname0310](https://github.com/noname0310) ([#16565](https://github.com/BabylonJS/Babylon.js/pull/16565)) + +### Node Editor + +- NME Preview window does not pop out correctly - by [RaananW](https://github.com/RaananW) ([#16571](https://github.com/BabylonJS/Babylon.js/pull/16571)) + +### Serializers + +- Diffuse Roughness support - by [MiiBond](https://github.com/MiiBond) ([#16253](https://github.com/BabylonJS/Babylon.js/pull/16253)) + ## 8.6.1 ## 8.6.0 diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index cd2f474b0e7..00000000000 --- a/package-lock.json +++ /dev/null @@ -1,26381 +0,0 @@ -{ - "name": "@babylonjs/root", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "@babylonjs/root", - "version": "1.0.0", - "workspaces": [ - "packages/**/*" - ], - "devDependencies": { - "@alex_neo/jest-expect-message": "~1.0.5", - "@dev/build-tools": "^1.0.0", - "@nrwl/tao": "^18.0.4", - "@nrwl/workspace": "^18.0.4", - "@playwright/test": "1.49.1", - "@types/expect-puppeteer": "~5.0.3", - "@types/fs-extra": "^9.0.13", - "@types/jest": "~27.4.0", - "@types/jest-environment-puppeteer": "~5.0.0", - "@types/jest-expect-message": "~1.0.3", - "@types/puppeteer": "~5.4.4", - "@typescript-eslint/eslint-plugin": "^8.29.0", - "@typescript-eslint/parser": "^8.29.0", - "ajv": "~8.12.0", - "chokidar": "~3.6.0", - "concurrently": "~8.0.1", - "dotenv": "~16.0.0", - "es-check": "^7.1.1", - "eslint": "^8.11.0", - "eslint-config-prettier": "~9.0.0", - "eslint-formatter-azure-devops": "^1.2.0", - "eslint-plugin-import": "~2.26.0", - "eslint-plugin-jest": "~28.11.0", - "eslint-plugin-jsdoc": "~46.2.6", - "eslint-plugin-prettier": "~5.0.0", - "eslint-plugin-tsdoc": "~0.2.14", - "fs-extra": "^10.0.1", - "glob": "^10.4.5", - "jest": "^29.7.0", - "jest-environment-jsdom": "^29.5.0", - "jest-junit": "~13.2.0", - "lerna": "^8.1.2", - "mini-css-extract-plugin": "~2.6.0", - "nx": "^18.0.4", - "prettier": "^3.0.3", - "rimraf": "~6.0.1", - "ts-jest": "~29.1.0", - "ts-node": "~10.9.0", - "ts-patch": "3.3.0", - "tslib": "^2.4.0", - "typedoc": "^0.27.6", - "typescript": "~5.7.0", - "webpack": "^5.98.0", - "webpack-cli": "^5.1.0" - }, - "engines": { - "node": ">=16.0.0 <23.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "canvas": "~2.11.0" - } - }, - "node_modules/@alex_neo/jest-expect-message": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@alex_neo/jest-expect-message/-/jest-expect-message-1.0.5.tgz", - "integrity": "sha512-1eBykZCd0pPGl5qKtV6Z5ARA6yuhXzHsVN2h5GH5/H6svYa37Jr7vMio5OFpiw1LBHtscrZs7amSkZkcwm0cvQ==", - "dev": true - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "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.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", - "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", - "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.10", - "@babel/helper-compilation-targets": "^7.26.5", - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.10", - "@babel/parser": "^7.26.10", - "@babel/template": "^7.26.9", - "@babel/traverse": "^7.26.10", - "@babel/types": "^7.26.10", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.0.tgz", - "integrity": "sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==", - "dependencies": { - "@babel/parser": "^7.27.0", - "@babel/types": "^7.27.0", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", - "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.0.tgz", - "integrity": "sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==", - "dependencies": { - "@babel/compat-data": "^7.26.8", - "@babel/helper-validator-option": "^7.25.9", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.0.tgz", - "integrity": "sha512-vSGCvMecvFCd/BdpGlhpXYNhhC4ccxyvQWpbGL4CWbvfEoLFWUZuSuf7s9Aw70flgQF+6vptvgK2IfOnKlRmBg==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-member-expression-to-functions": "^7.25.9", - "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/helper-replace-supers": "^7.26.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/traverse": "^7.27.0", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.0.tgz", - "integrity": "sha512-fO8l08T76v48BhpNRW/nQ0MxfnSdoSKUJBMjubOAYffsVuGG5qOfMq7N6Es7UJvi7Y8goXXo07EfcHZXDPuELQ==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "regexpu-core": "^6.2.0", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.4.tgz", - "integrity": "sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", - "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", - "dev": true, - "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", - "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", - "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", - "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", - "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9", - "@babel/traverse": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", - "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", - "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz", - "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-wrap-function": "^7.25.9", - "@babel/traverse": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz", - "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==", - "dev": true, - "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.25.9", - "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/traverse": "^7.26.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", - "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", - "dev": true, - "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", - "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz", - "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", - "dev": true, - "dependencies": { - "@babel/template": "^7.25.9", - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz", - "integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==", - "dependencies": { - "@babel/template": "^7.27.0", - "@babel/types": "^7.27.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz", - "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==", - "dependencies": { - "@babel/types": "^7.27.0" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz", - "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/traverse": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz", - "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz", - "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz", - "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/plugin-transform-optional-chaining": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz", - "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/traverse": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "dev": true, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz", - "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", - "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", - "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", - "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz", - "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.26.8.tgz", - "integrity": "sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.26.5", - "@babel/helper-remap-async-to-generator": "^7.25.9", - "@babel/traverse": "^7.26.8" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", - "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-remap-async-to-generator": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.26.5.tgz", - "integrity": "sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.26.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.0.tgz", - "integrity": "sha512-u1jGphZ8uDI2Pj/HJj6YQ6XQLZCNjOlprjxB5SVz6rq2T6SwAR+CdrWK0CP7F+9rDVMXdB0+r6Am5G5aobOjAQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.26.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz", - "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz", - "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz", - "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-replace-supers": "^7.25.9", - "@babel/traverse": "^7.25.9", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-classes/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz", - "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/template": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz", - "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz", - "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz", - "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz", - "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz", - "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz", - "integrity": "sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz", - "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.26.9.tgz", - "integrity": "sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.26.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz", - "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/traverse": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz", - "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz", - "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz", - "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz", - "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz", - "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz", - "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz", - "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9", - "@babel/traverse": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz", - "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz", - "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz", - "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.26.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.26.6.tgz", - "integrity": "sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.26.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz", - "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz", - "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/plugin-transform-parameters": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz", - "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-replace-supers": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz", - "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz", - "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz", - "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz", - "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz", - "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz", - "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-constant-elements": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.25.9.tgz", - "integrity": "sha512-Ncw2JFsJVuvfRsa2lSHiC55kETQVLSnsYGQ1JDDwkUeWGTL/8Tom8aLTnlqgoeuopWrbbGndrc9AlLYrIosrow==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.9.tgz", - "integrity": "sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz", - "integrity": "sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/plugin-syntax-jsx": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.9.tgz", - "integrity": "sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==", - "dev": true, - "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.25.9.tgz", - "integrity": "sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.27.0.tgz", - "integrity": "sha512-LX/vCajUJQDqE7Aum/ELUMZAY19+cDpghxrnyt5I1tV6X5PyC86AOoWXWFYFeIvauyeSA6/ktn4tQVn/3ZifsA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.26.5", - "regenerator-transform": "^0.15.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regexp-modifiers": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz", - "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz", - "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz", - "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz", - "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz", - "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.26.8.tgz", - "integrity": "sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.26.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.0.tgz", - "integrity": "sha512-+LLkxA9rKJpNoGsbLnAgOCdESl73vwYn+V6b+5wHbrE7OGKVDPHIQvbFSzqE6rwqaCw2RE+zdJrlLkcf8YOA0w==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.26.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.27.0.tgz", - "integrity": "sha512-fRGGjO2UEGPjvEcyAZXRXAS8AfdaQoq7HnxAbJoAoW10B9xOKesmmndJv+Sym2a+9FHWZ9KbyyLCe9s0Sn5jtg==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-create-class-features-plugin": "^7.27.0", - "@babel/helper-plugin-utils": "^7.26.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/plugin-syntax-typescript": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz", - "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz", - "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz", - "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz", - "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.9.tgz", - "integrity": "sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.26.8", - "@babel/helper-compilation-targets": "^7.26.5", - "@babel/helper-plugin-utils": "^7.26.5", - "@babel/helper-validator-option": "^7.25.9", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-import-assertions": "^7.26.0", - "@babel/plugin-syntax-import-attributes": "^7.26.0", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.25.9", - "@babel/plugin-transform-async-generator-functions": "^7.26.8", - "@babel/plugin-transform-async-to-generator": "^7.25.9", - "@babel/plugin-transform-block-scoped-functions": "^7.26.5", - "@babel/plugin-transform-block-scoping": "^7.25.9", - "@babel/plugin-transform-class-properties": "^7.25.9", - "@babel/plugin-transform-class-static-block": "^7.26.0", - "@babel/plugin-transform-classes": "^7.25.9", - "@babel/plugin-transform-computed-properties": "^7.25.9", - "@babel/plugin-transform-destructuring": "^7.25.9", - "@babel/plugin-transform-dotall-regex": "^7.25.9", - "@babel/plugin-transform-duplicate-keys": "^7.25.9", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", - "@babel/plugin-transform-dynamic-import": "^7.25.9", - "@babel/plugin-transform-exponentiation-operator": "^7.26.3", - "@babel/plugin-transform-export-namespace-from": "^7.25.9", - "@babel/plugin-transform-for-of": "^7.26.9", - "@babel/plugin-transform-function-name": "^7.25.9", - "@babel/plugin-transform-json-strings": "^7.25.9", - "@babel/plugin-transform-literals": "^7.25.9", - "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", - "@babel/plugin-transform-member-expression-literals": "^7.25.9", - "@babel/plugin-transform-modules-amd": "^7.25.9", - "@babel/plugin-transform-modules-commonjs": "^7.26.3", - "@babel/plugin-transform-modules-systemjs": "^7.25.9", - "@babel/plugin-transform-modules-umd": "^7.25.9", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", - "@babel/plugin-transform-new-target": "^7.25.9", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.26.6", - "@babel/plugin-transform-numeric-separator": "^7.25.9", - "@babel/plugin-transform-object-rest-spread": "^7.25.9", - "@babel/plugin-transform-object-super": "^7.25.9", - "@babel/plugin-transform-optional-catch-binding": "^7.25.9", - "@babel/plugin-transform-optional-chaining": "^7.25.9", - "@babel/plugin-transform-parameters": "^7.25.9", - "@babel/plugin-transform-private-methods": "^7.25.9", - "@babel/plugin-transform-private-property-in-object": "^7.25.9", - "@babel/plugin-transform-property-literals": "^7.25.9", - "@babel/plugin-transform-regenerator": "^7.25.9", - "@babel/plugin-transform-regexp-modifiers": "^7.26.0", - "@babel/plugin-transform-reserved-words": "^7.25.9", - "@babel/plugin-transform-shorthand-properties": "^7.25.9", - "@babel/plugin-transform-spread": "^7.25.9", - "@babel/plugin-transform-sticky-regex": "^7.25.9", - "@babel/plugin-transform-template-literals": "^7.26.8", - "@babel/plugin-transform-typeof-symbol": "^7.26.7", - "@babel/plugin-transform-unicode-escapes": "^7.25.9", - "@babel/plugin-transform-unicode-property-regex": "^7.25.9", - "@babel/plugin-transform-unicode-regex": "^7.25.9", - "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.11.0", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.40.0", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/preset-react": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.26.3.tgz", - "integrity": "sha512-Nl03d6T9ky516DGK2YMxrTqvnpUW63TnJMOMonj+Zae0JiPC5BC9xPMSL6L8fiSpA5vP88qfygavVQvnLp+6Cw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-validator-option": "^7.25.9", - "@babel/plugin-transform-react-display-name": "^7.25.9", - "@babel/plugin-transform-react-jsx": "^7.25.9", - "@babel/plugin-transform-react-jsx-development": "^7.25.9", - "@babel/plugin-transform-react-pure-annotations": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-typescript": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.27.0.tgz", - "integrity": "sha512-vxaPFfJtHhgeOVXRKuHpHPAOgymmy8V8I65T1q53R7GCZlefKeCaTyDs3zOPHTTbmquvNlQYC5klEvWsBAtrBQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.26.5", - "@babel/helper-validator-option": "^7.25.9", - "@babel/plugin-syntax-jsx": "^7.25.9", - "@babel/plugin-transform-modules-commonjs": "^7.26.3", - "@babel/plugin-transform-typescript": "^7.27.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz", - "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", - "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==", - "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/parser": "^7.27.0", - "@babel/types": "^7.27.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.0.tgz", - "integrity": "sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==", - "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.27.0", - "@babel/parser": "^7.27.0", - "@babel/template": "^7.27.0", - "@babel/types": "^7.27.0", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/types": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", - "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", - "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babylonjs/accessibility": { - "resolved": "packages/public/@babylonjs/accessibility", - "link": true - }, - "node_modules/@babylonjs/addons": { - "resolved": "packages/public/@babylonjs/addons", - "link": true - }, - "node_modules/@babylonjs/core": { - "resolved": "packages/public/@babylonjs/core", - "link": true - }, - "node_modules/@babylonjs/gui": { - "resolved": "packages/public/@babylonjs/gui", - "link": true - }, - "node_modules/@babylonjs/gui-editor": { - "resolved": "packages/public/@babylonjs/gui-editor", - "link": true - }, - "node_modules/@babylonjs/inspector": { - "resolved": "packages/public/@babylonjs/inspector", - "link": true - }, - "node_modules/@babylonjs/ktx2decoder": { - "resolved": "packages/public/@babylonjs/ktx2decoder", - "link": true - }, - "node_modules/@babylonjs/loaders": { - "resolved": "packages/public/@babylonjs/loaders", - "link": true - }, - "node_modules/@babylonjs/materials": { - "resolved": "packages/public/@babylonjs/materials", - "link": true - }, - "node_modules/@babylonjs/node-editor": { - "resolved": "packages/public/@babylonjs/node-editor", - "link": true - }, - "node_modules/@babylonjs/node-geometry-editor": { - "resolved": "packages/public/@babylonjs/node-geometry-editor", - "link": true - }, - "node_modules/@babylonjs/node-render-graph-editor": { - "resolved": "packages/public/@babylonjs/node-render-graph-editor", - "link": true - }, - "node_modules/@babylonjs/post-processes": { - "resolved": "packages/public/@babylonjs/post-processes", - "link": true - }, - "node_modules/@babylonjs/procedural-textures": { - "resolved": "packages/public/@babylonjs/procedural-textures", - "link": true - }, - "node_modules/@babylonjs/serializers": { - "resolved": "packages/public/@babylonjs/serializers", - "link": true - }, - "node_modules/@babylonjs/shared-ui-components": { - "resolved": "packages/public/@babylonjs/shared-ui-components", - "link": true - }, - "node_modules/@babylonjs/test-tools": { - "resolved": "packages/public/@babylonjs/test-tools", - "link": true - }, - "node_modules/@babylonjs/viewer": { - "resolved": "packages/public/@babylonjs/viewer", - "link": true - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" - }, - "node_modules/@colors/colors": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", - "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", - "dev": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "devOptional": true, - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "devOptional": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@dabh/diagnostics": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", - "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", - "dev": true, - "dependencies": { - "colorspace": "1.1.x", - "enabled": "2.0.x", - "kuler": "^2.0.0" - } - }, - "node_modules/@dev/addons": { - "resolved": "packages/dev/addons", - "link": true - }, - "node_modules/@dev/build-tools": { - "resolved": "packages/dev/buildTools", - "link": true - }, - "node_modules/@dev/core": { - "resolved": "packages/dev/core", - "link": true - }, - "node_modules/@dev/gui": { - "resolved": "packages/dev/gui", - "link": true - }, - "node_modules/@dev/inspector": { - "resolved": "packages/dev/inspector", - "link": true - }, - "node_modules/@dev/loaders": { - "resolved": "packages/dev/loaders", - "link": true - }, - "node_modules/@dev/materials": { - "resolved": "packages/dev/materials", - "link": true - }, - "node_modules/@dev/post-processes": { - "resolved": "packages/dev/postProcesses", - "link": true - }, - "node_modules/@dev/procedural-textures": { - "resolved": "packages/dev/proceduralTextures", - "link": true - }, - "node_modules/@dev/serializers": { - "resolved": "packages/dev/serializers", - "link": true - }, - "node_modules/@dev/shared-ui-components": { - "resolved": "packages/dev/sharedUiComponents", - "link": true - }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@dnd-kit/accessibility": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@dnd-kit/accessibility/-/accessibility-3.1.1.tgz", - "integrity": "sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==", - "peer": true, - "dependencies": { - "tslib": "^2.0.0" - }, - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "node_modules/@dnd-kit/core": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/@dnd-kit/core/-/core-6.3.1.tgz", - "integrity": "sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ==", - "peer": true, - "dependencies": { - "@dnd-kit/accessibility": "^3.1.1", - "@dnd-kit/utilities": "^3.2.2", - "tslib": "^2.0.0" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@dnd-kit/modifiers": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@dnd-kit/modifiers/-/modifiers-9.0.0.tgz", - "integrity": "sha512-ybiLc66qRGuZoC20wdSSG6pDXFikui/dCNGthxv4Ndy8ylErY0N3KVxY2bgo7AWwIbxDmXDg3ylAFmnrjcbVvw==", - "dependencies": { - "@dnd-kit/utilities": "^3.2.2", - "tslib": "^2.0.0" - }, - "peerDependencies": { - "@dnd-kit/core": "^6.3.0", - "react": ">=16.8.0" - } - }, - "node_modules/@dnd-kit/sortable": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@dnd-kit/sortable/-/sortable-10.0.0.tgz", - "integrity": "sha512-+xqhmIIzvAYMGfBYYnbKuNicfSsk4RksY2XdmJhT+HAC01nix6fHCztU68jooFiMUB01Ky3F0FyOvhG/BZrWkg==", - "dependencies": { - "@dnd-kit/utilities": "^3.2.2", - "tslib": "^2.0.0" - }, - "peerDependencies": { - "@dnd-kit/core": "^6.3.0", - "react": ">=16.8.0" - } - }, - "node_modules/@dnd-kit/utilities": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@dnd-kit/utilities/-/utilities-3.2.2.tgz", - "integrity": "sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==", - "dependencies": { - "tslib": "^2.0.0" - }, - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "node_modules/@es-joy/jsdoccomment": { - "version": "0.39.4", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.39.4.tgz", - "integrity": "sha512-Jvw915fjqQct445+yron7Dufix9A+m9j1fCJYlCo1FWlRvTxa3pjJelxdSTdaLWcTwRU6vbL+NYjO4YuNIS5Qg==", - "dev": true, - "dependencies": { - "comment-parser": "1.3.1", - "esquery": "^1.5.0", - "jsdoc-type-pratt-parser": "~4.0.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.2.tgz", - "integrity": "sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.2.tgz", - "integrity": "sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.2.tgz", - "integrity": "sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.2.tgz", - "integrity": "sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.2.tgz", - "integrity": "sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.2.tgz", - "integrity": "sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.2.tgz", - "integrity": "sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.2.tgz", - "integrity": "sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.2.tgz", - "integrity": "sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.2.tgz", - "integrity": "sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.2.tgz", - "integrity": "sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.2.tgz", - "integrity": "sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.2.tgz", - "integrity": "sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.2.tgz", - "integrity": "sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.2.tgz", - "integrity": "sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.2.tgz", - "integrity": "sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.2.tgz", - "integrity": "sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.2.tgz", - "integrity": "sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.2.tgz", - "integrity": "sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.2.tgz", - "integrity": "sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.2.tgz", - "integrity": "sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.2.tgz", - "integrity": "sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.2.tgz", - "integrity": "sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.2.tgz", - "integrity": "sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.2.tgz", - "integrity": "sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.5.1.tgz", - "integrity": "sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/@eslint/js": { - "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, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@fortawesome/fontawesome-common-types": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.7.2.tgz", - "integrity": "sha512-Zs+YeHUC5fkt7Mg1l6XTniei3k4bwG/yo3iFUtZWd/pMx9g3fdvkSK9E0FOC+++phXOka78uJcYb8JaFkW52Xg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/@fortawesome/fontawesome-svg-core": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.7.2.tgz", - "integrity": "sha512-yxtOBWDrdi5DD5o1pmVdq3WMCvnobT0LU6R8RyyVXPvFRd2o79/0NCuQoCjNTeZz9EzA9xS3JxNWfv54RIHFEA==", - "dependencies": { - "@fortawesome/fontawesome-common-types": "6.7.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@fortawesome/free-regular-svg-icons": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.7.2.tgz", - "integrity": "sha512-7Z/ur0gvCMW8G93dXIQOkQqHo2M5HLhYrRVC0//fakJXxcF1VmMPsxnG6Ee8qEylA8b8Q3peQXWMNZ62lYF28g==", - "dependencies": { - "@fortawesome/fontawesome-common-types": "6.7.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@fortawesome/free-solid-svg-icons": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.7.2.tgz", - "integrity": "sha512-GsBrnOzU8uj0LECDfD5zomZJIjrPhIlWU82AHwa2s40FKH+kcxQaBvBo3Z4TxyZHIyX8XTDxsyA33/Vx9eFuQA==", - "dependencies": { - "@fortawesome/fontawesome-common-types": "6.7.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@fortawesome/react-fontawesome": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.2.tgz", - "integrity": "sha512-EnkrprPNqI6SXJl//m29hpaNzOp1bruISWaOiRtkMi/xSvHJlzc2j2JAYS7egxt/EbjSNV/k6Xy0AQI6vB2+1g==", - "dev": true, - "dependencies": { - "prop-types": "^15.8.1" - }, - "peerDependencies": { - "@fortawesome/fontawesome-svg-core": "~1 || ~6", - "react": ">=16.3" - } - }, - "node_modules/@gerrit0/mini-shiki": { - "version": "1.27.2", - "resolved": "https://registry.npmjs.org/@gerrit0/mini-shiki/-/mini-shiki-1.27.2.tgz", - "integrity": "sha512-GeWyHz8ao2gBiUW4OJnQDxXQnFgZQwwQk05t/CVVgNBN7/rK8XZ7xY6YhLVv9tH3VppWWmr9DCl3MwemB/i+Og==", - "dev": true, - "dependencies": { - "@shikijs/engine-oniguruma": "^1.27.2", - "@shikijs/types": "^1.27.2", - "@shikijs/vscode-textmate": "^10.0.1" - } - }, - "node_modules/@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" - }, - "node_modules/@hapi/topo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "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, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "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 - }, - "node_modules/@hutson/parse-repository-url": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz", - "integrity": "sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/string-locale-compare": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz", - "integrity": "sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==", - "dev": true - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/core/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/core/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" - }, - "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", - "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", - "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", - "dependencies": { - "jest-get-type": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", - "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/reporters/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", - "dependencies": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" - }, - "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==", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", - "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", - "dev": true - }, - "node_modules/@lerna/create": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/@lerna/create/-/create-8.2.1.tgz", - "integrity": "sha512-Cz2u/fwc03D1EE6VFZCLMmI8FIUtGmxHQ3ECeNblsxv9i0YSKWe4Xm18sjO1xltG/K5ByiH8/HMeY9dlyAv22A==", - "dev": true, - "dependencies": { - "@npmcli/arborist": "7.5.4", - "@npmcli/package-json": "5.2.0", - "@npmcli/run-script": "8.1.0", - "@nx/devkit": ">=17.1.2 < 21", - "@octokit/plugin-enterprise-rest": "6.0.1", - "@octokit/rest": "20.1.2", - "aproba": "2.0.0", - "byte-size": "8.1.1", - "chalk": "4.1.0", - "clone-deep": "4.0.1", - "cmd-shim": "6.0.3", - "color-support": "1.1.3", - "columnify": "1.6.0", - "console-control-strings": "^1.1.0", - "conventional-changelog-core": "5.0.1", - "conventional-recommended-bump": "7.0.1", - "cosmiconfig": "9.0.0", - "dedent": "1.5.3", - "execa": "5.0.0", - "fs-extra": "^11.2.0", - "get-stream": "6.0.0", - "git-url-parse": "14.0.0", - "glob-parent": "6.0.2", - "globby": "11.1.0", - "graceful-fs": "4.2.11", - "has-unicode": "2.0.1", - "ini": "^1.3.8", - "init-package-json": "6.0.3", - "inquirer": "^8.2.4", - "is-ci": "3.0.1", - "is-stream": "2.0.0", - "js-yaml": "4.1.0", - "libnpmpublish": "9.0.9", - "load-json-file": "6.2.0", - "lodash": "^4.17.21", - "make-dir": "4.0.0", - "minimatch": "3.0.5", - "multimatch": "5.0.0", - "node-fetch": "2.6.7", - "npm-package-arg": "11.0.2", - "npm-packlist": "8.0.2", - "npm-registry-fetch": "^17.1.0", - "nx": ">=17.1.2 < 21", - "p-map": "4.0.0", - "p-map-series": "2.1.0", - "p-queue": "6.6.2", - "p-reduce": "^2.1.0", - "pacote": "^18.0.6", - "pify": "5.0.0", - "read-cmd-shim": "4.0.0", - "resolve-from": "5.0.0", - "rimraf": "^4.4.1", - "semver": "^7.3.4", - "set-blocking": "^2.0.0", - "signal-exit": "3.0.7", - "slash": "^3.0.0", - "ssri": "^10.0.6", - "string-width": "^4.2.3", - "strong-log-transformer": "2.1.0", - "tar": "6.2.1", - "temp-dir": "1.0.0", - "upath": "2.0.1", - "uuid": "^10.0.0", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "5.0.1", - "wide-align": "1.1.5", - "write-file-atomic": "5.0.1", - "write-pkg": "4.0.0", - "yargs": "17.7.2", - "yargs-parser": "21.1.1" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@lerna/create/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@lerna/create/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/@lerna/create/node_modules/execa": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz", - "integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/@lerna/create/node_modules/fs-extra": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", - "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/@lerna/create/node_modules/get-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz", - "integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@lerna/create/node_modules/glob": { - "version": "9.3.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", - "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "minimatch": "^8.0.2", - "minipass": "^4.2.4", - "path-scurry": "^1.6.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@lerna/create/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@lerna/create/node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@lerna/create/node_modules/glob/node_modules/minimatch": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", - "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@lerna/create/node_modules/is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@lerna/create/node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@lerna/create/node_modules/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@lerna/create/node_modules/minipass": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", - "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@lerna/create/node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/@lerna/create/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@lerna/create/node_modules/rimraf": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", - "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", - "dev": true, - "dependencies": { - "glob": "^9.2.0" - }, - "bin": { - "rimraf": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@lerna/create/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/@lerna/create/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@lerna/create/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "node_modules/@lerna/create/node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", - "dev": true, - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@lerna/create/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "node_modules/@lerna/create/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/@lerna/create/node_modules/write-file-atomic": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", - "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@lerna/create/node_modules/write-file-atomic/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@lit-labs/ssr-dom-shim": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.3.0.tgz", - "integrity": "sha512-nQIWonJ6eFAvUUrSlwyHDm/aE8PBDu5kRpL0vHMg6K8fK3Diq1xdPjTnsJSwxABhaZ+5eBi1btQB5ShUTKo4nQ==" - }, - "node_modules/@lit/reactive-element": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.0.4.tgz", - "integrity": "sha512-GFn91inaUa2oHLak8awSIigYz0cU0Payr1rcFsrkf5OJ5eSPxElyZfKh0f2p9FsTiZWXQdWGJeXZICEfXXYSXQ==", - "dependencies": { - "@lit-labs/ssr-dom-shim": "^1.2.0" - } - }, - "node_modules/@lts/core": { - "resolved": "packages/lts/core", - "link": true - }, - "node_modules/@lts/gui": { - "resolved": "packages/lts/gui", - "link": true - }, - "node_modules/@lts/loaders": { - "resolved": "packages/lts/loaders", - "link": true - }, - "node_modules/@lts/materials": { - "resolved": "packages/lts/materials", - "link": true - }, - "node_modules/@lts/post-processes": { - "resolved": "packages/lts/postProcesses", - "link": true - }, - "node_modules/@lts/procedural-textures": { - "resolved": "packages/lts/proceduralTextures", - "link": true - }, - "node_modules/@lts/serializers": { - "resolved": "packages/lts/serializers", - "link": true - }, - "node_modules/@mapbox/node-pre-gyp": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", - "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", - "optional": true, - "dependencies": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "optional": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "optional": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@memlab/api": { - "version": "1.0.39", - "resolved": "https://registry.npmjs.org/@memlab/api/-/api-1.0.39.tgz", - "integrity": "sha512-DCaKxgwDIINorUGIr41Uwi8UP1wCqY2Dp7Ge0iT8RCu70EIg3ipVXr8HNZnF1tYn6AVG+C/tEYOW6QqMAFoppg==", - "dependencies": { - "@memlab/core": "^1.1.40", - "@memlab/e2e": "^1.0.40", - "@memlab/heap-analysis": "^1.0.37", - "ansi": "^0.3.1", - "babar": "^0.2.0", - "chalk": "^4.0.0", - "fs-extra": "^4.0.2", - "minimist": "^1.2.8", - "puppeteer": "^22.12.1", - "puppeteer-core": "^22.12.1", - "string-width": "^4.2.0", - "util.promisify": "^1.1.1", - "xvfb": "^0.4.0" - } - }, - "node_modules/@memlab/api/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/@memlab/api/node_modules/fs-extra": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", - "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "node_modules/@memlab/api/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@memlab/api/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@memlab/api/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/@memlab/cli": { - "version": "1.0.42", - "resolved": "https://registry.npmjs.org/@memlab/cli/-/cli-1.0.42.tgz", - "integrity": "sha512-DCHC3R5l1cZrDXpit1693aNdcs2dcgxA7KTjgSGXs9av4OGWJC1zRj6hyauXtiWZ2SK1TaEa3nEEGA0yQKA89Q==", - "hasInstallScript": true, - "dependencies": { - "@memlab/api": "^1.0.39", - "@memlab/core": "^1.1.40", - "@memlab/e2e": "^1.0.40", - "@memlab/heap-analysis": "^1.0.37", - "ansi": "^0.3.1", - "babar": "^0.2.0", - "blessed": "^0.1.81", - "chalk": "^4.0.0", - "fs-extra": "^4.0.2", - "minimist": "^1.2.8", - "puppeteer": "^22.12.1", - "puppeteer-core": "^22.12.1", - "string-width": "^4.2.0", - "util.promisify": "^1.1.1", - "xvfb": "^0.4.0" - }, - "bin": { - "memlab": "bin/memlab.js" - } - }, - "node_modules/@memlab/cli/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/@memlab/cli/node_modules/fs-extra": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", - "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "node_modules/@memlab/cli/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@memlab/cli/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@memlab/cli/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/@memlab/core": { - "version": "1.1.40", - "resolved": "https://registry.npmjs.org/@memlab/core/-/core-1.1.40.tgz", - "integrity": "sha512-/TnoHYDXvNd/7xTVI6jbxzNg72o9HvL6Pp0OBi57zU41i3OzFevkllzIeH6n8EfS9TFv6WuwJA8sZtEWA8p/Ww==", - "dependencies": { - "ansi": "^0.3.1", - "babar": "^0.2.0", - "chalk": "^4.0.0", - "fs-extra": "^4.0.2", - "minimist": "^1.2.8", - "puppeteer": "^22.12.1", - "puppeteer-core": "^22.12.1", - "string-width": "^4.2.0", - "util.promisify": "^1.1.1", - "xvfb": "^0.4.0" - }, - "engines": { - "node": ">= 12.6.0" - } - }, - "node_modules/@memlab/core/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/@memlab/core/node_modules/fs-extra": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", - "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "node_modules/@memlab/core/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@memlab/core/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@memlab/core/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/@memlab/e2e": { - "version": "1.0.40", - "resolved": "https://registry.npmjs.org/@memlab/e2e/-/e2e-1.0.40.tgz", - "integrity": "sha512-hjDUCnB75/xFwAeMsi62NFvyqaozORn7k0pCeaGYlCoMTuvvb6rC1SgJjITbqi38JBADqLkVxpQkwnSwadZl+Q==", - "dependencies": { - "@babel/generator": "^7.16.0", - "@babel/parser": "^7.16.4", - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.3", - "@memlab/core": "^1.1.40", - "ansi": "^0.3.1", - "babar": "^0.2.0", - "chalk": "^4.0.0", - "fs-extra": "^4.0.2", - "minimist": "^1.2.8", - "puppeteer": "^22.12.1", - "puppeteer-core": "^22.12.1", - "string-width": "^4.2.0", - "util.promisify": "^1.1.1", - "xvfb": "^0.4.0" - } - }, - "node_modules/@memlab/e2e/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/@memlab/e2e/node_modules/fs-extra": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", - "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "node_modules/@memlab/e2e/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@memlab/e2e/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@memlab/e2e/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/@memlab/heap-analysis": { - "version": "1.0.37", - "resolved": "https://registry.npmjs.org/@memlab/heap-analysis/-/heap-analysis-1.0.37.tgz", - "integrity": "sha512-hp1BHcXNppK2fAY2C7K33Iup73m3FrTh0KybcUoFefkGM70YC51x3QeaUpxVjBhivzAz2bnkgQf9nXQ634tIqw==", - "dependencies": { - "@memlab/core": "^1.1.40", - "@memlab/e2e": "^1.0.40", - "ansi": "^0.3.1", - "babar": "^0.2.0", - "chalk": "^4.0.0", - "fs-extra": "^4.0.2", - "minimist": "^1.2.8", - "puppeteer": "^22.12.1", - "puppeteer-core": "^22.12.1", - "string-width": "^4.2.0", - "util.promisify": "^1.1.1", - "xvfb": "^0.4.0" - } - }, - "node_modules/@memlab/heap-analysis/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/@memlab/heap-analysis/node_modules/fs-extra": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", - "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "node_modules/@memlab/heap-analysis/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@memlab/heap-analysis/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@memlab/heap-analysis/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/@microsoft/tsdoc": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz", - "integrity": "sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==" - }, - "node_modules/@microsoft/tsdoc-config": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.16.2.tgz", - "integrity": "sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==", - "dependencies": { - "@microsoft/tsdoc": "0.14.2", - "ajv": "~6.12.6", - "jju": "~1.4.0", - "resolve": "~1.19.0" - } - }, - "node_modules/@microsoft/tsdoc-config/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@microsoft/tsdoc-config/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/@microsoft/tsdoc-config/node_modules/resolve": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", - "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", - "dependencies": { - "is-core-module": "^2.1.0", - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@npmcli/agent": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.2.tgz", - "integrity": "sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==", - "dev": true, - "dependencies": { - "agent-base": "^7.1.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.1", - "lru-cache": "^10.0.1", - "socks-proxy-agent": "^8.0.3" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/agent/node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", - "dev": true, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@npmcli/agent/node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "dev": true, - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@npmcli/agent/node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "dev": true, - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@npmcli/agent/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/@npmcli/arborist": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/@npmcli/arborist/-/arborist-7.5.4.tgz", - "integrity": "sha512-nWtIc6QwwoUORCRNzKx4ypHqCk3drI+5aeYdMTQQiRCcn4lOOgfQh7WyZobGYTxXPSq1VwV53lkpN/BRlRk08g==", - "dev": true, - "dependencies": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/fs": "^3.1.1", - "@npmcli/installed-package-contents": "^2.1.0", - "@npmcli/map-workspaces": "^3.0.2", - "@npmcli/metavuln-calculator": "^7.1.1", - "@npmcli/name-from-folder": "^2.0.0", - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/package-json": "^5.1.0", - "@npmcli/query": "^3.1.0", - "@npmcli/redact": "^2.0.0", - "@npmcli/run-script": "^8.1.0", - "bin-links": "^4.0.4", - "cacache": "^18.0.3", - "common-ancestor-path": "^1.0.1", - "hosted-git-info": "^7.0.2", - "json-parse-even-better-errors": "^3.0.2", - "json-stringify-nice": "^1.1.4", - "lru-cache": "^10.2.2", - "minimatch": "^9.0.4", - "nopt": "^7.2.1", - "npm-install-checks": "^6.2.0", - "npm-package-arg": "^11.0.2", - "npm-pick-manifest": "^9.0.1", - "npm-registry-fetch": "^17.0.1", - "pacote": "^18.0.6", - "parse-conflict-json": "^3.0.0", - "proc-log": "^4.2.0", - "proggy": "^2.0.0", - "promise-all-reject-late": "^1.0.0", - "promise-call-limit": "^3.0.1", - "read-package-json-fast": "^3.0.2", - "semver": "^7.3.7", - "ssri": "^10.0.6", - "treeverse": "^3.0.0", - "walk-up-path": "^3.0.1" - }, - "bin": { - "arborist": "bin/index.js" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/arborist/node_modules/abbrev": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", - "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/arborist/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@npmcli/arborist/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/@npmcli/arborist/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@npmcli/arborist/node_modules/nopt": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", - "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==", - "dev": true, - "dependencies": { - "abbrev": "^2.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/fs": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", - "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==", - "dev": true, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/git": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-5.0.8.tgz", - "integrity": "sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ==", - "dev": true, - "dependencies": { - "@npmcli/promise-spawn": "^7.0.0", - "ini": "^4.1.3", - "lru-cache": "^10.0.1", - "npm-pick-manifest": "^9.0.0", - "proc-log": "^4.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^4.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/git/node_modules/ini": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", - "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/git/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "dev": true, - "engines": { - "node": ">=16" - } - }, - "node_modules/@npmcli/git/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/@npmcli/git/node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", - "dev": true, - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/installed-package-contents": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.1.0.tgz", - "integrity": "sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w==", - "dev": true, - "dependencies": { - "npm-bundled": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "bin": { - "installed-package-contents": "bin/index.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/map-workspaces": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-3.0.6.tgz", - "integrity": "sha512-tkYs0OYnzQm6iIRdfy+LcLBjcKuQCeE5YLb8KnrIlutJfheNaPvPpgoFEyEFgbjzl5PLZ3IA/BWAwRU0eHuQDA==", - "dev": true, - "dependencies": { - "@npmcli/name-from-folder": "^2.0.0", - "glob": "^10.2.2", - "minimatch": "^9.0.0", - "read-package-json-fast": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/map-workspaces/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@npmcli/map-workspaces/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@npmcli/metavuln-calculator": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-7.1.1.tgz", - "integrity": "sha512-Nkxf96V0lAx3HCpVda7Vw4P23RILgdi/5K1fmj2tZkWIYLpXAN8k2UVVOsW16TsS5F8Ws2I7Cm+PU1/rsVF47g==", - "dev": true, - "dependencies": { - "cacache": "^18.0.0", - "json-parse-even-better-errors": "^3.0.0", - "pacote": "^18.0.0", - "proc-log": "^4.1.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/name-from-folder": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-2.0.0.tgz", - "integrity": "sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/node-gyp": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", - "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/package-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-5.2.0.tgz", - "integrity": "sha512-qe/kiqqkW0AGtvBjL8TJKZk/eBBSpnJkUWvHdQ9jM2lKHXRYYJuyNpJPlJw3c8QjC2ow6NZYiLExhUaeJelbxQ==", - "dev": true, - "dependencies": { - "@npmcli/git": "^5.0.0", - "glob": "^10.2.2", - "hosted-git-info": "^7.0.0", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^6.0.0", - "proc-log": "^4.0.0", - "semver": "^7.5.3" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/promise-spawn": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-7.0.2.tgz", - "integrity": "sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ==", - "dev": true, - "dependencies": { - "which": "^4.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/promise-spawn/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "dev": true, - "engines": { - "node": ">=16" - } - }, - "node_modules/@npmcli/promise-spawn/node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", - "dev": true, - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/query": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/query/-/query-3.1.0.tgz", - "integrity": "sha512-C/iR0tk7KSKGldibYIB9x8GtO/0Bd0I2mhOaDb8ucQL/bQVTmGoeREaFj64Z5+iCBRf3dQfed0CjJL7I8iTkiQ==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/redact": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-2.0.1.tgz", - "integrity": "sha512-YgsR5jCQZhVmTJvjduTOIHph0L73pK8xwMVaDY0PatySqVM9AZj93jpoXYSJqfHFxFkN9dmqTw6OiqExsS3LPw==", - "dev": true, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/run-script": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-8.1.0.tgz", - "integrity": "sha512-y7efHHwghQfk28G2z3tlZ67pLG0XdfYbcVG26r7YIXALRsrVQcTq4/tdenSmdOrEsNahIYA/eh8aEVROWGFUDg==", - "dev": true, - "dependencies": { - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/package-json": "^5.0.0", - "@npmcli/promise-spawn": "^7.0.0", - "node-gyp": "^10.0.0", - "proc-log": "^4.0.0", - "which": "^4.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/run-script/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "dev": true, - "engines": { - "node": ">=16" - } - }, - "node_modules/@npmcli/run-script/node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", - "dev": true, - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^16.13.0 || >=18.0.0" - } - }, - "node_modules/@nrwl/devkit": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-18.3.5.tgz", - "integrity": "sha512-DIvChKMe4q8CtIsbrumL/aYgf85H5vlT6eF3jnCCWORj6LTwoHtK8Q9ky1+uM82KIM0gaKd32NVDw+w64scHyg==", - "dev": true, - "dependencies": { - "@nx/devkit": "18.3.5" - } - }, - "node_modules/@nrwl/tao": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-18.3.5.tgz", - "integrity": "sha512-gB7Vxa6FReZZEGva03Eh+84W8BSZOjsNyXboglOINu6d8iZZ0eotSXGziKgjpkj3feZ1ofKZMs0PRObVAOROVw==", - "dev": true, - "dependencies": { - "nx": "18.3.5", - "tslib": "^2.3.0" - }, - "bin": { - "tao": "index.js" - } - }, - "node_modules/@nrwl/workspace": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nrwl/workspace/-/workspace-18.3.5.tgz", - "integrity": "sha512-2njrwfPT6AYgGdCNeZl/s4i6Sodq0z2YBtjyWtIi+2NTznK4pyHo9E4yL+NygGyJ0vVAToKURvYYQCtPHax0pw==", - "dev": true, - "dependencies": { - "@nx/workspace": "18.3.5" - } - }, - "node_modules/@nx/devkit": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-18.3.5.tgz", - "integrity": "sha512-9I0L17t0MN87fL4m4MjDiBxJIx7h5RQY/pTYtt5TBjye0ANb165JeE4oh3ibzfjMzXv42Aej2Gm+cOuSPwzT9g==", - "dev": true, - "dependencies": { - "@nrwl/devkit": "18.3.5", - "ejs": "^3.1.7", - "enquirer": "~2.3.6", - "ignore": "^5.0.4", - "semver": "^7.5.3", - "tmp": "~0.2.1", - "tslib": "^2.3.0", - "yargs-parser": "21.1.1" - }, - "peerDependencies": { - "nx": ">= 16 <= 19" - } - }, - "node_modules/@nx/nx-darwin-arm64": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-18.3.5.tgz", - "integrity": "sha512-4I5UpZ/x2WO9OQyETXKjaYhXiZKUTYcLPewruRMODWu6lgTM9hHci0SqMQB+TWe3f80K8VT8J8x3+uJjvllGlg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nx/nx-darwin-x64": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-18.3.5.tgz", - "integrity": "sha512-Drn6jOG237AD/s6OWPt06bsMj0coGKA5Ce1y5gfLhptOGk4S4UPE/Ay5YCjq+/yhTo1gDHzCHxH0uW2X9MN9Fg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nx/nx-freebsd-x64": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-18.3.5.tgz", - "integrity": "sha512-8tA8Yw0Iir4liFjffIFS5THTS3TtWY/No2tkVj91gwy/QQ/otvKbOyc5RCIPpbZU6GS3ZWfG92VyCSm06dtMFg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nx/nx-linux-arm-gnueabihf": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-18.3.5.tgz", - "integrity": "sha512-BrPGAHM9FCGkB9/hbvlJhe+qtjmvpjIjYixGIlUxL3gGc8E/ucTyCnz5pRFFPFQlBM7Z/9XmbHvGPoUi/LYn5A==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nx/nx-linux-arm64-gnu": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-18.3.5.tgz", - "integrity": "sha512-/Xd0Q3LBgJeigJqXC/Jck/9l5b+fK+FCM0nRFMXgPXrhZPhoxWouFkoYl2F1Ofr+AQf4jup4DkVTB5r98uxSCA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nx/nx-linux-arm64-musl": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-18.3.5.tgz", - "integrity": "sha512-r18qd7pUrl1haAZ/e9Q+xaFTsLJnxGARQcf/Y76q+K2psKmiUXoRlqd3HAOw43KTllaUJ5HkzLq2pIwg3p+xBw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nx/nx-linux-x64-gnu": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-18.3.5.tgz", - "integrity": "sha512-vYrikG6ff4I9cvr3Ysk3y3gjQ9cDcvr3iAr+4qqcQ4qVE+OLL2++JDS6xfPvG/TbS3GTQpyy2STRBwiHgxTeJw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nx/nx-linux-x64-musl": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-18.3.5.tgz", - "integrity": "sha512-6np86lcYy3+x6kkW/HrBHIdNWbUu/MIsvMuNH5UXgyFs60l5Z7Cocay2f7WOaAbTLVAr0W7p4RxRPamHLRwWFA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nx/nx-win32-arm64-msvc": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-18.3.5.tgz", - "integrity": "sha512-H3p2ZVhHV1WQWTICrQUTplOkNId0y3c23X3A2fXXFDbWSBs0UgW7m55LhMcA9p0XZ7wDHgh+yFtVgu55TXLjug==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nx/nx-win32-x64-msvc": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-18.3.5.tgz", - "integrity": "sha512-xFwKVTIXSgjdfxkpriqHv5NpmmFILTrWLEkUGSoimuRaAm1u15YWx/VmaUQ+UWuJnmgqvB/so4SMHSfNkq3ijA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nx/workspace": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-18.3.5.tgz", - "integrity": "sha512-C5+IhzKx6AUu8N+yURkYfDdDlv0NHkxsI1yqQIgLmqOsZ/nTNLps052QOTb6zYejSp+DbzkZ0H7SGXNO3Cd0+g==", - "dev": true, - "dependencies": { - "@nrwl/workspace": "18.3.5", - "@nx/devkit": "18.3.5", - "chalk": "^4.1.0", - "enquirer": "~2.3.6", - "nx": "18.3.5", - "tslib": "^2.3.0", - "yargs-parser": "21.1.1" - } - }, - "node_modules/@octokit/auth-token": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz", - "integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==", - "dev": true, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/core": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.2.1.tgz", - "integrity": "sha512-dKYCMuPO1bmrpuogcjQ8z7ICCH3FP6WmxpwC03yjzGfZhj9fTJg6+bS1+UAplekbN2C+M61UNllGOOoAfGCrdQ==", - "dev": true, - "dependencies": { - "@octokit/auth-token": "^4.0.0", - "@octokit/graphql": "^7.1.0", - "@octokit/request": "^8.4.1", - "@octokit/request-error": "^5.1.1", - "@octokit/types": "^13.0.0", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/endpoint": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.6.tgz", - "integrity": "sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw==", - "dev": true, - "dependencies": { - "@octokit/types": "^13.1.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/graphql": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.1.1.tgz", - "integrity": "sha512-3mkDltSfcDUoa176nlGoA32RGjeWjl3K7F/BwHwRMJUW/IteSa4bnSV8p2ThNkcIcZU2umkZWxwETSSCJf2Q7g==", - "dev": true, - "dependencies": { - "@octokit/request": "^8.4.1", - "@octokit/types": "^13.0.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/openapi-types": { - "version": "24.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", - "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", - "dev": true - }, - "node_modules/@octokit/plugin-enterprise-rest": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-enterprise-rest/-/plugin-enterprise-rest-6.0.1.tgz", - "integrity": "sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw==", - "dev": true - }, - "node_modules/@octokit/plugin-paginate-rest": { - "version": "11.4.4-cjs.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.4.4-cjs.2.tgz", - "integrity": "sha512-2dK6z8fhs8lla5PaOTgqfCGBxgAv/le+EhPs27KklPhm1bKObpu6lXzwfUEQ16ajXzqNrKMujsFyo9K2eaoISw==", - "dev": true, - "dependencies": { - "@octokit/types": "^13.7.0" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@octokit/core": "5" - } - }, - "node_modules/@octokit/plugin-request-log": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-4.0.1.tgz", - "integrity": "sha512-GihNqNpGHorUrO7Qa9JbAl0dbLnqJVrV8OXe2Zm5/Y4wFkZQDfTreBzVmiRfJVfE4mClXdihHnbpyyO9FSX4HA==", - "dev": true, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@octokit/core": "5" - } - }, - "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "13.3.2-cjs.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.3.2-cjs.1.tgz", - "integrity": "sha512-VUjIjOOvF2oELQmiFpWA1aOPdawpyaCUqcEBc/UOUnj3Xp6DJGrJ1+bjUIIDzdHjnFNO6q57ODMfdEZnoBkCwQ==", - "dev": true, - "dependencies": { - "@octokit/types": "^13.8.0" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@octokit/core": "^5" - } - }, - "node_modules/@octokit/request": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.4.1.tgz", - "integrity": "sha512-qnB2+SY3hkCmBxZsR/MPCybNmbJe4KAlfWErXq+rBKkQJlbjdJeS85VI9r8UqeLYLvnAenU8Q1okM/0MBsAGXw==", - "dev": true, - "dependencies": { - "@octokit/endpoint": "^9.0.6", - "@octokit/request-error": "^5.1.1", - "@octokit/types": "^13.1.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/request-error": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.1.tgz", - "integrity": "sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g==", - "dev": true, - "dependencies": { - "@octokit/types": "^13.1.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/rest": { - "version": "20.1.2", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-20.1.2.tgz", - "integrity": "sha512-GmYiltypkHHtihFwPRxlaorG5R9VAHuk/vbszVoRTGXnAsY60wYLkh/E2XiFmdZmqrisw+9FaazS1i5SbdWYgA==", - "dev": true, - "dependencies": { - "@octokit/core": "^5.0.2", - "@octokit/plugin-paginate-rest": "11.4.4-cjs.2", - "@octokit/plugin-request-log": "^4.0.0", - "@octokit/plugin-rest-endpoint-methods": "13.3.2-cjs.1" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@octokit/types": { - "version": "13.10.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", - "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", - "dev": true, - "dependencies": { - "@octokit/openapi-types": "^24.2.0" - } - }, - "node_modules/@parcel/watcher": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", - "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "peer": true, - "dependencies": { - "detect-libc": "^1.0.3", - "is-glob": "^4.0.3", - "micromatch": "^4.0.5", - "node-addon-api": "^7.0.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.5.1", - "@parcel/watcher-darwin-arm64": "2.5.1", - "@parcel/watcher-darwin-x64": "2.5.1", - "@parcel/watcher-freebsd-x64": "2.5.1", - "@parcel/watcher-linux-arm-glibc": "2.5.1", - "@parcel/watcher-linux-arm-musl": "2.5.1", - "@parcel/watcher-linux-arm64-glibc": "2.5.1", - "@parcel/watcher-linux-arm64-musl": "2.5.1", - "@parcel/watcher-linux-x64-glibc": "2.5.1", - "@parcel/watcher-linux-x64-musl": "2.5.1", - "@parcel/watcher-win32-arm64": "2.5.1", - "@parcel/watcher-win32-ia32": "2.5.1", - "@parcel/watcher-win32-x64": "2.5.1" - } - }, - "node_modules/@parcel/watcher-android-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", - "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", - "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", - "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", - "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "peer": true, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", - "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", - "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", - "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", - "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", - "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", - "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", - "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", - "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", - "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher/node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", - "dev": true, - "optional": true, - "peer": true, - "bin": { - "detect-libc": "bin/detect-libc.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@pkgr/core": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.2.tgz", - "integrity": "sha512-fdDH1LSGfZdTH2sxdpVMw31BanV28K/Gry0cVFxaNP77neJSkd82mM8ErPNYs9e+0O7SdHBLTDzDgwUuy18RnQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" - } - }, - "node_modules/@playwright/test": { - "version": "1.49.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.49.1.tgz", - "integrity": "sha512-Ky+BVzPz8pL6PQxHqNRW1k3mIyv933LML7HktS8uik0bUXNCdPhoS/kLihiO1tMf/egaJb4IutXd7UywvXEW+g==", - "dev": true, - "dependencies": { - "playwright": "1.49.1" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@polka/url": { - "version": "1.0.0-next.28", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz", - "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==", - "dev": true - }, - "node_modules/@puppeteer/browsers": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.3.0.tgz", - "integrity": "sha512-ioXoq9gPxkss4MYhD+SFaU9p1IHFUX0ILAWFPyjGaBdjLsYAlZw6j1iLA0N/m12uVHLFDfSYNF7EQccjinIMDA==", - "dependencies": { - "debug": "^4.3.5", - "extract-zip": "^2.0.1", - "progress": "^2.0.3", - "proxy-agent": "^6.4.0", - "semver": "^7.6.3", - "tar-fs": "^3.0.6", - "unbzip2-stream": "^1.4.3", - "yargs": "^17.7.2" - }, - "bin": { - "browsers": "lib/cjs/main-cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@react-dnd/asap": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@react-dnd/asap/-/asap-4.0.1.tgz", - "integrity": "sha512-kLy0PJDDwvwwTXxqTFNAAllPHD73AycE9ypWeln/IguoGBEbvFcPDbCV03G52bEcC5E+YgupBE0VzHGdC8SIXg==", - "peer": true - }, - "node_modules/@react-dnd/invariant": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@react-dnd/invariant/-/invariant-2.0.0.tgz", - "integrity": "sha512-xL4RCQBCBDJ+GRwKTFhGUW8GXa4yoDfJrPbLblc3U09ciS+9ZJXJ3Qrcs/x2IODOdIE5kQxvMmE2UKyqUictUw==", - "peer": true - }, - "node_modules/@react-dnd/shallowequal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@react-dnd/shallowequal/-/shallowequal-2.0.0.tgz", - "integrity": "sha512-Pc/AFTdwZwEKJxFJvlxrSmGe/di+aAOBn60sremrpLo6VI/6cmiUYNNwlI5KNYttg7uypzA3ILPMPgxB2GYZEg==", - "peer": true - }, - "node_modules/@rollup/plugin-alias": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-alias/-/plugin-alias-5.1.1.tgz", - "integrity": "sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==", - "dev": true, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-commonjs": { - "version": "26.0.3", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-26.0.3.tgz", - "integrity": "sha512-2BJcolt43MY+y5Tz47djHkodCC3c1VKVrBDKpVqHKpQ9z9S158kCCqB8NF6/gzxLdNlYW9abB3Ibh+kOWLp8KQ==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "commondir": "^1.0.1", - "estree-walker": "^2.0.2", - "glob": "^10.4.1", - "is-reference": "1.2.1", - "magic-string": "^0.30.3" - }, - "engines": { - "node": ">=16.0.0 || 14 >= 14.17" - }, - "peerDependencies": { - "rollup": "^2.68.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-node-resolve": { - "version": "15.3.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.1.tgz", - "integrity": "sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "@types/resolve": "1.20.2", - "deepmerge": "^4.2.2", - "is-module": "^1.0.0", - "resolve": "^1.22.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^2.78.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-terser": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz", - "integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==", - "dev": true, - "dependencies": { - "serialize-javascript": "^6.0.1", - "smob": "^1.0.0", - "terser": "^5.17.4" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-typescript": { - "version": "11.1.6", - "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-11.1.6.tgz", - "integrity": "sha512-R92yOmIACgYdJ7dJ97p4K69I8gg6IEHt8M7dUBxN3W6nrO8uUxX5ixl0yU/N3aZTi8WhPuICvOHXQvF6FaykAA==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^5.1.0", - "resolve": "^1.22.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^2.14.0||^3.0.0||^4.0.0", - "tslib": "*", - "typescript": ">=3.7.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - }, - "tslib": { - "optional": true - } - } - }, - "node_modules/@rollup/pluginutils": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", - "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", - "dev": true, - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.39.0.tgz", - "integrity": "sha512-lGVys55Qb00Wvh8DMAocp5kIcaNzEFTmGhfFd88LfaogYTRKrdxgtlO5H6S49v2Nd8R2C6wLOal0qv6/kCkOwA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.39.0.tgz", - "integrity": "sha512-It9+M1zE31KWfqh/0cJLrrsCPiF72PoJjIChLX+rEcujVRCb4NLQ5QzFkzIZW8Kn8FTbvGQBY5TkKBau3S8cCQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.39.0.tgz", - "integrity": "sha512-lXQnhpFDOKDXiGxsU9/l8UEGGM65comrQuZ+lDcGUx+9YQ9dKpF3rSEGepyeR5AHZ0b5RgiligsBhWZfSSQh8Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.39.0.tgz", - "integrity": "sha512-mKXpNZLvtEbgu6WCkNij7CGycdw9cJi2k9v0noMb++Vab12GZjFgUXD69ilAbBh034Zwn95c2PNSz9xM7KYEAQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.39.0.tgz", - "integrity": "sha512-jivRRlh2Lod/KvDZx2zUR+I4iBfHcu2V/BA2vasUtdtTN2Uk3jfcZczLa81ESHZHPHy4ih3T/W5rPFZ/hX7RtQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.39.0.tgz", - "integrity": "sha512-8RXIWvYIRK9nO+bhVz8DwLBepcptw633gv/QT4015CpJ0Ht8punmoHU/DuEd3iw9Hr8UwUV+t+VNNuZIWYeY7Q==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.39.0.tgz", - "integrity": "sha512-mz5POx5Zu58f2xAG5RaRRhp3IZDK7zXGk5sdEDj4o96HeaXhlUwmLFzNlc4hCQi5sGdR12VDgEUqVSHer0lI9g==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.39.0.tgz", - "integrity": "sha512-+YDwhM6gUAyakl0CD+bMFpdmwIoRDzZYaTWV3SDRBGkMU/VpIBYXXEvkEcTagw/7VVkL2vA29zU4UVy1mP0/Yw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.39.0.tgz", - "integrity": "sha512-EKf7iF7aK36eEChvlgxGnk7pdJfzfQbNvGV/+l98iiMwU23MwvmV0Ty3pJ0p5WQfm3JRHOytSIqD9LB7Bq7xdQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.39.0.tgz", - "integrity": "sha512-vYanR6MtqC7Z2SNr8gzVnzUul09Wi1kZqJaek3KcIlI/wq5Xtq4ZPIZ0Mr/st/sv/NnaPwy/D4yXg5x0B3aUUA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.39.0.tgz", - "integrity": "sha512-NMRUT40+h0FBa5fb+cpxtZoGAggRem16ocVKIv5gDB5uLDgBIwrIsXlGqYbLwW8YyO3WVTk1FkFDjMETYlDqiw==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.39.0.tgz", - "integrity": "sha512-0pCNnmxgduJ3YRt+D+kJ6Ai/r+TaePu9ZLENl+ZDV/CdVczXl95CbIiwwswu4L+K7uOIGf6tMo2vm8uadRaICQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.39.0.tgz", - "integrity": "sha512-t7j5Zhr7S4bBtksT73bO6c3Qa2AV/HqiGlj9+KB3gNF5upcVkx+HLgxTm8DK4OkzsOYqbdqbLKwvGMhylJCPhQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.39.0.tgz", - "integrity": "sha512-m6cwI86IvQ7M93MQ2RF5SP8tUjD39Y7rjb1qjHgYh28uAPVU8+k/xYWvxRO3/tBN2pZkSMa5RjnPuUIbrwVxeA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.39.0.tgz", - "integrity": "sha512-iRDJd2ebMunnk2rsSBYlsptCyuINvxUfGwOUldjv5M4tpa93K8tFMeYGpNk2+Nxl+OBJnBzy2/JCscGeO507kA==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.39.0.tgz", - "integrity": "sha512-t9jqYw27R6Lx0XKfEFe5vUeEJ5pF3SGIM6gTfONSMb7DuG6z6wfj2yjcoZxHg129veTqU7+wOhY6GX8wmf90dA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.39.0.tgz", - "integrity": "sha512-ThFdkrFDP55AIsIZDKSBWEt/JcWlCzydbZHinZ0F/r1h83qbGeenCt/G/wG2O0reuENDD2tawfAj2s8VK7Bugg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.39.0.tgz", - "integrity": "sha512-jDrLm6yUtbOg2TYB3sBF3acUnAwsIksEYjLeHL+TJv9jg+TmTwdyjnDex27jqEMakNKf3RwwPahDIt7QXCSqRQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.39.0.tgz", - "integrity": "sha512-6w9uMuza+LbLCVoNKL5FSLE7yvYkq9laSd09bwS0tMjkwXrmib/4KmoJcrKhLWHvw19mwU+33ndC69T7weNNjQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.39.0.tgz", - "integrity": "sha512-yAkUOkIKZlK5dl7u6dg897doBgLXmUHhIINM2c+sND3DZwnrdQkkSiDh7N75Ll4mM4dxSkYfXqU9fW3lLkMFug==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@shikijs/engine-oniguruma": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.29.2.tgz", - "integrity": "sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA==", - "dev": true, - "dependencies": { - "@shikijs/types": "1.29.2", - "@shikijs/vscode-textmate": "^10.0.1" - } - }, - "node_modules/@shikijs/types": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.29.2.tgz", - "integrity": "sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw==", - "dev": true, - "dependencies": { - "@shikijs/vscode-textmate": "^10.0.1", - "@types/hast": "^3.0.4" - } - }, - "node_modules/@shikijs/vscode-textmate": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", - "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", - "dev": true - }, - "node_modules/@sideway/address": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", - "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "node_modules/@sideway/formula": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", - "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" - }, - "node_modules/@sideway/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" - }, - "node_modules/@sigstore/bundle": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.3.2.tgz", - "integrity": "sha512-wueKWDk70QixNLB363yHc2D2ItTgYiMTdPwK8D9dKQMR3ZQ0c35IxP5xnwQ8cNLoCgCRcHf14kE+CLIvNX1zmA==", - "dev": true, - "dependencies": { - "@sigstore/protobuf-specs": "^0.3.2" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/core": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-1.1.0.tgz", - "integrity": "sha512-JzBqdVIyqm2FRQCulY6nbQzMpJJpSiJ8XXWMhtOX9eKgaXXpfNOF53lzQEjIydlStnd/eFtuC1dW4VYdD93oRg==", - "dev": true, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/protobuf-specs": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.3.tgz", - "integrity": "sha512-RpacQhBlwpBWd7KEJsRKcBQalbV28fvkxwTOJIqhIuDysMMaJW47V4OqW30iJB9uRpqOSxxEAQFdr8tTattReQ==", - "dev": true, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@sigstore/sign": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-2.3.2.tgz", - "integrity": "sha512-5Vz5dPVuunIIvC5vBb0APwo7qKA4G9yM48kPWJT+OEERs40md5GoUR1yedwpekWZ4m0Hhw44m6zU+ObsON+iDA==", - "dev": true, - "dependencies": { - "@sigstore/bundle": "^2.3.2", - "@sigstore/core": "^1.0.0", - "@sigstore/protobuf-specs": "^0.3.2", - "make-fetch-happen": "^13.0.1", - "proc-log": "^4.2.0", - "promise-retry": "^2.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/tuf": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.3.4.tgz", - "integrity": "sha512-44vtsveTPUpqhm9NCrbU8CWLe3Vck2HO1PNLw7RIajbB7xhtn5RBPm1VNSCMwqGYHhDsBJG8gDF0q4lgydsJvw==", - "dev": true, - "dependencies": { - "@sigstore/protobuf-specs": "^0.3.2", - "tuf-js": "^2.2.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@sigstore/verify": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-1.2.1.tgz", - "integrity": "sha512-8iKx79/F73DKbGfRf7+t4dqrc0bRr0thdPrxAtCKWRm/F0tG71i6O1rvlnScncJLLBZHn3h8M3c1BSUAb9yu8g==", - "dev": true, - "dependencies": { - "@sigstore/bundle": "^2.3.2", - "@sigstore/core": "^1.1.0", - "@sigstore/protobuf-specs": "^0.3.2" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dependencies": { - "@sinonjs/commons": "^3.0.0" - } - }, - "node_modules/@svgr/babel-plugin-add-jsx-attribute": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-7.0.0.tgz", - "integrity": "sha512-khWbXesWIP9v8HuKCl2NU2HNAyqpSQ/vkIl36Nbn4HIwEYSRWL0H7Gs6idJdha2DkpFDWlsqMELvoCE8lfFY6Q==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-7.0.0.tgz", - "integrity": "sha512-iiZaIvb3H/c7d3TH2HBeK91uI2rMhZNwnsIrvd7ZwGLkFw6mmunOCoVnjdYua662MqGFxlN9xTq4fv9hgR4VXQ==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-7.0.0.tgz", - "integrity": "sha512-sQQmyo+qegBx8DfFc04PFmIO1FP1MHI1/QEpzcIcclo5OAISsOJPW76ZIs0bDyO/DBSJEa/tDa1W26pVtt0FRw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-7.0.0.tgz", - "integrity": "sha512-i6MaAqIZXDOJeikJuzocByBf8zO+meLwfQ/qMHIjCcvpnfvWf82PFvredEZElErB5glQFJa2KVKk8N2xV6tRRA==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-svg-dynamic-title": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-7.0.0.tgz", - "integrity": "sha512-BoVSh6ge3SLLpKC0pmmN9DFlqgFy4NxNgdZNLPNJWBUU7TQpDWeBuyVuDW88iXydb5Cv0ReC+ffa5h3VrKfk1w==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-svg-em-dimensions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-7.0.0.tgz", - "integrity": "sha512-tNDcBa+hYn0gO+GkP/AuNKdVtMufVhU9fdzu+vUQsR18RIJ9RWe7h/pSBY338RO08wArntwbDk5WhQBmhf2PaA==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-transform-react-native-svg": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-7.0.0.tgz", - "integrity": "sha512-qw54u8ljCJYL2KtBOjI5z7Nzg8LnSvQOP5hPKj77H4VQL4+HdKbAT5pnkkZLmHKYwzsIHSYKXxHouD8zZamCFQ==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-transform-svg-component": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-7.0.0.tgz", - "integrity": "sha512-CcFECkDj98daOg9jE3Bh3uyD9kzevCAnZ+UtzG6+BQG/jOQ2OA3jHnX6iG4G1MCJkUQFnUvEv33NvQfqrb/F3A==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-preset": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-7.0.0.tgz", - "integrity": "sha512-EX/NHeFa30j5UjldQGVQikuuQNHUdGmbh9kEpBKofGUtF0GUPJ4T4rhoYiqDAOmBOxojyot36JIFiDUHUK1ilQ==", - "dev": true, - "dependencies": { - "@svgr/babel-plugin-add-jsx-attribute": "^7.0.0", - "@svgr/babel-plugin-remove-jsx-attribute": "^7.0.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "^7.0.0", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^7.0.0", - "@svgr/babel-plugin-svg-dynamic-title": "^7.0.0", - "@svgr/babel-plugin-svg-em-dimensions": "^7.0.0", - "@svgr/babel-plugin-transform-react-native-svg": "^7.0.0", - "@svgr/babel-plugin-transform-svg-component": "^7.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/core": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-7.0.0.tgz", - "integrity": "sha512-ztAoxkaKhRVloa3XydohgQQCb0/8x9T63yXovpmHzKMkHO6pkjdsIAWKOS4bE95P/2quVh1NtjSKlMRNzSBffw==", - "dev": true, - "dependencies": { - "@babel/core": "^7.21.3", - "@svgr/babel-preset": "^7.0.0", - "camelcase": "^6.2.0", - "cosmiconfig": "^8.1.3" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/core/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@svgr/core/node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", - "dev": true, - "dependencies": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@svgr/hast-util-to-babel-ast": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-7.0.0.tgz", - "integrity": "sha512-42Ej9sDDEmsJKjrfQ1PHmiDiHagh/u9AHO9QWbeNx4KmD9yS5d1XHmXUNINfUcykAU+4431Cn+k6Vn5mWBYimQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.21.3", - "entities": "^4.4.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/plugin-jsx": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-7.0.0.tgz", - "integrity": "sha512-SWlTpPQmBUtLKxXWgpv8syzqIU8XgFRvyhfkam2So8b3BE0OS0HPe5UfmlJ2KIC+a7dpuuYovPR2WAQuSyMoPw==", - "dev": true, - "dependencies": { - "@babel/core": "^7.21.3", - "@svgr/babel-preset": "^7.0.0", - "@svgr/hast-util-to-babel-ast": "^7.0.0", - "svg-parser": "^2.0.4" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/plugin-svgo": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-7.0.0.tgz", - "integrity": "sha512-263znzlu3qTKj71/ot5G9l2vpL4CW+pr2IexBFIwwB+fRAXE9Xnw2rUFgE6P4+37N9siOuC4lKkgBfUCOLFRKQ==", - "dev": true, - "dependencies": { - "cosmiconfig": "^8.1.3", - "deepmerge": "^4.3.1", - "svgo": "^3.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@svgr/core": "*" - } - }, - "node_modules/@svgr/plugin-svgo/node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", - "dev": true, - "dependencies": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@svgr/webpack": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-7.0.0.tgz", - "integrity": "sha512-XWzIhLTr5WYns/cNFXpXrmFy+LFf2xp60VnNUBZCpM1CGTx47FCDuUj2DQjxirMf2L6CP2jTRELK8ef01TecFQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.21.3", - "@babel/plugin-transform-react-constant-elements": "^7.21.3", - "@babel/preset-env": "^7.20.2", - "@babel/preset-react": "^7.18.6", - "@babel/preset-typescript": "^7.21.0", - "@svgr/core": "^7.0.0", - "@svgr/plugin-jsx": "^7.0.0", - "@svgr/plugin-svgo": "^7.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@tools/accessibility": { - "resolved": "packages/tools/accessibility", - "link": true - }, - "node_modules/@tools/babylon-server": { - "resolved": "packages/tools/babylonServer", - "link": true - }, - "node_modules/@tools/dev-host": { - "resolved": "packages/tools/devHost", - "link": true - }, - "node_modules/@tools/gui-editor": { - "resolved": "packages/tools/guiEditor", - "link": true - }, - "node_modules/@tools/ktx2decoder": { - "resolved": "packages/tools/ktx2Decoder", - "link": true - }, - "node_modules/@tools/memory-leak-tests": { - "resolved": "packages/tools/testsMemoryLeaks", - "link": true - }, - "node_modules/@tools/node-editor": { - "resolved": "packages/tools/nodeEditor", - "link": true - }, - "node_modules/@tools/node-geometry-editor": { - "resolved": "packages/tools/nodeGeometryEditor", - "link": true - }, - "node_modules/@tools/node-render-graph-editor": { - "resolved": "packages/tools/nodeRenderGraphEditor", - "link": true - }, - "node_modules/@tools/playground": { - "resolved": "packages/tools/playground", - "link": true - }, - "node_modules/@tools/reflector": { - "resolved": "packages/tools/reflector", - "link": true - }, - "node_modules/@tools/sandbox": { - "resolved": "packages/tools/sandbox", - "link": true - }, - "node_modules/@tools/test-tools": { - "resolved": "packages/tools/testTools", - "link": true - }, - "node_modules/@tools/tests": { - "resolved": "packages/tools/tests", - "link": true - }, - "node_modules/@tools/viewer": { - "resolved": "packages/tools/viewer", - "link": true - }, - "node_modules/@tools/viewer-configurator": { - "resolved": "packages/tools/viewer-configurator", - "link": true - }, - "node_modules/@tools/viewer-legacy": { - "resolved": "packages/tools/viewer-legacy", - "link": true - }, - "node_modules/@tools/visual-state-manager": { - "resolved": "packages/tools/vsm", - "link": true - }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tootallnate/quickjs-emscripten": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", - "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==" - }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "dev": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", - "devOptional": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "devOptional": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "devOptional": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "devOptional": true - }, - "node_modules/@tufjs/canonical-json": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", - "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", - "dev": true, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@tufjs/models": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-2.0.1.tgz", - "integrity": "sha512-92F7/SFyufn4DXsha9+QfKnN03JGqtMFMXgSHbZOo8JG59WkTni7UzAouNQDf7AuP9OAMxVOPQcqG3sB7w+kkg==", - "dev": true, - "dependencies": { - "@tufjs/canonical-json": "2.0.0", - "minimatch": "^9.0.4" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/@tufjs/models/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@tufjs/models/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", - "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", - "dev": true, - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/bonjour": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", - "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect-history-api-fallback": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", - "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", - "dev": true, - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "node_modules/@types/dagre": { - "version": "0.7.52", - "resolved": "https://registry.npmjs.org/@types/dagre/-/dagre-0.7.52.tgz", - "integrity": "sha512-XKJdy+OClLk3hketHi9Qg6gTfe1F3y+UFnHxKA2rn9Dw+oXa4Gb378Ztz9HlMgZKSxpPmn4BNVh9wgkpvrK1uw==" - }, - "node_modules/@types/draco3d": { - "version": "1.4.10", - "resolved": "https://registry.npmjs.org/@types/draco3d/-/draco3d-1.4.10.tgz", - "integrity": "sha512-AX22jp8Y7wwaBgAixaSvkoG4M/+PlAcm3Qs4OW8yT9DM4xUpWKeFhLueTAyZF39pviAdcDdeJoACapiAceqNcw==", - "dev": true - }, - "node_modules/@types/draco3dgltf": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/@types/draco3dgltf/-/draco3dgltf-1.4.3.tgz", - "integrity": "sha512-JTY574f8xRI9+bOsDajeVSQ/gnIo0q3dt/MAJhNRKWJKdH2TAP3hld+lQ+eQnG9Eb6Ae493EiKi2oDZZpciQgw==", - "dev": true, - "dependencies": { - "@types/draco3d": "*" - } - }, - "node_modules/@types/eslint": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", - "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", - "dev": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "dev": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", - "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", - "dev": true - }, - "node_modules/@types/expect-puppeteer": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@types/expect-puppeteer/-/expect-puppeteer-5.0.6.tgz", - "integrity": "sha512-71TRn11EozNfUYredjmVRuwtVnk0ZJIUmUcJhpMr0ffQ9M32RNUgz/w0G4nfgcAx9GAuBQhJ0lBZxLbkj+eZkA==", - "dev": true, - "dependencies": { - "@types/jest": "*", - "@types/puppeteer": "^5.4.0" - } - }, - "node_modules/@types/express": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", - "dev": true, - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz", - "integrity": "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==", - "dev": true, - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/express/node_modules/@types/express-serve-static-core": { - "version": "4.19.6", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", - "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", - "dev": true, - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/fs-extra": { - "version": "9.0.13", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", - "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "dev": true, - "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", - "dev": true, - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", - "dev": true - }, - "node_modules/@types/http-errors": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", - "dev": true - }, - "node_modules/@types/http-proxy": { - "version": "1.17.16", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz", - "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==" - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/jest": { - "version": "27.4.1", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.4.1.tgz", - "integrity": "sha512-23iPJADSmicDVrWk+HT58LMJtzLAnB2AgIzplQuq/bSrGaxCrlvRFjGbXmamnnk/mAmCdLStiGqggu28ocUyiw==", - "dev": true, - "dependencies": { - "jest-matcher-utils": "^27.0.0", - "pretty-format": "^27.0.0" - } - }, - "node_modules/@types/jest-environment-puppeteer": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@types/jest-environment-puppeteer/-/jest-environment-puppeteer-5.0.6.tgz", - "integrity": "sha512-MAi9ey7sIRl0ddWsN3jaQQwC41eBfYghE6TKnJNbEXKxw1X6nF6TBCZA+DbQ+KDOb9e2BjUtiWWMZbgjhlTneg==", - "dev": true, - "dependencies": { - "@jest/types": ">=24 <=27", - "@types/puppeteer": "^5.4.0", - "jest-environment-node": ">=24 <=27" - } - }, - "node_modules/@types/jest-environment-puppeteer/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@types/jest-environment-puppeteer/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/jest-expect-message": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@types/jest-expect-message/-/jest-expect-message-1.0.4.tgz", - "integrity": "sha512-2jOgQ38y+YZ8envIA+P2XGyiuXA0fM3QQ8OI15hkzsVX+4oxSIeBhWhUKPEwWzzmc4AdFta9pDvrvJVZzC/9Sg==", - "dev": true, - "dependencies": { - "@types/jest": "*" - } - }, - "node_modules/@types/jest-image-snapshot": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@types/jest-image-snapshot/-/jest-image-snapshot-4.3.2.tgz", - "integrity": "sha512-bJCAD1KO8bzdSmHfN+sGy6LIoHcNFA9/zRyzjQ+gJ5CZRcp9F9I5Sjl3/v1ndnyFpH22XCGVj+CUCteaXRwl3A==", - "dev": true, - "dependencies": { - "@types/jest": "*", - "@types/pixelmatch": "*", - "ssim.js": "^3.1.1" - } - }, - "node_modules/@types/jsdom": { - "version": "20.0.1", - "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-20.0.1.tgz", - "integrity": "sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==", - "dev": true, - "dependencies": { - "@types/node": "*", - "@types/tough-cookie": "*", - "parse5": "^7.0.0" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, - "node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "dev": true - }, - "node_modules/@types/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", - "dev": true - }, - "node_modules/@types/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", - "dev": true - }, - "node_modules/@types/mv": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@types/mv/-/mv-2.1.4.tgz", - "integrity": "sha512-MgEHBpXnQo44Q43j8G0Bvp/Yi8LYbC8hxKrRFMgDEDZMmzDKZLgiyMWtW49B37ko+QupgZ3G5rtPUnOGe5ixLw==", - "dev": true - }, - "node_modules/@types/node": { - "version": "22.14.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.14.0.tgz", - "integrity": "sha512-Kmpl+z84ILoG+3T/zQFyAJsU6EPTmOCj8/2+83fSN6djd6I4o7uOuGIH6vq3PrjY5BGitSbFuMN18j3iknubbA==", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/@types/node-forge": { - "version": "1.3.11", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", - "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "dev": true - }, - "node_modules/@types/pixelmatch": { - "version": "5.2.6", - "resolved": "https://registry.npmjs.org/@types/pixelmatch/-/pixelmatch-5.2.6.tgz", - "integrity": "sha512-wC83uexE5KGuUODn6zkm9gMzTwdY5L0chiK+VrKcDfEjzxh1uadlWTvOmAbCpnM9zx/Ww3f8uKlYQVnO/TrqVg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/prop-types": { - "version": "15.7.14", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", - "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==" - }, - "node_modules/@types/puppeteer": { - "version": "5.4.7", - "resolved": "https://registry.npmjs.org/@types/puppeteer/-/puppeteer-5.4.7.tgz", - "integrity": "sha512-JdGWZZYL0vKapXF4oQTC5hLVNfOgdPrqeZ1BiQnGk5cB7HeE91EWUiTdVSdQPobRN8rIcdffjiOgCYJ/S8QrnQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/qs": { - "version": "6.9.18", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz", - "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==", - "dev": true - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "dev": true - }, - "node_modules/@types/react": { - "version": "18.3.20", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.20.tgz", - "integrity": "sha512-IPaCZN7PShZK/3t6Q87pfTkRm6oLTd4vztyoj+cbHUF1g3FfVb2tFIL79uCRKEfv16AhqDMBywP2VW3KIZUvcg==", - "dependencies": { - "@types/prop-types": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.3.6", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.6.tgz", - "integrity": "sha512-nf22//wEbKXusP6E9pfOCDwFdHAX4u172eaJI4YkDRQEZiorm6KfYnSC2SWLDMVWUOWPERmJnN0ujeAfTBLvrw==", - "peerDependencies": { - "@types/react": "^18.0.0" - } - }, - "node_modules/@types/resolve": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", - "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", - "dev": true - }, - "node_modules/@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", - "dev": true - }, - "node_modules/@types/send": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", - "dev": true, - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-index": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", - "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", - "dev": true, - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.7", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", - "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", - "dev": true, - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "*" - } - }, - "node_modules/@types/sockjs": { - "version": "0.3.36", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", - "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==" - }, - "node_modules/@types/tough-cookie": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", - "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", - "dev": true - }, - "node_modules/@types/triple-beam": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", - "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", - "dev": true - }, - "node_modules/@types/trusted-types": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", - "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==" - }, - "node_modules/@types/unist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", - "dev": true - }, - "node_modules/@types/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" - }, - "node_modules/@types/yauzl": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", - "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.29.0.tgz", - "integrity": "sha512-PAIpk/U7NIS6H7TEtN45SPGLQaHNgB7wSjsQV/8+KYokAb2T/gloOA/Bee2yd4/yKVhPKe5LlaUGhAZk5zmSaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.29.0", - "@typescript-eslint/type-utils": "8.29.0", - "@typescript-eslint/utils": "8.29.0", - "@typescript-eslint/visitor-keys": "8.29.0", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.0.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "8.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.29.0.tgz", - "integrity": "sha512-8C0+jlNJOwQso2GapCVWWfW/rzaq7Lbme+vGUFKE31djwNncIpgXD7Cd4weEsDdkoZDjH0lwwr3QDQFuyrMg9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/scope-manager": "8.29.0", - "@typescript-eslint/types": "8.29.0", - "@typescript-eslint/typescript-estree": "8.29.0", - "@typescript-eslint/visitor-keys": "8.29.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.29.0.tgz", - "integrity": "sha512-aO1PVsq7Gm+tcghabUpzEnVSFMCU4/nYIgC2GOatJcllvWfnhrgW0ZEbnTxm36QsikmCN1K/6ZgM7fok2I7xNw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.29.0", - "@typescript-eslint/visitor-keys": "8.29.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.29.0.tgz", - "integrity": "sha512-ahaWQ42JAOx+NKEf5++WC/ua17q5l+j1GFrbbpVKzFL/tKVc0aYY8rVSYUpUvt2hUP1YBr7mwXzx+E/DfUWI9Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/typescript-estree": "8.29.0", - "@typescript-eslint/utils": "8.29.0", - "debug": "^4.3.4", - "ts-api-utils": "^2.0.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "8.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.29.0.tgz", - "integrity": "sha512-wcJL/+cOXV+RE3gjCyl/V2G877+2faqvlgtso/ZRbTCnZazh0gXhe+7gbAnfubzN2bNsBtZjDvlh7ero8uIbzg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.29.0.tgz", - "integrity": "sha512-yOfen3jE9ISZR/hHpU/bmNvTtBW1NjRbkSFdZOksL1N+ybPEE7UVGMwqvS6CP022Rp00Sb0tdiIkhSCe6NI8ow==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.29.0", - "@typescript-eslint/visitor-keys": "8.29.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.0.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.29.0.tgz", - "integrity": "sha512-gX/A0Mz9Bskm8avSWFcK0gP7cZpbY4AIo6B0hWYFCaIsz750oaiWR4Jr2CI+PQhfW1CpcQr9OlfPS+kMFegjXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.29.0", - "@typescript-eslint/types": "8.29.0", - "@typescript-eslint/typescript-estree": "8.29.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.29.0.tgz", - "integrity": "sha512-Sne/pVz8ryR03NFK21VpN88dZ2FdQXOlq3VIklbrTYEt8yXtRFr9tvUhqvCeKjqYk5FSim37sHbooT6vzBTZcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.29.0", - "eslint-visitor-keys": "^4.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", - "dev": true - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", - "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", - "dev": true, - "dependencies": { - "@webassemblyjs/helper-numbers": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", - "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", - "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", - "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", - "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", - "dev": true, - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.13.2", - "@webassemblyjs/helper-api-error": "1.13.2", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", - "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", - "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/wasm-gen": "1.14.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", - "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", - "dev": true, - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", - "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", - "dev": true, - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", - "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", - "dev": true - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", - "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/helper-wasm-section": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-opt": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1", - "@webassemblyjs/wast-printer": "1.14.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", - "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", - "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", - "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-api-error": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", - "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webpack-cli/configtest": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", - "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", - "dev": true, - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - } - }, - "node_modules/@webpack-cli/info": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", - "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", - "dev": true, - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - } - }, - "node_modules/@webpack-cli/serve": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", - "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", - "dev": true, - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - }, - "peerDependenciesMeta": { - "webpack-dev-server": { - "optional": true - } - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "node_modules/@yarnpkg/lockfile": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", - "dev": true - }, - "node_modules/@yarnpkg/parsers": { - "version": "3.0.0-rc.46", - "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.0-rc.46.tgz", - "integrity": "sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q==", - "dev": true, - "dependencies": { - "js-yaml": "^3.10.0", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=14.15.0" - } - }, - "node_modules/@yarnpkg/parsers/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/@yarnpkg/parsers/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@yarnpkg/parsers/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "node_modules/@zkochan/js-yaml": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.6.tgz", - "integrity": "sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "deprecated": "Use your platform's native atob() and btoa() methods instead", - "dev": true - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "optional": true - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "devOptional": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-globals": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", - "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", - "dev": true, - "dependencies": { - "acorn": "^8.1.0", - "acorn-walk": "^8.0.2" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "devOptional": true, - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/add-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", - "integrity": "sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==", - "dev": true - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "devOptional": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/ansi": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz", - "integrity": "sha512-iFY7JCgHbepc0b82yLaw4IMortylNb6wG4kL+4R0C3iv6i+RHGHux/yUX5BTiRvSX/shMnngjR1YyNMnXEFh5A==" - }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "dev": true, - "engines": [ - "node >= 0.8.0" - ], - "bin": { - "ansi-html": "bin/ansi-html" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "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==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/append-transform": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", - "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", - "dev": true, - "dependencies": { - "default-require-extensions": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "devOptional": true - }, - "node_modules/archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", - "dev": true - }, - "node_modules/are-docs-informative": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", - "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==", - "dev": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "deprecated": "This package is no longer supported.", - "optional": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "devOptional": true - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", - "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", - "dependencies": { - "call-bound": "^1.0.3", - "is-array-buffer": "^3.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-differ": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", - "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true - }, - "node_modules/array-ify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", - "dev": true - }, - "node_modules/array-includes": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", - "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", - "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.reduce": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.8.tgz", - "integrity": "sha512-DwuEqgXFBwbmZSRqt3BpQigWNUoqw9Ml2dTWdF3B2zQlQX4OeUE0zyuzX0fX0IbTvjdkZbcBTU3idgpO78qkTw==", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-array-method-boxes-properly": "^1.0.0", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "is-string": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", - "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ast-types": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", - "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", - "dependencies": { - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "dev": true - }, - "node_modules/async-function": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", - "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axios": { - "version": "1.8.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz", - "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/b4a": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", - "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==" - }, - "node_modules/babar": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/babar/-/babar-0.2.3.tgz", - "integrity": "sha512-1hmYKLj+7m5qHsJ3hosOlO7Z5BYe3E8u9u/W2BEqB4kytysuHYuGe5OIrEr7q4Zyg3y3EytFb4YrPZokYSix8g==", - "dependencies": { - "colors": "~1.4.0" - } - }, - "node_modules/babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", - "dependencies": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-istanbul/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.13.tgz", - "integrity": "sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.4", - "semver": "^6.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz", - "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.3", - "core-js-compat": "^3.40.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.4.tgz", - "integrity": "sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.4" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", - "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-import-attributes": "^7.24.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", - "dependencies": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babylonjs": { - "resolved": "packages/public/umd/babylonjs", - "link": true - }, - "node_modules/babylonjs-accessibility": { - "resolved": "packages/public/umd/babylonjs-accessibility", - "link": true - }, - "node_modules/babylonjs-addons": { - "resolved": "packages/public/umd/babylonjs-addons", - "link": true - }, - "node_modules/babylonjs-gltf2interface": { - "resolved": "packages/public/glTF2Interface", - "link": true - }, - "node_modules/babylonjs-gui": { - "resolved": "packages/public/umd/babylonjs-gui", - "link": true - }, - "node_modules/babylonjs-gui-editor": { - "resolved": "packages/public/umd/babylonjs-gui-editor", - "link": true - }, - "node_modules/babylonjs-inspector": { - "resolved": "packages/public/umd/babylonjs-inspector", - "link": true - }, - "node_modules/babylonjs-ktx2decoder": { - "resolved": "packages/public/umd/babylonjs-ktx2decoder", - "link": true - }, - "node_modules/babylonjs-loaders": { - "resolved": "packages/public/umd/babylonjs-loaders", - "link": true - }, - "node_modules/babylonjs-materials": { - "resolved": "packages/public/umd/babylonjs-materials", - "link": true - }, - "node_modules/babylonjs-node-editor": { - "resolved": "packages/public/umd/babylonjs-node-editor", - "link": true - }, - "node_modules/babylonjs-node-geometry-editor": { - "resolved": "packages/public/umd/babylonjs-node-geometry-editor", - "link": true - }, - "node_modules/babylonjs-node-render-graph-editor": { - "resolved": "packages/public/umd/babylonjs-node-render-graph-editor", - "link": true - }, - "node_modules/babylonjs-post-process": { - "resolved": "packages/public/umd/babylonjs-post-process", - "link": true - }, - "node_modules/babylonjs-procedural-textures": { - "resolved": "packages/public/umd/babylonjs-procedural-textures", - "link": true - }, - "node_modules/babylonjs-serializers": { - "resolved": "packages/public/umd/babylonjs-serializers", - "link": true - }, - "node_modules/babylonjs-testproject": { - "resolved": "packages/public/umd/babylonjs-testproject", - "link": true - }, - "node_modules/babylonjs-viewer-assets": { - "resolved": "packages/public/babylonjs-viewer-assets", - "link": true - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/bare-events": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", - "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", - "optional": true - }, - "node_modules/bare-fs": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.1.2.tgz", - "integrity": "sha512-8wSeOia5B7LwD4+h465y73KOdj5QHsbbuoUfPBi+pXgFJIPuG7SsiOdJuijWMyfid49eD+WivpfY7KT8gbAzBA==", - "optional": true, - "dependencies": { - "bare-events": "^2.5.4", - "bare-path": "^3.0.0", - "bare-stream": "^2.6.4" - }, - "engines": { - "bare": ">=1.16.0" - }, - "peerDependencies": { - "bare-buffer": "*" - }, - "peerDependenciesMeta": { - "bare-buffer": { - "optional": true - } - } - }, - "node_modules/bare-os": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.1.tgz", - "integrity": "sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==", - "optional": true, - "engines": { - "bare": ">=1.14.0" - } - }, - "node_modules/bare-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", - "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", - "optional": true, - "dependencies": { - "bare-os": "^3.0.1" - } - }, - "node_modules/bare-stream": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.6.5.tgz", - "integrity": "sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==", - "optional": true, - "dependencies": { - "streamx": "^2.21.0" - }, - "peerDependencies": { - "bare-buffer": "*", - "bare-events": "*" - }, - "peerDependenciesMeta": { - "bare-buffer": { - "optional": true - }, - "bare-events": { - "optional": true - } - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/basic-ftp": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", - "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "dev": true - }, - "node_modules/before-after-hook": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", - "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", - "dev": true - }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/bin-links": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/bin-links/-/bin-links-4.0.4.tgz", - "integrity": "sha512-cMtq4W5ZsEwcutJrVId+a/tjt8GSbS+h0oNkdl6+6rBuEv8Ot33Bevj5KPm40t309zuhVic8NjpuL42QCiJWWA==", - "dev": true, - "dependencies": { - "cmd-shim": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "read-cmd-shim": "^4.0.0", - "write-file-atomic": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/bin-links/node_modules/write-file-atomic": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", - "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/blessed": { - "version": "0.1.81", - "resolved": "https://registry.npmjs.org/blessed/-/blessed-0.1.81.tgz", - "integrity": "sha512-LoF5gae+hlmfORcG1M5+5XZi4LBmvlXTzwJWzUlPryN/SJdSflZvROM2TwkT0GMpq7oqT48NRd4GS7BiVBc5OQ==", - "bin": { - "blessed": "bin/tput.js" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", - "dev": true, - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/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, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/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/bonjour-service": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", - "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", - "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001688", - "electron-to-chromium": "^1.5.73", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.1" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/browserstack-local": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/browserstack-local/-/browserstack-local-1.5.6.tgz", - "integrity": "sha512-s0GadAkyE1XHxnmymb9atogTZbA654bcFpqGkcYEtYPaPvuvVfSXR0gw8ojn0I0Td2HEMJcGtdrkBjb1Fi/HmQ==", - "dev": true, - "dependencies": { - "agent-base": "^6.0.2", - "https-proxy-agent": "^5.0.1", - "is-running": "^2.1.0", - "ps-tree": "=1.2.0", - "temp-fs": "^0.9.9" - } - }, - "node_modules/bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "dependencies": { - "fast-json-stable-stringify": "2.x" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "engines": { - "node": "*" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "node_modules/bufferutil": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.9.tgz", - "integrity": "sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==", - "hasInstallScript": true, - "optional": true, - "dependencies": { - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=6.14.2" - } - }, - "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, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bundle-name": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", - "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", - "dev": true, - "dependencies": { - "run-applescript": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/byte-size": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/byte-size/-/byte-size-8.1.1.tgz", - "integrity": "sha512-tUkzZWK0M/qdoLEqikxBWe4kumyuwjl3HO6zHTr4yEI23EojPtLYXdG1+AQY7MN0cGyNDvEaJ8wiYQm6P2bPxg==", - "dev": true, - "engines": { - "node": ">=12.17" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cacache": { - "version": "18.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.4.tgz", - "integrity": "sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==", - "dev": true, - "dependencies": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^10.0.1", - "minipass": "^7.0.3", - "minipass-collect": "^2.0.1", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/cacache/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/caching-transform": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", - "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", - "dev": true, - "dependencies": { - "hasha": "^5.0.0", - "make-dir": "^3.0.0", - "package-hash": "^4.0.0", - "write-file-atomic": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/caching-transform/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/caching-transform/node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", - "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dev": true, - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001712", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001712.tgz", - "integrity": "sha512-MBqPpGYYdQ7/hfKiet9SCI+nmN5/hp4ZzveOJubl5DTAMa5oggjAuoi0Z4onBpKPFI2ePGnQuQIzF3VxDjDJig==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/canvas": { - "version": "2.11.2", - "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.11.2.tgz", - "integrity": "sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==", - "hasInstallScript": true, - "optional": true, - "dependencies": { - "@mapbox/node-pre-gyp": "^1.0.0", - "nan": "^2.17.0", - "simple-get": "^3.0.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "engines": { - "node": ">=10" - } - }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "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/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "devOptional": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", - "dev": true, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/chromium-bidi": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.6.3.tgz", - "integrity": "sha512-qXlsCmpCZJAnoTYI83Iu6EdYQpMYdVkCfq08KDh2pmlVqK5t5IA9mGs4/LwCwp4fqisSOMXZxP3HIh8w8aRn0A==", - "dependencies": { - "mitt": "3.0.1", - "urlpattern-polyfill": "10.0.0", - "zod": "3.23.8" - }, - "peerDependencies": { - "devtools-protocol": "*" - } - }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, - "node_modules/cjs-module-lexer": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", - "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==" - }, - "node_modules/classnames": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", - "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", - "dev": true - }, - "node_modules/clean-css": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", - "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", - "dev": true, - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 10.0" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-spinners": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", - "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/cmd-shim": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-6.0.3.tgz", - "integrity": "sha512-FMabTRlc5t5zjdenF6mS0MBeFZm0XqHqeOkcskKFb/LYCcRQ5fVgLOHVc4Lq9CqABd9zhjwPjMBCJvMCziSVtA==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==" - }, - "node_modules/color": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", - "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.3", - "color-string": "^1.6.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "dev": true, - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "devOptional": true, - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/color/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true - }, - "node_modules/colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/colorspace": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", - "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", - "dev": true, - "dependencies": { - "color": "^3.1.3", - "text-hex": "1.0.x" - } - }, - "node_modules/columnify": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz", - "integrity": "sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==", - "dev": true, - "dependencies": { - "strip-ansi": "^6.0.1", - "wcwidth": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.0.0.tgz", - "integrity": "sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA==", - "dev": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/comment-parser": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.3.1.tgz", - "integrity": "sha512-B52sN2VNghyq5ofvUsqZjmk6YkihBX5vMSChmSK9v4ShjKf3Vk5Xcmgpw4o+iIgtrnM/u5FiMpz9VKb8lpBveA==", - "dev": true, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/common-ancestor-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", - "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", - "dev": true - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true - }, - "node_modules/compare-func": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", - "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", - "dev": true, - "dependencies": { - "array-ify": "^1.0.0", - "dot-prop": "^5.1.0" - } - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.0.tgz", - "integrity": "sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==", - "dev": true, - "dependencies": { - "bytes": "3.1.2", - "compressible": "~2.0.18", - "debug": "2.6.9", - "negotiator": "~0.6.4", - "on-headers": "~1.0.2", - "safe-buffer": "5.2.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/compression/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, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/compression/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/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "node_modules/concat-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", - "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", - "dev": true, - "engines": [ - "node >= 6.0" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.0.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/concurrently": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.0.1.tgz", - "integrity": "sha512-Sh8bGQMEL0TAmAm2meAXMjcASHZa7V0xXQVDBLknCPa9TPtkY9yYs+0cnGGgfdkW0SV1Mlg+hVGfXcoI8d3MJA==", - "dev": true, - "dependencies": { - "chalk": "^4.1.2", - "date-fns": "^2.29.3", - "lodash": "^4.17.21", - "rxjs": "^7.8.0", - "shell-quote": "^1.8.0", - "spawn-command": "0.0.2-1", - "supports-color": "^8.1.1", - "tree-kill": "^1.2.2", - "yargs": "^17.7.1" - }, - "bin": { - "conc": "dist/bin/concurrently.js", - "concurrently": "dist/bin/concurrently.js" - }, - "engines": { - "node": "^14.13.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" - } - }, - "node_modules/concurrently/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "devOptional": true - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/conventional-changelog-angular": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz", - "integrity": "sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==", - "dev": true, - "dependencies": { - "compare-func": "^2.0.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/conventional-changelog-core": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-5.0.1.tgz", - "integrity": "sha512-Rvi5pH+LvgsqGwZPZ3Cq/tz4ty7mjijhr3qR4m9IBXNbxGGYgTVVO+duXzz9aArmHxFtwZ+LRkrNIMDQzgoY4A==", - "dev": true, - "dependencies": { - "add-stream": "^1.0.0", - "conventional-changelog-writer": "^6.0.0", - "conventional-commits-parser": "^4.0.0", - "dateformat": "^3.0.3", - "get-pkg-repo": "^4.2.1", - "git-raw-commits": "^3.0.0", - "git-remote-origin-url": "^2.0.0", - "git-semver-tags": "^5.0.0", - "normalize-package-data": "^3.0.3", - "read-pkg": "^3.0.0", - "read-pkg-up": "^3.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/conventional-changelog-core/node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-core/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-core/node_modules/normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-core/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/conventional-changelog-preset-loader": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-3.0.0.tgz", - "integrity": "sha512-qy9XbdSLmVnwnvzEisjxdDiLA4OmV3o8db+Zdg4WiFw14fP3B6XNz98X0swPPpkTd/pc1K7+adKgEDM1JCUMiA==", - "dev": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/conventional-changelog-writer": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-6.0.1.tgz", - "integrity": "sha512-359t9aHorPw+U+nHzUXHS5ZnPBOizRxfQsWT5ZDHBfvfxQOAik+yfuhKXG66CN5LEWPpMNnIMHUTCKeYNprvHQ==", - "dev": true, - "dependencies": { - "conventional-commits-filter": "^3.0.0", - "dateformat": "^3.0.3", - "handlebars": "^4.7.7", - "json-stringify-safe": "^5.0.1", - "meow": "^8.1.2", - "semver": "^7.0.0", - "split": "^1.0.1" - }, - "bin": { - "conventional-changelog-writer": "cli.js" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/conventional-commits-filter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-3.0.0.tgz", - "integrity": "sha512-1ymej8b5LouPx9Ox0Dw/qAO2dVdfpRFq28e5Y0jJEU8ZrLdy0vOSkkIInwmxErFGhg6SALro60ZrwYFVTUDo4Q==", - "dev": true, - "dependencies": { - "lodash.ismatch": "^4.4.0", - "modify-values": "^1.0.1" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/conventional-commits-parser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-4.0.0.tgz", - "integrity": "sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg==", - "dev": true, - "dependencies": { - "is-text-path": "^1.0.1", - "JSONStream": "^1.3.5", - "meow": "^8.1.2", - "split2": "^3.2.2" - }, - "bin": { - "conventional-commits-parser": "cli.js" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/conventional-recommended-bump": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-7.0.1.tgz", - "integrity": "sha512-Ft79FF4SlOFvX4PkwFDRnaNiIVX7YbmqGU0RwccUaiGvgp3S0a8ipR2/Qxk31vclDNM+GSdJOVs2KrsUCjblVA==", - "dev": true, - "dependencies": { - "concat-stream": "^2.0.0", - "conventional-changelog-preset-loader": "^3.0.0", - "conventional-commits-filter": "^3.0.0", - "conventional-commits-parser": "^4.0.0", - "git-raw-commits": "^3.0.0", - "git-semver-tags": "^5.0.0", - "meow": "^8.1.2" - }, - "bin": { - "conventional-recommended-bump": "cli.js" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/convert-source-map": { - "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==" - }, - "node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true - }, - "node_modules/copy-webpack-plugin": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", - "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", - "dev": true, - "dependencies": { - "fast-glob": "^3.2.11", - "glob-parent": "^6.0.1", - "globby": "^13.1.1", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - } - }, - "node_modules/copy-webpack-plugin/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/copy-webpack-plugin/node_modules/globby": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", - "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", - "dev": true, - "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.3.0", - "ignore": "^5.2.4", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/copy-webpack-plugin/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/core-js-compat": { - "version": "3.41.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.41.0.tgz", - "integrity": "sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==", - "dev": true, - "dependencies": { - "browserslist": "^4.24.4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "node_modules/cosmiconfig": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", - "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", - "dependencies": { - "env-paths": "^2.2.1", - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - }, - "bin": { - "create-jest": "bin/create-jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "devOptional": true - }, - "node_modules/cross-env": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", - "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "bin": { - "cross-env": "src/bin/cross-env.js", - "cross-env-shell": "src/bin/cross-env-shell.js" - }, - "engines": { - "node": ">=10.14", - "npm": ">=6", - "yarn": ">=1" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/css-loader": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.2.tgz", - "integrity": "sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==", - "dev": true, - "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.33", - "postcss-modules-extract-imports": "^3.1.0", - "postcss-modules-local-by-default": "^4.0.5", - "postcss-modules-scope": "^3.2.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.27.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-tree": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", - "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", - "dev": true, - "dependencies": { - "mdn-data": "2.0.30", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" - } - }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/csso": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", - "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", - "dev": true, - "dependencies": { - "css-tree": "~2.2.0" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/csso/node_modules/css-tree": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", - "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", - "dev": true, - "dependencies": { - "mdn-data": "2.0.28", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/csso/node_modules/mdn-data": { - "version": "2.0.28", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", - "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", - "dev": true - }, - "node_modules/cssom": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", - "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", - "dev": true - }, - "node_modules/cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "dependencies": { - "cssom": "~0.3.6" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" - }, - "node_modules/cwd": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/cwd/-/cwd-0.10.0.tgz", - "integrity": "sha512-YGZxdTTL9lmLkCUTpg4j0zQ7IhRB5ZmqNBbGCl3Tg6MP/d5/6sY7L5mmTjzbc6JKgVZYiqTQTNhPFsbXNGlRaA==", - "dependencies": { - "find-pkg": "^0.1.2", - "fs-exists-sync": "^0.1.0" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/dagre": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/dagre/-/dagre-0.8.5.tgz", - "integrity": "sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==", - "dependencies": { - "graphlib": "^2.1.8", - "lodash": "^4.17.15" - } - }, - "node_modules/dargs": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", - "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/data-uri-to-buffer": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", - "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", - "engines": { - "node": ">= 14" - } - }, - "node_modules/data-urls": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", - "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", - "dev": true, - "dependencies": { - "abab": "^2.0.6", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/data-view-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", - "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", - "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/inspect-js" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", - "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/date-fns": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", - "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.21.0" - }, - "engines": { - "node": ">=0.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/date-fns" - } - }, - "node_modules/dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/debounce": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", - "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", - "dev": true - }, - "node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decamelize-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", - "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", - "dev": true, - "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decamelize-keys/node_modules/map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decimal.js": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.5.0.tgz", - "integrity": "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==", - "dev": true - }, - "node_modules/decompress-response": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", - "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", - "optional": true, - "dependencies": { - "mimic-response": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dedent": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", - "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" - }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-browser": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", - "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", - "dev": true, - "dependencies": { - "bundle-name": "^4.1.0", - "default-browser-id": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser-id": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", - "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", - "dev": true, - "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/default-require-extensions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", - "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", - "dev": true, - "dependencies": { - "strip-bom": "^4.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dev": true, - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/degenerator": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", - "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", - "dependencies": { - "ast-types": "^0.13.4", - "escodegen": "^2.1.0", - "esprima": "^4.0.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "optional": true - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", - "dev": true - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-indent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", - "integrity": "sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true - }, - "node_modules/devtools-protocol": { - "version": "0.0.1312386", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1312386.tgz", - "integrity": "sha512-DPnhUXvmvKT2dFA/j7B+riVLUt9Q6RKJlcppojL5CoRywJJKLDYnRlw0gTFKfgDPHP5E04UoB71SxoJlVZy8FA==" - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "devOptional": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/diff-sequences": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", - "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", - "dev": true, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dnd-core": { - "version": "15.0.1", - "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-15.0.1.tgz", - "integrity": "sha512-pqVsLKNYdIYwOesmeAC9wcfDmyAHsiZwLoIYs+bDXaUjnuGZc3h/QWFenPSPFgp2ichG50P9sIFy4yuBZd49JQ==", - "peer": true, - "dependencies": { - "@react-dnd/asap": "^4.0.0", - "@react-dnd/invariant": "^2.0.0", - "redux": "^4.1.1" - } - }, - "node_modules/dns-packet": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", - "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", - "dev": true, - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "dev": true, - "dependencies": { - "utila": "~0.4" - } - }, - "node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dev": true, - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/dom-serializer/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/domexception": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", - "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", - "deprecated": "Use your platform's native DOMException instead", - "dev": true, - "dependencies": { - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dev": true, - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dev": true, - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dotenv": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", - "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", - "engines": { - "node": ">=12" - } - }, - "node_modules/dotenv-expand": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-10.0.0.tgz", - "integrity": "sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true - }, - "node_modules/ejs": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", - "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", - "dev": true, - "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.5.134", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.134.tgz", - "integrity": "sha512-zSwzrLg3jNP3bwsLqWHmS5z2nIOQ5ngMnfMZOWWtXnqqQkPVyOipxK98w+1beLw1TB+EImPNcG8wVP/cLVs2Og==" - }, - "node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/enabled": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", - "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", - "dev": true - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.18.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", - "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "dependencies": { - "ansi-colors": "^4.1.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/envinfo": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.13.0.tgz", - "integrity": "sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==", - "dev": true, - "bin": { - "envinfo": "dist/cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-abstract": { - "version": "1.23.9", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", - "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", - "dependencies": { - "array-buffer-byte-length": "^1.0.2", - "arraybuffer.prototype.slice": "^1.0.4", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "data-view-buffer": "^1.0.2", - "data-view-byte-length": "^1.0.2", - "data-view-byte-offset": "^1.0.1", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.1.0", - "es-to-primitive": "^1.3.0", - "function.prototype.name": "^1.1.8", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.0", - "get-symbol-description": "^1.1.0", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "internal-slot": "^1.1.0", - "is-array-buffer": "^3.0.5", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.2", - "is-regex": "^1.2.1", - "is-shared-array-buffer": "^1.0.4", - "is-string": "^1.1.1", - "is-typed-array": "^1.1.15", - "is-weakref": "^1.1.0", - "math-intrinsics": "^1.1.0", - "object-inspect": "^1.13.3", - "object-keys": "^1.1.1", - "object.assign": "^4.1.7", - "own-keys": "^1.0.1", - "regexp.prototype.flags": "^1.5.3", - "safe-array-concat": "^1.1.3", - "safe-push-apply": "^1.0.0", - "safe-regex-test": "^1.1.0", - "set-proto": "^1.0.0", - "string.prototype.trim": "^1.2.10", - "string.prototype.trimend": "^1.0.9", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.3", - "typed-array-byte-length": "^1.0.3", - "typed-array-byte-offset": "^1.0.4", - "typed-array-length": "^1.0.7", - "unbox-primitive": "^1.1.0", - "which-typed-array": "^1.1.18" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-array-method-boxes-properly": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", - "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==" - }, - "node_modules/es-check": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/es-check/-/es-check-7.2.1.tgz", - "integrity": "sha512-4sxU2OZ1aYYRRX2ajL3hDDBaY96Yr/OcH6MTRerIuOSyil6SQYQQ0b48uqVfYGRCiI0NgJbtY6Sbmf75oPaTeQ==", - "dev": true, - "dependencies": { - "acorn": "8.11.3", - "commander": "12.0.0", - "fast-glob": "^3.3.2", - "supports-color": "^8.1.1", - "winston": "3.13.0" - }, - "bin": { - "es-check": "index.js" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/es-check/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-module-lexer": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", - "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", - "dev": true - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", - "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-to-primitive": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", - "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", - "dependencies": { - "is-callable": "^1.2.7", - "is-date-object": "^1.0.5", - "is-symbol": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true - }, - "node_modules/esbuild": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.2.tgz", - "integrity": "sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.2", - "@esbuild/android-arm": "0.25.2", - "@esbuild/android-arm64": "0.25.2", - "@esbuild/android-x64": "0.25.2", - "@esbuild/darwin-arm64": "0.25.2", - "@esbuild/darwin-x64": "0.25.2", - "@esbuild/freebsd-arm64": "0.25.2", - "@esbuild/freebsd-x64": "0.25.2", - "@esbuild/linux-arm": "0.25.2", - "@esbuild/linux-arm64": "0.25.2", - "@esbuild/linux-ia32": "0.25.2", - "@esbuild/linux-loong64": "0.25.2", - "@esbuild/linux-mips64el": "0.25.2", - "@esbuild/linux-ppc64": "0.25.2", - "@esbuild/linux-riscv64": "0.25.2", - "@esbuild/linux-s390x": "0.25.2", - "@esbuild/linux-x64": "0.25.2", - "@esbuild/netbsd-arm64": "0.25.2", - "@esbuild/netbsd-x64": "0.25.2", - "@esbuild/openbsd-arm64": "0.25.2", - "@esbuild/openbsd-x64": "0.25.2", - "@esbuild/sunos-x64": "0.25.2", - "@esbuild/win32-arm64": "0.25.2", - "@esbuild/win32-ia32": "0.25.2", - "@esbuild/win32-x64": "0.25.2" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/eslint": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", - "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", - "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@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", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-prettier": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz", - "integrity": "sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==", - "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-formatter-azure-devops": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/eslint-formatter-azure-devops/-/eslint-formatter-azure-devops-1.2.0.tgz", - "integrity": "sha512-2hp/v2p8an4LEJM/YC7PyagldkGhj8Qvk1zaO0Ei+l5rwwhcBhBnT7NVYVvn5mX3CExsZ3YK3NHgkuUzESEqhw==", - "dev": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dev": true, - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", - "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", - "dev": true, - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-babylonjs": { - "resolved": "packages/tools/eslintBabylonPlugin", - "link": true - }, - "node_modules/eslint-plugin-import": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", - "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.3", - "has": "^1.0.3", - "is-core-module": "^2.8.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.values": "^1.1.5", - "resolve": "^1.22.0", - "tsconfig-paths": "^3.14.1" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "node_modules/eslint-plugin-import/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, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/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/eslint-plugin-jest": { - "version": "28.11.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-28.11.0.tgz", - "integrity": "sha512-QAfipLcNCWLVocVbZW8GimKn5p5iiMcgGbRzz8z/P5q7xw+cNEpYqyzFMtIF/ZgF2HLOyy+dYBut+DoYolvqig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/utils": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "engines": { - "node": "^16.10.0 || ^18.12.0 || >=20.0.0" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^6.0.0 || ^7.0.0 || ^8.0.0", - "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0", - "jest": "*" - }, - "peerDependenciesMeta": { - "@typescript-eslint/eslint-plugin": { - "optional": true - }, - "jest": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-jsdoc": { - "version": "46.2.6", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-46.2.6.tgz", - "integrity": "sha512-zIaK3zbSrKuH12bP+SPybPgcHSM6MFzh3HFeaODzmsF1N8C1l8dzJ22cW1aq4g0+nayU1VMjmNf7hg0dpShLrA==", - "dev": true, - "dependencies": { - "@es-joy/jsdoccomment": "~0.39.4", - "are-docs-informative": "^0.0.2", - "comment-parser": "1.3.1", - "debug": "^4.3.4", - "escape-string-regexp": "^4.0.0", - "esquery": "^1.5.0", - "is-builtin-module": "^3.2.1", - "semver": "^7.5.1", - "spdx-expression-parse": "^3.0.1" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/eslint-plugin-prettier": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.1.tgz", - "integrity": "sha512-m3u5RnR56asrwV/lDC4GHorlW75DsFfmUcjfCYylTUs85dBRnB7VM6xG8eCMJdeDRnppzmxZVf1GEPJvl1JmNg==", - "dev": true, - "dependencies": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.8.5" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/prettier" - }, - "peerDependencies": { - "@types/eslint": ">=8.0.0", - "eslint": ">=8.0.0", - "prettier": ">=3.0.0" - }, - "peerDependenciesMeta": { - "@types/eslint": { - "optional": true - }, - "eslint-config-prettier": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-tsdoc": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/eslint-plugin-tsdoc/-/eslint-plugin-tsdoc-0.2.17.tgz", - "integrity": "sha512-xRmVi7Zx44lOBuYqG8vzTXuL6IdGOeF9nHX17bjJ8+VE6fsxpdGem0/SBTmAwgYMKYB1WBkqRJVQ+n8GK041pA==", - "dev": true, - "dependencies": { - "@microsoft/tsdoc": "0.14.2", - "@microsoft/tsdoc-config": "0.16.2" - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/eslint/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/event-stream": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", - "integrity": "sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==", - "dev": true, - "dependencies": { - "duplexer": "~0.1.1", - "from": "~0", - "map-stream": "~0.1.0", - "pause-stream": "0.0.11", - "split": "0.3", - "stream-combiner": "~0.0.4", - "through": "~2.3.1" - } - }, - "node_modules/event-stream/node_modules/split": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", - "integrity": "sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==", - "dev": true, - "dependencies": { - "through": "2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/execa/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expand-tilde": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", - "integrity": "sha512-rtmc+cjLZqnu9dSYosX9EWmSJhTwpACgJQTfj4hgg2JjOD/6SIQalZrt4a3aQeh++oNxkazcaxrhPUj6+g5G/Q==", - "dependencies": { - "os-homedir": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", - "dependencies": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/expect-puppeteer": { - "version": "10.1.4", - "resolved": "https://registry.npmjs.org/expect-puppeteer/-/expect-puppeteer-10.1.4.tgz", - "integrity": "sha512-zNVzk/+TkPS/CuTlGSK7SjXuUpQiakXtUJhbTRrcPHop4jCWydPx9RlvHhQELzZYgXlLhIP+hvBzUNiN8WNAow==", - "engines": { - "node": ">=16" - } - }, - "node_modules/expect/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/expect/node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/expect/node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/expect/node_modules/jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/expect/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/expect/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" - }, - "node_modules/exponential-backoff": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz", - "integrity": "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==", - "dev": true - }, - "node_modules/express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", - "dev": true, - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", - "proxy-addr": "~2.0.7", - "qs": "6.13.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express/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, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/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/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/external-editor/node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, - "node_modules/extract-zip/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-diff": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true - }, - "node_modules/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "dev": true, - "engines": { - "node": ">= 4.9.1" - } - }, - "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dev": true, - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/fecha": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", - "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", - "dev": true - }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/file-loader": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", - "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", - "dev": true, - "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/file-loader/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/file-loader/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/file-loader/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/file-loader/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dev": true, - "dependencies": { - "minimatch": "^5.0.1" - } - }, - "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/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, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/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/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, - "node_modules/find-file-up": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/find-file-up/-/find-file-up-0.1.3.tgz", - "integrity": "sha512-mBxmNbVyjg1LQIIpgO8hN+ybWBgDQK8qjht+EbrTCGmmPV/sc7RF1i9stPTD6bpvXZywBdrwRYxhSdJv867L6A==", - "dependencies": { - "fs-exists-sync": "^0.1.0", - "resolve-dir": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/find-pkg": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/find-pkg/-/find-pkg-0.1.2.tgz", - "integrity": "sha512-0rnQWcFwZr7eO0513HahrWafsc3CTFioEB7DRiEYCUM/70QXSY8f3mCST17HXLcPvEhzH/Ty/Bxd72ZZsr/yvw==", - "dependencies": { - "find-file-up": "^0.1.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/find-process": { - "version": "1.4.10", - "resolved": "https://registry.npmjs.org/find-process/-/find-process-1.4.10.tgz", - "integrity": "sha512-ncYFnWEIwL7PzmrK1yZtaccN8GhethD37RzBHG6iOZoFYB4vSmLLXfeWJjeN5nMvCJMjOtBvBBF8OgxEcikiZg==", - "dependencies": { - "chalk": "~4.1.2", - "commander": "^12.1.0", - "loglevel": "^1.9.2" - }, - "bin": { - "find-process": "bin/find-process.js" - } - }, - "node_modules/find-process/node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "engines": { - "node": ">=18" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, - "bin": { - "flat": "cli.js" - } - }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dev": true, - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flat-cache/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/flat-cache/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "dev": true - }, - "node_modules/fn.name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", - "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", - "dev": true - }, - "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-each": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", - "dependencies": { - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", - "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/from": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==", - "dev": true - }, - "node_modules/fromentries": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", - "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, - "node_modules/fs-exists-sync": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", - "integrity": "sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/fs-minipass": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", - "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", - "dev": true, - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/fs-monkey": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", - "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==", - "dev": true - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", - "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "functions-have-names": "^1.2.3", - "hasown": "^2.0.2", - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "deprecated": "This package is no longer supported.", - "optional": true, - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/gauge/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "optional": true - }, - "node_modules/gauge/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "optional": true - }, - "node_modules/gauge/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "optional": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/gensync": { - "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==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-pkg-repo": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz", - "integrity": "sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==", - "dev": true, - "dependencies": { - "@hutson/parse-repository-url": "^3.0.0", - "hosted-git-info": "^4.0.0", - "through2": "^2.0.0", - "yargs": "^16.2.0" - }, - "bin": { - "get-pkg-repo": "src/cli.js" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-pkg-repo/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/get-pkg-repo/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/get-pkg-repo/node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/get-pkg-repo/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/get-pkg-repo/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/get-pkg-repo/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/get-pkg-repo/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/get-pkg-repo/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/get-pkg-repo/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/get-port": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", - "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-stdin": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", - "integrity": "sha512-jZV7n6jGE3Gt7fgSTJoz91Ak5MuTLwMwkoYdjxuJ/AmjIsE1UC03y/IWkZCQGEvVNS9qoRNwy5BCqxImv0FVeA==", - "optional": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-symbol-description": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", - "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-uri": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.4.tgz", - "integrity": "sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ==", - "dependencies": { - "basic-ftp": "^5.0.2", - "data-uri-to-buffer": "^6.0.2", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/gif.js.optimized": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gif.js.optimized/-/gif.js.optimized-1.0.1.tgz", - "integrity": "sha512-IS0F42Xken6lp/iR4irgG4r52tvxRkEKsXGZmlUHUOb00SWNMezJOJwkVaJk2MLW53rqzMbPnnBtEhs9hcMJ9w==", - "dev": true - }, - "node_modules/git-raw-commits": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-3.0.0.tgz", - "integrity": "sha512-b5OHmZ3vAgGrDn/X0kS+9qCfNKWe4K/jFnhwzVWWg0/k5eLa3060tZShrRg8Dja5kPc+YjS0Gc6y7cRr44Lpjw==", - "dev": true, - "dependencies": { - "dargs": "^7.0.0", - "meow": "^8.1.2", - "split2": "^3.2.2" - }, - "bin": { - "git-raw-commits": "cli.js" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/git-remote-origin-url": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", - "integrity": "sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==", - "dev": true, - "dependencies": { - "gitconfiglocal": "^1.0.0", - "pify": "^2.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/git-remote-origin-url/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/git-semver-tags": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-5.0.1.tgz", - "integrity": "sha512-hIvOeZwRbQ+7YEUmCkHqo8FOLQZCEn18yevLHADlFPZY02KJGsu5FZt9YW/lybfK2uhWFI7Qg/07LekJiTv7iA==", - "dev": true, - "dependencies": { - "meow": "^8.1.2", - "semver": "^7.0.0" - }, - "bin": { - "git-semver-tags": "cli.js" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/git-up": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", - "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==", - "dev": true, - "dependencies": { - "is-ssh": "^1.4.0", - "parse-url": "^8.1.0" - } - }, - "node_modules/git-url-parse": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-14.0.0.tgz", - "integrity": "sha512-NnLweV+2A4nCvn4U/m2AoYu0pPKlsmhK9cknG7IMwsjFY1S2jxM+mAhsDxyxfCIGfGaD+dozsyX4b6vkYc83yQ==", - "dev": true, - "dependencies": { - "git-up": "^7.0.0" - } - }, - "node_modules/gitconfiglocal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", - "integrity": "sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==", - "dev": true, - "dependencies": { - "ini": "^1.3.2" - } - }, - "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/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/global-modules": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", - "integrity": "sha512-JeXuCbvYzYXcwE6acL9V2bAOeSIGl4dD+iwLY9iUx2VBJJ80R18HCn+JCwHM9Oegdfya3lEkGCdaRkSyc10hDA==", - "dependencies": { - "global-prefix": "^0.1.4", - "is-windows": "^0.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/global-modules/node_modules/global-prefix": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", - "integrity": "sha512-gOPiyxcD9dJGCEArAhF4Hd0BAqvAe/JzERP7tYumE4yIkmIedPUVXcJFWbV3/p/ovIIvKjkrTk+f1UVkq7vvbw==", - "dependencies": { - "homedir-polyfill": "^1.0.0", - "ini": "^1.3.4", - "is-windows": "^0.2.0", - "which": "^1.2.12" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/global-modules/node_modules/is-windows": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", - "integrity": "sha512-n67eJYmXbniZB7RF4I/FTjK1s6RPOCTxhYrVYLRaCt3lF0mpWZPKr3T2LSZAqyjQsxR2qMmGYXXzK0YWwcPM1Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/global-modules/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/global-prefix": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-4.0.0.tgz", - "integrity": "sha512-w0Uf9Y9/nyHinEk5vMJKRie+wa4kR5hmDbEhGGds/kG1PwGLLHKRoNMeJOyCQjjBkANlnScqgzcFwGHgmgLkVA==", - "dev": true, - "dependencies": { - "ini": "^4.1.3", - "kind-of": "^6.0.3", - "which": "^4.0.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/global-prefix/node_modules/ini": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", - "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/global-prefix/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "dev": true, - "engines": { - "node": ">=16" - } - }, - "node_modules/global-prefix/node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", - "dev": true, - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^16.13.0 || >=18.0.0" - } - }, - "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glur": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/glur/-/glur-1.1.2.tgz", - "integrity": "sha512-l+8esYHTKOx2G/Aao4lEQ0bnHWg4fWtJbVoZZT9Knxi01pB8C80BR85nONLFwkkQoFRCmXY+BUcGZN3yZ2QsRA==", - "optional": true - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/graphlib": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", - "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==", - "dependencies": { - "lodash": "^4.17.15" - } - }, - "node_modules/gzip-size": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", - "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", - "dev": true, - "dependencies": { - "duplexer": "^0.1.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true - }, - "node_modules/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "node_modules/hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/has": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", - "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-bigints": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", - "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", - "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", - "dependencies": { - "dunder-proto": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "devOptional": true - }, - "node_modules/hasha": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", - "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", - "dev": true, - "dependencies": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hasha/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "bin": { - "he": "bin/he" - } - }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "peer": true, - "dependencies": { - "react-is": "^16.7.0" - } - }, - "node_modules/hoist-non-react-statics/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "peer": true - }, - "node_modules/homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dependencies": { - "parse-passwd": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/hosted-git-info": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", - "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", - "dev": true, - "dependencies": { - "lru-cache": "^10.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/hosted-git-info/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/hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "node_modules/hpack.js/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/hpack.js/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/hpack.js/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/hpack.js/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/html-encoding-sniffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", - "dev": true, - "dependencies": { - "whatwg-encoding": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/html-entities": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", - "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ] - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" - }, - "node_modules/html-loader": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-3.1.2.tgz", - "integrity": "sha512-9WQlLiAV5N9fCna4MUmBW/ifaUbuFZ2r7IZmtXzhyfyi4zgPEjXsmsYCKs+yT873MzRj+f1WMjuAiPNA7C6Tcw==", - "dev": true, - "dependencies": { - "html-minifier-terser": "^6.0.2", - "parse5": "^6.0.1" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/html-loader/node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "node_modules/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", - "dev": true, - "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/html-minifier-terser/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true, - "engines": { - "node": ">= 12" - } - }, - "node_modules/html-webpack-plugin": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.3.tgz", - "integrity": "sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg==", - "dev": true, - "dependencies": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/html-webpack-plugin" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.20.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, - "node_modules/htmlparser2/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true - }, - "node_modules/http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "dev": true - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-parser-js": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", - "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", - "dev": true - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/http-proxy-middleware": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", - "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==", - "dev": true, - "dependencies": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } - } - }, - "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/https": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https/-/https-1.0.0.tgz", - "integrity": "sha512-4EC57ddXrkaF0x83Oj8sM6SLQHAWXw90Skqu2M4AEWENZ3F02dFJE/GARA8igO79tcgYqGrD7ae4f5L3um2lgg==", - "dev": true - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "devOptional": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/ignore-walk": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.5.tgz", - "integrity": "sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A==", - "dev": true, - "dependencies": { - "minimatch": "^9.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/ignore-walk/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/ignore-walk/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/immutable": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.1.tgz", - "integrity": "sha512-3jatXi9ObIsPGr3N5hGw/vWWcTkq6hUYhpQz4k0wLC+owqWi/LiugIw9x0EdNZ2yGedKN/HzePiBvaJRXa0Ujg==", - "dev": true - }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-local": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", - "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "node_modules/init-package-json": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/init-package-json/-/init-package-json-6.0.3.tgz", - "integrity": "sha512-Zfeb5ol+H+eqJWHTaGca9BovufyGeIfr4zaaBorPmJBMrJ+KBnN+kQx2ZtXdsotUTgldHmHQV44xvUWOUA7E2w==", - "dev": true, - "dependencies": { - "@npmcli/package-json": "^5.0.0", - "npm-package-arg": "^11.0.0", - "promzard": "^1.0.0", - "read": "^3.0.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^5.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/inquirer": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.6.tgz", - "integrity": "sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.1", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.21", - "mute-stream": "0.0.8", - "ora": "^5.4.1", - "run-async": "^2.4.0", - "rxjs": "^7.5.5", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6", - "wrap-ansi": "^6.0.1" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/inquirer/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/inquirer/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/internal-slot": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", - "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.2", - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/interpret": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", - "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", - "dev": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/ip-address": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", - "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", - "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/ipaddr.js": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", - "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", - "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" - }, - "node_modules/is-async-function": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", - "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", - "dependencies": { - "async-function": "^1.0.0", - "call-bound": "^1.0.3", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", - "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", - "dependencies": { - "has-bigints": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", - "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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, - "dependencies": { - "builtin-modules": "^3.3.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-ci": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", - "dev": true, - "dependencies": { - "ci-info": "^3.2.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-view": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", - "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", - "dependencies": { - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", - "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finalizationregistry": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", - "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-generator-function": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", - "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", - "dependencies": { - "call-bound": "^1.0.3", - "get-proto": "^1.0.0", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-inside-container": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", - "dev": true, - "dependencies": { - "is-docker": "^3.0.0" - }, - "bin": { - "is-inside-container": "cli.js" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "dev": true - }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", - "dev": true - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", - "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, - "node_modules/is-reference": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", - "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", - "dev": true, - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/is-regex": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", - "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-running": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-running/-/is-running-2.1.0.tgz", - "integrity": "sha512-mjJd3PujZMl7j+D395WTIO5tU5RIDBfVSRtRR4VOJou3H66E38UjbjvDGh3slJzPuolsb+yQFqwHNNdyp5jg3w==", - "dev": true - }, - "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", - "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-ssh": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.1.tgz", - "integrity": "sha512-JNeu1wQsHjyHgn9NcWTaXq6zWSR6hqE0++zhfZlkFBbScNkyvxCdeV8sRkSBaeLKxmbpR21brail63ACNxJ0Tg==", - "dev": true, - "dependencies": { - "protocols": "^2.0.1" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-string": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", - "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", - "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", - "dependencies": { - "call-bound": "^1.0.2", - "has-symbols": "^1.1.0", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-text-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", - "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", - "dev": true, - "dependencies": { - "text-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", - "dependencies": { - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", - "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", - "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", - "dependencies": { - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-wsl": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", - "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", - "dev": true, - "dependencies": { - "is-inside-container": "^1.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-hook": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", - "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", - "dev": true, - "dependencies": { - "append-transform": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", - "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", - "dependencies": { - "@babel/core": "^7.23.9", - "@babel/parser": "^7.23.9", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-processinfo": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", - "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", - "dev": true, - "dependencies": { - "archy": "^1.0.0", - "cross-spawn": "^7.0.3", - "istanbul-lib-coverage": "^3.2.0", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "uuid": "^8.3.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-processinfo/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/istanbul-lib-processinfo/node_modules/p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-processinfo/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report/node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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/jake": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", - "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", - "dev": true, - "dependencies": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.4", - "minimatch": "^3.1.2" - }, - "bin": { - "jake": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", - "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/types": "^29.6.3", - "import-local": "^3.0.2", - "jest-cli": "^29.7.0" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", - "dependencies": { - "execa": "^5.0.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-circus/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-circus/node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-circus/node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-circus/node_modules/jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-circus/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-circus/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" - }, - "node_modules/jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "create-jest": "^29.7.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "yargs": "^17.3.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-config/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-config/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/jest-config/node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-config/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-config/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" - }, - "node_modules/jest-dev-server": { - "version": "10.1.4", - "resolved": "https://registry.npmjs.org/jest-dev-server/-/jest-dev-server-10.1.4.tgz", - "integrity": "sha512-bGQ6sedNGtT6AFHhCVqGTXMPz7UyJi/ZrhNBgyqsP0XU9N8acCEIfqZEA22rOaZ+NdEVsaltk6tL7UT6aXfI7w==", - "dependencies": { - "chalk": "^4.1.2", - "cwd": "^0.10.0", - "find-process": "^1.4.7", - "prompts": "^2.4.2", - "spawnd": "^10.1.4", - "tree-kill": "^1.2.2", - "wait-on": "^8.0.1" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/jest-diff": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", - "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-diff/node_modules/jest-get-type": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", - "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", - "dev": true, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-each/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" - }, - "node_modules/jest-environment-jsdom": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz", - "integrity": "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/jsdom": "^20.0.0", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0", - "jsdom": "^20.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jest-environment-node": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", - "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", - "dev": true, - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-environment-node/node_modules/@jest/environment": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", - "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", - "dev": true, - "dependencies": { - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-environment-node/node_modules/@jest/fake-timers": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", - "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", - "dev": true, - "dependencies": { - "@jest/types": "^27.5.1", - "@sinonjs/fake-timers": "^8.0.1", - "@types/node": "*", - "jest-message-util": "^27.5.1", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-environment-node/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-environment-node/node_modules/@sinonjs/commons": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", - "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/jest-environment-node/node_modules/@sinonjs/fake-timers": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", - "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, - "node_modules/jest-environment-node/node_modules/@types/yargs": { - "version": "16.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", - "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-environment-node/node_modules/jest-message-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", - "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.5.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-environment-node/node_modules/jest-mock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", - "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", - "dev": true, - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-environment-node/node_modules/jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "dev": true, - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-environment-node/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/jest-environment-puppeteer": { - "version": "10.1.4", - "resolved": "https://registry.npmjs.org/jest-environment-puppeteer/-/jest-environment-puppeteer-10.1.4.tgz", - "integrity": "sha512-cx2jzf1qZb6/vdmLbRccF0k/zSsoWlrXi8bg10GzrODxiwsRomVDszTfoOCRsQ+C1sbJ+ubI1PlryIvvYjITrA==", - "dependencies": { - "chalk": "^4.1.2", - "cosmiconfig": "^8.3.6", - "deepmerge": "^4.3.1", - "jest-dev-server": "^10.1.4", - "jest-environment-node": "^29.7.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/jest-environment-puppeteer/node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", - "dependencies": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/jest-environment-puppeteer/node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-image-snapshot": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/jest-image-snapshot/-/jest-image-snapshot-6.4.0.tgz", - "integrity": "sha512-IWGtSOnelwaVPd09STbJuLmnAwlBC/roJtTLGLb8M3TA0vfku3MRNEXmljTa1EMXqdRbA0oIWiqHFB1ttTGazQ==", - "optional": true, - "dependencies": { - "chalk": "^4.0.0", - "get-stdin": "^5.0.1", - "glur": "^1.1.2", - "lodash": "^4.17.4", - "pixelmatch": "^5.1.0", - "pngjs": "^3.4.0", - "rimraf": "^2.6.2", - "ssim.js": "^3.1.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "jest": ">=20 <=29" - }, - "peerDependenciesMeta": { - "jest": { - "optional": true - } - } - }, - "node_modules/jest-image-snapshot/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "optional": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/jest-image-snapshot/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "optional": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/jest-junit": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-13.2.0.tgz", - "integrity": "sha512-B0XNlotl1rdsvFZkFfoa19mc634+rrd8E4Sskb92Bb8MmSXeWV9XJGUyctunZS1W410uAxcyYuPUGVnbcOH8cg==", - "dev": true, - "dependencies": { - "mkdirp": "^1.0.4", - "strip-ansi": "^6.0.1", - "uuid": "^8.3.2", - "xml": "^1.0.1" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", - "dependencies": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-leak-detector/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-leak-detector/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-leak-detector/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" - }, - "node_modules/jest-matcher-utils": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", - "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-matcher-utils/node_modules/jest-get-type": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", - "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", - "dev": true, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-message-util/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" - }, - "node_modules/jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-puppeteer": { - "version": "10.1.4", - "resolved": "https://registry.npmjs.org/jest-puppeteer/-/jest-puppeteer-10.1.4.tgz", - "integrity": "sha512-I9bADDn9EzpaL9QgzEtyJhd29PBv45rZJFPROUC2KWZHUs+5OGjzBOZKBzmqECdGv2GV/JL+NMdjqRJde2A36Q==", - "dependencies": { - "expect-puppeteer": "^10.1.4", - "jest-environment-puppeteer": "^10.1.4" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "puppeteer": ">=19" - } - }, - "node_modules/jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", - "dependencies": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runner/node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", - "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", - "semver": "^7.5.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-snapshot/node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" - }, - "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "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==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "dependencies": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-validate/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" - }, - "node_modules/jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", - "dependencies": { - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.7.0", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/jju": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", - "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==" - }, - "node_modules/joi": { - "version": "17.13.3", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", - "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", - "dependencies": { - "@hapi/hoek": "^9.3.0", - "@hapi/topo": "^5.1.0", - "@sideway/address": "^4.1.5", - "@sideway/formula": "^3.0.1", - "@sideway/pinpoint": "^2.0.0" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==" - }, - "node_modules/jsdoc-type-pratt-parser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz", - "integrity": "sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==", - "dev": true, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/jsdom": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", - "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", - "dev": true, - "dependencies": { - "abab": "^2.0.6", - "acorn": "^8.8.1", - "acorn-globals": "^7.0.0", - "cssom": "^0.5.0", - "cssstyle": "^2.3.0", - "data-urls": "^3.0.2", - "decimal.js": "^10.4.2", - "domexception": "^4.0.0", - "escodegen": "^2.0.0", - "form-data": "^4.0.0", - "html-encoding-sniffer": "^3.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.1", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.2", - "parse5": "^7.1.1", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.1.2", - "w3c-xmlserializer": "^4.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^2.0.0", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0", - "ws": "^8.11.0", - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "node_modules/json-parse-even-better-errors": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", - "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/json-stringify-nice": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz", - "integrity": "sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "dev": true, - "engines": [ - "node >= 0.2.0" - ] - }, - "node_modules/JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dev": true, - "dependencies": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - }, - "bin": { - "JSONStream": "bin.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/just-diff": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/just-diff/-/just-diff-6.0.2.tgz", - "integrity": "sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA==", - "dev": true - }, - "node_modules/just-diff-apply": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/just-diff-apply/-/just-diff-apply-5.5.0.tgz", - "integrity": "sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw==", - "dev": true - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "engines": { - "node": ">=6" - } - }, - "node_modules/kuler": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", - "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", - "dev": true - }, - "node_modules/launch-editor": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.10.0.tgz", - "integrity": "sha512-D7dBRJo/qcGX9xlvt/6wUYzQxjh5G1RvZPgPv8vi4KRU99DVQL/oW7tnVOCCTm2HGeo3C5HvGE5Yrh6UBoZ0vA==", - "dev": true, - "dependencies": { - "picocolors": "^1.0.0", - "shell-quote": "^1.8.1" - } - }, - "node_modules/lerna": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/lerna/-/lerna-8.2.1.tgz", - "integrity": "sha512-Xwjv9/4ixp7fpBWhtvp7dz4NoQT8DEf7hzibHKCgu/8kmZUHeXsTn+TKspHqhI+p4YDmdkDnkg8xmymz73kVOg==", - "dev": true, - "dependencies": { - "@lerna/create": "8.2.1", - "@npmcli/arborist": "7.5.4", - "@npmcli/package-json": "5.2.0", - "@npmcli/run-script": "8.1.0", - "@nx/devkit": ">=17.1.2 < 21", - "@octokit/plugin-enterprise-rest": "6.0.1", - "@octokit/rest": "20.1.2", - "aproba": "2.0.0", - "byte-size": "8.1.1", - "chalk": "4.1.0", - "clone-deep": "4.0.1", - "cmd-shim": "6.0.3", - "color-support": "1.1.3", - "columnify": "1.6.0", - "console-control-strings": "^1.1.0", - "conventional-changelog-angular": "7.0.0", - "conventional-changelog-core": "5.0.1", - "conventional-recommended-bump": "7.0.1", - "cosmiconfig": "9.0.0", - "dedent": "1.5.3", - "envinfo": "7.13.0", - "execa": "5.0.0", - "fs-extra": "^11.2.0", - "get-port": "5.1.1", - "get-stream": "6.0.0", - "git-url-parse": "14.0.0", - "glob-parent": "6.0.2", - "globby": "11.1.0", - "graceful-fs": "4.2.11", - "has-unicode": "2.0.1", - "import-local": "3.1.0", - "ini": "^1.3.8", - "init-package-json": "6.0.3", - "inquirer": "^8.2.4", - "is-ci": "3.0.1", - "is-stream": "2.0.0", - "jest-diff": ">=29.4.3 < 30", - "js-yaml": "4.1.0", - "libnpmaccess": "8.0.6", - "libnpmpublish": "9.0.9", - "load-json-file": "6.2.0", - "lodash": "^4.17.21", - "make-dir": "4.0.0", - "minimatch": "3.0.5", - "multimatch": "5.0.0", - "node-fetch": "2.6.7", - "npm-package-arg": "11.0.2", - "npm-packlist": "8.0.2", - "npm-registry-fetch": "^17.1.0", - "nx": ">=17.1.2 < 21", - "p-map": "4.0.0", - "p-map-series": "2.1.0", - "p-pipe": "3.1.0", - "p-queue": "6.6.2", - "p-reduce": "2.1.0", - "p-waterfall": "2.1.1", - "pacote": "^18.0.6", - "pify": "5.0.0", - "read-cmd-shim": "4.0.0", - "resolve-from": "5.0.0", - "rimraf": "^4.4.1", - "semver": "^7.3.8", - "set-blocking": "^2.0.0", - "signal-exit": "3.0.7", - "slash": "3.0.0", - "ssri": "^10.0.6", - "string-width": "^4.2.3", - "strong-log-transformer": "2.1.0", - "tar": "6.2.1", - "temp-dir": "1.0.0", - "typescript": ">=3 < 6", - "upath": "2.0.1", - "uuid": "^10.0.0", - "validate-npm-package-license": "3.0.4", - "validate-npm-package-name": "5.0.1", - "wide-align": "1.1.5", - "write-file-atomic": "5.0.1", - "write-pkg": "4.0.0", - "yargs": "17.7.2", - "yargs-parser": "21.1.1" - }, - "bin": { - "lerna": "dist/cli.js" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/lerna/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/lerna/node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/lerna/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/lerna/node_modules/execa": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz", - "integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/lerna/node_modules/fs-extra": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", - "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/lerna/node_modules/get-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz", - "integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lerna/node_modules/glob": { - "version": "9.3.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", - "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "minimatch": "^8.0.2", - "minipass": "^4.2.4", - "path-scurry": "^1.6.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/lerna/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/lerna/node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/lerna/node_modules/glob/node_modules/minimatch": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", - "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/lerna/node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lerna/node_modules/is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/lerna/node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/lerna/node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lerna/node_modules/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/lerna/node_modules/minipass": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", - "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/lerna/node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/lerna/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/lerna/node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/lerna/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true - }, - "node_modules/lerna/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/lerna/node_modules/rimraf": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", - "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", - "dev": true, - "dependencies": { - "glob": "^9.2.0" - }, - "bin": { - "rimraf": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/lerna/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/lerna/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lerna/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "node_modules/lerna/node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", - "dev": true, - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/lerna/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "node_modules/lerna/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/lerna/node_modules/write-file-atomic": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", - "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/lerna/node_modules/write-file-atomic/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/libnpmaccess": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/libnpmaccess/-/libnpmaccess-8.0.6.tgz", - "integrity": "sha512-uM8DHDEfYG6G5gVivVl+yQd4pH3uRclHC59lzIbSvy7b5FEwR+mU49Zq1jEyRtRFv7+M99mUW9S0wL/4laT4lw==", - "dev": true, - "dependencies": { - "npm-package-arg": "^11.0.2", - "npm-registry-fetch": "^17.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/libnpmpublish": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/libnpmpublish/-/libnpmpublish-9.0.9.tgz", - "integrity": "sha512-26zzwoBNAvX9AWOPiqqF6FG4HrSCPsHFkQm7nT+xU1ggAujL/eae81RnCv4CJ2In9q9fh10B88sYSzKCUh/Ghg==", - "dev": true, - "dependencies": { - "ci-info": "^4.0.0", - "normalize-package-data": "^6.0.1", - "npm-package-arg": "^11.0.2", - "npm-registry-fetch": "^17.0.1", - "proc-log": "^4.2.0", - "semver": "^7.3.7", - "sigstore": "^2.2.0", - "ssri": "^10.0.6" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/libnpmpublish/node_modules/ci-info": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.2.0.tgz", - "integrity": "sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, - "node_modules/lines-and-columns": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz", - "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/linkify-it": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", - "dev": true, - "dependencies": { - "uc.micro": "^2.0.0" - } - }, - "node_modules/lit": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/lit/-/lit-3.2.1.tgz", - "integrity": "sha512-1BBa1E/z0O9ye5fZprPtdqnc0BFzxIxTTOO/tQFmyC/hj1O3jL4TfmLBw0WEwjAokdLwpclkvGgDJwTIh0/22w==", - "dependencies": { - "@lit/reactive-element": "^2.0.4", - "lit-element": "^4.1.0", - "lit-html": "^3.2.0" - } - }, - "node_modules/lit-element": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.1.1.tgz", - "integrity": "sha512-HO9Tkkh34QkTeUmEdNYhMT8hzLid7YlMlATSi1q4q17HE5d9mrrEHJ/o8O2D0cMi182zK1F3v7x0PWFjrhXFew==", - "dependencies": { - "@lit-labs/ssr-dom-shim": "^1.2.0", - "@lit/reactive-element": "^2.0.4", - "lit-html": "^3.2.0" - } - }, - "node_modules/lit-html": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.2.1.tgz", - "integrity": "sha512-qI/3lziaPMSKsrwlxH/xMgikhQ0EGOX2ICU73Bi/YHFvz2j/yMCIrw4+puF2IpQ4+upd3EWbvnHM9+PnJn48YA==", - "dependencies": { - "@types/trusted-types": "^2.0.2" - } - }, - "node_modules/load-json-file": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-6.2.0.tgz", - "integrity": "sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.15", - "parse-json": "^5.0.0", - "strip-bom": "^4.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/load-json-file/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true, - "engines": { - "node": ">=6.11.5" - } - }, - "node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "node_modules/lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", - "dev": true - }, - "node_modules/lodash.ismatch": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", - "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==", - "dev": true - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/logform": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", - "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", - "dev": true, - "dependencies": { - "@colors/colors": "1.6.0", - "@types/triple-beam": "^1.3.2", - "fecha": "^4.2.0", - "ms": "^2.1.1", - "safe-stable-stringify": "^2.3.1", - "triple-beam": "^1.3.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/loglevel": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.2.tgz", - "integrity": "sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==", - "engines": { - "node": ">= 0.6.0" - }, - "funding": { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/loglevel" - } - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dev": true, - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/lunr": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", - "dev": true - }, - "node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "devOptional": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "devOptional": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "devOptional": true - }, - "node_modules/make-fetch-happen": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.1.tgz", - "integrity": "sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA==", - "dev": true, - "dependencies": { - "@npmcli/agent": "^2.0.0", - "cacache": "^18.0.0", - "http-cache-semantics": "^4.1.1", - "is-lambda": "^1.0.1", - "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "proc-log": "^4.2.0", - "promise-retry": "^2.0.1", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/map-stream": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", - "integrity": "sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==", - "dev": true - }, - "node_modules/markdown-it": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", - "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1", - "entities": "^4.4.0", - "linkify-it": "^5.0.0", - "mdurl": "^2.0.0", - "punycode.js": "^2.3.1", - "uc.micro": "^2.1.0" - }, - "bin": { - "markdown-it": "bin/markdown-it.mjs" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/mdn-data": { - "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", - "dev": true - }, - "node_modules/mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", - "dev": true - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memfs": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", - "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", - "dev": true, - "dependencies": { - "fs-monkey": "^1.0.4" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/memlab": { - "version": "1.1.57", - "resolved": "https://registry.npmjs.org/memlab/-/memlab-1.1.57.tgz", - "integrity": "sha512-irMSWu5+y2eIAqMTyiUVvqmYCB+xWSwO4vGGBACGBSoVPlaYrVQwFc2zDMxHN3p0jHC8p0mCjIhr0sYhG8eWig==", - "hasInstallScript": true, - "dependencies": { - "@memlab/api": "^1.0.39", - "@memlab/cli": "^1.0.42", - "@memlab/core": "^1.1.40", - "@memlab/e2e": "^1.0.40", - "@memlab/heap-analysis": "^1.0.37", - "ansi": "^0.3.1", - "babar": "^0.2.0", - "chalk": "^4.0.0", - "fs-extra": "^4.0.2", - "minimist": "^1.2.8", - "puppeteer": "^22.12.1", - "puppeteer-core": "^22.12.1", - "string-width": "^4.2.0", - "util.promisify": "^1.1.1", - "xvfb": "^0.4.0" - }, - "bin": { - "memlab": "bin/memlab" - } - }, - "node_modules/memlab/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/memlab/node_modules/fs-extra": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", - "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "node_modules/memlab/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/memlab/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/memlab/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/meow": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", - "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", - "dev": true, - "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/meow/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/meow/node_modules/normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/meow/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/read-pkg/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/meow/node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/meow/node_modules/read-pkg/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/meow/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/meow/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "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==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/mimic-response": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", - "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", - "optional": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/mini-css-extract-plugin": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.1.tgz", - "integrity": "sha512-wd+SD57/K6DiV7jIR34P+s3uckTRuQvx0tKPcvjFlrEylk6P4mQ2KSWk1hblj1Kxaqok7LogKOieygXqBczNlg==", - "dev": true, - "dependencies": { - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/minify-literals": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/minify-literals/-/minify-literals-1.0.10.tgz", - "integrity": "sha512-3gzrwHTd7kRTqsoGhGw4iySDy7JGgc3RozKZ7IT9vcXPyno5egKkpFqud+F1ECSPxi/ls2JwQCUYZr5SeUci0Q==", - "dev": true, - "dependencies": { - "clean-css": "^5.3.3", - "html-minifier-terser": "^7.2.0", - "magic-string": "^0.30.7", - "parse-literals": "^1.2.1" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/minify-literals/node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "dev": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/minify-literals/node_modules/html-minifier-terser": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", - "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==", - "dev": true, - "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "~5.3.2", - "commander": "^10.0.0", - "entities": "^4.4.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.15.1" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": "^14.13.1 || >=16.0.0" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/minipass-collect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", - "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", - "dev": true, - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/minipass-fetch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", - "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", - "dev": true, - "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-flush/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-flush/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-pipeline/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-pipeline/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "devOptional": true, - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "devOptional": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "devOptional": true - }, - "node_modules/mitt": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", - "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==" - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "devOptional": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/modify-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", - "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/monaco-editor": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.27.0.tgz", - "integrity": "sha512-UhwP78Wb8w0ZSYoKXQNTV/0CHObp6NS3nCt51QfKE6sKyBo5PBsvuDOHoI2ooBakc6uIwByRLHVeT7+yXQe2fQ==", - "dev": true - }, - "node_modules/monaco-editor-webpack-plugin": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/monaco-editor-webpack-plugin/-/monaco-editor-webpack-plugin-4.2.0.tgz", - "integrity": "sha512-/P3sFiEgBl+Y50he4mbknMhbLJVop5gBUZiPS86SuHUDOOnQiQ5rL1jU5lwt1XKAwMEkhwZbUwqaHxTPkb1Utw==", - "dev": true, - "dependencies": { - "loader-utils": "^2.0.0" - }, - "peerDependencies": { - "monaco-editor": "0.25.x || 0.26.x || 0.27.x || 0.28.x", - "webpack": "^4.5.0 || 5.x" - } - }, - "node_modules/mrmime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", - "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "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==" - }, - "node_modules/multicast-dns": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", - "dev": true, - "dependencies": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - }, - "bin": { - "multicast-dns": "cli.js" - } - }, - "node_modules/multimatch": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz", - "integrity": "sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==", - "dev": true, - "dependencies": { - "@types/minimatch": "^3.0.3", - "array-differ": "^3.0.0", - "array-union": "^2.1.0", - "arrify": "^2.0.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/multimatch/node_modules/@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", - "dev": true - }, - "node_modules/multimatch/node_modules/arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "node_modules/mv": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", - "integrity": "sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg==", - "dev": true, - "dependencies": { - "mkdirp": "~0.5.1", - "ncp": "~2.0.0", - "rimraf": "~2.4.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/mv/node_modules/glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "dependencies": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/mv/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/mv/node_modules/rimraf": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", - "integrity": "sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "dependencies": { - "glob": "^6.0.1" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/nan": { - "version": "2.22.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.2.tgz", - "integrity": "sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==", - "optional": true - }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" - }, - "node_modules/ncp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", - "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==", - "dev": true, - "bin": { - "ncp": "bin/ncp" - } - }, - "node_modules/negotiator": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", - "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" - }, - "node_modules/netmask": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", - "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dev": true, - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node_modules/node-addon-api": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", - "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", - "dev": true, - "optional": true, - "peer": true - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "optional": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-fetch/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "optional": true - }, - "node_modules/node-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "optional": true - }, - "node_modules/node-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "optional": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "dev": true, - "engines": { - "node": ">= 6.13.0" - } - }, - "node_modules/node-gyp": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.3.1.tgz", - "integrity": "sha512-Pp3nFHBThHzVtNY7U6JfPjvT/DTE8+o/4xKsLQtBoU+j2HLsGlhcfzflAoUreaJbNmYnX+LlLi0qjV8kpyO6xQ==", - "dev": true, - "dependencies": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "glob": "^10.3.10", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^13.0.0", - "nopt": "^7.0.0", - "proc-log": "^4.1.0", - "semver": "^7.3.5", - "tar": "^6.2.1", - "which": "^4.0.0" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/node-gyp-build": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", - "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", - "optional": true, - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/node-gyp/node_modules/abbrev": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", - "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/node-gyp/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "dev": true, - "engines": { - "node": ">=16" - } - }, - "node_modules/node-gyp/node_modules/nopt": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", - "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==", - "dev": true, - "dependencies": { - "abbrev": "^2.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/node-gyp/node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", - "dev": true, - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^16.13.0 || >=18.0.0" - } - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" - }, - "node_modules/node-machine-id": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/node-machine-id/-/node-machine-id-1.1.12.tgz", - "integrity": "sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==", - "dev": true - }, - "node_modules/node-preload": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", - "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", - "dev": true, - "dependencies": { - "process-on-spawn": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==" - }, - "node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "optional": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/normalize-package-data": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", - "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", - "dev": true, - "dependencies": { - "hosted-git-info": "^7.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-bundled": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.1.tgz", - "integrity": "sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ==", - "dev": true, - "dependencies": { - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-install-checks": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", - "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", - "dev": true, - "dependencies": { - "semver": "^7.1.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-normalize-package-bin": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", - "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-package-arg": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.2.tgz", - "integrity": "sha512-IGN0IAwmhDJwy13Wc8k+4PEbTPhpJnMtfR53ZbOyjkvmEcLS4nCwp6mvMWjS5sUjeiW3mpx6cHmuhKEu9XmcQw==", - "dev": true, - "dependencies": { - "hosted-git-info": "^7.0.0", - "proc-log": "^4.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm-packlist": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-8.0.2.tgz", - "integrity": "sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA==", - "dev": true, - "dependencies": { - "ignore-walk": "^6.0.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-pick-manifest": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-9.1.0.tgz", - "integrity": "sha512-nkc+3pIIhqHVQr085X9d2JzPzLyjzQS96zbruppqC9aZRm/x8xx6xhI98gHtsfELP2bE+loHq8ZaHFHhe+NauA==", - "dev": true, - "dependencies": { - "npm-install-checks": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "npm-package-arg": "^11.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm-registry-fetch": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-17.1.0.tgz", - "integrity": "sha512-5+bKQRH0J1xG1uZ1zMNvxW0VEyoNWgJpY9UDuluPFLKDfJ9u2JmmjmTJV1srBGQOROfdBMiVvnH2Zvpbm+xkVA==", - "dev": true, - "dependencies": { - "@npmcli/redact": "^2.0.0", - "jsonparse": "^1.3.1", - "make-fetch-happen": "^13.0.0", - "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", - "minizlib": "^2.1.2", - "npm-package-arg": "^11.0.0", - "proc-log": "^4.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "deprecated": "This package is no longer supported.", - "optional": true, - "dependencies": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/nwsapi": { - "version": "2.2.20", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.20.tgz", - "integrity": "sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==", - "dev": true - }, - "node_modules/nx": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/nx/-/nx-18.3.5.tgz", - "integrity": "sha512-wWcvwoTgiT5okdrG0RIWm1tepC17bDmSpw+MrOxnjfBjARQNTURkiq4U6cxjCVsCxNHxCrlAaBSQLZeBgJZTzQ==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "@nrwl/tao": "18.3.5", - "@yarnpkg/lockfile": "^1.1.0", - "@yarnpkg/parsers": "3.0.0-rc.46", - "@zkochan/js-yaml": "0.0.6", - "axios": "^1.6.0", - "chalk": "^4.1.0", - "cli-cursor": "3.1.0", - "cli-spinners": "2.6.1", - "cliui": "^8.0.1", - "dotenv": "~16.3.1", - "dotenv-expand": "~10.0.0", - "enquirer": "~2.3.6", - "figures": "3.2.0", - "flat": "^5.0.2", - "fs-extra": "^11.1.0", - "ignore": "^5.0.4", - "jest-diff": "^29.4.1", - "js-yaml": "4.1.0", - "jsonc-parser": "3.2.0", - "lines-and-columns": "~2.0.3", - "minimatch": "9.0.3", - "node-machine-id": "1.1.12", - "npm-run-path": "^4.0.1", - "open": "^8.4.0", - "ora": "5.3.0", - "semver": "^7.5.3", - "string-width": "^4.2.3", - "strong-log-transformer": "^2.1.0", - "tar-stream": "~2.2.0", - "tmp": "~0.2.1", - "tsconfig-paths": "^4.1.2", - "tslib": "^2.3.0", - "yargs": "^17.6.2", - "yargs-parser": "21.1.1" - }, - "bin": { - "nx": "bin/nx.js", - "nx-cloud": "bin/nx-cloud.js" - }, - "optionalDependencies": { - "@nx/nx-darwin-arm64": "18.3.5", - "@nx/nx-darwin-x64": "18.3.5", - "@nx/nx-freebsd-x64": "18.3.5", - "@nx/nx-linux-arm-gnueabihf": "18.3.5", - "@nx/nx-linux-arm64-gnu": "18.3.5", - "@nx/nx-linux-arm64-musl": "18.3.5", - "@nx/nx-linux-x64-gnu": "18.3.5", - "@nx/nx-linux-x64-musl": "18.3.5", - "@nx/nx-win32-arm64-msvc": "18.3.5", - "@nx/nx-win32-x64-msvc": "18.3.5" - }, - "peerDependencies": { - "@swc-node/register": "^1.8.0", - "@swc/core": "^1.3.85" - }, - "peerDependenciesMeta": { - "@swc-node/register": { - "optional": true - }, - "@swc/core": { - "optional": true - } - } - }, - "node_modules/nx/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/nx/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/nx/node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/nx/node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/nx/node_modules/dotenv": { - "version": "16.3.2", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.2.tgz", - "integrity": "sha512-HTlk5nmhkm8F6JcdXvHIzaorzCoziNQT9mGxLPVXW8wJF1TiGSL60ZGB4gHWabHOaMmWmhvk2/lPHfnBiT78AQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/motdotla/dotenv?sponsor=1" - } - }, - "node_modules/nx/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/nx/node_modules/fs-extra": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", - "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/nx/node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/nx/node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nx/node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/nx/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/nx/node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "dev": true, - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/nx/node_modules/ora": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", - "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", - "dev": true, - "dependencies": { - "bl": "^4.0.3", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "log-symbols": "^4.0.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/nx/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/nx/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true - }, - "node_modules/nx/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nx/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/nx/node_modules/tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", - "dev": true, - "dependencies": { - "json5": "^2.2.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/nyc": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-17.1.0.tgz", - "integrity": "sha512-U42vQ4czpKa0QdI1hu950XuNhYqgoM+ZF1HT+VuUHL9hPfDPVvNQyltmMqdE9bUHMVa+8yNbc3QKTj8zQhlVxQ==", - "dev": true, - "dependencies": { - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "caching-transform": "^4.0.0", - "convert-source-map": "^1.7.0", - "decamelize": "^1.2.0", - "find-cache-dir": "^3.2.0", - "find-up": "^4.1.0", - "foreground-child": "^3.3.0", - "get-package-type": "^0.1.0", - "glob": "^7.1.6", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-hook": "^3.0.0", - "istanbul-lib-instrument": "^6.0.2", - "istanbul-lib-processinfo": "^2.0.2", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "make-dir": "^3.0.0", - "node-preload": "^0.2.1", - "p-map": "^3.0.0", - "process-on-spawn": "^1.0.0", - "resolve-from": "^5.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "spawn-wrap": "^2.0.0", - "test-exclude": "^6.0.0", - "yargs": "^15.0.2" - }, - "bin": { - "nyc": "bin/nyc.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/nyc/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/nyc/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "node_modules/nyc/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/nyc/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/nyc/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/nyc/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/nyc/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/nyc/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/nyc/node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "devOptional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0", - "has-symbols": "^1.1.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.getownpropertydescriptors": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.8.tgz", - "integrity": "sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A==", - "dependencies": { - "array.prototype.reduce": "^1.0.6", - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "gopd": "^1.0.1", - "safe-array-concat": "^1.1.2" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.values": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", - "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/one-time": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", - "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", - "dev": true, - "dependencies": { - "fn.name": "1.x.x" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", - "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", - "dev": true, - "dependencies": { - "default-browser": "^5.2.1", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "is-wsl": "^3.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", - "dev": true, - "bin": { - "opener": "bin/opener-bin.js" - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/own-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", - "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", - "dependencies": { - "get-intrinsic": "^1.2.6", - "object-keys": "^1.1.1", - "safe-push-apply": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map-series": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map-series/-/p-map-series-2.1.0.tgz", - "integrity": "sha512-RpYIIK1zXSNEOdwxcfe7FdvGcs7+y5n8rifMhMNWvaxRNMPINJHF5GDeuVxWqnfrcHPSCnp7Oo5yNXHId9Av2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-pipe": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-pipe/-/p-pipe-3.1.0.tgz", - "integrity": "sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-queue": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", - "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", - "dev": true, - "dependencies": { - "eventemitter3": "^4.0.4", - "p-timeout": "^3.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-reduce": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz", - "integrity": "sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", - "dev": true, - "dependencies": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-retry/node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", - "dev": true, - "dependencies": { - "p-finally": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/p-waterfall": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-waterfall/-/p-waterfall-2.1.1.tgz", - "integrity": "sha512-RRTnDb2TBG/epPRI2yYXsimO0v3BXC8Yd3ogr1545IaqKK17VGhbWVeGGN+XfCm/08OK8635nH31c8bATkHuSw==", - "dev": true, - "dependencies": { - "p-reduce": "^2.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pac-proxy-agent": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", - "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", - "dependencies": { - "@tootallnate/quickjs-emscripten": "^0.23.0", - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "get-uri": "^6.0.1", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.6", - "pac-resolver": "^7.0.1", - "socks-proxy-agent": "^8.0.5" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-proxy-agent/node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", - "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-proxy-agent/node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-proxy-agent/node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-resolver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", - "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", - "dependencies": { - "degenerator": "^5.0.0", - "netmask": "^2.0.2" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/package-hash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", - "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.15", - "hasha": "^5.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true - }, - "node_modules/pacote": { - "version": "18.0.6", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-18.0.6.tgz", - "integrity": "sha512-+eK3G27SMwsB8kLIuj4h1FUhHtwiEUo21Tw8wNjmvdlpOEr613edv+8FUsTj/4F/VN5ywGE19X18N7CC2EJk6A==", - "dev": true, - "dependencies": { - "@npmcli/git": "^5.0.0", - "@npmcli/installed-package-contents": "^2.0.1", - "@npmcli/package-json": "^5.1.0", - "@npmcli/promise-spawn": "^7.0.0", - "@npmcli/run-script": "^8.0.0", - "cacache": "^18.0.0", - "fs-minipass": "^3.0.0", - "minipass": "^7.0.2", - "npm-package-arg": "^11.0.0", - "npm-packlist": "^8.0.0", - "npm-pick-manifest": "^9.0.0", - "npm-registry-fetch": "^17.0.0", - "proc-log": "^4.0.0", - "promise-retry": "^2.0.1", - "sigstore": "^2.2.0", - "ssri": "^10.0.0", - "tar": "^6.1.11" - }, - "bin": { - "pacote": "bin/index.js" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dev": true, - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-conflict-json": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/parse-conflict-json/-/parse-conflict-json-3.0.1.tgz", - "integrity": "sha512-01TvEktc68vwbJOtWZluyWeVGWjP+bZwXtPDMQVbBKzbJ/vZBif0L69KH1+cHv1SZ6e0FKLvjyHe8mqsIqYOmw==", - "dev": true, - "dependencies": { - "json-parse-even-better-errors": "^3.0.0", - "just-diff": "^6.0.0", - "just-diff-apply": "^5.2.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse-json/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "node_modules/parse-json/node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - }, - "node_modules/parse-literals": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/parse-literals/-/parse-literals-1.2.1.tgz", - "integrity": "sha512-Ml0w104Ph2wwzuRdxrg9booVWsngXbB4bZ5T2z6WyF8b5oaNkUmBiDtahi34yUIpXD8Y13JjAK6UyIyApJ73RQ==", - "dev": true, - "dependencies": { - "typescript": "^2.9.2 || ^3.0.0 || ^4.0.0" - } - }, - "node_modules/parse-literals/node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/parse-path": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.0.1.tgz", - "integrity": "sha512-6ReLMptznuuOEzLoGEa+I1oWRSj2Zna5jLWC+l6zlfAI4dbbSaIES29ThzuPkbhNahT65dWzfoZEO6cfJw2Ksg==", - "dev": true, - "dependencies": { - "protocols": "^2.0.0" - } - }, - "node_modules/parse-url": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz", - "integrity": "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==", - "dev": true, - "dependencies": { - "parse-path": "^7.0.0" - } - }, - "node_modules/parse5": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", - "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", - "dev": true, - "dependencies": { - "entities": "^4.5.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dev": true, - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/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/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/pause-stream": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", - "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", - "dev": true, - "dependencies": { - "through": "~2.3" - } - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" - }, - "node_modules/pepjs": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/pepjs/-/pepjs-0.5.3.tgz", - "integrity": "sha512-5yHVB9OHqKd9fr/OIsn8ss0NgThQ9buaqrEuwr9Or5YjPp6h+WTDKWZI+xZLaBGZCtODTnFtlSHNmhFsq67THg==" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" - }, - "node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", - "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pirates": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/pixelmatch": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-5.3.0.tgz", - "integrity": "sha512-o8mkY4E/+LNUf6LzX96ht6k6CEDi65k9G2rjMtBe9Oo+VPKSvl+0GKHuH/AlG+GA5LPG/i5hrekkxUc3s2HU+Q==", - "optional": true, - "dependencies": { - "pngjs": "^6.0.0" - }, - "bin": { - "pixelmatch": "bin/pixelmatch" - } - }, - "node_modules/pixelmatch/node_modules/pngjs": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-6.0.0.tgz", - "integrity": "sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg==", - "optional": true, - "engines": { - "node": ">=12.13.0" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/playwright": { - "version": "1.49.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.49.1.tgz", - "integrity": "sha512-VYL8zLoNTBxVOrJBbDuRgDWa3i+mfQgDTrL8Ah9QXZ7ax4Dsj0MSq5bYgytRnDVVe+njoKnfsYkH3HzqVj5UZA==", - "dev": true, - "dependencies": { - "playwright-core": "1.49.1" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "fsevents": "2.3.2" - } - }, - "node_modules/playwright-core": { - "version": "1.49.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.49.1.tgz", - "integrity": "sha512-BzmpVcs4kE2CH15rWfzpjzVGhWERJfmnXmniSyKeRZUs9Ws65m+RGIi7mjJK/euCegfn3i7jvqWeWyHe9y3Vgg==", - "dev": true, - "bin": { - "playwright-core": "cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/playwright/node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/pngjs": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", - "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", - "optional": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", - "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/postcss": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", - "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.8", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", - "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", - "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", - "dev": true, - "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^7.0.0", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", - "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-modules-scope": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", - "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", - "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dev": true, - "dependencies": { - "icss-utils": "^5.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", - "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", - "dev": true, - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/pretty-error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", - "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", - "dev": true, - "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" - } - }, - "node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/proc-log": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", - "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "node_modules/process-on-spawn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.1.0.tgz", - "integrity": "sha512-JOnOPQ/8TZgjs1JIH/m9ni7FfimjNa/PRx7y/Wb5qdItsnhO0jE4AT7fC0HjC28DUQWDr50dwSYZLdRMlqDq3Q==", - "dev": true, - "dependencies": { - "fromentries": "^1.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/proggy": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/proggy/-/proggy-2.0.0.tgz", - "integrity": "sha512-69agxLtnI8xBs9gUGqEnK26UfiexpHy+KUpBQWabiytQjnn5wFY8rklAi7GRfABIuPNnQ/ik48+LGLkYYJcy4A==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/promise-all-reject-late": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz", - "integrity": "sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/promise-call-limit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/promise-call-limit/-/promise-call-limit-3.0.2.tgz", - "integrity": "sha512-mRPQO2T1QQVw11E7+UdCJu7S61eJVWknzml9sC1heAdj1jxl0fWMBypIt9ZOcLFf8FkG995ZD7RnVk7HH72fZw==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "dev": true - }, - "node_modules/promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "dev": true, - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/promzard": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/promzard/-/promzard-1.0.2.tgz", - "integrity": "sha512-2FPputGL+mP3jJ3UZg/Dl9YOkovB7DX0oOr+ck5QbZ5MtORtds8k/BZdn+02peDLI8/YWbmzx34k5fA+fHvCVQ==", - "dev": true, - "dependencies": { - "read": "^3.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - }, - "node_modules/protocols": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.2.tgz", - "integrity": "sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ==", - "dev": true - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dev": true, - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-addr/node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-agent": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", - "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "http-proxy-agent": "^7.0.1", - "https-proxy-agent": "^7.0.6", - "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.1.0", - "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.5" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/proxy-agent/node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", - "engines": { - "node": ">= 14" - } - }, - "node_modules/proxy-agent/node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/proxy-agent/node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/proxy-agent/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "node_modules/ps-tree": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.2.0.tgz", - "integrity": "sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==", - "dev": true, - "dependencies": { - "event-stream": "=3.3.4" - }, - "bin": { - "ps-tree": "bin/ps-tree.js" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/psl": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", - "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", - "dev": true, - "dependencies": { - "punycode": "^2.3.1" - }, - "funding": { - "url": "https://github.com/sponsors/lupomontero" - } - }, - "node_modules/pump": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", - "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/punycode.js": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", - "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/puppeteer": { - "version": "22.15.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-22.15.0.tgz", - "integrity": "sha512-XjCY1SiSEi1T7iSYuxS82ft85kwDJUS7wj1Z0eGVXKdtr5g4xnVcbjwxhq5xBnpK/E7x1VZZoJDxpjAOasHT4Q==", - "hasInstallScript": true, - "dependencies": { - "@puppeteer/browsers": "2.3.0", - "cosmiconfig": "^9.0.0", - "devtools-protocol": "0.0.1312386", - "puppeteer-core": "22.15.0" - }, - "bin": { - "puppeteer": "lib/esm/puppeteer/node/cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/puppeteer-core": { - "version": "22.15.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-22.15.0.tgz", - "integrity": "sha512-cHArnywCiAAVXa3t4GGL2vttNxh7GqXtIYGym99egkNJ3oG//wL9LkvO4WE8W1TJe95t1F1ocu9X4xWaGsOKOA==", - "dependencies": { - "@puppeteer/browsers": "2.3.0", - "chromium-bidi": "0.6.3", - "debug": "^4.3.6", - "devtools-protocol": "0.0.1312386", - "ws": "^8.18.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/pure-rand": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", - "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ] - }, - "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "dev": true, - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dev": true, - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/re-resizable": { - "version": "6.11.2", - "resolved": "https://registry.npmjs.org/re-resizable/-/re-resizable-6.11.2.tgz", - "integrity": "sha512-2xI2P3OHs5qw7K0Ud1aLILK6MQxW50TcO+DetD9eIV58j84TqYeHoZcL9H4GXFXXIh7afhH8mv5iUCXII7OW7A==", - "dev": true, - "peerDependencies": { - "react": "^16.13.1 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-contextmenu": { - "version": "3.14.2", - "resolved": "git+ssh://git@github.com/RaananW/react-contextmenu.git#4cb92c957ebff7aee6fc3b0ace61bc143a7373f2", - "integrity": "sha512-ZLr6AVfBC7TVxk5ND/A3sAk03Jo4tog9Lnt7Ty1deB/TsF9PE8IV44AJVF3IEuXOqCJHf/beCAe/Lzsm6nOl/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "classnames": "^2.2.5" - }, - "peerDependencies": { - "prop-types": "^15.0.0", - "react": "^0.14.0 || ^15.0.0 || ^16.0.1 || ^17.0.1 || ^18.0.1", - "react-dom": "^0.14.0 || ^15.0.0 || ^16.0.1 || ^17.0.1 || ^18.0.1" - } - }, - "node_modules/react-dnd": { - "version": "15.0.1", - "resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-15.0.1.tgz", - "integrity": "sha512-qUqVY+KlG4ZX3eSFTcOHU2HcVa6B9x6bKmyDfji8AkOl15/3gkbEyIARCyJVByFjTjwUPF1VnRiEcvVHYw8APA==", - "peer": true, - "dependencies": { - "@react-dnd/invariant": "^2.0.0", - "@react-dnd/shallowequal": "^2.0.0", - "dnd-core": "15.0.1", - "fast-deep-equal": "^3.1.3", - "hoist-non-react-statics": "^3.3.2" - }, - "peerDependencies": { - "@types/hoist-non-react-statics": ">= 3.3.1", - "@types/node": ">= 12", - "@types/react": ">= 16", - "react": ">= 16.14" - }, - "peerDependenciesMeta": { - "@types/hoist-non-react-statics": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-dnd-touch-backend": { - "version": "15.0.1", - "resolved": "https://registry.npmjs.org/react-dnd-touch-backend/-/react-dnd-touch-backend-15.0.1.tgz", - "integrity": "sha512-DoigPaIAs70DRy4qd+i1U5+wLyyhtiuydqHuhXTObxjQzimG70UN7L3Qzx/3SXYQroOIj9fEOXvb9yzMsD2TMA==", - "peer": true, - "dependencies": { - "@react-dnd/invariant": "^2.0.0", - "dnd-core": "15.0.1" - } - }, - "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - }, - "peerDependencies": { - "react": "^18.3.1" - } - }, - "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true - }, - "node_modules/read": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/read/-/read-3.0.1.tgz", - "integrity": "sha512-SLBrDU/Srs/9EoWhU5GdbAoxG1GzpQHo/6qiGItaoLJ1thmYpcNIM1qISEUvyHBzfGlWIyd6p2DNi1oV1VmAuw==", - "dev": true, - "dependencies": { - "mute-stream": "^1.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/read-cmd-shim": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-4.0.0.tgz", - "integrity": "sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/read-package-json-fast": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", - "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", - "dev": true, - "dependencies": { - "json-parse-even-better-errors": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", - "dev": true, - "dependencies": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==", - "dev": true, - "dependencies": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "dev": true, - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "dev": true, - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "dev": true, - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/read-pkg/node_modules/load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/read-pkg/node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg/node_modules/path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/read-pkg/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/read/node_modules/mute-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", - "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "devOptional": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "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/readdirp/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/rechoir": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", - "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", - "dev": true, - "dependencies": { - "resolve": "^1.20.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/redux": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", - "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.9.2" - } - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", - "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.1", - "which-builtin-type": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", - "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", - "dev": true, - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" - }, - "node_modules/regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", - "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexpu-core": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", - "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", - "dev": true, - "dependencies": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.2.0", - "regjsgen": "^0.8.0", - "regjsparser": "^0.12.0", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", - "dev": true - }, - "node_modules/regjsparser": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", - "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", - "dev": true, - "dependencies": { - "jsesc": "~3.0.2" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", - "dev": true, - "dependencies": { - "es6-error": "^4.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/renderkid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", - "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", - "dev": true, - "dependencies": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-dir": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", - "integrity": "sha512-QxMPqI6le2u0dCLyiGzgy92kjkkL6zO0XyvHzjdTNH3zM6e5Hz3BwG6+aEyNgiQ5Xz6PwTwgQEj3U50dByPKIA==", - "dependencies": { - "expand-tilde": "^1.2.2", - "global-modules": "^0.2.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve.exports": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", - "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", - "engines": { - "node": ">=10" - } - }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/restore-cursor/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.0.1.tgz", - "integrity": "sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==", - "dev": true, - "dependencies": { - "glob": "^11.0.0", - "package-json-from-dist": "^1.0.0" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.1.tgz", - "integrity": "sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^4.0.1", - "minimatch": "^10.0.0", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^2.0.0" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/jackspeak": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.0.tgz", - "integrity": "sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/lru-cache": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.1.0.tgz", - "integrity": "sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==", - "dev": true, - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/rimraf/node_modules/minimatch": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", - "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/path-scurry": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", - "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", - "dev": true, - "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup": { - "version": "4.39.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.39.0.tgz", - "integrity": "sha512-thI8kNc02yNvnmJp8dr3fNWJ9tCONDhp6TV35X6HkKGGs9E6q7YWCHbe5vKiTa7TAiNcFEmXKj3X/pG2b3ci0g==", - "dev": true, - "dependencies": { - "@types/estree": "1.0.7" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.39.0", - "@rollup/rollup-android-arm64": "4.39.0", - "@rollup/rollup-darwin-arm64": "4.39.0", - "@rollup/rollup-darwin-x64": "4.39.0", - "@rollup/rollup-freebsd-arm64": "4.39.0", - "@rollup/rollup-freebsd-x64": "4.39.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.39.0", - "@rollup/rollup-linux-arm-musleabihf": "4.39.0", - "@rollup/rollup-linux-arm64-gnu": "4.39.0", - "@rollup/rollup-linux-arm64-musl": "4.39.0", - "@rollup/rollup-linux-loongarch64-gnu": "4.39.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.39.0", - "@rollup/rollup-linux-riscv64-gnu": "4.39.0", - "@rollup/rollup-linux-riscv64-musl": "4.39.0", - "@rollup/rollup-linux-s390x-gnu": "4.39.0", - "@rollup/rollup-linux-x64-gnu": "4.39.0", - "@rollup/rollup-linux-x64-musl": "4.39.0", - "@rollup/rollup-win32-arm64-msvc": "4.39.0", - "@rollup/rollup-win32-ia32-msvc": "4.39.0", - "@rollup/rollup-win32-x64-msvc": "4.39.0", - "fsevents": "~2.3.2" - } - }, - "node_modules/rollup-plugin-dts": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/rollup-plugin-dts/-/rollup-plugin-dts-6.2.1.tgz", - "integrity": "sha512-sR3CxYUl7i2CHa0O7bA45mCrgADyAQ0tVtGSqi3yvH28M+eg1+g5d7kQ9hLvEz5dorK3XVsH5L2jwHLQf72DzA==", - "dev": true, - "dependencies": { - "magic-string": "^0.30.17" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/Swatinem" - }, - "optionalDependencies": { - "@babel/code-frame": "^7.26.2" - }, - "peerDependencies": { - "rollup": "^3.29.4 || ^4", - "typescript": "^4.5 || ^5.0" - } - }, - "node_modules/rollup-plugin-minify-template-literals": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/rollup-plugin-minify-template-literals/-/rollup-plugin-minify-template-literals-1.1.7.tgz", - "integrity": "sha512-PT3xboFF649fuzIP8woyjVL5lJgEJaGzXt4y+OTvFyWcI1TzL/M9GlHec4W+Nvp0Sl35o6w91C1DENMPDl54jg==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^5.1.0", - "minify-literals": "^1.0.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/rollup-plugin-visualizer": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.14.0.tgz", - "integrity": "sha512-VlDXneTDaKsHIw8yzJAFWtrzguoJ/LnQ+lMpoVfYJ3jJF4Ihe5oYLAqLklIK/35lgUY+1yEzCkHyZ1j4A5w5fA==", - "dev": true, - "dependencies": { - "open": "^8.4.0", - "picomatch": "^4.0.2", - "source-map": "^0.7.4", - "yargs": "^17.5.1" - }, - "bin": { - "rollup-plugin-visualizer": "dist/bin/cli.js" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "rolldown": "1.x", - "rollup": "2.x || 3.x || 4.x" - }, - "peerDependenciesMeta": { - "rolldown": { - "optional": true - }, - "rollup": { - "optional": true - } - } - }, - "node_modules/rollup-plugin-visualizer/node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/rollup-plugin-visualizer/node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/rollup-plugin-visualizer/node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/rollup-plugin-visualizer/node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "dev": true, - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/rollup-plugin-visualizer/node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/run-applescript": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", - "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rxjs": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", - "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/safe-array-concat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", - "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "has-symbols": "^1.1.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "devOptional": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safe-push-apply": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", - "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", - "dependencies": { - "es-errors": "^1.3.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-regex-test": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-regex": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-stable-stringify": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", - "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "devOptional": true - }, - "node_modules/sass": { - "version": "1.86.3", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.86.3.tgz", - "integrity": "sha512-iGtg8kus4GrsGLRDLRBRHY9dNVA78ZaS7xr01cWnS7PEMQyFtTqBiyCrfpTYTZXRWM94akzckYjh8oADfFNTzw==", - "dev": true, - "dependencies": { - "chokidar": "^4.0.0", - "immutable": "^5.0.2", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=14.0.0" - }, - "optionalDependencies": { - "@parcel/watcher": "^2.4.1" - } - }, - "node_modules/sass-loader": { - "version": "16.0.5", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.5.tgz", - "integrity": "sha512-oL+CMBXrj6BZ/zOq4os+UECPL+bWqt6OAC6DWS8Ln8GZRcMDjlJ4JC3FBDuHJdYaFWIdKNIBYmtZtK2MaMkNIw==", - "dev": true, - "dependencies": { - "neo-async": "^2.6.2" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", - "sass": "^1.3.0", - "sass-embedded": "*", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "node-sass": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/sass/node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "dev": true, - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/sass/node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "dev": true, - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/saxes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", - "dev": true, - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=v12.22.7" - } - }, - "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/schema-utils": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", - "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", - "dev": true - }, - "node_modules/selfsigned": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", - "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", - "dev": true, - "dependencies": { - "@types/node-forge": "^1.3.0", - "node-forge": "^1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "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/send/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, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/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/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/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", - "dev": true, - "dependencies": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-index/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, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/serve-index/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "dev": true, - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true - }, - "node_modules/serve-index/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-index/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, - "node_modules/serve-index/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "dev": true, - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "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==", - "devOptional": true - }, - "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==", - "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==", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-proto": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", - "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", - "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/sigstore": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-2.3.1.tgz", - "integrity": "sha512-8G+/XDU8wNsJOQS5ysDVO0Etg9/2uA5gR9l4ZwijjlwxBcrU6RPfwi2+jJmbP+Ap1Hlp/nVAaEO4Fj22/SL2gQ==", - "dev": true, - "dependencies": { - "@sigstore/bundle": "^2.3.2", - "@sigstore/core": "^1.0.0", - "@sigstore/protobuf-specs": "^0.3.2", - "@sigstore/sign": "^2.3.2", - "@sigstore/tuf": "^2.3.4", - "@sigstore/verify": "^1.2.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "optional": true - }, - "node_modules/simple-get": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", - "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", - "optional": true, - "dependencies": { - "decompress-response": "^4.2.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/simple-swizzle/node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "dev": true - }, - "node_modules/sirv": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", - "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", - "dev": true, - "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/sleep": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/sleep/-/sleep-6.1.0.tgz", - "integrity": "sha512-Z1x4JjJxsru75Tqn8F4tnOFeEu3HjtITTsumYUiuz54sGKdISgLCek9AUlXlVVrkhltRFhNUsJDJE76SFHTDIQ==", - "hasInstallScript": true, - "optional": true, - "dependencies": { - "nan": "^2.13.2" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/smob": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/smob/-/smob-1.5.0.tgz", - "integrity": "sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==", - "dev": true - }, - "node_modules/sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "dev": true, - "dependencies": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "node_modules/socks": { - "version": "2.8.4", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz", - "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==", - "dependencies": { - "ip-address": "^9.0.5", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", - "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "socks": "^2.8.3" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/socks-proxy-agent/node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", - "engines": { - "node": ">= 14" - } - }, - "node_modules/sort-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", - "integrity": "sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==", - "dev": true, - "dependencies": { - "is-plain-obj": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-loader": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-4.0.2.tgz", - "integrity": "sha512-oYwAqCuL0OZhBoSgmdrLa7mv9MjommVMiQIWgcztf+eS4+8BfcUee6nenFnDhKOhzAVnk5gpZdfnz1iiBv+5sg==", - "dev": true, - "dependencies": { - "iconv-lite": "^0.6.3", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.72.1" - } - }, - "node_modules/source-map-loader/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/spawn-command": { - "version": "0.0.2-1", - "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", - "integrity": "sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==", - "dev": true - }, - "node_modules/spawn-wrap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", - "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", - "dev": true, - "dependencies": { - "foreground-child": "^2.0.0", - "is-windows": "^1.0.2", - "make-dir": "^3.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "which": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/spawn-wrap/node_modules/foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/spawn-wrap/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/spawn-wrap/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/spawn-wrap/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/spawnd": { - "version": "10.1.4", - "resolved": "https://registry.npmjs.org/spawnd/-/spawnd-10.1.4.tgz", - "integrity": "sha512-drqHc0mKJmtMsiGMOCwzlc5eZ0RPtRvT7tQAluW2A0qUc0G7TQ8KLcn3E6K5qzkLkH2UkS3nYQiVGULvvsD9dw==", - "dependencies": { - "signal-exit": "^4.1.0", - "tree-kill": "^1.2.2" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.21", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", - "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", - "dev": true - }, - "node_modules/spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dev": true, - "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dev": true, - "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "node_modules/split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "dev": true, - "dependencies": { - "through": "2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/split.js": { - "version": "1.6.5", - "resolved": "https://registry.npmjs.org/split.js/-/split.js-1.6.5.tgz", - "integrity": "sha512-mPTnGCiS/RiuTNsVhCm9De9cCAUsrNFFviRbADdKiiV+Kk8HKp/0fWu7Kr8pi3/yBmsqLFHuXGT9UUZ+CNLwFw==", - "dev": true - }, - "node_modules/split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", - "dev": true, - "dependencies": { - "readable-stream": "^3.0.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==" - }, - "node_modules/ssim.js": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/ssim.js/-/ssim.js-3.5.0.tgz", - "integrity": "sha512-Aj6Jl2z6oDmgYFFbQqK7fght19bXdOxY7Tj03nF+03M9gCBAjeIiO8/PlEGMfKDwYpw4q6iBqVq2YuREorGg/g==", - "devOptional": true - }, - "node_modules/ssri": { - "version": "10.0.6", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", - "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", - "dev": true, - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/stream-combiner": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", - "integrity": "sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==", - "dev": true, - "dependencies": { - "duplexer": "~0.1.1" - } - }, - "node_modules/streamx": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz", - "integrity": "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==", - "dependencies": { - "fast-fifo": "^1.3.2", - "text-decoder": "^1.1.0" - }, - "optionalDependencies": { - "bare-events": "^2.2.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "devOptional": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", - "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-data-property": "^1.1.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-object-atoms": "^1.0.0", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", - "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strong-log-transformer": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz", - "integrity": "sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==", - "dev": true, - "dependencies": { - "duplexer": "^0.1.1", - "minimist": "^1.2.0", - "through": "^2.3.4" - }, - "bin": { - "sl-log-transformer": "bin/sl-log-transformer.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/style-loader": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", - "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==", - "dev": true, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/svg-parser": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", - "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", - "dev": true - }, - "node_modules/svgo": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", - "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", - "dev": true, - "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^5.1.0", - "css-tree": "^2.3.1", - "css-what": "^6.1.0", - "csso": "^5.0.5", - "picocolors": "^1.0.0" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/svgo" - } - }, - "node_modules/svgo/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/svgo/node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/svgo/node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dev": true, - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/svgo/node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/svgo/node_modules/domutils": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", - "dev": true, - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "node_modules/synckit": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz", - "integrity": "sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==", - "dev": true, - "dependencies": { - "@pkgr/core": "^0.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" - } - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", - "devOptional": true, - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar-fs": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.8.tgz", - "integrity": "sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==", - "dependencies": { - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - }, - "optionalDependencies": { - "bare-fs": "^4.0.1", - "bare-path": "^3.0.0" - } - }, - "node_modules/tar-fs/node_modules/tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar/node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "devOptional": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "devOptional": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "devOptional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/tar/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "devOptional": true - }, - "node_modules/temp-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", - "integrity": "sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/temp-fs": { - "version": "0.9.9", - "resolved": "https://registry.npmjs.org/temp-fs/-/temp-fs-0.9.9.tgz", - "integrity": "sha512-WfecDCR1xC9b0nsrzSaxPf3ZuWeWLUWblW4vlDQAa1biQaKHiImHnJfeQocQe/hXKMcolRzgkcVX/7kK4zoWbw==", - "dev": true, - "dependencies": { - "rimraf": "~2.5.2" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/temp-fs/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/temp-fs/node_modules/rimraf": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.4.tgz", - "integrity": "sha512-Lw7SHMjssciQb/rRz7JyPIy9+bbUshEucPoLRvWqy09vC5zQixl8Uet+Zl+SROBB/JMWHJRdCk1qdxNWHNMvlQ==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "dependencies": { - "glob": "^7.0.5" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/terser": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.0.tgz", - "integrity": "sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==", - "dev": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.14", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", - "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "jest-worker": "^27.4.5", - "schema-utils": "^4.3.0", - "serialize-javascript": "^6.0.2", - "terser": "^5.31.1" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/terser-webpack-plugin/node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/terser-webpack-plugin/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/terser/node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/test-exclude/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/text-decoder": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", - "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", - "dependencies": { - "b4a": "^1.6.4" - } - }, - "node_modules/text-extensions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", - "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/text-hex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", - "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", - "dev": true - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" - }, - "node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/through2/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/through2/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/through2/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/through2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true - }, - "node_modules/tmp": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", - "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", - "dev": true, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/totalist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/tough-cookie": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", - "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", - "dev": true, - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tough-cookie/node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/tr46": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", - "dev": true, - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "bin": { - "tree-kill": "cli.js" - } - }, - "node_modules/treeverse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/treeverse/-/treeverse-3.0.0.tgz", - "integrity": "sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/triple-beam": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", - "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", - "dev": true, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/ts-api-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", - "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.12" - }, - "peerDependencies": { - "typescript": ">=4.8.4" - } - }, - "node_modules/ts-debounce": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/ts-debounce/-/ts-debounce-4.0.0.tgz", - "integrity": "sha512-+1iDGY6NmOGidq7i7xZGA4cm8DAa6fqdYcvO5Z6yBevH++Bdo9Qt/mN0TzHUgcCcKv1gmh9+W5dHqz8pMWbCbg==", - "dev": true - }, - "node_modules/ts-jest": { - "version": "29.1.5", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.5.tgz", - "integrity": "sha512-UuClSYxM7byvvYfyWdFI+/2UxMmwNyJb0NPkZPQE2hew3RurV7l7zURgOHAd/1I1ZdPpe3GUsXNXAcN8TFKSIg==", - "dev": true, - "dependencies": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^29.0.0", - "json5": "^2.2.3", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "^7.5.3", - "yargs-parser": "^21.0.1" - }, - "bin": { - "ts-jest": "cli.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "@babel/core": ">=7.0.0-beta.0 <8", - "@jest/transform": "^29.0.0", - "@jest/types": "^29.0.0", - "babel-jest": "^29.0.0", - "jest": "^29.0.0", - "typescript": ">=4.3 <6" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "@jest/transform": { - "optional": true - }, - "@jest/types": { - "optional": true - }, - "babel-jest": { - "optional": true - }, - "esbuild": { - "optional": true - } - } - }, - "node_modules/ts-loader": { - "version": "9.5.2", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.2.tgz", - "integrity": "sha512-Qo4piXvOTWcMGIgRiuFa6nHNm+54HbYaZCKqc9eeZCLRy3XqafQgwX2F7mofrbJG3g7EEb+lkiR+z2Lic2s3Zw==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "enhanced-resolve": "^5.0.0", - "micromatch": "^4.0.0", - "semver": "^7.3.4", - "source-map": "^0.7.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "typescript": "*", - "webpack": "^5.0.0" - } - }, - "node_modules/ts-loader/node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "devOptional": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/ts-patch": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/ts-patch/-/ts-patch-3.3.0.tgz", - "integrity": "sha512-zAOzDnd5qsfEnjd9IGy1IRuvA7ygyyxxdxesbhMdutt8AHFjD8Vw8hU2rMF89HX1BKRWFYqKHrO8Q6lw0NeUZg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.2", - "global-prefix": "^4.0.0", - "minimist": "^1.2.8", - "resolve": "^1.22.2", - "semver": "^7.6.3", - "strip-ansi": "^6.0.1" - }, - "bin": { - "ts-patch": "bin/ts-patch.js", - "tspc": "bin/tspc.js" - } - }, - "node_modules/tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", - "dev": true, - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/tsconfig-paths/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" - }, - "node_modules/tuf-js": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-2.2.1.tgz", - "integrity": "sha512-GwIJau9XaA8nLVbUXsN3IlFi7WmQ48gBUrl3FTkkL/XLu/POhBzfmX9hd33FNMX1qAsfl6ozO1iMmW9NC8YniA==", - "dev": true, - "dependencies": { - "@tufjs/models": "2.0.1", - "debug": "^4.3.4", - "make-fetch-happen": "^13.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "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, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "engines": { - "node": ">=4" - } - }, - "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, - "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, - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", - "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", - "dependencies": { - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", - "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.15", - "reflect.getprototypeof": "^1.0.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", - "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0", - "reflect.getprototypeof": "^1.0.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "dev": true - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typedoc": { - "version": "0.27.9", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.27.9.tgz", - "integrity": "sha512-/z585740YHURLl9DN2jCWe6OW7zKYm6VoQ93H0sxZ1cwHQEQrUn5BJrEnkWhfzUdyO+BLGjnKUZ9iz9hKloFDw==", - "dev": true, - "dependencies": { - "@gerrit0/mini-shiki": "^1.24.0", - "lunr": "^2.3.9", - "markdown-it": "^14.1.0", - "minimatch": "^9.0.5", - "yaml": "^2.6.1" - }, - "bin": { - "typedoc": "bin/typedoc" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "typescript": "5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x" - } - }, - "node_modules/typedoc/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/typedoc/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/typescript": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", - "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", - "devOptional": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/uc.micro": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", - "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", - "dev": true - }, - "node_modules/uglify-js": { - "version": "3.19.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", - "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/unbox-primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", - "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", - "dependencies": { - "call-bound": "^1.0.3", - "has-bigints": "^1.0.2", - "has-symbols": "^1.1.0", - "which-boxed-primitive": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/unbzip2-stream": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", - "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", - "dependencies": { - "buffer": "^5.2.1", - "through": "^2.3.8" - } - }, - "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==" - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", - "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", - "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unique-filename": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", - "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", - "dev": true, - "dependencies": { - "unique-slug": "^4.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/unique-slug": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", - "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/universal-user-agent": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", - "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", - "dev": true - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/upath": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz", - "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==", - "dev": true, - "engines": { - "node": ">=4", - "yarn": "*" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url-loader": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", - "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", - "dev": true, - "dependencies": { - "loader-utils": "^2.0.0", - "mime-types": "^2.1.27", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "file-loader": "*", - "webpack": "^4.0.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "file-loader": { - "optional": true - } - } - }, - "node_modules/url-loader/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/url-loader/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/url-loader/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/url-loader/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/urlpattern-polyfill": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", - "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==" - }, - "node_modules/utf-8-validate": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", - "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", - "hasInstallScript": true, - "optional": true, - "dependencies": { - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=6.14.2" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "devOptional": true - }, - "node_modules/util.promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.1.3.tgz", - "integrity": "sha512-GIEaZ6o86fj09Wtf0VfZ5XP7tmd4t3jM5aZCgmBi231D0DB1AEBa3Aa6MP48DMsAIi96WkpWLimIWVwOjbDMOw==", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-data-property": "^1.1.4", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "for-each": "^0.3.3", - "get-intrinsic": "^1.2.6", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "object.getownpropertydescriptors": "^2.1.8", - "safe-array-concat": "^1.1.3" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", - "dev": true - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "devOptional": true - }, - "node_modules/v8-to-istanbul": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", - "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/validate-npm-package-name": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", - "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vite": { - "version": "6.2.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.5.tgz", - "integrity": "sha512-j023J/hCAa4pRIUH6J9HemwYfjB5llR2Ps0CWeikOtdR8+pAURAk0DoJC5/mm9kd+UgdnIy7d6HE4EAvlYhPhA==", - "dev": true, - "dependencies": { - "esbuild": "^0.25.0", - "postcss": "^8.5.3", - "rollup": "^4.30.1" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "jiti": ">=1.21.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/w3c-xmlserializer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", - "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", - "dev": true, - "dependencies": { - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/wait-on": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-8.0.3.tgz", - "integrity": "sha512-nQFqAFzZDeRxsu7S3C7LbuxslHhk+gnJZHyethuGKAn2IVleIbTB9I3vJSQiSR+DifUqmdzfPMoMPJfLqMF2vw==", - "dependencies": { - "axios": "^1.8.2", - "joi": "^17.13.3", - "lodash": "^4.17.21", - "minimist": "^1.2.8", - "rxjs": "^7.8.2" - }, - "bin": { - "wait-on": "bin/wait-on" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/walk-up-path": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-3.0.1.tgz", - "integrity": "sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==", - "dev": true - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/watchpack": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", - "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", - "dev": true, - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/webpack": { - "version": "5.99.5", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.99.5.tgz", - "integrity": "sha512-q+vHBa6H9qwBLUlHL4Y7L0L1/LlyBKZtS9FHNCQmtayxjI5RKC9yD8gpvLeqGv5lCQp1Re04yi0MF40pf30Pvg==", - "dev": true, - "dependencies": { - "@types/eslint-scope": "^3.7.7", - "@types/estree": "^1.0.6", - "@webassemblyjs/ast": "^1.14.1", - "@webassemblyjs/wasm-edit": "^1.14.1", - "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.14.0", - "browserslist": "^4.24.0", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.1", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^4.3.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.11", - "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-bundle-analyzer": { - "version": "4.10.2", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz", - "integrity": "sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==", - "dev": true, - "dependencies": { - "@discoveryjs/json-ext": "0.5.7", - "acorn": "^8.0.4", - "acorn-walk": "^8.0.0", - "commander": "^7.2.0", - "debounce": "^1.2.1", - "escape-string-regexp": "^4.0.0", - "gzip-size": "^6.0.0", - "html-escaper": "^2.0.2", - "opener": "^1.5.2", - "picocolors": "^1.0.0", - "sirv": "^2.0.3", - "ws": "^7.3.1" - }, - "bin": { - "webpack-bundle-analyzer": "lib/bin/analyzer.js" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/webpack-bundle-analyzer/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/webpack-bundle-analyzer/node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "dev": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/webpack-cli": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", - "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", - "dev": true, - "dependencies": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^2.1.1", - "@webpack-cli/info": "^2.0.2", - "@webpack-cli/serve": "^2.0.5", - "colorette": "^2.0.14", - "commander": "^10.0.1", - "cross-spawn": "^7.0.3", - "envinfo": "^7.7.3", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^3.1.1", - "rechoir": "^0.8.0", - "webpack-merge": "^5.7.3" - }, - "bin": { - "webpack-cli": "bin/cli.js" - }, - "engines": { - "node": ">=14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "5.x.x" - }, - "peerDependenciesMeta": { - "@webpack-cli/generators": { - "optional": true - }, - "webpack-bundle-analyzer": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - } - } - }, - "node_modules/webpack-cli/node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "dev": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/webpack-dev-middleware": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", - "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", - "dev": true, - "dependencies": { - "colorette": "^2.0.10", - "memfs": "^3.4.3", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/webpack-dev-server": { - "version": "4.15.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", - "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", - "dev": true, - "dependencies": { - "@types/bonjour": "^3.5.9", - "@types/connect-history-api-fallback": "^1.3.5", - "@types/express": "^4.17.13", - "@types/serve-index": "^1.9.1", - "@types/serve-static": "^1.13.10", - "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.5", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.0.11", - "chokidar": "^3.5.3", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", - "graceful-fs": "^4.2.6", - "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.0.1", - "launch-editor": "^2.6.0", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "rimraf": "^3.0.2", - "schema-utils": "^4.0.0", - "selfsigned": "^2.1.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.4", - "ws": "^8.13.0" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.37.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - }, - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-dev-server/node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/webpack-dev-server/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/webpack-dev-server/node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/webpack-dev-server/node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/webpack-dev-server/node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "dev": true, - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/webpack-dev-server/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/webpack-merge": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", - "dev": true, - "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack/node_modules/acorn": { - "version": "8.14.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", - "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/webpack/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/webpack/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/webpack/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dev": true, - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/whatwg-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", - "dev": true, - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/whatwg-mimetype": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-url": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", - "dev": true, - "dependencies": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", - "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", - "dependencies": { - "is-bigint": "^1.1.0", - "is-boolean-object": "^1.2.1", - "is-number-object": "^1.1.1", - "is-string": "^1.1.1", - "is-symbol": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", - "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", - "dependencies": { - "call-bound": "^1.0.2", - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.1.0", - "is-finalizationregistry": "^1.1.0", - "is-generator-function": "^1.0.10", - "is-regex": "^1.2.1", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.1.0", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-module": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", - "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", - "dev": true - }, - "node_modules/which-typed-array": { - "version": "1.1.19", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", - "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "for-each": "^0.3.5", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "devOptional": true, - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/wide-align/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "devOptional": true - }, - "node_modules/wide-align/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "devOptional": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wildcard": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", - "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", - "dev": true - }, - "node_modules/winston": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.13.0.tgz", - "integrity": "sha512-rwidmA1w3SE4j0E5MuIufFhyJPBDG7Nu71RkZor1p2+qHvJSZ9GYDA81AyleQcZbh/+V6HjeBdfnTZJm9rSeQQ==", - "dev": true, - "dependencies": { - "@colors/colors": "^1.6.0", - "@dabh/diagnostics": "^2.0.2", - "async": "^3.2.3", - "is-stream": "^2.0.0", - "logform": "^2.4.0", - "one-time": "^1.0.0", - "readable-stream": "^3.4.0", - "safe-stable-stringify": "^2.3.1", - "stack-trace": "0.0.x", - "triple-beam": "^1.3.0", - "winston-transport": "^4.7.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/winston-transport": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", - "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", - "dev": true, - "dependencies": { - "logform": "^2.7.0", - "readable-stream": "^3.6.2", - "triple-beam": "^1.3.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==" - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/write-file-atomic/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "node_modules/write-json-file": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-3.2.0.tgz", - "integrity": "sha512-3xZqT7Byc2uORAatYiP3DHUUAVEkNOswEWNs9H5KXiicRTvzYzYqKjYc4G7p+8pltvAw641lVByKVtMpf+4sYQ==", - "dev": true, - "dependencies": { - "detect-indent": "^5.0.0", - "graceful-fs": "^4.1.15", - "make-dir": "^2.1.0", - "pify": "^4.0.1", - "sort-keys": "^2.0.0", - "write-file-atomic": "^2.4.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/write-json-file/node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/write-json-file/node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/write-json-file/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/write-json-file/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/write-json-file/node_modules/write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "node_modules/write-pkg": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/write-pkg/-/write-pkg-4.0.0.tgz", - "integrity": "sha512-v2UQ+50TNf2rNHJ8NyWttfm/EJUBWMJcx6ZTYZr6Qp52uuegWw/lBkCtCbnYZEmPRNL61m+u67dAmGxo+HTULA==", - "dev": true, - "dependencies": { - "sort-keys": "^2.0.0", - "type-fest": "^0.4.1", - "write-json-file": "^3.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/write-pkg/node_modules/type-fest": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.4.1.tgz", - "integrity": "sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xml": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", - "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==", - "dev": true - }, - "node_modules/xml-name-validator": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/xvfb": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/xvfb/-/xvfb-0.4.0.tgz", - "integrity": "sha512-g55AbjcBL4Bztfn7kiUrR0ne8mMUsFODDJ+HFGf5OuHJqKKccpExX2Qgn7VF2eImw1eoh6+riXHser1J4agrFA==", - "optionalDependencies": { - "sleep": "6.1.0" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, - "node_modules/yaml": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.1.tgz", - "integrity": "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==", - "dev": true, - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "devOptional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zod": { - "version": "3.23.8", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", - "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "packages/dev/addons": { - "name": "@dev/addons", - "version": "1.0.0", - "devDependencies": { - "@dev/core": "^1.0.0" - } - }, - "packages/dev/buildTools": { - "name": "@dev/build-tools", - "version": "1.0.0", - "dependencies": { - "dotenv": "^16.0.0" - }, - "bin": { - "build-tools": "dist/index.js" - }, - "devDependencies": { - "@types/glob": "^7.2.0", - "@types/mv": "^2.1.2", - "@types/node": "^16.11.6", - "mv": "^2.1.1" - } - }, - "packages/dev/buildTools/node_modules/@types/node": { - "version": "16.18.126", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.126.tgz", - "integrity": "sha512-OTcgaiwfGFBKacvfwuHzzn1KLxH/er8mluiy8/uM3sGXHaRe73RrSIj01jow9t4kJEW633Ov+cOexXeiApTyAw==", - "dev": true - }, - "packages/dev/core": { - "name": "@dev/core", - "version": "1.0.0", - "devDependencies": { - "@dev/build-tools": "^1.0.0", - "@types/draco3d": "^1.4.3", - "@types/draco3dgltf": "^1.4.0" - } - }, - "packages/dev/gui": { - "name": "@dev/gui", - "version": "1.0.0", - "devDependencies": { - "@dev/core": "^1.0.0" - } - }, - "packages/dev/inspector": { - "name": "@dev/inspector", - "version": "1.0.0", - "devDependencies": { - "@dev/core": "^1.0.0", - "@dev/gui": "^1.0.0", - "@dev/loaders": "^1.0.0", - "@dev/materials": "^1.0.0", - "@dev/serializers": "^1.0.0", - "@dev/shared-ui-components": "^1.0.0", - "@fortawesome/fontawesome-svg-core": "^6.1.0", - "@fortawesome/free-regular-svg-icons": "^6.0.0", - "@fortawesome/free-solid-svg-icons": "^6.0.0", - "@fortawesome/react-fontawesome": "^0.2.0", - "@types/react": "^18.0.0", - "@types/react-dom": "^18.0.0", - "gif.js.optimized": "^1.0.1", - "re-resizable": "^6.9.1", - "react": "^18.2.0", - "react-contextmenu": "RaananW/react-contextmenu#4cb92c957ebff7aee6fc3b0ace61bc143a7373f2", - "react-dom": "^18.2.0", - "sass": "^1.62.1" - } - }, - "packages/dev/loaders": { - "name": "@dev/loaders", - "version": "1.0.0", - "devDependencies": { - "@dev/core": "^1.0.0" - } - }, - "packages/dev/materials": { - "name": "@dev/materials", - "version": "1.0.0", - "devDependencies": { - "@dev/build-tools": "^1.0.0", - "@dev/core": "^1.0.0" - } - }, - "packages/dev/postProcesses": { - "name": "@dev/post-processes", - "version": "1.0.0", - "devDependencies": { - "@dev/build-tools": "^1.0.0", - "@dev/core": "^1.0.0" - } - }, - "packages/dev/proceduralTextures": { - "name": "@dev/procedural-textures", - "version": "1.0.0", - "devDependencies": { - "@dev/build-tools": "^1.0.0", - "@dev/core": "^1.0.0" - } - }, - "packages/dev/serializers": { - "name": "@dev/serializers", - "version": "1.0.0", - "devDependencies": { - "@dev/core": "^1.0.0" - } - }, - "packages/dev/sharedUiComponents": { - "name": "@dev/shared-ui-components", - "version": "1.0.0", - "devDependencies": { - "@babel/core": "^7.17.9", - "@dev/core": "^1.0.0", - "@dev/gui": "^1.0.0", - "@fortawesome/fontawesome-svg-core": "^6.1.0", - "@fortawesome/free-solid-svg-icons": "^6.0.0", - "@fortawesome/react-fontawesome": "^0.2.0", - "sass": "^1.62.1" - }, - "peerDependencies": { - "@fortawesome/fontawesome-svg-core": "^6.1.0", - "@fortawesome/free-solid-svg-icons": "^6.1.0", - "@fortawesome/react-fontawesome": "^0.2.0", - "@types/react": "^18.0.0", - "@types/react-dom": "^18.0.0", - "react": "^18.2.0", - "react-dnd": "15.0.1", - "react-dnd-touch-backend": "15.0.1", - "react-dom": "^18.2.0" - } - }, - "packages/lts/core": { - "name": "@lts/core", - "version": "1.0.0", - "devDependencies": { - "@dev/core": "^1.0.0" - } - }, - "packages/lts/gui": { - "name": "@lts/gui", - "version": "1.0.0", - "dependencies": { - "@lts/core": "^1.0.0" - }, - "devDependencies": { - "@dev/gui": "^1.0.0" - } - }, - "packages/lts/loaders": { - "name": "@lts/loaders", - "version": "1.0.0", - "dependencies": { - "@lts/core": "^1.0.0" - }, - "devDependencies": { - "@dev/loaders": "^1.0.0" - } - }, - "packages/lts/materials": { - "name": "@lts/materials", - "version": "1.0.0", - "dependencies": { - "@lts/core": "^1.0.0" - }, - "devDependencies": { - "@dev/materials": "^1.0.0" - } - }, - "packages/lts/postProcesses": { - "name": "@lts/post-processes", - "version": "1.0.0", - "dependencies": { - "@lts/core": "^1.0.0" - }, - "devDependencies": { - "@dev/post-processes": "^1.0.0" - } - }, - "packages/lts/proceduralTextures": { - "name": "@lts/procedural-textures", - "version": "1.0.0", - "dependencies": { - "@lts/core": "^1.0.0" - }, - "devDependencies": { - "@dev/procedural-textures": "^1.0.0" - } - }, - "packages/lts/serializers": { - "name": "@lts/serializers", - "version": "1.0.0", - "dependencies": { - "@lts/core": "^1.0.0" - }, - "devDependencies": { - "@dev/serializers": "^1.0.0" - } - }, - "packages/public/@babylonjs/accessibility": { - "version": "8.6.1", - "license": "Apache-2.0", - "devDependencies": { - "@babylonjs/core": "^8.6.1", - "@babylonjs/gui": "^8.6.1", - "react": "^18.2.0", - "react-dom": "^18.2.0" - }, - "peerDependencies": { - "@babylonjs/core": "^8.0.0", - "@babylonjs/gui": "^8.0.0", - "@types/react": ">=16.7.3", - "@types/react-dom": ">=16.0.9" - } - }, - "packages/public/@babylonjs/addons": { - "version": "8.6.1", - "license": "Apache-2.0", - "devDependencies": { - "@babylonjs/core": "^8.6.1", - "@dev/addons": "^1.0.0", - "@dev/build-tools": "^1.0.0" - }, - "peerDependencies": { - "@babylonjs/core": "^8.0.0" - } - }, - "packages/public/@babylonjs/core": { - "version": "8.6.1", - "license": "Apache-2.0", - "devDependencies": { - "@dev/build-tools": "^1.0.0", - "@lts/core": "^1.0.0" - } - }, - "packages/public/@babylonjs/gui": { - "version": "8.6.1", - "license": "Apache-2.0", - "devDependencies": { - "@babylonjs/core": "^8.6.1", - "@dev/build-tools": "^1.0.0", - "@lts/gui": "1.0.0" - }, - "peerDependencies": { - "@babylonjs/core": "^8.0.0" - } - }, - "packages/public/@babylonjs/gui-editor": { - "version": "8.6.1", - "license": "Apache-2.0", - "devDependencies": { - "@babylonjs/core": "^8.6.1", - "@babylonjs/gui": "^8.6.1", - "react": "^18.2.0", - "react-dom": "^18.2.0" - }, - "peerDependencies": { - "@babylonjs/core": "^8.0.0", - "@babylonjs/gui": "^8.0.0", - "@types/react": ">=16.7.3", - "@types/react-dom": ">=16.0.9" - } - }, - "packages/public/@babylonjs/inspector": { - "version": "8.6.1", - "license": "Apache-2.0", - "dependencies": { - "@fortawesome/fontawesome-svg-core": "^6.1.0", - "@fortawesome/free-regular-svg-icons": "^6.0.0", - "@fortawesome/free-solid-svg-icons": "^6.0.0" - }, - "devDependencies": { - "@babylonjs/core": "^8.6.1", - "@babylonjs/gui": "^8.6.1", - "@babylonjs/gui-editor": "^8.6.1", - "@babylonjs/loaders": "^8.6.1", - "@babylonjs/materials": "^8.6.1", - "@babylonjs/serializers": "^8.6.1", - "@lts/gui": "1.0.0", - "react": "^18.2.0", - "react-dom": "^18.2.0" - }, - "peerDependencies": { - "@babylonjs/core": "^8.0.0", - "@babylonjs/gui": "^8.0.0", - "@babylonjs/gui-editor": "^8.0.0", - "@babylonjs/loaders": "^8.0.0", - "@babylonjs/materials": "^8.0.0", - "@babylonjs/serializers": "^8.0.0", - "@types/react": ">=16.7.3", - "@types/react-dom": ">=16.0.9" - } - }, - "packages/public/@babylonjs/ktx2decoder": { - "version": "8.6.1", - "license": "Apache-2.0", - "devDependencies": { - "@babylonjs/core": "^8.6.1", - "@dev/build-tools": "^1.0.0", - "@tools/ktx2decoder": "^1.0.0" - }, - "peerDependencies": { - "@babylonjs/core": "^8.0.0" - } - }, - "packages/public/@babylonjs/loaders": { - "version": "8.6.1", - "license": "Apache-2.0", - "devDependencies": { - "@babylonjs/core": "^8.6.1", - "@dev/build-tools": "^1.0.0", - "@lts/loaders": "^1.0.0", - "babylonjs-gltf2interface": "^8.6.1" - }, - "peerDependencies": { - "@babylonjs/core": "^8.0.0", - "babylonjs-gltf2interface": "^8.0.0" - } - }, - "packages/public/@babylonjs/materials": { - "version": "8.6.1", - "license": "Apache-2.0", - "devDependencies": { - "@babylonjs/core": "^8.6.1", - "@dev/build-tools": "^1.0.0", - "@lts/materials": "^1.0.0" - }, - "peerDependencies": { - "@babylonjs/core": "^8.0.0" - } - }, - "packages/public/@babylonjs/node-editor": { - "version": "8.6.1", - "license": "Apache-2.0", - "devDependencies": { - "@babylonjs/core": "^8.6.1", - "react": "^18.2.0", - "react-dom": "^18.2.0" - }, - "peerDependencies": { - "@babylonjs/core": "^8.0.0", - "@types/react": ">=16.7.3", - "@types/react-dom": ">=16.0.9" - } - }, - "packages/public/@babylonjs/node-geometry-editor": { - "version": "8.6.1", - "license": "Apache-2.0", - "devDependencies": { - "@babylonjs/core": "^8.6.1", - "react": "^18.2.0", - "react-dom": "^18.2.0" - }, - "peerDependencies": { - "@babylonjs/core": "^8.0.0", - "@types/react": ">=16.7.3", - "@types/react-dom": ">=16.0.9" - } - }, - "packages/public/@babylonjs/node-render-graph-editor": { - "version": "8.6.1", - "license": "Apache-2.0", - "devDependencies": { - "@babylonjs/core": "^8.6.1", - "react": "^18.2.0", - "react-dom": "^18.2.0" - }, - "peerDependencies": { - "@babylonjs/core": "^8.0.0", - "@types/react": ">=16.7.3", - "@types/react-dom": ">=16.0.9" - } - }, - "packages/public/@babylonjs/post-processes": { - "version": "8.6.1", - "license": "Apache-2.0", - "devDependencies": { - "@babylonjs/core": "^8.6.1", - "@dev/build-tools": "^1.0.0", - "@lts/post-processes": "^1.0.0" - }, - "peerDependencies": { - "@babylonjs/core": "^8.0.0" - } - }, - "packages/public/@babylonjs/procedural-textures": { - "version": "8.6.1", - "license": "Apache-2.0", - "devDependencies": { - "@babylonjs/core": "^8.6.1", - "@dev/build-tools": "^1.0.0", - "@lts/procedural-textures": "^1.0.0" - }, - "peerDependencies": { - "@babylonjs/core": "^8.0.0" - } - }, - "packages/public/@babylonjs/serializers": { - "version": "8.6.1", - "license": "Apache-2.0", - "devDependencies": { - "@babylonjs/core": "^8.6.1", - "@dev/build-tools": "^1.0.0", - "@lts/serializers": "^1.0.0", - "babylonjs-gltf2interface": "^8.6.1" - }, - "peerDependencies": { - "@babylonjs/core": "^8.0.0", - "babylonjs-gltf2interface": "^8.0.0" - } - }, - "packages/public/@babylonjs/shared-ui-components": { - "version": "8.6.1", - "license": "Apache-2.0", - "devDependencies": { - "@dev/build-tools": "^1.0.0", - "@lts/core": "1.0.0", - "@lts/gui": "1.0.0" - }, - "peerDependencies": { - "@types/dagre": "^0.7.47", - "dagre": "^0.8.5", - "react": "^18.2.0", - "react-dnd": "15.0.1", - "react-dnd-touch-backend": "15.0.1", - "react-dom": "^18.2.0" - } - }, - "packages/public/@babylonjs/test-tools": { - "version": "0.1.0", - "license": "Apache-2.0", - "dependencies": { - "jest": "^29.7.0", - "jest-puppeteer": "^10.0.1" - }, - "devDependencies": { - "@alex_neo/jest-expect-message": "~1.0.5", - "puppeteer": "^22.1.0" - }, - "optionalDependencies": { - "@alex_neo/jest-expect-message": "~1.0.5" - }, - "peerDependencies": { - "puppeteer": ">20.0.0" - } - }, - "packages/public/@babylonjs/viewer": { - "version": "8.6.1", - "license": "Apache-2.0", - "dependencies": { - "lit": "^3.2.0" - }, - "devDependencies": { - "@babylonjs/core": "^8.6.1", - "@babylonjs/loaders": "^8.6.1", - "@dev/build-tools": "^1.0.0", - "@rollup/plugin-alias": "^5.1.0", - "@rollup/plugin-commonjs": "^26.0.1", - "@rollup/plugin-node-resolve": "^15.2.3", - "@rollup/plugin-terser": "^0.4.4", - "@rollup/plugin-typescript": "^11.1.6", - "chalk": "^5.3.0", - "rollup": "^4.18.0", - "rollup-plugin-dts": "^6.1.1", - "rollup-plugin-minify-template-literals": "^1.1.7", - "vite": "^6.2.1" - }, - "peerDependencies": { - "@babylonjs/core": "^8.0.0", - "@babylonjs/loaders": "^8.0.0" - } - }, - "packages/public/@babylonjs/viewer/node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "packages/public/babylonjs-viewer-assets": { - "version": "8.6.1", - "license": "Apache-2.0", - "devDependencies": { - "html-loader": "^3.1.0", - "webpack": "^5.98.0", - "webpack-cli": "^5.1.0", - "webpack-merge": "^5.8.0" - }, - "engines": { - "node": "*" - } - }, - "packages/public/glTF2Interface": { - "name": "babylonjs-gltf2interface", - "version": "8.6.1", - "license": "Apache-2.0" - }, - "packages/public/umd/babylonjs": { - "version": "8.6.1", - "hasInstallScript": true, - "license": "Apache-2.0", - "devDependencies": { - "@dev/build-tools": "1.0.0", - "source-map-loader": "^4.0.0", - "ts-loader": "^9.2.6", - "webpack": "^5.98.0", - "webpack-cli": "^5.1.0", - "webpack-merge": "^5.8.0" - } - }, - "packages/public/umd/babylonjs-accessibility": { - "version": "8.6.1", - "license": "Apache-2.0", - "dependencies": { - "babylonjs": "^8.6.1", - "babylonjs-gui": "^8.6.1" - }, - "devDependencies": { - "@dev/build-tools": "1.0.0", - "@dev/shared-ui-components": "1.0.0", - "@tools/accessibility": "1.0.0", - "@types/react": "^18.0.0", - "@types/react-dom": "^18.0.0", - "css-loader": "^7.1.0", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "sass-loader": "^16.0.0", - "source-map-loader": "^4.0.0", - "ts-loader": "^9.2.6", - "webpack": "^5.98.0", - "webpack-cli": "^5.1.0", - "webpack-merge": "^5.8.0" - } - }, - "packages/public/umd/babylonjs-addons": { - "version": "8.6.1", - "license": "Apache-2.0", - "dependencies": { - "babylonjs": "^8.6.1" - }, - "devDependencies": { - "@dev/build-tools": "1.0.0", - "@dev/core": "1.0.0", - "source-map-loader": "^4.0.0", - "ts-loader": "^9.2.6", - "webpack": "^5.98.0", - "webpack-cli": "^5.1.0", - "webpack-merge": "^5.8.0" - } - }, - "packages/public/umd/babylonjs-gui": { - "version": "8.6.1", - "license": "Apache-2.0", - "dependencies": { - "babylonjs": "^8.6.1" - }, - "devDependencies": { - "@dev/build-tools": "1.0.0", - "@lts/gui": "1.0.0", - "source-map-loader": "^4.0.0", - "ts-loader": "^9.2.6", - "webpack": "^5.98.0", - "webpack-cli": "^5.1.0", - "webpack-merge": "^5.8.0" - } - }, - "packages/public/umd/babylonjs-gui-editor": { - "version": "8.6.1", - "license": "Apache-2.0", - "dependencies": { - "babylonjs": "^8.6.1", - "babylonjs-gui": "^8.6.1" - }, - "devDependencies": { - "@dev/build-tools": "1.0.0", - "@dev/shared-ui-components": "1.0.0", - "@tools/gui-editor": "1.0.0", - "@types/react": "^18.0.0", - "@types/react-dom": "^18.0.0", - "css-loader": "^7.1.0", - "react": "^18.2.0", - "react-contextmenu": "RaananW/react-contextmenu#4cb92c957ebff7aee6fc3b0ace61bc143a7373f2", - "react-dom": "^18.2.0", - "sass-loader": "^16.0.0", - "source-map-loader": "^4.0.0", - "ts-loader": "^9.2.6", - "webpack": "^5.98.0", - "webpack-cli": "^5.1.0", - "webpack-merge": "^5.8.0" - } - }, - "packages/public/umd/babylonjs-inspector": { - "version": "8.6.1", - "license": "Apache-2.0", - "dependencies": { - "babylonjs": "^8.6.1", - "babylonjs-gui": "^8.6.1", - "babylonjs-gui-editor": "^8.6.1", - "babylonjs-loaders": "^8.6.1", - "babylonjs-materials": "^8.6.1", - "babylonjs-serializers": "^8.6.1" - }, - "devDependencies": { - "@dev/build-tools": "1.0.0", - "@dev/inspector": "1.0.0", - "@dev/shared-ui-components": "1.0.0", - "@types/react": "^18.0.0", - "@types/react-dom": "^18.0.0", - "css-loader": "^7.1.0", - "react": "^18.2.0", - "react-contextmenu": "RaananW/react-contextmenu#4cb92c957ebff7aee6fc3b0ace61bc143a7373f2", - "react-dom": "^18.2.0", - "sass-loader": "^16.0.0", - "source-map-loader": "^4.0.0", - "ts-loader": "^9.2.6", - "webpack": "^5.98.0", - "webpack-cli": "^5.1.0", - "webpack-merge": "^5.8.0" - } - }, - "packages/public/umd/babylonjs-ktx2decoder": { - "version": "8.6.1", - "license": "Apache-2.0", - "dependencies": { - "babylonjs": "^8.6.1" - }, - "devDependencies": { - "@dev/build-tools": "1.0.0", - "@tools/ktx2decoder": "1.0.0", - "source-map-loader": "^4.0.0", - "ts-loader": "^9.2.6", - "webpack": "^5.98.0", - "webpack-cli": "^5.1.0", - "webpack-merge": "^5.8.0" - } - }, - "packages/public/umd/babylonjs-loaders": { - "version": "8.6.1", - "license": "Apache-2.0", - "dependencies": { - "babylonjs": "^8.6.1", - "babylonjs-gltf2interface": "^8.6.1" - }, - "devDependencies": { - "@dev/build-tools": "1.0.0", - "@dev/core": "1.0.0", - "source-map-loader": "^4.0.0", - "ts-loader": "^9.2.6", - "webpack": "^5.98.0", - "webpack-cli": "^5.1.0", - "webpack-merge": "^5.8.0" - } - }, - "packages/public/umd/babylonjs-materials": { - "version": "8.6.1", - "license": "Apache-2.0", - "dependencies": { - "babylonjs": "^8.6.1" - }, - "devDependencies": { - "@dev/build-tools": "1.0.0", - "@dev/core": "1.0.0", - "source-map-loader": "^4.0.0", - "ts-loader": "^9.2.6", - "webpack": "^5.98.0", - "webpack-cli": "^5.1.0", - "webpack-merge": "^5.8.0" - } - }, - "packages/public/umd/babylonjs-node-editor": { - "version": "8.6.1", - "license": "Apache-2.0", - "dependencies": { - "babylonjs": "^8.6.1" - }, - "devDependencies": { - "@dev/build-tools": "1.0.0", - "@dev/shared-ui-components": "1.0.0", - "@tools/node-editor": "1.0.0", - "@types/react": "^18.0.0", - "@types/react-dom": "^18.0.0", - "css-loader": "^7.1.0", - "react": "^18.2.0", - "react-contextmenu": "RaananW/react-contextmenu#4cb92c957ebff7aee6fc3b0ace61bc143a7373f2", - "react-dom": "^18.2.0", - "sass-loader": "^16.0.0", - "source-map-loader": "^4.0.0", - "ts-loader": "^9.2.6", - "webpack": "^5.98.0", - "webpack-cli": "^5.1.0", - "webpack-merge": "^5.8.0" - } - }, - "packages/public/umd/babylonjs-node-geometry-editor": { - "version": "8.6.1", - "license": "Apache-2.0", - "dependencies": { - "babylonjs": "^8.6.1" - }, - "devDependencies": { - "@dev/build-tools": "1.0.0", - "@dev/shared-ui-components": "1.0.0", - "@tools/node-geometry-editor": "1.0.0", - "@types/react": "^18.0.0", - "@types/react-dom": "^18.0.0", - "css-loader": "^7.1.0", - "react": "^18.2.0", - "react-contextmenu": "RaananW/react-contextmenu#4cb92c957ebff7aee6fc3b0ace61bc143a7373f2", - "react-dom": "^18.2.0", - "sass-loader": "^16.0.0", - "source-map-loader": "^4.0.0", - "ts-loader": "^9.2.6", - "webpack": "^5.98.0", - "webpack-cli": "^5.1.0", - "webpack-merge": "^5.8.0" - } - }, - "packages/public/umd/babylonjs-node-render-graph-editor": { - "version": "8.6.1", - "license": "Apache-2.0", - "dependencies": { - "babylonjs": "^8.6.1" - }, - "devDependencies": { - "@dev/build-tools": "1.0.0", - "@dev/shared-ui-components": "1.0.0", - "@tools/node-render-graph-editor": "1.0.0", - "@types/react": "^18.0.0", - "@types/react-dom": "^18.0.0", - "css-loader": "^7.1.0", - "react": "^18.2.0", - "react-contextmenu": "RaananW/react-contextmenu#4cb92c957ebff7aee6fc3b0ace61bc143a7373f2", - "react-dom": "^18.2.0", - "sass-loader": "^13.0.0", - "source-map-loader": "^4.0.0", - "ts-loader": "^9.2.6", - "webpack": "^5.98.0", - "webpack-cli": "^5.1.0", - "webpack-merge": "^5.8.0" - } - }, - "packages/public/umd/babylonjs-node-render-graph-editor/node_modules/sass-loader": { - "version": "13.3.3", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.3.3.tgz", - "integrity": "sha512-mt5YN2F1MOZr3d/wBRcZxeFgwgkH44wVc2zohO2YF6JiOMkiXe4BYRZpSu2sO1g71mo/j16txzUhsKZlqjVGzA==", - "dev": true, - "dependencies": { - "neo-async": "^2.6.2" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "fibers": ">= 3.1.0", - "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", - "sass": "^1.3.0", - "sass-embedded": "*", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "fibers": { - "optional": true - }, - "node-sass": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - } - } - }, - "packages/public/umd/babylonjs-post-process": { - "version": "8.6.1", - "license": "Apache-2.0", - "dependencies": { - "babylonjs": "^8.6.1" - }, - "devDependencies": { - "@dev/build-tools": "1.0.0", - "@dev/core": "1.0.0", - "source-map-loader": "^4.0.0", - "ts-loader": "^9.2.6", - "webpack": "^5.98.0", - "webpack-cli": "^5.1.0", - "webpack-merge": "^5.8.0" - } - }, - "packages/public/umd/babylonjs-procedural-textures": { - "version": "8.6.1", - "license": "Apache-2.0", - "dependencies": { - "babylonjs": "^8.6.1" - }, - "devDependencies": { - "@dev/build-tools": "1.0.0", - "@dev/core": "1.0.0", - "source-map-loader": "^4.0.0", - "ts-loader": "^9.2.6", - "webpack": "^5.98.0", - "webpack-cli": "^5.1.0", - "webpack-merge": "^5.8.0" - } - }, - "packages/public/umd/babylonjs-serializers": { - "version": "8.6.1", - "license": "Apache-2.0", - "dependencies": { - "babylonjs": "^8.6.1", - "babylonjs-gltf2interface": "^8.6.1" - }, - "devDependencies": { - "@dev/build-tools": "1.0.0", - "@dev/core": "1.0.0", - "source-map-loader": "^4.0.0", - "ts-loader": "^9.2.6", - "webpack": "^5.98.0", - "webpack-cli": "^5.1.0", - "webpack-merge": "^5.8.0" - } - }, - "packages/public/umd/babylonjs-testproject": { - "version": "1.0.0" - }, - "packages/tools/accessibility": { - "name": "@tools/accessibility", - "version": "1.0.0", - "devDependencies": { - "@dev/core": "^1.0.0", - "@dev/gui": "^1.0.0", - "@dev/loaders": "^1.0.0", - "@types/react": "^18.0.0", - "@types/react-dom": "^18.0.0", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "sass": "^1.62.1" - } - }, - "packages/tools/babylonServer": { - "name": "@tools/babylon-server", - "version": "1.0.0", - "devDependencies": { - "@dev/addons": "1.0.0", - "@dev/build-tools": "1.0.0", - "@dev/core": "1.0.0", - "@dev/gui": "1.0.0", - "@dev/inspector": "1.0.0", - "@dev/loaders": "1.0.0", - "@dev/post-processes": "1.0.0", - "@dev/procedural-textures": "1.0.0", - "@dev/serializers": "1.0.0", - "@dev/shared-ui-components": "1.0.0", - "@lts/core": "1.0.0", - "@lts/gui": "1.0.0", - "@lts/loaders": "1.0.0", - "@lts/post-processes": "1.0.0", - "@lts/procedural-textures": "1.0.0", - "@lts/serializers": "1.0.0", - "@tools/gui-editor": "1.0.0", - "@tools/ktx2decoder": "1.0.0", - "@tools/node-editor": "1.0.0", - "mini-css-extract-plugin": "^2.5.3", - "source-map-loader": "^4.0.0", - "style-loader": "^3.3.1", - "ts-loader": "^9.2.6", - "webpack": "^5.98.0", - "webpack-cli": "^5.1.0", - "webpack-dev-server": "^4.7.3", - "webpack-merge": "^5.8.0" - } - }, - "packages/tools/devHost": { - "name": "@tools/dev-host", - "version": "1.0.0", - "devDependencies": { - "@dev/build-tools": "1.0.0", - "@dev/core": "1.0.0", - "@dev/gui": "1.0.0", - "@dev/loaders": "1.0.0", - "@dev/post-processes": "1.0.0", - "@dev/procedural-textures": "1.0.0", - "@dev/serializers": "1.0.0", - "@tools/accessibility": "1.0.0", - "babylonjs-gltf2interface": "^6.42.0", - "html-webpack-plugin": "^5.5.0", - "source-map-loader": "^4.0.0", - "ts-loader": "^9.2.6", - "webpack": "^5.98.0", - "webpack-bundle-analyzer": "^4.10.1", - "webpack-cli": "^5.1.0", - "webpack-dev-server": "^4.7.4", - "webpack-merge": "^5.8.0" - } - }, - "packages/tools/devHost/node_modules/babylonjs-gltf2interface": { - "version": "6.49.0", - "resolved": "https://registry.npmjs.org/babylonjs-gltf2interface/-/babylonjs-gltf2interface-6.49.0.tgz", - "integrity": "sha512-4qzKCgEayti/YUaeMgAAZxZJlx/kLqXxoC+G8gODYz9wOV9UjnHF09wREZ5cuELzzY/rjSJMqkgDfYbUQIQ6/A==", - "dev": true - }, - "packages/tools/eslintBabylonPlugin": { - "name": "eslint-plugin-babylonjs", - "version": "1.0.0", - "license": "Apache-2.0", - "dependencies": { - "@microsoft/tsdoc": "~0.14.1", - "@microsoft/tsdoc-config": "~0.16.1" - }, - "devDependencies": { - "@types/eslint": "^8.56.10" - } - }, - "packages/tools/eslintBabylonPlugin/node_modules/@types/eslint": { - "version": "8.56.12", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.12.tgz", - "integrity": "sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==", - "dev": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "packages/tools/guiEditor": { - "name": "@tools/gui-editor", - "version": "1.0.0", - "dependencies": { - "react": "^18.2.0", - "react-dom": "^18.2.0" - }, - "devDependencies": { - "@dev/build-tools": "1.0.0", - "@dev/core": "1.0.0", - "@dev/gui": "1.0.0", - "@dev/shared-ui-components": "1.0.0", - "@svgr/webpack": "^7.0.0", - "@types/dagre": "^0.7.47", - "@types/react": "^18.0.0", - "@types/react-dom": "^18.0.0", - "copy-webpack-plugin": "^11.0.0", - "css-loader": "^7.1.0", - "sass-loader": "^16.0.0", - "split.js": "^1.6.5", - "style-loader": "^3.3.0", - "url-loader": "^4.1.1", - "webpack": "^5.98.0", - "webpack-cli": "^5.1.0", - "webpack-merge": "^5.8.0" - } - }, - "packages/tools/ktx2Decoder": { - "name": "@tools/ktx2decoder", - "version": "1.0.0", - "devDependencies": { - "@dev/build-tools": "1.0.0", - "source-map-loader": "^4.0.0", - "ts-loader": "^9.2.6", - "webpack": "^5.98.0", - "webpack-cli": "^5.1.0", - "webpack-merge": "^5.8.0" - } - }, - "packages/tools/nodeEditor": { - "name": "@tools/node-editor", - "version": "1.0.0", - "dependencies": { - "react": "^18.2.0", - "react-dom": "^18.2.0" - }, - "devDependencies": { - "@dev/build-tools": "1.0.0", - "@dev/core": "1.0.0", - "@dev/shared-ui-components": "1.0.0", - "@svgr/webpack": "^7.0.0", - "@types/dagre": "^0.7.47", - "@types/react": "^18.0.0", - "@types/react-dom": "^18.0.0", - "copy-webpack-plugin": "^11.0.0", - "css-loader": "^7.1.0", - "dagre": "^0.8.5", - "file-loader": "^6.2.0", - "html-webpack-plugin": "^5.4.0", - "mini-css-extract-plugin": "^2.4.3", - "sass-loader": "^16.0.0", - "split.js": "^1.6.5", - "style-loader": "^3.3.0", - "url-loader": "^4.1.1", - "webpack": "^5.98.0", - "webpack-cli": "^5.1.0", - "webpack-merge": "^5.8.0" - } - }, - "packages/tools/nodeGeometryEditor": { - "name": "@tools/node-geometry-editor", - "version": "1.0.0", - "dependencies": { - "react": "^18.2.0", - "react-dom": "^18.2.0" - }, - "devDependencies": { - "@dev/build-tools": "1.0.0", - "@dev/core": "1.0.0", - "@dev/materials": "^1.0.0", - "@dev/serializers": "^1.0.0", - "@dev/shared-ui-components": "1.0.0", - "@svgr/webpack": "^7.0.0", - "@types/dagre": "^0.7.47", - "@types/react": "^18.0.0", - "@types/react-dom": "^18.0.0", - "copy-webpack-plugin": "^11.0.0", - "css-loader": "^7.1.0", - "dagre": "^0.8.5", - "file-loader": "^6.2.0", - "html-webpack-plugin": "^5.4.0", - "mini-css-extract-plugin": "^2.4.3", - "sass-loader": "^16.0.0", - "split.js": "^1.6.5", - "style-loader": "^3.3.0", - "url-loader": "^4.1.1", - "webpack": "^5.98.0", - "webpack-cli": "^5.1.0", - "webpack-merge": "^5.8.0" - } - }, - "packages/tools/nodeRenderGraphEditor": { - "name": "@tools/node-render-graph-editor", - "version": "1.0.0", - "dependencies": { - "react": "^18.2.0", - "react-dom": "^18.2.0" - }, - "devDependencies": { - "@dev/build-tools": "1.0.0", - "@dev/core": "1.0.0", - "@dev/gui": "^1.0.0", - "@dev/serializers": "^1.0.0", - "@dev/shared-ui-components": "1.0.0", - "@svgr/webpack": "^7.0.0", - "@types/dagre": "^0.7.47", - "@types/react": "^18.0.0", - "@types/react-dom": "^18.0.0", - "copy-webpack-plugin": "^11.0.0", - "css-loader": "^7.1.0", - "dagre": "^0.8.5", - "file-loader": "^6.2.0", - "html-webpack-plugin": "^5.4.0", - "mini-css-extract-plugin": "^2.4.3", - "sass-loader": "^13.0.0", - "split.js": "^1.6.5", - "style-loader": "^3.3.0", - "url-loader": "^4.1.1", - "webpack": "^5.98.0", - "webpack-cli": "^5.1.0", - "webpack-merge": "^5.8.0" - } - }, - "packages/tools/nodeRenderGraphEditor/node_modules/sass-loader": { - "version": "13.3.3", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.3.3.tgz", - "integrity": "sha512-mt5YN2F1MOZr3d/wBRcZxeFgwgkH44wVc2zohO2YF6JiOMkiXe4BYRZpSu2sO1g71mo/j16txzUhsKZlqjVGzA==", - "dev": true, - "dependencies": { - "neo-async": "^2.6.2" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "fibers": ">= 3.1.0", - "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", - "sass": "^1.3.0", - "sass-embedded": "*", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "fibers": { - "optional": true - }, - "node-sass": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - } - } - }, - "packages/tools/playground": { - "name": "@tools/playground", - "version": "1.0.0", - "devDependencies": { - "@dev/build-tools": "1.0.0", - "@dev/core": "1.0.0", - "@svgr/webpack": "^7.0.0", - "@types/react": "^18.0.0", - "@types/react-dom": "^18.0.0", - "copy-webpack-plugin": "^11.0.0", - "css-loader": "^7.1.0", - "file-loader": "^6.2.0", - "html-webpack-plugin": "^5.4.0", - "mini-css-extract-plugin": "^2.4.3", - "monaco-editor": "0.27.0", - "monaco-editor-webpack-plugin": "^4.2.0", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "sass-loader": "^16.0.0", - "style-loader": "^3.3.0", - "ts-debounce": "4.0.0", - "url-loader": "^4.1.1", - "webpack": "^5.98.0", - "webpack-cli": "^5.1.0", - "webpack-merge": "^5.8.0" - } - }, - "packages/tools/reflector": { - "name": "@tools/reflector", - "version": "0.0.1", - "dependencies": { - "ws": "^8.5.0" - }, - "devDependencies": { - "@types/ws": "^8.5.2", - "https": "^1.0.0", - "ts-loader": "^9.2.6", - "webpack": "^5.98.0", - "webpack-cli": "^5.1.0" - }, - "optionalDependencies": { - "bufferutil": "^4.0.3", - "utf-8-validate": "^5.0.4" - } - }, - "packages/tools/sandbox": { - "name": "@tools/sandbox", - "version": "1.0.0", - "dependencies": { - "react": "^18.2.0", - "react-dom": "^18.2.0" - }, - "devDependencies": { - "@dev/build-tools": "1.0.0", - "@dev/core": "1.0.0", - "@dev/loaders": "1.0.0", - "@svgr/webpack": "^7.0.0", - "@types/dagre": "^0.7.47", - "@types/react": "^18.0.0", - "@types/react-dom": "^18.0.0", - "copy-webpack-plugin": "^11.0.0", - "css-loader": "^7.1.0", - "file-loader": "^6.2.0", - "html-webpack-plugin": "^5.4.0", - "mini-css-extract-plugin": "^2.4.3", - "sass-loader": "^16.0.0", - "style-loader": "^3.3.0", - "url-loader": "^4.1.1", - "webpack": "^5.98.0", - "webpack-cli": "^5.1.0", - "webpack-merge": "^5.8.0" - } - }, - "packages/tools/tests": { - "name": "@tools/tests", - "version": "1.0.0", - "devDependencies": { - "@dev/core": "^1.0.0", - "@dev/gui": "^1.0.0", - "@dev/loaders": "^1.0.0", - "@dev/materials": "^1.0.0", - "@dev/serializers": "^1.0.0", - "@dev/shared-ui-components": "^1.0.0", - "@tools/test-tools": "^1.0.0", - "@types/jest": "^27.4.0", - "@types/jest-image-snapshot": "^4.3.1", - "@types/react": "^18.0.0", - "@types/react-dom": "^18.0.0", - "browserstack-local": "^1.5.5", - "jest": "^29.7.0", - "jest-puppeteer": "^10.0.1", - "puppeteer": "^22.1.0", - "sass": "^1.62.1" - }, - "optionalDependencies": { - "jest-image-snapshot": "^6.1.0" - } - }, - "packages/tools/testsMemoryLeaks": { - "name": "@tools/memory-leak-tests", - "version": "1.0.0", - "dependencies": { - "memlab": "^1.1.28" - } - }, - "packages/tools/testTools": { - "name": "@tools/test-tools", - "version": "1.0.0", - "dependencies": { - "dotenv": "^16.0.0" - }, - "devDependencies": { - "@dev/core": "^1.0.0", - "@types/glob": "^7.2.0", - "@types/mv": "^2.1.2", - "@types/node": "^16.11.6", - "mv": "^2.1.1" - } - }, - "packages/tools/testTools/node_modules/@types/node": { - "version": "16.18.126", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.126.tgz", - "integrity": "sha512-OTcgaiwfGFBKacvfwuHzzn1KLxH/er8mluiy8/uM3sGXHaRe73RrSIj01jow9t4kJEW633Ov+cOexXeiApTyAw==", - "dev": true - }, - "packages/tools/viewer": { - "name": "@tools/viewer", - "version": "1.0.0", - "dependencies": { - "@dev/core": "1.0.0", - "@dev/loaders": "1.0.0", - "lit": "^3.2.0" - }, - "devDependencies": { - "@rollup/plugin-alias": "^5.1.0", - "@rollup/plugin-commonjs": "^26.0.1", - "@rollup/plugin-node-resolve": "^15.2.3", - "@rollup/plugin-terser": "^0.4.4", - "@rollup/plugin-typescript": "^11.1.6", - "chalk": "^5.3.0", - "commondir": "^1.0.1", - "cross-env": "^7.0.3", - "nyc": "^17.0.0", - "open": "^10.1.0", - "rollup": "^4.18.0", - "rollup-plugin-minify-template-literals": "^1.1.7", - "rollup-plugin-visualizer": "^5.12.0", - "vite": "^6.2.1" - } - }, - "packages/tools/viewer-configurator": { - "name": "@tools/viewer-configurator", - "version": "1.0.0", - "dependencies": { - "@dev/core": "1.0.0", - "@dev/loaders": "1.0.0", - "@dev/shared-ui-components": "1.0.0", - "@dnd-kit/modifiers": "^9.0.0", - "@dnd-kit/sortable": "^10.0.0", - "@tools/viewer": "1.0.0" - }, - "devDependencies": { - "@dev/build-tools": "1.0.0", - "@svgr/webpack": "^7.0.0", - "@types/dagre": "^0.7.47", - "@types/react": "^18.0.0", - "@types/react-dom": "^18.0.0", - "copy-webpack-plugin": "^11.0.0", - "css-loader": "^7.1.0", - "file-loader": "^6.2.0", - "html-webpack-plugin": "^5.4.0", - "mini-css-extract-plugin": "^2.4.3", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "sass-loader": "^16.0.0", - "style-loader": "^3.3.0", - "url-loader": "^4.1.1", - "webpack": "^5.98.0", - "webpack-cli": "^5.1.0", - "webpack-merge": "^5.8.0" - } - }, - "packages/tools/viewer-legacy": { - "name": "@tools/viewer-legacy", - "version": "1.0.0", - "dependencies": { - "deepmerge": "~4.2.2", - "handlebars": "^4.7.6", - "pepjs": "^0.5.3" - }, - "devDependencies": { - "@dev/core": "1.0.0", - "@dev/loaders": "1.0.0", - "source-map-loader": "^4.0.0", - "ts-loader": "^9.2.6", - "webpack": "^5.98.0", - "webpack-cli": "^5.1.0" - } - }, - "packages/tools/viewer-legacy/node_modules/deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "engines": { - "node": ">=0.10.0" - } - }, - "packages/tools/viewer/node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "packages/tools/vsm": { - "name": "@tools/visual-state-manager", - "version": "0.0.1", - "dependencies": { - "react": "^18.2.0", - "react-dom": "^18.2.0" - }, - "devDependencies": { - "@dev/build-tools": "1.0.0", - "@dev/core": "1.0.0", - "@dev/gui": "1.0.0", - "@dev/shared-ui-components": "1.0.0", - "@svgr/webpack": "^7.0.0", - "@types/dagre": "^0.7.47", - "@types/react": "^18.0.0", - "@types/react-dom": "^18.0.0", - "copy-webpack-plugin": "^11.0.0", - "css-loader": "^7.1.0", - "sass-loader": "^16.0.0", - "split.js": "^1.6.5", - "style-loader": "^3.3.0", - "url-loader": "^4.1.1", - "webpack": "^5.98.0", - "webpack-cli": "^5.1.0", - "webpack-merge": "^5.8.0" - } - } - } -} diff --git a/package.json b/package.json index 247123ec716..647c56182f7 100644 --- a/package.json +++ b/package.json @@ -25,9 +25,10 @@ "concurrently": "~8.0.1", "dotenv": "~16.0.0", "es-check": "^7.1.1", - "eslint": "^8.11.0", + "eslint": "^8.57.1", "eslint-config-prettier": "~9.0.0", "eslint-formatter-azure-devops": "^1.2.0", + "eslint-plugin-github": "5.0.2", "eslint-plugin-import": "~2.26.0", "eslint-plugin-jest": "~28.11.0", "eslint-plugin-jsdoc": "~46.2.6", diff --git a/packages/dev/addons/src/htmlMesh/htmlMeshRenderer.ts b/packages/dev/addons/src/htmlMesh/htmlMeshRenderer.ts index 853256321dd..936fc86f16f 100644 --- a/packages/dev/addons/src/htmlMesh/htmlMeshRenderer.ts +++ b/packages/dev/addons/src/htmlMesh/htmlMeshRenderer.ts @@ -626,7 +626,7 @@ export class HtmlMeshRenderer { const source = [this._inSceneElements?.container, this._overlayElements?.container]; for (const container of source) { if (!container) { - return; + continue; } // set the top and left of the css container to match the canvas const containerParent = container.offsetParent as HTMLElement; diff --git a/packages/dev/addons/src/index.ts b/packages/dev/addons/src/index.ts index d3f709a22b0..052b6963a25 100644 --- a/packages/dev/addons/src/index.ts +++ b/packages/dev/addons/src/index.ts @@ -1 +1,2 @@ export * from "./htmlMesh"; +export * from "./msdfText"; diff --git a/packages/dev/addons/src/msdfText/fontAsset.ts b/packages/dev/addons/src/msdfText/fontAsset.ts new file mode 100644 index 00000000000..d3b940f9595 --- /dev/null +++ b/packages/dev/addons/src/msdfText/fontAsset.ts @@ -0,0 +1,108 @@ +import type { BMFontChar } from "./sdf/bmFont"; +import type { SdfFont } from "./sdf/font"; +import { Texture } from "core/Materials/Textures/texture"; + +enum CharCode { + SPACE = 32, + TOFU = 0xfffc, +} + +/** + * Class representing a font asset for SDF (Signed Distance Field) rendering. + */ +export class FontAsset { + private readonly _chars = new Map(); + private readonly _charsRegex: RegExp; + private readonly _kernings = new Map>(); + + /** @internal */ + public readonly _font: SdfFont; + + /** + * Gets the font scale value + */ + public readonly scale: number; + + /** + * Gets the list of used textures + */ + public readonly textures: Texture[]; + + /** + * Creates a new FontAsset instance. + * @param definitionData defines the font data in JSON format. + * @param textureUrl defines the url of the texture to use for the font. + */ + public constructor(definitionData: string, textureUrl: string) { + this._font = JSON.parse(definitionData) as SdfFont; + // So far we only consider one page + this._font.pages = [textureUrl]; + + this._font.chars.forEach((char) => this._chars.set(char.id, char)); + this._font.kernings.forEach((kerning) => { + let submap = this._kernings.get(kerning.first); + if (!submap) { + submap = new Map(); + this._kernings.set(kerning.first, submap); + } + submap.set(kerning.second, kerning.amount); + }); + this._charsRegex = new RegExp(`[${this._font.chars.map((c) => c.char.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&")).join("")}]`, "g"); + + this._updateFallbacks(); + + this.scale = 1 / this._font.info.size; + this.textures = this._font.pages.map((page) => new Texture(page, undefined, { noMipmap: true, invertY: false })); + } + + private _updateFallbacks() { + if (!this._chars.has(CharCode.SPACE)) { + this._chars.set(CharCode.SPACE, { + id: CharCode.SPACE, + x: 0, + y: 0, + width: 0, + height: 0, + xoffset: 0, + yoffset: 0, + xadvance: this._font.info.size * 0.5, + page: -1, + chnl: -1, + index: -1, + char: " ", + }); + } + + if (!this._chars.has(CharCode.TOFU)) { + this._chars.set(CharCode.TOFU, { + id: CharCode.TOFU, + x: 0, + y: 0, + width: this._font.info.size, + height: this._font.info.size, + xoffset: 0, + yoffset: 0, + xadvance: this._font.info.size * 0.5, + page: -1, + chnl: -1, + index: -1, + char: "￿", + }); + } + } + + /** @internal */ + public _getChar(charCode: number) { + return this._chars.get(charCode) || this._chars.get(CharCode.TOFU)!; + } + + /** @internal */ + public _getKerning(first: number, second: number) { + return this._kernings.get(first)?.get(second) || 0; + } + + /** @internal */ + public _unsupportedChars(text: string) { + return text.replace(this._charsRegex, ""); + } +} diff --git a/packages/dev/addons/src/msdfText/index.ts b/packages/dev/addons/src/msdfText/index.ts new file mode 100644 index 00000000000..76b8f2d93eb --- /dev/null +++ b/packages/dev/addons/src/msdfText/index.ts @@ -0,0 +1,3 @@ +export * from "./fontAsset"; +export * from "./paragraphOptions"; +export * from "./textRenderer"; diff --git a/packages/dev/addons/src/msdfText/paragraphOptions.ts b/packages/dev/addons/src/msdfText/paragraphOptions.ts new file mode 100644 index 00000000000..e0b6caf28b1 --- /dev/null +++ b/packages/dev/addons/src/msdfText/paragraphOptions.ts @@ -0,0 +1,25 @@ +/* eslint-disable jsdoc/require-jsdoc */ + +import { Vector2 } from "core/Maths/math.vector"; + +/** @internal */ +export type ParagraphOptions = { + maxWidth: number; + lineHeight: number; + letterSpacing: number; + tabSize: number; + whiteSpace: /* 'normal' | 'nowrap' | 'pre' | 'pre-wrap' | */ "pre-line" /* | 'break-spaces'*/; + textAlign: "left" | "right" | "center" /* | 'justify'*/; + translate: Vector2 | undefined; +}; + +/** @internal */ +export const DefaultParagraphOptions: ParagraphOptions = { + maxWidth: Infinity, + lineHeight: 1, + letterSpacing: 1, + tabSize: 4, + whiteSpace: "pre-line", + textAlign: "center", + translate: new Vector2(-0.5, -0.5), +}; diff --git a/packages/dev/addons/src/msdfText/sdf/bmFont.ts b/packages/dev/addons/src/msdfText/sdf/bmFont.ts new file mode 100644 index 00000000000..1b1f3611d6d --- /dev/null +++ b/packages/dev/addons/src/msdfText/sdf/bmFont.ts @@ -0,0 +1,136 @@ +/* eslint-disable @typescript-eslint/naming-convention */ +/** + * Holds information on how the font was generated. + */ +export type BMFontInfo = { + /** The name of the font */ + face: string; + /** The size of the font */ + size: number; + /** The font is bold */ + bold: number; + /** The font is italic */ + italic: number; + /** The charset of the font */ + charset: string[]; + /** The charset is unicode */ + unicode: number; + /** The font height stretch in percentage. 100% means no stretch. */ + stretchH: number; + /** Set to 1 if smoothing was turned on. */ + smooth: number; + /** The supersampling level used. 1 means no supersampling was used. */ + aa: number; + /** The padding for each character (up, right, down, left). */ + padding: [number, number, number, number]; + /** The spacing for each character (horizontal, vertical). */ + spacing: [number, number]; + /** + * The outline thickness for the characters. + * + * @remark missing in msdf-bmfont-xml + */ + outline?: number; +}; + +/** + * Holds information common to all characters. + */ +export type BMFontCommon = { + /** Distance in pixels between each line of text */ + lineHeight: number; + /** The number of pixels from the absolute top of the line to the base of the characters */ + base: number; + /** The width of the texture, normally used to scale the x pos of the character image */ + scaleW: number; + /** The height of the texture, normally used to scale the y pos of the character image */ + scaleH: number; + /** The number of pages in the font */ + pages: number; + /** Set to 1 if the monochrome characters have been packed into each of the texture channels. In this case alphaChnl describes what is stored in each channel. */ + packed: number; + /** Set to 0 if the channel holds the glyph data, 1 if it holds the outline, 2 if it holds the glyph and the outline, 3 if its set to zero, and 4 if its set to one. */ + alphaChnl: number; + /** Set to 0 if the channel holds the glyph data, 1 if it holds the outline, 2 if it holds the glyph and the outline, 3 if its set to zero, and 4 if its set to one. */ + redChnl: number; + /** Set to 0 if the channel holds the glyph data, 1 if it holds the outline, 2 if it holds the glyph and the outline, 3 if its set to zero, and 4 if its set to one. */ + greenChnl: number; + /** Set to 0 if the channel holds the glyph data, 1 if it holds the outline, 2 if it holds the glyph and the outline, 3 if its set to zero, and 4 if its set to one. */ + blueChnl: number; +}; + +/** Name of a texture file. There is one for each page in the font. */ +export type BMFontPages = { + [id: number]: string; +} & Array; + +/** + * Describes a single character in the font + */ +export type BMFontChar = { + /** Character id (charCode) */ + id: number; + /** Left position of the character image in the texture. */ + x: number; + /** Right position of the character image in the texture */ + y: number; + /** Width of the chracter image in the texture */ + width: number; + /** Height of the chracter image in the texture */ + height: number; + /** Horizontal offset to be applied on screen */ + xoffset: number; + /** Vertical offset to be applied on screen */ + yoffset: number; + /** Horizontal advance after the character */ + xadvance: number; + /** Page index where the character image is found */ + page: number; + /** Texture channel where the chracter image is found + * - 1 = blue + * - 2 = green + * - 3 = red + * - 8 = alpha + * - 15 = all channels + */ + chnl: number; +} & BMFontCharExtra; + +/** + * additional context from msdf-bmfont-xml + */ +export type BMFontCharExtra = { + /** index of opentype.js glyph */ + index: number; + /** actual character*/ + char: string; +}; + +/** + * The kerning information is used to adjust the distance between certain characters, e.g. some characters should be placed closer to each other than others. + */ +export type BMFontKerning = { + /** The first character id. */ + first: number; + /** The second character id. */ + second: number; + /** How much the x position should be adjusted when drawing the second character immediately following the first. */ + amount: number; +}; + +/** + * Compatible with [msdf-bmfont-xml](https://github.com/soimy/msdf-bmfont-xml) + * @see https://www.angelcode.com/products/bmfont/doc/file_format.html + */ +export type BMFont = { + /** {@inheritDoc BMFontInfo} */ + info: BMFontInfo; + /** {@inheritDoc BMFontCommon} */ + common: BMFontCommon; + /** {@inheritDoc BMFontPages} */ + pages: BMFontPages; + /** {@inheritDoc BMFontChar} */ + chars: BMFontChar[]; + /** {@inheritDoc BMFontKerning} */ + kernings: BMFontKerning[]; +}; diff --git a/packages/dev/addons/src/msdfText/sdf/font.ts b/packages/dev/addons/src/msdfText/sdf/font.ts new file mode 100644 index 00000000000..d525e788fca --- /dev/null +++ b/packages/dev/addons/src/msdfText/sdf/font.ts @@ -0,0 +1,11 @@ +/* eslint-disable jsdoc/require-jsdoc */ +import type { BMFont } from "./bmFont"; + +export type SdfFontDistanceField = { + fieldType: "sdf" | "msdf"; + distanceRange: number; +}; + +export type SdfFont = BMFont & { + distanceField: SdfFontDistanceField; +}; diff --git a/packages/dev/addons/src/msdfText/sdf/glyph.ts b/packages/dev/addons/src/msdfText/sdf/glyph.ts new file mode 100644 index 00000000000..dc05196d0f8 --- /dev/null +++ b/packages/dev/addons/src/msdfText/sdf/glyph.ts @@ -0,0 +1,13 @@ +/* eslint-disable jsdoc/require-jsdoc */ +import type { BMFontChar } from "./bmFont"; + +/** @internal */ +export type SdfGlyph = { + char: BMFontChar; + /** index of the line */ + line: number; + /** position within the line */ + position: number; + x: number; + y: number; +}; diff --git a/packages/dev/addons/src/msdfText/sdf/line.ts b/packages/dev/addons/src/msdfText/sdf/line.ts new file mode 100644 index 00000000000..b9ead49b955 --- /dev/null +++ b/packages/dev/addons/src/msdfText/sdf/line.ts @@ -0,0 +1,11 @@ +/* eslint-disable jsdoc/require-jsdoc */ +import type { SdfGlyph } from "./glyph"; + +/** @internal */ +export type SdfTextLine = { + text: string; + glyphs: SdfGlyph[]; + start: number; + end: number; + width: number; +}; diff --git a/packages/dev/addons/src/msdfText/sdf/paragraph.ts b/packages/dev/addons/src/msdfText/sdf/paragraph.ts new file mode 100644 index 00000000000..2917f2f91cd --- /dev/null +++ b/packages/dev/addons/src/msdfText/sdf/paragraph.ts @@ -0,0 +1,169 @@ +/* eslint-disable babylonjs/available */ +/* eslint-disable jsdoc/require-jsdoc */ +import type { FontAsset } from "../fontAsset"; +import { DefaultParagraphOptions, type ParagraphOptions } from "../paragraphOptions"; +import type { BMFontChar } from "./bmFont"; +import type { SdfGlyph } from "./glyph"; +import type { SdfTextLine } from "./line"; + +/** @internal */ +export class SdfTextParagraph { + public readonly options: ParagraphOptions; + + get lineHeight() { + return this.fontAsset._font.common.lineHeight * this.options.lineHeight; + } + + readonly paragraph; + readonly lines; + readonly width; + readonly height; + readonly glyphs; + + constructor( + public readonly text: string, + public readonly fontAsset: FontAsset, + options?: Partial + ) { + this.options = { ...DefaultParagraphOptions, ...options }; + + const { paragraph, lines, glyphs, width, height } = this._computeMetrics(text); + + this.paragraph = paragraph; + this.lines = lines; + this.glyphs = glyphs; + this.width = width; + this.height = height; + } + + private _computeMetrics(text: string) { + const collapsed = this._collapse(text); + const breaked = this._breakLines(collapsed); + const trimmed = breaked.map((line) => line.trim()); + + const lines: SdfTextLine[] = []; + for (const line of trimmed) { + lines.push(...this._wrap(line, lines.length)); + } + + const width = Math.max(...lines.map((line) => line.width)); + const height = this.lineHeight * lines.length; + + if (this.options.textAlign !== "left" || this.options.translate) { + lines.forEach((line) => { + const anchor = (() => { + switch (this.options.textAlign) { + case "right": + return width - line.width; + case "center": + return (width - line.width) / 2; + case "left": + default: + return 0; + } + })(); + const translate = this.options.translate?.multiplyByFloats(width, height); + line.glyphs.forEach((glyph) => { + glyph.x += anchor; + if (translate) { + glyph.x += translate.x; + glyph.y += translate.y; + } + }); + }); + } + + const glyphs = lines.flatMap((line) => line.glyphs); + + return { + paragraph: trimmed.join("\n"), + lines, + glyphs, + width, + height, + }; + } + + private _breakLines(text: string) { + return text.split("\n"); + } + + private _collapse(text: string) { + return text.replace(/\t/g, " ".repeat(this.options.tabSize)).replace(/ +/g, " "); + } + + private _wrap(text: string, lineOffset = 0) { + const lines = new Array(); + + let currentLine = lineOffset; + let currentGlyphs = new Array(); + let currentCursor = 0; + let currentWidth = 0; + let lastChar: BMFontChar | undefined; + let start = 0; + let end = start; + + const pushCurrentLine = () => { + lines.push({ + text: text.slice(start, end), + glyphs: currentGlyphs, + start: start, + end: end, + width: currentWidth, + }); + }; + + while (end < text.length) { + const i = end; + const charCode = text.charCodeAt(i); + const char = this.fontAsset._getChar(charCode); + const charWidth = char.width; + const kerning = lastChar ? this.fontAsset._getKerning(lastChar.id, char.id) : 0; + + currentCursor += kerning + char.xoffset; + const newWidth = currentCursor + charWidth; + const cursorProgress = char.xadvance + this.options.letterSpacing; + const nextPosition = currentCursor + cursorProgress; + + const shouldBreak = nextPosition > this.options.maxWidth || newWidth > this.options.maxWidth; + + if (shouldBreak) { + pushCurrentLine(); + + currentLine++; + lastChar = undefined; + currentCursor = 0; + currentWidth = 0; + start = end; + end = start + 1; + currentGlyphs = []; + } + + const x = currentCursor; + const y = currentLine * this.lineHeight + char.yoffset; + + currentGlyphs.push({ + char, + line: currentLine, + position: currentGlyphs.length, + x: x, + y: y, + }); + + if (!shouldBreak) { + lastChar = char; + currentCursor = nextPosition; + currentWidth = newWidth; + end++; + } else { + currentCursor = cursorProgress; + } + } + + if (currentGlyphs.length > 0) { + pushCurrentLine(); + } + + return lines; + } +} diff --git a/packages/dev/addons/src/msdfText/textRenderer.ts b/packages/dev/addons/src/msdfText/textRenderer.ts new file mode 100644 index 00000000000..af9c3c9efd6 --- /dev/null +++ b/packages/dev/addons/src/msdfText/textRenderer.ts @@ -0,0 +1,379 @@ +import type { VertexBuffer } from "core/Buffers/buffer"; +import { Buffer } from "core/Buffers/buffer"; +import type { AbstractEngine } from "core/Engines/abstractEngine"; +import { Constants } from "core/Engines/constants"; +import type { ThinEngine } from "core/Engines/thinEngine"; +import { DrawWrapper } from "core/Materials/drawWrapper"; +import { ShaderLanguage } from "core/Materials/shaderLanguage"; +import type { IDisposable } from "core/scene"; +import type { Nullable } from "core/types"; +import { SdfTextParagraph } from "./sdf/paragraph"; +import type { FontAsset } from "./fontAsset"; +import type { ParagraphOptions } from "./paragraphOptions"; +import { ThinMatrix } from "core/Maths/ThinMaths/thinMath.matrix"; +import { + CopyMatrixToArray, + IdentityMatrixToRef, + InvertMatrixToRef, + MultiplyMatricesToRef, + ScalingMatrixToRef, + TranslationMatrixToRef, +} from "core/Maths/ThinMaths/thinMath.matrix.functions"; +import type { IColor4Like, IMatrixLike, IVector3Like } from "core/Maths"; + +/** + * Abstract Node class from Babylon.js + */ +export interface INodeLike { + getWorldMatrix(): ThinMatrix; +} + +/** + * Class used to render text using MSDF (Multi-channel Signed Distance Field) technique + * Thanks a lot to the work of Bhushan_Wagh and zb_sj for their amazing work on MSDF for Babylon.js + * #6RLCWP#16 + * Star wars scroller: #6RLCWP#29 + * With metrics: #6RLCWP#35 + * Thickness: #IABMEZ#3 + * Solar system: #9YCDYC#9 + */ +export class TextRenderer implements IDisposable { + private readonly _useVAO: boolean = false; + private _engine: AbstractEngine; + private _shaderLanguage: ShaderLanguage; + private _vertexBuffers: { [key: string]: VertexBuffer } = {}; + private _spriteBuffer: Nullable; + private _worldBuffer: Nullable; + private _uvBuffer: Nullable; + private _drawWrapperBase: DrawWrapper; + private _vertexArrayObject: WebGLVertexArrayObject; + private _font: FontAsset; + private _charMatrices = new Array(); + private _charUvs = new Array(); + private _isDirty = true; + private _baseLine = 0; + + // Cache + private _scalingMatrix = new ThinMatrix(); + private _fontScaleMatrix = new ThinMatrix(); + private _offsetMatrix = new ThinMatrix(); + private _translationMatrix = new ThinMatrix(); + private _baseMatrix = new ThinMatrix(); + private _scaledMatrix = new ThinMatrix(); + private _localMatrix = new ThinMatrix(); + private _finalMatrix = new ThinMatrix(); + private _lineMatrix = new ThinMatrix(); + private _parentWorldMatrix = new ThinMatrix(); + private _storedTranslation: IVector3Like = { x: 0, y: 0, z: 0 }; + + /** + * Gets or sets the color of the text + */ + public color: IColor4Like = { r: 1.0, g: 1.0, b: 1.0, a: 1.0 }; + + /** + * Gets or sets the thickness of the text (0 means as defined in the font) + * Value must be between -0.5 and 0.5 + */ + public thicknessControl = 0; + + private _parent: Nullable = null; + + /** + * Gets or sets the parent of the text renderer + */ + public get parent(): Nullable { + return this._parent; + } + + public set parent(value: Nullable) { + this._parent = value; + } + + /** + * Gets or sets if the text is billboarded + */ + public isBillboard = false; + + /** + * Gets the number of characters in the text renderer + */ + public get characterCount(): number { + return this._charMatrices.length / 16; + } + + private constructor(engine: AbstractEngine, shaderLanguage: ShaderLanguage = ShaderLanguage.GLSL, font: FontAsset) { + this._engine = engine; + this._shaderLanguage = shaderLanguage; + this._font = font; + this._baseLine = font._font.common.lineHeight * font.scale; + + this._useVAO = engine.getCaps().vertexArrayObject && !engine.disableVertexArrayObjects; + + // Main vertex buffer + const spriteData = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]); + this._spriteBuffer = new Buffer(engine, spriteData, false, 2); + this._vertexBuffers["offsets"] = this._spriteBuffer.createVertexBuffer("offsets", 0, 2); + + // Instances + this._resizeBuffers(128); + } + + private _resizeBuffers(capacity: number) { + if (this._worldBuffer) { + this._worldBuffer.dispose(); + this._worldBuffer = null; + } + + if (this._uvBuffer) { + this._uvBuffer.dispose(); + this._uvBuffer = null; + } + + this._worldBuffer = new Buffer(this._engine, new Float32Array(capacity * 16), true, 16); + this._vertexBuffers["world0"] = this._worldBuffer.createVertexBuffer("world0", 0, 4, 16, true); + this._vertexBuffers["world1"] = this._worldBuffer.createVertexBuffer("world1", 4, 4, 16, true); + this._vertexBuffers["world2"] = this._worldBuffer.createVertexBuffer("world2", 8, 4, 16, true); + this._vertexBuffers["world3"] = this._worldBuffer.createVertexBuffer("world3", 12, 4, 16, true); + + this._uvBuffer = new Buffer(this._engine, new Float32Array(capacity * 4), true, 4); + this._vertexBuffers["uvs"] = this._uvBuffer.createVertexBuffer("uvs", 0, 4, 4, true); + } + + private _setShaders(vertex: string, fragment: string) { + this._drawWrapperBase?.dispose(); + + this._drawWrapperBase = new DrawWrapper(this._engine); + + if (this._drawWrapperBase.drawContext) { + this._drawWrapperBase.drawContext.useInstancing = true; + } + + const defines = ""; + + this._drawWrapperBase.effect = this._engine.createEffect( + { + vertexSource: vertex, + fragmentSource: fragment, + }, + ["offsets", "world0", "world1", "world2", "world3", "uvs"], + ["parentWorld", "view", "projection", "uColor", "unitRange", "texelSize", "thickness"], + ["fontAtlas"], + defines, + undefined, + undefined, + undefined, + undefined, + this._shaderLanguage + ); + + this._drawWrapperBase.effect._refCount++; + } + + /** + * Add a paragraph of text to the renderer + * @param text define the text to add + * @param options define the options to use for the paragraph (optional) + * @param worldMatrix define the world matrix to use for the paragraph (optional) + */ + public addParagraph(text: string, options?: Partial, worldMatrix?: IMatrixLike) { + const paragraph = new SdfTextParagraph(text, this._font, options); + + const fontScale = this._font.scale; + + const texWidth = this._font._font.common.scaleW; + const texHeight = this._font._font.common.scaleH; + const glyphs = paragraph.glyphs.filter((g) => g.char.page >= 0); + + let worldMatrixToUse = worldMatrix; + + if (!worldMatrixToUse) { + const lineHeight = paragraph.lineHeight * fontScale; + const lineOffset = (paragraph.lines.length * lineHeight) / 2; + TranslationMatrixToRef(0, this._baseLine - lineOffset, 0, this._lineMatrix); + worldMatrixToUse = this._lineMatrix; + } + + ScalingMatrixToRef(fontScale, fontScale, 1.0, this._fontScaleMatrix); + TranslationMatrixToRef(0.5, -0.5, 0, this._offsetMatrix); + + const charsUvsBase = this._charUvs.length; + const matricesBase = this._charMatrices.length; + glyphs.forEach((g, i) => { + this._charUvs[charsUvsBase + i * 4 + 0] = g.char.x / texWidth; + this._charUvs[charsUvsBase + i * 4 + 1] = g.char.y / texHeight; + this._charUvs[charsUvsBase + i * 4 + 2] = g.char.width / texWidth; + this._charUvs[charsUvsBase + i * 4 + 3] = g.char.height / texHeight; + + const x = g.x; + const y = -g.y; + + ScalingMatrixToRef(g.char.width, g.char.height, 1.0, this._scalingMatrix); + MultiplyMatricesToRef(this._offsetMatrix, this._scalingMatrix, this._baseMatrix); + + TranslationMatrixToRef(x * fontScale, y * fontScale, 0.0, this._translationMatrix); + MultiplyMatricesToRef(this._baseMatrix, this._fontScaleMatrix, this._scaledMatrix); + MultiplyMatricesToRef(this._scaledMatrix, this._translationMatrix, this._localMatrix); + + MultiplyMatricesToRef(this._localMatrix, worldMatrixToUse, this._finalMatrix); + CopyMatrixToArray(this._finalMatrix, this._charMatrices, matricesBase + i * 16); + }); + + this._isDirty = true; + + this._baseLine -= paragraph.lineHeight * fontScale * paragraph.lines.length; + } + + /** + * Render the text using the provided view and projection matrices + * @param viewMatrix define the view matrix to use + * @param projectionMatrix define the projection matrix to use + */ + public render(viewMatrix: IMatrixLike, projectionMatrix: IMatrixLike): void { + const drawWrapper = this._drawWrapperBase; + + const effect = drawWrapper.effect!; + + // Check + if (!effect.isReady()) { + return; + } + const engine = this._engine; + + engine.setState(false); + engine.enableEffect(drawWrapper); + + if (this.isBillboard) { + // We will only consider translation for parent to simplify computation + // Save parent translation + if (this._parent) { + const pwm = this._parent.getWorldMatrix().asArray(); + this._storedTranslation.x = pwm[12]; + this._storedTranslation.y = pwm[13]; + this._storedTranslation.z = pwm[14]; + } else { + this._storedTranslation.x = 0; + this._storedTranslation.y = 0; + this._storedTranslation.z = 0; + } + // Cancel camera rotation + const baseM = this._baseMatrix.asArray(); + CopyMatrixToArray(viewMatrix, baseM); + baseM[12] = 0; + baseM[13] = 0; + baseM[14] = 0; + InvertMatrixToRef(this._baseMatrix, this._parentWorldMatrix.asArray()); + + // Restore translation + const pwm = this._parentWorldMatrix.asArray(); + pwm[12] = this._storedTranslation.x; + pwm[13] = this._storedTranslation.y; + pwm[14] = this._storedTranslation.z; + } else { + if (this._parent) { + CopyMatrixToArray(this._parent.getWorldMatrix(), this._parentWorldMatrix.asArray()); + } else { + IdentityMatrixToRef(this._parentWorldMatrix); + } + } + + effect.setMatrix("parentWorld", this._parentWorldMatrix); + effect.setMatrix("view", viewMatrix); + effect.setMatrix("projection", projectionMatrix); + + // Texture + const textureWidth = this._font._font.common.scaleW; + const textureHeight = this._font._font.common.scaleW; + const distanceRange = this._font._font.distanceField.distanceRange; + + effect.setTexture("fontAtlas", this._font.textures[0]); + effect.setFloat2("unitRange", distanceRange / textureWidth, distanceRange / textureHeight); + effect.setFloat2("texelSize", 1.0 / textureWidth, 1.0 / textureHeight); + effect.setDirectColor4("uColor", this.color); + effect.setFloat("thickness", this.thicknessControl * 0.9); + + const instanceCount = this._charMatrices.length / 16; + + // Need update? + if (this._isDirty) { + this._isDirty = false; + + if (this._worldBuffer!.getBuffer()!.capacity / 4 < instanceCount * 16) { + this._resizeBuffers(instanceCount); + } + + this._worldBuffer!.update(this._charMatrices); + this._uvBuffer!.update(this._charUvs); + } + + if (this._useVAO) { + if (!this._vertexArrayObject) { + this._vertexArrayObject = (engine as ThinEngine).recordVertexArrayObject(this._vertexBuffers, null, effect); + } + (engine as ThinEngine).bindVertexArrayObject(this._vertexArrayObject, null); + } else { + // VBOs + engine.bindBuffers(this._vertexBuffers, null, effect); + } + + engine.setAlphaMode(Constants.ALPHA_COMBINE); + + engine.drawArraysType(Constants.MATERIAL_TriangleStripDrawMode, 0, 4, instanceCount); + + engine.unbindInstanceAttributes(); + } + + /** + * Release associated resources + */ + public dispose(): void { + if (this._worldBuffer) { + this._worldBuffer.dispose(); + this._worldBuffer = null; + } + + if (this._uvBuffer) { + this._uvBuffer.dispose(); + this._uvBuffer = null; + } + + if (this._spriteBuffer) { + this._spriteBuffer.dispose(); + this._spriteBuffer = null; + } + + if (this._vertexArrayObject) { + (this._engine as ThinEngine).releaseVertexArrayObject(this._vertexArrayObject); + (this._vertexArrayObject) = null; + } + } + + /** + * Creates a new TextRenderer instance asynchronously + * @param font define the font asset to use + * @param engine define the engine to use + * @returns a promise that resolves to the created TextRenderer instance + */ + public static async CreateTextRendererAsync(font: FontAsset, engine: AbstractEngine) { + if (!engine.getCaps().instancedArrays || !engine._features.supportSpriteInstancing) { + throw new Error("Instanced arrays are required for MSDF text rendering."); + } + + let shaderLanguage = ShaderLanguage.GLSL; + let vertex: string = ""; + let fragment: string = ""; + if (engine.isWebGPU) { + shaderLanguage = ShaderLanguage.WGSL; + vertex = (await import("./webgpu/vertex")).msdfVertexShader.shader; + fragment = (await import("./webgpu/fragment")).msdfFragmentShader.shader; + } else { + vertex = (await import("./webgl/vertex")).msdfVertexShader.shader; + fragment = (await import("./webgl/fragment")).msdfFragmentShader.shader; + } + + const textRenderer = new TextRenderer(engine, shaderLanguage, font); + textRenderer._setShaders(vertex, fragment); + + return textRenderer; + } +} diff --git a/packages/dev/addons/src/msdfText/webgl/fragment.ts b/packages/dev/addons/src/msdfText/webgl/fragment.ts new file mode 100644 index 00000000000..554c8451b33 --- /dev/null +++ b/packages/dev/addons/src/msdfText/webgl/fragment.ts @@ -0,0 +1,45 @@ +/* eslint-disable @typescript-eslint/naming-convention */ +const name = "msdfFragmentShader"; +const shader = ` +#extension GL_OES_standard_derivatives : enable + +precision highp float; + +uniform sampler2D fontAtlas; +uniform vec2 unitRange; +uniform vec2 texelSize; +uniform vec4 uColor; +uniform float thickness; + +varying vec2 atlasUV; + +float median(vec3 msdf) { + return max(min(msdf.r, msdf.g), min(max(msdf.r, msdf.g), msdf.b)); +} + +float screenPxRange(sampler2D tex) { + vec2 screenTexSize = vec2(1.0) / fwidth(atlasUV); + return max(0.5 * dot(unitRange, screenTexSize), 1.0); +} + +void main(void) +{ + vec3 sdfCenter = texture2D(fontAtlas, atlasUV).rgb; + vec3 sdfLeft = texture2D(fontAtlas, atlasUV - vec2(texelSize.x, 0.0)).rgb; + vec3 sdfRight = texture2D(fontAtlas, atlasUV + vec2(texelSize.x, 0.0)).rgb; + vec3 sdfTop = texture2D(fontAtlas, atlasUV - vec2(0.0, texelSize.y)).rgb; + vec3 sdfBottom = texture2D(fontAtlas, atlasUV + vec2(0.0, texelSize.y)).rgb; + + vec3 sdf = (sdfCenter + sdfLeft + sdfRight + sdfTop + sdfBottom) / 5.0; + + float dist = median(sdfCenter); + + float pxRange = screenPxRange(fontAtlas); + float pxDist = pxRange * (dist - 0.5 + thickness); + float alpha = clamp(pxDist / fwidth(pxDist) + 0.5, 0.0, 1.0); + + gl_FragColor = vec4(uColor.rgb, alpha * uColor.a); +}`; + +/** @internal */ +export const msdfFragmentShader = { name, shader }; diff --git a/packages/dev/addons/src/msdfText/webgl/vertex.ts b/packages/dev/addons/src/msdfText/webgl/vertex.ts new file mode 100644 index 00000000000..9720bd63f7b --- /dev/null +++ b/packages/dev/addons/src/msdfText/webgl/vertex.ts @@ -0,0 +1,25 @@ +/* eslint-disable @typescript-eslint/naming-convention */ +const name = "msdfVertexShader"; +const shader = ` +attribute vec2 offsets; +attribute vec4 world0; +attribute vec4 world1; +attribute vec4 world2; +attribute vec4 world3; +attribute vec4 uvs; + +uniform mat4 parentWorld; +uniform mat4 view; +uniform mat4 projection; + +varying vec2 atlasUV; + +void main(void) { + mat4 world = mat4(world0, world1, world2, world3); + vec3 viewPos = (view * parentWorld * world * vec4(offsets.xy - vec2(0.5, 0.5), 0., 1.0)).xyz; + gl_Position = projection * vec4(viewPos,1.0); + atlasUV = vec2(uvs.x + offsets.x * uvs.z, uvs.y + (1.0 - offsets.y) * uvs.w); +}`; + +/** @internal */ +export const msdfVertexShader = { name, shader }; diff --git a/packages/dev/addons/src/msdfText/webgpu/fragment.ts b/packages/dev/addons/src/msdfText/webgpu/fragment.ts new file mode 100644 index 00000000000..b3a1a7bd516 --- /dev/null +++ b/packages/dev/addons/src/msdfText/webgpu/fragment.ts @@ -0,0 +1,47 @@ +/* eslint-disable @typescript-eslint/naming-convention */ +const name = "msdfFragmentShader"; +const shader = ` +var fontAtlas: texture_2d; +var fontAtlasSampler: sampler; +uniform unitRange: vec2f; +uniform texelSize: vec2f; +uniform uColor: vec4f; +uniform thickness: f32; + +varying atlasUV: vec2f; + +fn median(msdf: vec3) -> f32 { + let a = min(msdf.r, msdf.g); + let b = max(msdf.r, msdf.g); + return max(a, min(b, msdf.b)); +} + +@fragment +fn main(input: FragmentInputs) -> FragmentOutputs { + let uv = input.atlasUV; + + // Sample center and neighbors + let sdfCenter = textureSample(fontAtlas, fontAtlasSampler, uv).rgb; + let sdfLeft = textureSample(fontAtlas, fontAtlasSampler, uv - vec2(uniforms.texelSize.x, 0.0)).rgb; + let sdfRight = textureSample(fontAtlas, fontAtlasSampler, uv + vec2(uniforms.texelSize.x, 0.0)).rgb; + let sdfTop = textureSample(fontAtlas, fontAtlasSampler, uv - vec2(0.0, uniforms.texelSize.y)).rgb; + let sdfBottom = textureSample(fontAtlas, fontAtlasSampler, uv + vec2(0.0, uniforms.texelSize.y)).rgb; + + let sdf = (sdfCenter + sdfLeft + sdfRight + sdfTop + sdfBottom) / 5.0; + + let dist = median(sdfCenter); + + // Estimate pixel range in screen space + let dx = dpdx(uv); + let dy = dpdy(uv); + let screenTexSize = vec2(1.0) / vec2(length(dx), length(dy)); + let pxRange = max(0.5 * dot(uniforms.unitRange, screenTexSize), 1.0); + + let pxDist = pxRange * (dist - 0.5 + uniforms.thickness); + let alpha = clamp(pxDist / length(dpdx(pxDist)) + 0.5, 0.0, 1.0); + + fragmentOutputs.color = vec4(uniforms.uColor.rgb, alpha * uniforms.uColor.a); +}`; + +/** @internal */ +export const msdfFragmentShader = { name, shader }; diff --git a/packages/dev/addons/src/msdfText/webgpu/vertex.ts b/packages/dev/addons/src/msdfText/webgpu/vertex.ts new file mode 100644 index 00000000000..8acc01569b8 --- /dev/null +++ b/packages/dev/addons/src/msdfText/webgpu/vertex.ts @@ -0,0 +1,31 @@ +/* eslint-disable @typescript-eslint/naming-convention */ +const name = "msdfVertexShader"; +const shader = ` +attribute offsets: vec2f; +attribute world0: vec4f; +attribute world1: vec4f; +attribute world2: vec4f; +attribute world3: vec4f; +attribute uvs: vec4f; + +uniform parentWorld: mat4x4f; +uniform view: mat4x4f; +uniform projection: mat4x4f; + +varying atlasUV: vec2f; + +@vertex +fn main(input: VertexInputs) -> FragmentInputs { + let world = mat4x4(input.world0, input.world1, input.world2, input.world3); + let localOffset = vec4(input.offsets - vec2(0.5, 0.5), 0.0, 1.0); + let viewPos = (uniforms.view * uniforms.parentWorld * world * localOffset).xyz; + vertexOutputs.position = uniforms.projection * vec4(viewPos, 1.0); + + vertexOutputs.atlasUV = vec2( + input.uvs.x + input.offsets.x * input.uvs.z, + input.uvs.y + (1.0 - input.offsets.y) * input.uvs.w + ); +}`; + +/** @internal */ +export const msdfVertexShader = { name, shader }; diff --git a/packages/dev/buildTools/src/index.ts b/packages/dev/buildTools/src/index.ts index bbea8efc01e..c81a96b9988 100644 --- a/packages/dev/buildTools/src/index.ts +++ b/packages/dev/buildTools/src/index.ts @@ -69,6 +69,7 @@ function RunCommand(command: string) { break; case "prepare-es6-build": case "peb": + // eslint-disable-next-line github/no-then prepareES6Build().catch((e) => { console.error(e); process.exit(1); @@ -88,6 +89,7 @@ function RunCommand(command: string) { break; case "update-engine-version": case "uev": + // eslint-disable-next-line @typescript-eslint/no-floating-promises updateEngineVersion(); break; case "declarations-es6": diff --git a/packages/dev/core/package.json b/packages/dev/core/package.json index cdbbb06f939..9e1922af1fa 100644 --- a/packages/dev/core/package.json +++ b/packages/dev/core/package.json @@ -25,7 +25,10 @@ "watch:source": "tsc -b tsconfig.build.json -w", "watch": "build-tools -c dev-watch --packages \"core\" -wa" }, - "sideEffects": true, + "sideEffects": [ + "**/*", + "!src/Maths/ThinMaths/**" + ], "devDependencies": { "@dev/build-tools": "^1.0.0", "@types/draco3d": "^1.4.3", diff --git a/packages/dev/core/src/Actions/actionManager.ts b/packages/dev/core/src/Actions/actionManager.ts index 659a1774091..b68e997f073 100644 --- a/packages/dev/core/src/Actions/actionManager.ts +++ b/packages/dev/core/src/Actions/actionManager.ts @@ -588,6 +588,7 @@ export class ActionManager extends AbstractActionManager { const nothing = new DoNothingAction(trigger, condition); if (action) { + // eslint-disable-next-line github/no-then action.then(nothing); } else { actionManager.registerAction(nothing); @@ -603,6 +604,7 @@ export class ActionManager extends AbstractActionManager { } else { condition = null; if (action) { + // eslint-disable-next-line github/no-then action.then(newAction); } else { actionManager.registerAction(newAction); diff --git a/packages/dev/core/src/Animations/animatable.core.ts b/packages/dev/core/src/Animations/animatable.core.ts index a9d9ad5230e..58082d48b88 100644 --- a/packages/dev/core/src/Animations/animatable.core.ts +++ b/packages/dev/core/src/Animations/animatable.core.ts @@ -293,7 +293,7 @@ export class Animatable { const fps = runtimeAnimations[0].animation.framePerSecond; this._frameToSyncFromJump = this._frameToSyncFromJump ?? runtimeAnimations[0].currentFrame; const delay = this.speedRatio === 0 ? 0 : (((frame - this._frameToSyncFromJump) / fps) * 1000) / this.speedRatio; - this._manualJumpDelay = -delay; + this._manualJumpDelay = Math.abs(delay); } for (let index = 0; index < runtimeAnimations.length; index++) { @@ -398,7 +398,7 @@ export class Animatable { * @returns a promise which will be fulfilled when the animation ends */ public async waitAsync(): Promise { - return new Promise((resolve) => { + return await new Promise((resolve) => { this.onAnimationEndObservable.add( () => { resolve(this); @@ -432,7 +432,7 @@ export class Animatable { } if (this._manualJumpDelay !== null) { - this._localDelayOffset += this._manualJumpDelay; + this._localDelayOffset -= this._manualJumpDelay; this._manualJumpDelay = null; this._frameToSyncFromJump = null; } diff --git a/packages/dev/core/src/Animations/animation.ts b/packages/dev/core/src/Animations/animation.ts index 69ee3c32a80..c68530b21cb 100644 --- a/packages/dev/core/src/Animations/animation.ts +++ b/packages/dev/core/src/Animations/animation.ts @@ -1559,7 +1559,7 @@ export class Animation { * @returns a promise that will resolve to the new animation or an array of animations */ public static async ParseFromFileAsync(name: Nullable, url: string): Promise> { - return new Promise((resolve, reject) => { + return await new Promise((resolve, reject) => { const request = new WebRequest(); request.addEventListener("readystatechange", () => { if (request.readyState == 4) { @@ -1586,6 +1586,7 @@ export class Animation { resolve(output); } } else { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject("Unable to load the animation"); } } @@ -1602,7 +1603,7 @@ export class Animation { * @returns a promise that will resolve to the new animation or a new array of animations */ public static async ParseFromSnippetAsync(snippetId: string): Promise> { - return new Promise((resolve, reject) => { + return await new Promise((resolve, reject) => { const request = new WebRequest(); request.addEventListener("readystatechange", () => { if (request.readyState == 4) { @@ -1628,6 +1629,7 @@ export class Animation { resolve(output); } } else { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject("Unable to load the snippet " + snippetId); } } diff --git a/packages/dev/core/src/Audio/audioEngine.ts b/packages/dev/core/src/Audio/audioEngine.ts index 0f65e394da1..43078a4d261 100644 --- a/packages/dev/core/src/Audio/audioEngine.ts +++ b/packages/dev/core/src/Audio/audioEngine.ts @@ -165,12 +165,20 @@ export class AudioEngine implements IAudioEngine { // the resume promise will never resolve and the only way to get the audio context unstuck is to // suspend it and make another resume request. if (this._tryToRun) { - this._audioContext?.suspend().then(() => { - this._tryToRun = false; - this._triggerRunningState(); - }); + // eslint-disable-next-line github/no-then + this._audioContext?.suspend().then( + () => { + this._tryToRun = false; + // eslint-disable-next-line @typescript-eslint/no-floating-promises + this._triggerRunningStateAsync(); + }, + () => { + Logger.Error("Failed to suspend audio context."); + } + ); } else { - this._triggerRunningState(); + // eslint-disable-next-line @typescript-eslint/no-floating-promises + this._triggerRunningStateAsync(); } } @@ -180,6 +188,7 @@ export class AudioEngine implements IAudioEngine { "statechange", () => { if (this.unlocked && this._audioContext?.state !== "running") { + // eslint-disable-next-line @typescript-eslint/no-floating-promises this._resumeAudioContextAsync(); } }, @@ -191,6 +200,7 @@ export class AudioEngine implements IAudioEngine { ); } + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax private _resumeAudioContextAsync(): Promise { if (this._audioContext?.resume) { return this._audioContext.resume(); @@ -215,7 +225,8 @@ export class AudioEngine implements IAudioEngine { this._audioContextInitialized = true; if (this._audioContext.state === "running") { // Do not wait for the promise to unlock. - this._triggerRunningState(); + // eslint-disable-next-line @typescript-eslint/no-floating-promises + this._triggerRunningStateAsync(); } } } catch (e) { @@ -225,26 +236,25 @@ export class AudioEngine implements IAudioEngine { } private _tryToRun = false; - private _triggerRunningState() { + private async _triggerRunningStateAsync() { if (this._tryToRun) { return; } this._tryToRun = true; - this._resumeAudioContextAsync() - .then(() => { - this._tryToRun = false; - if (this._muteButton) { - this._hideMuteButton(); - } - // Notify users that the audio stack is unlocked/unmuted - this.unlocked = true; - this.onAudioUnlockedObservable.notifyObservers(this); - }) - .catch(() => { - this._tryToRun = false; - this.unlocked = false; - }); + try { + await this._resumeAudioContextAsync(); + this._tryToRun = false; + if (this._muteButton) { + this._hideMuteButton(); + } + // Notify users that the audio stack is unlocked/unmuted + this.unlocked = true; + this.onAudioUnlockedObservable.notifyObservers(this); + } catch (_e) { + this._tryToRun = false; + this.unlocked = false; + } } private _triggerSuspendedState() { @@ -282,7 +292,8 @@ export class AudioEngine implements IAudioEngine { this._muteButton.addEventListener( "touchend", () => { - this._triggerRunningState(); + // eslint-disable-next-line @typescript-eslint/no-floating-promises + this._triggerRunningStateAsync(); }, true ); @@ -337,6 +348,7 @@ export class AudioEngine implements IAudioEngine { this.onAudioLockedObservable.clear(); // close is async. + // eslint-disable-next-line @typescript-eslint/no-floating-promises this._audioContext?.close(); this._audioContext = null; } diff --git a/packages/dev/core/src/Audio/audioSceneComponent.ts b/packages/dev/core/src/Audio/audioSceneComponent.ts index 5d350de67f5..dfa322c1cb5 100644 --- a/packages/dev/core/src/Audio/audioSceneComponent.ts +++ b/packages/dev/core/src/Audio/audioSceneComponent.ts @@ -428,6 +428,7 @@ export class AudioSceneComponent implements ISceneSerializableComponent { this._audioEnabled = false; if (AbstractEngine.audioEngine && AbstractEngine.audioEngine.audioContext) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises AbstractEngine.audioEngine.audioContext.suspend(); } @@ -452,6 +453,7 @@ export class AudioSceneComponent implements ISceneSerializableComponent { this._audioEnabled = true; if (AbstractEngine.audioEngine && AbstractEngine.audioEngine.audioContext) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises AbstractEngine.audioEngine.audioContext.resume(); } diff --git a/packages/dev/core/src/Audio/sound.ts b/packages/dev/core/src/Audio/sound.ts index 6b992be6930..750c2e6a454 100644 --- a/packages/dev/core/src/Audio/sound.ts +++ b/packages/dev/core/src/Audio/sound.ts @@ -498,6 +498,7 @@ export class Sound { if (!AbstractEngine.audioEngine?.audioContext) { return; } + // eslint-disable-next-line @typescript-eslint/no-floating-promises AbstractEngine.audioEngine.audioContext.decodeAudioData( audioData, (buffer) => { @@ -850,6 +851,7 @@ export class Sound { // In browsers that don’t yet support this functionality, // playPromise won’t be defined. if (playPromise !== undefined) { + // eslint-disable-next-line github/no-then playPromise.catch(() => { // Automatic playback failed. // Waiting for the audio engine to be unlocked by user click on unmute diff --git a/packages/dev/core/src/AudioV2/abstractAudio/abstractSound.ts b/packages/dev/core/src/AudioV2/abstractAudio/abstractSound.ts index 2403ed4102c..3d57647e872 100644 --- a/packages/dev/core/src/AudioV2/abstractAudio/abstractSound.ts +++ b/packages/dev/core/src/AudioV2/abstractAudio/abstractSound.ts @@ -1,17 +1,12 @@ import { Observable } from "../../Misc/observable"; import type { Nullable } from "../../types"; import { SoundState } from "../soundState"; -import { AbstractNamedAudioNode, AudioNodeType } from "./abstractAudioNode"; +import { AudioNodeType } from "./abstractAudioNode"; import type { _AbstractSoundInstance } from "./abstractSoundInstance"; +import { AbstractSoundSource, type ISoundSourceOptions } from "./abstractSoundSource"; import type { PrimaryAudioBus } from "./audioBus"; import type { AudioEngineV2 } from "./audioEngineV2"; -import type { _AbstractAudioSubGraph } from "./subNodes/abstractAudioSubGraph"; import type { IVolumeAudioOptions } from "./subNodes/volumeAudioSubNode"; -import { _GetVolumeAudioProperty, _GetVolumeAudioSubNode } from "./subNodes/volumeAudioSubNode"; -import type { AbstractAudioAnalyzer, IAudioAnalyzerOptions } from "./subProperties/abstractAudioAnalyzer"; -import type { AbstractSpatialAudio, ISpatialAudioOptions } from "./subProperties/abstractSpatialAudio"; -import type { AbstractStereoAudio, IStereoAudioOptions } from "./subProperties/abstractStereoAudio"; -import { _AudioAnalyzer } from "./subProperties/audioAnalyzer"; /** @internal */ export interface IAbstractSoundOptionsBase { @@ -40,7 +35,7 @@ export interface IAbstractSoundPlayOptionsBase { /** * Options for creating a sound. */ -export interface IAbstractSoundOptions extends IAbstractSoundOptionsBase, IAbstractSoundPlayOptions, IAudioAnalyzerOptions, ISpatialAudioOptions, IStereoAudioOptions { +export interface IAbstractSoundOptions extends IAbstractSoundOptionsBase, IAbstractSoundPlayOptions, ISoundSourceOptions { /** * The output bus for the sound. Defaults to `null`. * - If not set or `null`, the sound is automatically connected to the audio engine's default main bus. @@ -63,16 +58,13 @@ export interface IAbstractSoundStoredOptions extends IAbstractSoundOptionsBase, /** * Abstract class representing a sound in the audio engine. */ -export abstract class AbstractSound extends AbstractNamedAudioNode { - private _analyzer: Nullable = null; +export abstract class AbstractSound extends AbstractSoundSource { private _newestInstance: Nullable<_AbstractSoundInstance> = null; - private _outBus: Nullable = null; private _privateInstances = new Set<_AbstractSoundInstance>(); private _state: SoundState = SoundState.Stopped; protected _instances: ReadonlySet<_AbstractSoundInstance> = this._privateInstances; protected abstract readonly _options: IAbstractSoundStoredOptions; - protected abstract _subGraph: _AbstractAudioSubGraph; /** * Observable for when the sound stops playing. @@ -83,13 +75,6 @@ export abstract class AbstractSound extends AbstractNamedAudioNode { super(name, engine, AudioNodeType.HAS_INPUTS_AND_OUTPUTS); // Inputs are for instances. } - /** - * The analyzer features of the sound. - */ - public get analyzer(): AbstractAudioAnalyzer { - return this._analyzer ?? (this._analyzer = new _AudioAnalyzer(this._subGraph)); - } - /** * Whether the sound should start playing automatically. Defaults to `false`. */ @@ -136,42 +121,6 @@ export abstract class AbstractSound extends AbstractNamedAudioNode { this._options.maxInstances = value; } - /** - * The output bus for the sound. Defaults to `null`. - * - If not set or `null`, the sound is automatically connected to the audio engine's default main bus. - * @see {@link AudioEngineV2.defaultMainBus} - */ - public get outBus(): Nullable { - return this._outBus; - } - - public set outBus(outBus: Nullable) { - if (this._outBus === outBus) { - return; - } - - if (this._outBus) { - this._outBus.onDisposeObservable.removeCallback(this._onOutBusDisposed); - if (!this._disconnect(this._outBus)) { - throw new Error("Disconnect failed"); - } - } - - this._outBus = outBus; - - if (this._outBus) { - this._outBus.onDisposeObservable.add(this._onOutBusDisposed); - if (!this._connect(this._outBus)) { - throw new Error("Connect failed"); - } - } - } - - /** - * The spatial features of the sound. - */ - public abstract spatial: AbstractSpatialAudio; - /** * The time within the sound buffer to start playing at, in seconds. Defaults to `0`. */ @@ -190,28 +139,6 @@ export abstract class AbstractSound extends AbstractNamedAudioNode { return this._state; } - /** - * The stereo features of the sound. - */ - public abstract stereo: AbstractStereoAudio; - - /** - * The output volume of the sound. - */ - public get volume(): number { - return _GetVolumeAudioProperty(this._subGraph, "volume"); - } - - public set volume(value: number) { - // The volume subnode is created on initialization and should always exist. - const node = _GetVolumeAudioSubNode(this._subGraph); - if (!node) { - throw new Error("No volume subnode"); - } - - node.volume = value; - } - /** * Releases associated resources. */ @@ -220,11 +147,7 @@ export abstract class AbstractSound extends AbstractNamedAudioNode { this.stop(); - this._analyzer?.dispose(); - this._analyzer = null; - this._newestInstance = null; - this._outBus = null; this._privateInstances.clear(); this.onEndedObservable.clear(); @@ -331,8 +254,4 @@ export abstract class AbstractSound extends AbstractNamedAudioNode { this.onEndedObservable.notifyObservers(this); } }; - - private _onOutBusDisposed = () => { - this._outBus = null; - }; } diff --git a/packages/dev/core/src/AudioV2/abstractAudio/abstractSoundSource.ts b/packages/dev/core/src/AudioV2/abstractAudio/abstractSoundSource.ts new file mode 100644 index 00000000000..fcf251d869e --- /dev/null +++ b/packages/dev/core/src/AudioV2/abstractAudio/abstractSoundSource.ts @@ -0,0 +1,117 @@ +import type { Nullable } from "../../types"; +import { AbstractNamedAudioNode, AudioNodeType } from "./abstractAudioNode"; +import type { PrimaryAudioBus } from "./audioBus"; +import type { AudioEngineV2 } from "./audioEngineV2"; +import type { _AbstractAudioSubGraph } from "./subNodes/abstractAudioSubGraph"; +import { _GetVolumeAudioProperty, _GetVolumeAudioSubNode } from "./subNodes/volumeAudioSubNode"; +import type { AbstractAudioAnalyzer, IAudioAnalyzerOptions } from "./subProperties/abstractAudioAnalyzer"; +import type { AbstractSpatialAudio, ISpatialAudioOptions } from "./subProperties/abstractSpatialAudio"; +import type { AbstractStereoAudio, IStereoAudioOptions } from "./subProperties/abstractStereoAudio"; +import { _AudioAnalyzer } from "./subProperties/audioAnalyzer"; + +/** + * Options for creating a sound source. + */ +export interface ISoundSourceOptions extends IAudioAnalyzerOptions, ISpatialAudioOptions, IStereoAudioOptions { + /** + * The output bus for the sound source. Defaults to `null`. + * - If not set or `null`, the sound source is automatically connected to the audio engine's default main bus. + * @see {@link AudioEngineV2.defaultMainBus} + */ + outBus: Nullable; +} + +/** + * Abstract class representing a sound in the audio engine. + */ +export abstract class AbstractSoundSource extends AbstractNamedAudioNode { + private _analyzer: Nullable = null; + private _outBus: Nullable = null; + + protected abstract _subGraph: _AbstractAudioSubGraph; + + protected constructor(name: string, engine: AudioEngineV2, nodeType: AudioNodeType = AudioNodeType.HAS_OUTPUTS) { + super(name, engine, nodeType); + } + + /** + * The analyzer features of the sound. + */ + public get analyzer(): AbstractAudioAnalyzer { + return this._analyzer ?? (this._analyzer = new _AudioAnalyzer(this._subGraph)); + } + + /** + * The output bus for the sound. Defaults to `null`. + * - If not set or `null`, the sound is automatically connected to the audio engine's default main bus. + * @see {@link AudioEngineV2.defaultMainBus} + */ + public get outBus(): Nullable { + return this._outBus; + } + + public set outBus(outBus: Nullable) { + if (this._outBus === outBus) { + return; + } + + if (this._outBus) { + this._outBus.onDisposeObservable.removeCallback(this._onOutBusDisposed); + if (!this._disconnect(this._outBus)) { + throw new Error("Disconnect failed"); + } + } + + this._outBus = outBus; + + if (this._outBus) { + this._outBus.onDisposeObservable.add(this._onOutBusDisposed); + if (!this._connect(this._outBus)) { + throw new Error("Connect failed"); + } + } + } + + /** + * The spatial features of the sound. + */ + public abstract spatial: AbstractSpatialAudio; + + /** + * The stereo features of the sound. + */ + public abstract stereo: AbstractStereoAudio; + + /** + * The output volume of the sound. + */ + public get volume(): number { + return _GetVolumeAudioProperty(this._subGraph, "volume"); + } + + public set volume(value: number) { + // The volume subnode is created on initialization and should always exist. + const node = _GetVolumeAudioSubNode(this._subGraph); + if (!node) { + throw new Error("No volume subnode"); + } + + node.volume = value; + } + + /** + * Releases associated resources. + */ + public override dispose(): void { + super.dispose(); + + this._analyzer?.dispose(); + this._analyzer = null; + + this._outBus = null; + } + + private _onOutBusDisposed = () => { + this._outBus = null; + }; +} diff --git a/packages/dev/core/src/AudioV2/abstractAudio/audioEngineV2.ts b/packages/dev/core/src/AudioV2/abstractAudio/audioEngineV2.ts index 47881b01a9f..6c6725440a4 100644 --- a/packages/dev/core/src/AudioV2/abstractAudio/audioEngineV2.ts +++ b/packages/dev/core/src/AudioV2/abstractAudio/audioEngineV2.ts @@ -1,5 +1,6 @@ import type { Nullable } from "../../types"; import type { AbstractAudioNode, AbstractNamedAudioNode } from "./abstractAudioNode"; +import type { AbstractSoundSource, ISoundSourceOptions } from "./abstractSoundSource"; import type { AudioBus, IAudioBusOptions } from "./audioBus"; import type { IMainAudioBusOptions, MainAudioBus } from "./mainAudioBus"; import type { IStaticSoundOptions, StaticSound } from "./staticSound"; @@ -142,6 +143,15 @@ export abstract class AudioEngineV2 { * @returns A promise that resolves with the created main audio bus. */ public abstract createMainBusAsync(name: string, options?: Partial): Promise; + + /** + * Creates a new microphone sound source. + * @param name - The name of the sound. + * @param options - The options for the sound source. + * @returns A promise that resolves to the created sound source. + */ + public abstract createMicrophoneSoundSourceAsync(name: string, options?: Partial): Promise; + /** * Creates a new static sound. * @param name - The name of the sound. @@ -167,6 +177,15 @@ export abstract class AudioEngineV2 { options?: Partial ): Promise; + /** + * Creates a new sound source. + * @param name - The name of the sound. + * @param source - The source of the sound. + * @param options - The options for the sound source. + * @returns A promise that resolves to the created sound source. + */ + public abstract createSoundSourceAsync(name: string, source: AudioNode, options?: Partial): Promise; + /** * Creates a new streaming sound. * @param name - The name of the sound. @@ -219,6 +238,7 @@ export abstract class AudioEngineV2 { * - Note that the returned promise may already be resolved if the audio engine is already unlocked. * @returns A promise that is resolved when the audio engine is unlocked. */ + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax public unlockAsync(): Promise { return this.resumeAsync(); } @@ -270,6 +290,7 @@ export function _GetAudioEngine(engine: Nullable): AudioEngineV2 * @param engine - The audio engine. * @returns A promise that resolves with the created audio bus. */ +// eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax export function CreateAudioBusAsync(name: string, options: Partial = {}, engine: Nullable = null): Promise { engine = _GetAudioEngine(engine); return engine.createBusAsync(name, options); @@ -282,11 +303,25 @@ export function CreateAudioBusAsync(name: string, options: Partial = {}, engine: Nullable = null): Promise { engine = _GetAudioEngine(engine); return engine.createMainBusAsync(name, options); } +/** + * Creates a new microphone sound source. + * @param name - The name of the sound. + * @param options - The options for the sound source. + * @param engine - The audio engine. + * @returns A promise that resolves to the created sound source. + */ +// eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax +export function CreateMicrophoneSoundSourceAsync(name: string, options: Partial = {}, engine: Nullable = null): Promise { + engine = _GetAudioEngine(engine); + return engine.createMicrophoneSoundSourceAsync(name, options); +} + /** * Creates a new static sound. * @param name - The name of the sound. @@ -295,6 +330,7 @@ export function CreateMainAudioBusAsync(name: string, options: Partial = null ): Promise { engine = _GetAudioEngine(engine); - return engine.createSoundBufferAsync(source, options); + return await engine.createSoundBufferAsync(source, options); +} + +/** + * Creates a new sound source. + * @param name - The name of the sound. + * @param source - The source of the sound. + * @param options - The options for the sound source. + * @param engine - The audio engine. + * @returns A promise that resolves to the created sound source. + */ +// eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax +export function CreateSoundSourceAsync( + name: string, + source: AudioNode, + options: Partial = {}, + engine: Nullable = null +): Promise { + engine = _GetAudioEngine(engine); + return engine.createSoundSourceAsync(name, source, options); } /** @@ -329,6 +384,7 @@ export async function CreateSoundBufferAsync( * @param engine - The audio engine. * @returns A promise that resolves to the created streaming sound. */ +// eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax export function CreateStreamingSoundAsync( name: string, source: HTMLMediaElement | string | string[], diff --git a/packages/dev/core/src/AudioV2/abstractAudio/streamingSound.ts b/packages/dev/core/src/AudioV2/abstractAudio/streamingSound.ts index 34cd4684262..796f3496a6d 100644 --- a/packages/dev/core/src/AudioV2/abstractAudio/streamingSound.ts +++ b/packages/dev/core/src/AudioV2/abstractAudio/streamingSound.ts @@ -68,6 +68,7 @@ export abstract class StreamingSound extends AbstractSound { * Preloads an instance of the sound. * @returns A promise that resolves when the instance is preloaded. */ + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax public preloadInstanceAsync(): Promise { const instance = this._createInstance(); @@ -83,10 +84,11 @@ export abstract class StreamingSound extends AbstractSound { */ public async preloadInstancesAsync(count: number): Promise { for (let i = 0; i < count; i++) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises this.preloadInstanceAsync(); } - await Promise.all(this._preloadedInstances.map((instance) => instance.preloadedPromise)); + await Promise.all(this._preloadedInstances.map(async (instance) => await instance.preloadedPromise)); } /** diff --git a/packages/dev/core/src/AudioV2/abstractAudio/subNodes/abstractAudioSubGraph.ts b/packages/dev/core/src/AudioV2/abstractAudio/subNodes/abstractAudioSubGraph.ts index f53f8287f07..69d2dd32910 100644 --- a/packages/dev/core/src/AudioV2/abstractAudio/subNodes/abstractAudioSubGraph.ts +++ b/packages/dev/core/src/AudioV2/abstractAudio/subNodes/abstractAudioSubGraph.ts @@ -38,6 +38,7 @@ export abstract class _AbstractAudioSubGraph { return; } + // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then this._createSubNodePromisesResolvedAsync().then(() => { const node = this.getSubNode(name); if (node) { @@ -45,6 +46,7 @@ export abstract class _AbstractAudioSubGraph { return; } + // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then this.createAndAddSubNodeAsync(name).then((node) => { callback(node as T); }); @@ -59,7 +61,9 @@ export abstract class _AbstractAudioSubGraph { * * @internal */ + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax public createAndAddSubNodeAsync(name: AudioSubNode): Promise<_AbstractAudioSubNode> { + // eslint-disable-next-line github/no-then this._createSubNodePromises[name] ||= this._createSubNode(name).then((node) => { this._addSubNode(node); return node; @@ -126,8 +130,8 @@ export abstract class _AbstractAudioSubGraph { */ protected abstract _onSubNodesChanged(): void; - protected _createSubNodePromisesResolvedAsync(): Promise<_AbstractAudioSubNode[]> { - return Promise.all(Object.values(this._createSubNodePromises)); + protected async _createSubNodePromisesResolvedAsync(): Promise<_AbstractAudioSubNode[]> { + return await Promise.all(Object.values(this._createSubNodePromises)); } private _addSubNode(node: _AbstractAudioSubNode): void { diff --git a/packages/dev/core/src/AudioV2/abstractAudio/subProperties/audioAnalyzer.ts b/packages/dev/core/src/AudioV2/abstractAudio/subProperties/audioAnalyzer.ts index 22ce7e848d8..f17e9a48f4a 100644 --- a/packages/dev/core/src/AudioV2/abstractAudio/subProperties/audioAnalyzer.ts +++ b/packages/dev/core/src/AudioV2/abstractAudio/subProperties/audioAnalyzer.ts @@ -88,6 +88,7 @@ export class _AudioAnalyzer extends AbstractAudioAnalyzer { public dispose(): void { const subNode = _GetAudioAnalyzerSubNode(this._subGraph); if (subNode) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises this._subGraph.removeSubNodeAsync(subNode); subNode.dispose(); } @@ -106,6 +107,7 @@ export class _AudioAnalyzer extends AbstractAudioAnalyzer { const subNode = _GetAudioAnalyzerSubNode(this._subGraph); if (!subNode) { Logger.Warn("AudioAnalyzer not enabled"); + // eslint-disable-next-line @typescript-eslint/no-floating-promises this.enableAsync(); return _GetEmptyByteFrequencyData(); } @@ -117,6 +119,7 @@ export class _AudioAnalyzer extends AbstractAudioAnalyzer { const subNode = _GetAudioAnalyzerSubNode(this._subGraph); if (!subNode) { Logger.Warn("AudioAnalyzer not enabled"); + // eslint-disable-next-line @typescript-eslint/no-floating-promises this.enableAsync(); return _GetEmptyFloatFrequencyData(); } diff --git a/packages/dev/core/src/AudioV2/abstractAudio/subProperties/spatialAudio.ts b/packages/dev/core/src/AudioV2/abstractAudio/subProperties/spatialAudio.ts index 1e2b2031b62..b4303ed0257 100644 --- a/packages/dev/core/src/AudioV2/abstractAudio/subProperties/spatialAudio.ts +++ b/packages/dev/core/src/AudioV2/abstractAudio/subProperties/spatialAudio.ts @@ -37,6 +37,7 @@ export abstract class _SpatialAudio extends AbstractSpatialAudio { this._rotation = _SpatialAudioDefaults.rotation.clone(); this._rotationQuaternion = _SpatialAudioDefaults.rotationQuaternion.clone(); + // eslint-disable-next-line @typescript-eslint/no-floating-promises subGraph.createAndAddSubNodeAsync(AudioSubNode.SPATIAL); } diff --git a/packages/dev/core/src/AudioV2/webAudio/index.ts b/packages/dev/core/src/AudioV2/webAudio/index.ts index 250c52225c0..d2e6d8e37f3 100644 --- a/packages/dev/core/src/AudioV2/webAudio/index.ts +++ b/packages/dev/core/src/AudioV2/webAudio/index.ts @@ -1,5 +1,6 @@ export * from "./webAudioBus"; export * from "./webAudioEngine"; export * from "./webAudioMainBus"; +export * from "./webAudioSoundSource"; export * from "./webAudioStaticSound"; export * from "./webAudioStreamingSound"; diff --git a/packages/dev/core/src/AudioV2/webAudio/webAudioEngine.ts b/packages/dev/core/src/AudioV2/webAudio/webAudioEngine.ts index 78ec1f0c578..1833365d8f6 100644 --- a/packages/dev/core/src/AudioV2/webAudio/webAudioEngine.ts +++ b/packages/dev/core/src/AudioV2/webAudio/webAudioEngine.ts @@ -1,6 +1,7 @@ import { Observable } from "../../Misc/observable"; import type { Nullable } from "../../types"; import type { AbstractNamedAudioNode } from "../abstractAudio/abstractAudioNode"; +import type { AbstractSoundSource, ISoundSourceOptions } from "../abstractAudio/abstractSoundSource"; import type { AudioBus, IAudioBusOptions } from "../abstractAudio/audioBus"; import type { AudioEngineV2State, IAudioEngineV2Options } from "../abstractAudio/audioEngineV2"; import { AudioEngineV2 } from "../abstractAudio/audioEngineV2"; @@ -210,6 +211,19 @@ export class _WebAudioEngine extends AudioEngineV2 { return bus; } + /** @internal */ + public async createMicrophoneSoundSourceAsync(name: string, options?: Partial): Promise { + let mediaStream: MediaStream; + + try { + mediaStream = await navigator.mediaDevices.getUserMedia({ audio: true }); + } catch (e) { + throw new Error("Unable to access microphone: " + e); + } + + return await this.createSoundSourceAsync(name, new MediaStreamAudioSourceNode(this._audioContext, { mediaStream }), options); + } + /** @internal */ public async createSoundAsync( name: string, @@ -237,6 +251,16 @@ export class _WebAudioEngine extends AudioEngineV2 { return soundBuffer; } + /** @internal */ + public async createSoundSourceAsync(name: string, source: AudioNode, options: Partial = {}): Promise { + const module = await import("./webAudioSoundSource"); + + const soundSource = new module._WebAudioSoundSource(name, source, this, options); + await soundSource._initAsync(options); + + return soundSource; + } + /** @internal */ public async createStreamingSoundAsync(name: string, source: HTMLMediaElement | string | string[], options: Partial = {}): Promise { const module = await import("./webAudioStreamingSound"); @@ -256,6 +280,7 @@ export class _WebAudioEngine extends AudioEngineV2 { // Note that OfflineAudioContext does not have a `close` method. if (this._audioContext.state !== "closed" && !this._isUsingOfflineAudioContext) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises this._audioContext.close(); } @@ -307,6 +332,7 @@ export class _WebAudioEngine extends AudioEngineV2 { } /** @internal */ + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax public override resumeAsync(): Promise { this._pauseCalled = false; @@ -363,6 +389,7 @@ export class _WebAudioEngine extends AudioEngineV2 { clearInterval(this._resumeOnPauseTimerId); this._resumeOnPauseTimerId = setInterval(() => { + // eslint-disable-next-line @typescript-eslint/no-floating-promises this.resumeAsync(); }, this._resumeOnPauseRetryInterval); } @@ -389,6 +416,7 @@ export class _WebAudioEngine extends AudioEngineV2 { // Wave data for 0.0001 seconds of silence. audio.src = "data:audio/wav;base64,UklGRjAAAABXQVZFZm10IBAAAAABAAEAgLsAAAB3AQACABAAZGF0YQwAAAAAAAEA/v8CAP//AQA="; + // eslint-disable-next-line @typescript-eslint/no-floating-promises audio.play(); } diff --git a/packages/dev/core/src/AudioV2/webAudio/webAudioSoundSource.ts b/packages/dev/core/src/AudioV2/webAudio/webAudioSoundSource.ts new file mode 100644 index 00000000000..0c9ff89803d --- /dev/null +++ b/packages/dev/core/src/AudioV2/webAudio/webAudioSoundSource.ts @@ -0,0 +1,165 @@ +import type { Nullable } from "../../types"; +import type { AbstractAudioNode } from "../abstractAudio"; +import type { ISoundSourceOptions } from "../abstractAudio/abstractSoundSource"; +import { AbstractSoundSource } from "../abstractAudio/abstractSoundSource"; +import { _HasSpatialAudioOptions } from "../abstractAudio/subProperties/abstractSpatialAudio"; +import type { _SpatialAudio } from "../abstractAudio/subProperties/spatialAudio"; +import { _StereoAudio } from "../abstractAudio/subProperties/stereoAudio"; +import { _WebAudioBusAndSoundSubGraph } from "./subNodes/webAudioBusAndSoundSubGraph"; +import { _SpatialWebAudio } from "./subProperties/spatialWebAudio"; +import type { _WebAudioEngine } from "./webAudioEngine"; +import type { IWebAudioInNode } from "./webAudioNode"; + +/** @internal */ +export class _WebAudioSoundSource extends AbstractSoundSource { + private _spatial: Nullable<_SpatialWebAudio> = null; + private readonly _spatialAutoUpdate: boolean = true; + private readonly _spatialMinUpdateTime: number = 0; + private _stereo: Nullable<_StereoAudio> = null; + + protected _subGraph: _WebAudioBusAndSoundSubGraph; + protected _webAudioNode: AudioNode; + + /** @internal */ + public _audioContext: AudioContext | OfflineAudioContext; + + /** @internal */ + public override readonly engine: _WebAudioEngine; + + /** @internal */ + public constructor(name: string, webAudioNode: AudioNode, engine: _WebAudioEngine, options: Partial) { + super(name, engine); + + if (typeof options.spatialAutoUpdate === "boolean") { + this._spatialAutoUpdate = options.spatialAutoUpdate; + } + + if (typeof options.spatialMinUpdateTime === "number") { + this._spatialMinUpdateTime = options.spatialMinUpdateTime; + } + + this._audioContext = this.engine._audioContext; + this._webAudioNode = webAudioNode; + + this._subGraph = new _WebAudioSoundSource._SubGraph(this); + } + + /** @internal */ + public async _initAsync(options: Partial): Promise { + if (options.outBus) { + this.outBus = options.outBus; + } else { + await this.engine.isReadyPromise; + this.outBus = this.engine.defaultMainBus; + } + + await this._subGraph.initAsync(options); + + if (_HasSpatialAudioOptions(options)) { + this._initSpatialProperty(); + } + + this.engine._addNode(this); + } + + /** @internal */ + public get _inNode() { + return this._webAudioNode; + } + + /** @internal */ + public get _outNode() { + return this._subGraph._outNode; + } + + /** @internal */ + public override get spatial(): _SpatialAudio { + if (this._spatial) { + return this._spatial; + } + return this._initSpatialProperty(); + } + + /** @internal */ + public override get stereo(): _StereoAudio { + return this._stereo ?? (this._stereo = new _StereoAudio(this._subGraph)); + } + + /** @internal */ + public override dispose(): void { + super.dispose(); + + this._spatial?.dispose(); + this._spatial = null; + + this._stereo = null; + + this._subGraph.dispose(); + + this.engine._removeNode(this); + } + + /** @internal */ + public getClassName(): string { + return "_WebAudioSoundSource"; + } + + protected override _connect(node: IWebAudioInNode): boolean { + const connected = super._connect(node); + + if (!connected) { + return false; + } + + // If the wrapped node is not available now, it will be connected later by the subgraph. + if (node._inNode) { + this._outNode?.connect(node._inNode); + } + + return true; + } + + protected override _disconnect(node: IWebAudioInNode): boolean { + const disconnected = super._disconnect(node); + + if (!disconnected) { + return false; + } + + if (node._inNode) { + this._outNode?.disconnect(node._inNode); + } + + return true; + } + + private _initSpatialProperty(): _SpatialAudio { + if (!this._spatial) { + this._spatial = new _SpatialWebAudio(this._subGraph, this._spatialAutoUpdate, this._spatialMinUpdateTime); + } + + return this._spatial; + } + + private static _SubGraph = class extends _WebAudioBusAndSoundSubGraph { + protected override _owner: _WebAudioSoundSource; + + protected get _downstreamNodes(): Nullable> { + return this._owner._downstreamNodes ?? null; + } + + protected get _upstreamNodes(): Nullable> { + return this._owner._upstreamNodes ?? null; + } + + protected override _onSubNodesChanged(): void { + super._onSubNodesChanged(); + + this._owner._inNode.disconnect(); + + if (this._owner._subGraph._inNode) { + this._owner._inNode.connect(this._owner._subGraph._inNode); + } + } + }; +} diff --git a/packages/dev/core/src/AudioV2/webAudio/webAudioStaticSound.ts b/packages/dev/core/src/AudioV2/webAudio/webAudioStaticSound.ts index 8a49288cbb2..5ffdbabab94 100644 --- a/packages/dev/core/src/AudioV2/webAudio/webAudioStaticSound.ts +++ b/packages/dev/core/src/AudioV2/webAudio/webAudioStaticSound.ts @@ -250,14 +250,16 @@ export class _WebAudioStaticSoundBuffer extends StaticSoundBuffer { private async _initFromUrlsAsync(urls: string[], skipCodecCheck: boolean): Promise { for (const url of urls) { if (skipCodecCheck) { + // eslint-disable-next-line no-await-in-loop await this._initFromUrlAsync(url); } else { const matches = url.match(_FileExtensionRegex); const format = matches?.at(1); if (format && this.engine.isFormatValid(format)) { try { + // eslint-disable-next-line no-await-in-loop await this._initFromUrlAsync(url); - } catch (e) { + } catch { if (format && 0 < format.length) { this.engine.flagInvalidFormat(format); } diff --git a/packages/dev/core/src/AudioV2/webAudio/webAudioStreamingSound.ts b/packages/dev/core/src/AudioV2/webAudio/webAudioStreamingSound.ts index 4eb540bbf7d..54ba33007ee 100644 --- a/packages/dev/core/src/AudioV2/webAudio/webAudioStreamingSound.ts +++ b/packages/dev/core/src/AudioV2/webAudio/webAudioStreamingSound.ts @@ -473,6 +473,7 @@ class _WebAudioStreamingSoundInstance extends _StreamingSoundInstance implements // It's possible that the play() method fails on Safari, even if the audio engine's state is "running". // This occurs when the audio context is paused by the system and resumed automatically by the audio engine // without a user interaction (e.g. when the Vision Pro exits and reenters immersive mode). + // eslint-disable-next-line github/no-then result.catch(() => { this._setState(SoundState.FailedToStart); @@ -490,9 +491,11 @@ class _WebAudioStreamingSoundInstance extends _StreamingSoundInstance implements private _playWhenReady(): void { this._isReadyPromise + // eslint-disable-next-line github/no-then .then(() => { this._play(); }) + // eslint-disable-next-line github/no-then .catch(() => { Logger.Error("Streaming sound instance failed to play"); this._setState(SoundState.FailedToStart); diff --git a/packages/dev/core/src/AudioV2/webAudio/webAudioUnmuteUI.ts b/packages/dev/core/src/AudioV2/webAudio/webAudioUnmuteUI.ts index b05117db4c9..0e04f44e5fb 100644 --- a/packages/dev/core/src/AudioV2/webAudio/webAudioUnmuteUI.ts +++ b/packages/dev/core/src/AudioV2/webAudio/webAudioUnmuteUI.ts @@ -30,6 +30,7 @@ export class _WebAudioUnmuteUI { this._button.id = "babylonUnmuteButton"; this._button.addEventListener("click", () => { + // eslint-disable-next-line @typescript-eslint/no-floating-promises this._engine.unlockAsync(); }); diff --git a/packages/dev/core/src/BakedVertexAnimation/vertexAnimationBaker.ts b/packages/dev/core/src/BakedVertexAnimation/vertexAnimationBaker.ts index 2d4a52661aa..e135a7dcca8 100644 --- a/packages/dev/core/src/BakedVertexAnimation/vertexAnimationBaker.ts +++ b/packages/dev/core/src/BakedVertexAnimation/vertexAnimationBaker.ts @@ -64,6 +64,7 @@ export class VertexAnimationBaker { // render all frames from our slices for (const range of ranges) { for (let frameIndex = range.from; frameIndex <= range.to; frameIndex++) { + // eslint-disable-next-line no-await-in-loop await this._executeAnimationFrameAsync(vertexData, frameIndex, textureIndex++); } } @@ -77,9 +78,10 @@ export class VertexAnimationBaker { * @param vertexData The array to save data to. * @param frameIndex Current frame in the skeleton animation to render. * @param textureIndex Current index of the texture data. + * @returns A promise that resolves when the animation frame is done. */ private async _executeAnimationFrameAsync(vertexData: Float32Array, frameIndex: number, textureIndex: number): Promise { - return new Promise((resolve, _reject) => { + return await new Promise((resolve, _reject) => { this._scene.beginAnimation(this._skeleton, frameIndex, frameIndex, false, 1.0, () => { // generate matrices const skeletonMatrices = this._skeleton!.getTransformMatrices(this._mesh); diff --git a/packages/dev/core/src/Buffers/buffer.nonFloatVertexBuffers.ts b/packages/dev/core/src/Buffers/buffer.nonFloatVertexBuffers.ts index 370d60efd27..24c026443b2 100644 --- a/packages/dev/core/src/Buffers/buffer.nonFloatVertexBuffers.ts +++ b/packages/dev/core/src/Buffers/buffer.nonFloatVertexBuffers.ts @@ -92,6 +92,7 @@ export function checkNonFloatVertexBuffers(vertexBuffers: { [key: string]: Nulla const parallelShaderCompile = engine._caps.parallelShaderCompile; engine._caps.parallelShaderCompile = undefined; + // eslint-disable-next-line @typescript-eslint/no-floating-promises effect._processShaderCodeAsync(null, engine._features._checkNonFloatVertexBuffersDontRecreatePipelineContext, shaderProcessingContext); engine._caps.parallelShaderCompile = parallelShaderCompile; diff --git a/packages/dev/core/src/Buffers/storageBuffer.ts b/packages/dev/core/src/Buffers/storageBuffer.ts index 9e17c74c764..2bfa08fab23 100644 --- a/packages/dev/core/src/Buffers/storageBuffer.ts +++ b/packages/dev/core/src/Buffers/storageBuffer.ts @@ -70,7 +70,7 @@ export class StorageBuffer { */ // eslint-disable-next-line @typescript-eslint/naming-convention public async read(offset?: number, size?: number, buffer?: ArrayBufferView, noDelay?: boolean): Promise { - return this._engine.readFromStorageBuffer(this._buffer, offset, size, buffer, noDelay); + return await this._engine.readFromStorageBuffer(this._buffer, offset, size, buffer, noDelay); } /** diff --git a/packages/dev/core/src/Cameras/Inputs/arcRotateCameraVRDeviceOrientationInput.ts b/packages/dev/core/src/Cameras/Inputs/arcRotateCameraVRDeviceOrientationInput.ts index 3c86c30afa6..58df3ecfcba 100644 --- a/packages/dev/core/src/Cameras/Inputs/arcRotateCameraVRDeviceOrientationInput.ts +++ b/packages/dev/core/src/Cameras/Inputs/arcRotateCameraVRDeviceOrientationInput.ts @@ -74,6 +74,7 @@ export class ArcRotateCameraVRDeviceOrientationInput implements ICameraInputDeviceOrientationEvent).requestPermission === "function") { (DeviceOrientationEvent) .requestPermission() + // eslint-disable-next-line github/no-then .then((response: string) => { if (response === "granted") { hostWindow.addEventListener("deviceorientation", this._deviceOrientationHandler); @@ -81,6 +82,7 @@ export class ArcRotateCameraVRDeviceOrientationInput implements ICameraInput { Tools.Error(error); }); diff --git a/packages/dev/core/src/Cameras/Inputs/freeCameraDeviceOrientationInput.ts b/packages/dev/core/src/Cameras/Inputs/freeCameraDeviceOrientationInput.ts index b12cba39beb..58e8504fbbb 100644 --- a/packages/dev/core/src/Cameras/Inputs/freeCameraDeviceOrientationInput.ts +++ b/packages/dev/core/src/Cameras/Inputs/freeCameraDeviceOrientationInput.ts @@ -67,7 +67,7 @@ export class FreeCameraDeviceOrientationInput implements ICameraInput { - return new Promise((res, rej) => { + return await new Promise((res, rej) => { let gotValue = false; const eventHandler = () => { window.removeEventListener("deviceorientation", eventHandler); @@ -80,6 +80,7 @@ export class FreeCameraDeviceOrientationInput implements ICameraInput { if (!gotValue) { window.removeEventListener("deviceorientation", eventHandler); + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors rej("WaitForOrientationChangeAsync timed out"); } }, timeout); @@ -88,6 +89,7 @@ export class FreeCameraDeviceOrientationInput implements ICameraInputDeviceOrientationEvent).requestPermission === "function") { (DeviceOrientationEvent) .requestPermission() + // eslint-disable-next-line github/no-then .then((response: string) => { if (response == "granted") { window.addEventListener("deviceorientation", eventHandler); @@ -95,6 +97,7 @@ export class FreeCameraDeviceOrientationInput implements ICameraInput { Tools.Error(error); }); @@ -153,6 +156,7 @@ export class FreeCameraDeviceOrientationInput implements ICameraInputDeviceOrientationEvent).requestPermission === "function") { (DeviceOrientationEvent) .requestPermission() + // eslint-disable-next-line github/no-then .then((response: string) => { if (response === "granted") { eventHandler(); @@ -160,6 +164,7 @@ export class FreeCameraDeviceOrientationInput implements ICameraInput { Tools.Error(error); }); diff --git a/packages/dev/core/src/Cameras/VR/vrExperienceHelper.ts b/packages/dev/core/src/Cameras/VR/vrExperienceHelper.ts index a6db166cbd0..13e7a9111a2 100644 --- a/packages/dev/core/src/Cameras/VR/vrExperienceHelper.ts +++ b/packages/dev/core/src/Cameras/VR/vrExperienceHelper.ts @@ -1,3 +1,5 @@ +/* eslint-disable github/no-then */ +/* eslint-disable @typescript-eslint/no-floating-promises */ import { Logger } from "../../Misc/logger"; import { Observable } from "../../Misc/observable"; import type { Nullable } from "../../types"; diff --git a/packages/dev/core/src/Collisions/collider.ts b/packages/dev/core/src/Collisions/collider.ts index 1cae3e30c10..18202c01802 100644 --- a/packages/dev/core/src/Collisions/collider.ts +++ b/packages/dev/core/src/Collisions/collider.ts @@ -500,11 +500,24 @@ export class Collider { /** * @internal */ - public _getResponse(pos: Vector3, vel: Vector3): void { + public _getResponse(pos: Vector3, vel: Vector3, slideOnCollide: boolean): void { + // Handle straight movement up to collision + pos.addToRef(vel, this._destinationPoint); - vel.scaleInPlace(this._nearestDistance / vel.length()); - this._basePoint.addToRef(vel, pos); + if (!slideOnCollide) { + // Move to one "close distance" less than the collision point to + // prevent any collision penetration from floating point inaccuracy + vel.scaleInPlace((this._nearestDistance - this._epsilon) / vel.length()); + this._basePoint.addToRef(vel, pos); + return; + } else { + vel.scaleInPlace(this._nearestDistance / vel.length()); + this._basePoint.addToRef(vel, pos); + } + + // Handle slide movement past collision + pos.subtractToRef(this.intersectionPoint, this._slidePlaneNormal); this._slidePlaneNormal.normalize(); this._slidePlaneNormal.scaleToRef(this._epsilon, this._displacementVector); diff --git a/packages/dev/core/src/Collisions/collisionCoordinator.ts b/packages/dev/core/src/Collisions/collisionCoordinator.ts index f005c02c468..2ae4b17ad47 100644 --- a/packages/dev/core/src/Collisions/collisionCoordinator.ts +++ b/packages/dev/core/src/Collisions/collisionCoordinator.ts @@ -15,7 +15,8 @@ export interface ICollisionCoordinator { maximumRetry: number, excludedMesh: Nullable, onNewPosition: (collisionIndex: number, newPosition: Vector3, collidedMesh: Nullable) => void, - collisionIndex: number + collisionIndex: number, + slideOnCollide?: boolean ): void; init(scene: Scene): void; } @@ -36,7 +37,8 @@ export class DefaultCollisionCoordinator implements ICollisionCoordinator { maximumRetry: number, excludedMesh: AbstractMesh, onNewPosition: (collisionIndex: number, newPosition: Vector3, collidedMesh: Nullable) => void, - collisionIndex: number + collisionIndex: number, + slideOnCollide: boolean = true ): void { position.divideToRef(collider._radius, this._scaledPosition); displacement.divideToRef(collider._radius, this._scaledVelocity); @@ -44,7 +46,7 @@ export class DefaultCollisionCoordinator implements ICollisionCoordinator { collider._retry = 0; collider._initialVelocity = this._scaledVelocity; collider._initialPosition = this._scaledPosition; - this._collideWithWorld(this._scaledPosition, this._scaledVelocity, collider, maximumRetry, this._finalPosition, excludedMesh); + this._collideWithWorld(this._scaledPosition, this._scaledVelocity, collider, maximumRetry, this._finalPosition, slideOnCollide, excludedMesh); this._finalPosition.multiplyInPlace(collider._radius); //run the callback @@ -65,6 +67,7 @@ export class DefaultCollisionCoordinator implements ICollisionCoordinator { collider: Collider, maximumRetry: number, finalPosition: Vector3, + slideOnCollide: boolean, excludedMesh: Nullable = null ): void { const closeDistance = AbstractEngine.CollisionsEpsilon * 10.0; @@ -96,7 +99,11 @@ export class DefaultCollisionCoordinator implements ICollisionCoordinator { } if (velocity.x !== 0 || velocity.y !== 0 || velocity.z !== 0) { - collider._getResponse(position, velocity); + collider._getResponse(position, velocity, slideOnCollide); + // Halt all movement at the first collision, if not slideOnCollide + if (!slideOnCollide) { + velocity.setAll(0); + } } if (velocity.length() <= closeDistance) { @@ -105,7 +112,7 @@ export class DefaultCollisionCoordinator implements ICollisionCoordinator { } collider._retry++; - this._collideWithWorld(position, velocity, collider, maximumRetry, finalPosition, excludedMesh); + this._collideWithWorld(position, velocity, collider, maximumRetry, finalPosition, slideOnCollide, excludedMesh); } } diff --git a/packages/dev/core/src/Collisions/gpuPicker.ts b/packages/dev/core/src/Collisions/gpuPicker.ts index 47c9fa0759e..b25caa270b7 100644 --- a/packages/dev/core/src/Collisions/gpuPicker.ts +++ b/packages/dev/core/src/Collisions/gpuPicker.ts @@ -272,6 +272,7 @@ export class GPUPicker { } if (!this._cachedScene || this._cachedScene !== scene) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises this._createColorMaterialAsync(scene); } @@ -353,7 +354,9 @@ export class GPUPicker { return null; } - const { x: adjustedX, y: adjustedY, rttSizeW, rttSizeH } = this._prepareForPicking(x, y); + const { rttSizeW, rttSizeH, devicePixelRatio } = this._getRenderInfo(); + + const { x: adjustedX, y: adjustedY } = this._prepareForPicking(x, y, devicePixelRatio); if (adjustedX < 0 || adjustedY < 0 || adjustedX >= rttSizeW || adjustedY >= rttSizeH) { return null; } @@ -364,7 +367,7 @@ export class GPUPicker { const invertedY = rttSizeH - adjustedY - 1; this._preparePickingBuffer(this._engine!, rttSizeW, rttSizeH, adjustedX, invertedY); - return this._executePickingAsync(adjustedX, invertedY, disposeWhenDone); + return await this._executePickingAsync(adjustedX, invertedY, disposeWhenDone); } /** @@ -399,12 +402,14 @@ export class GPUPicker { let minY = Infinity; let maxY = -Infinity; + const { rttSizeW, rttSizeH, devicePixelRatio } = this._getRenderInfo(); + // Process screen coordinates adjust to dpr for (let i = 0; i < xy.length; i++) { const item = xy[i]; const { x, y } = item; - const { x: adjustedX, y: adjustedY } = this._prepareForPicking(x, y); + const { x: adjustedX, y: adjustedY } = this._prepareForPicking(x, y, devicePixelRatio); processedXY[i] = { ...item, @@ -418,27 +423,30 @@ export class GPUPicker { maxY = Math.max(maxY, adjustedY); } - const { rttSizeW, rttSizeH } = this._prepareForPicking(minX, minY); const w = Math.max(maxX - minX, 1); const h = Math.max(maxY - minY, 1); const partialCutH = rttSizeH - maxY - 1; this._preparePickingBuffer(this._engine!, rttSizeW, rttSizeH, minX, partialCutH, w, h); - return this._executeMultiPickingAsync(processedXY, minX, maxY, rttSizeH, w, h, disposeWhenDone); + return await this._executeMultiPickingAsync(processedXY, minX, maxY, rttSizeH, w, h, disposeWhenDone); } - private _prepareForPicking(x: number, y: number) { - const scene = this._cachedScene!; - const engine = scene.getEngine(); + private _getRenderInfo() { + const engine = this._cachedScene!.getEngine(); const rttSizeW = engine.getRenderWidth(); const rttSizeH = engine.getRenderHeight(); const devicePixelRatio = 1 / engine._hardwareScalingLevel; - const intX = (devicePixelRatio * x) >> 0; - const intY = (devicePixelRatio * y) >> 0; + return { + rttSizeW, + rttSizeH, + devicePixelRatio, + }; + } - return { x: intX, y: intY, rttSizeW, rttSizeH }; + private _prepareForPicking(x: number, y: number, devicePixelRatio: number) { + return { x: (devicePixelRatio * x) >> 0, y: (devicePixelRatio * y) >> 0 }; } private _preparePickingBuffer(engine: AbstractEngine, rttSizeW: number, rttSizeH: number, x: number, y: number, w = 1, h = 1) { @@ -467,13 +475,14 @@ export class GPUPicker { // pick one pixel private async _executePickingAsync(x: number, y: number, disposeWhenDone: boolean): Promise> { - return new Promise((resolve, reject) => { + return await new Promise((resolve, reject) => { if (!this._pickingTexture) { this._pickingInProgress = false; - reject(); + reject(new Error("Picking texture not created")); return; } + // eslint-disable-next-line @typescript-eslint/no-misused-promises this._pickingTexture.onAfterRender = async () => { this._disableScissor(); @@ -526,13 +535,14 @@ export class GPUPicker { h: number, disposeWhenDone: boolean ): Promise> { - return new Promise((resolve, reject) => { + return await new Promise((resolve, reject) => { if (!this._pickingTexture) { this._pickingInProgress = false; - reject(); + reject(new Error("Picking texture not created")); return; } + // eslint-disable-next-line @typescript-eslint/no-misused-promises this._pickingTexture.onAfterRender = async () => { this._disableScissor(); diff --git a/packages/dev/core/src/Compute/computeShader.ts b/packages/dev/core/src/Compute/computeShader.ts index d3551170b33..d6fb9323595 100644 --- a/packages/dev/core/src/Compute/computeShader.ts +++ b/packages/dev/core/src/Compute/computeShader.ts @@ -437,7 +437,7 @@ export class ComputeShader { */ // eslint-disable-next-line @typescript-eslint/naming-convention public async dispatchWhenReady(x: number, y?: number, z?: number, delay = 10): Promise { - return new Promise((resolve) => { + return await new Promise((resolve) => { _RetryWithInterval(() => this.dispatch(x, y, z), resolve, undefined, delay); }); } diff --git a/packages/dev/core/src/Culling/Helper/boundingInfoHelper.ts b/packages/dev/core/src/Culling/Helper/boundingInfoHelper.ts index 42bb12cdfa9..a9a7930ef34 100644 --- a/packages/dev/core/src/Culling/Helper/boundingInfoHelper.ts +++ b/packages/dev/core/src/Culling/Helper/boundingInfoHelper.ts @@ -45,7 +45,7 @@ export class BoundingInfoHelper { */ public async computeAsync(target: AbstractMesh | AbstractMesh[]): Promise { await this._initializePlatformAsync(); - return this._platform.processAsync(target); + return await this._platform.processAsync(target); } /** @@ -56,7 +56,7 @@ export class BoundingInfoHelper { */ public async batchInitializeAsync(target: AbstractMesh | AbstractMesh[]): Promise { await this._initializePlatformAsync(); - return this._platform.registerMeshListAsync(target); + return await this._platform.registerMeshListAsync(target); } /** @@ -77,7 +77,7 @@ export class BoundingInfoHelper { */ public async batchFetchResultsAsync(): Promise { await this._initializePlatformAsync(); - return this._platform.fetchResultsForMeshListAsync(); + return await this._platform.fetchResultsForMeshListAsync(); } /** diff --git a/packages/dev/core/src/Culling/Helper/computeShaderBoundingHelper.ts b/packages/dev/core/src/Culling/Helper/computeShaderBoundingHelper.ts index 613f7c0d7f8..319a065a4c9 100644 --- a/packages/dev/core/src/Culling/Helper/computeShaderBoundingHelper.ts +++ b/packages/dev/core/src/Culling/Helper/computeShaderBoundingHelper.ts @@ -126,6 +126,7 @@ export class ComputeShaderBoundingHelper implements IBoundingInfoHelperPlatform } /** @internal */ + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax public registerMeshListAsync(meshes: AbstractMesh | AbstractMesh[]): Promise { this._disposeForMeshList(); @@ -284,7 +285,7 @@ export class ComputeShaderBoundingHelper implements IBoundingInfoHelperPlatform /** @internal */ public async fetchResultsForMeshListAsync(): Promise { - return new Promise((resolve) => { + return await new Promise((resolve) => { const buffers: DataBuffer[] = []; let size = 0; for (let i = 0; i < this._resultBuffers.length; i++) { @@ -300,6 +301,7 @@ export class ComputeShaderBoundingHelper implements IBoundingInfoHelperPlatform const minmax = { minimum, maximum }; + // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then (this._engine as WebGPUEngine).readFromMultipleStorageBuffers(buffers, 0, undefined, resultData, true).then(() => { let resultDataOffset = 0; for (let j = 0; j < this._resultBuffers.length; j++) { diff --git a/packages/dev/core/src/Culling/Helper/transformFeedbackBoundingHelper.ts b/packages/dev/core/src/Culling/Helper/transformFeedbackBoundingHelper.ts index 53e6282a862..a0c67715985 100644 --- a/packages/dev/core/src/Culling/Helper/transformFeedbackBoundingHelper.ts +++ b/packages/dev/core/src/Culling/Helper/transformFeedbackBoundingHelper.ts @@ -39,6 +39,7 @@ export class TransformFeedbackBoundingHelper implements IBoundingInfoHelperPlatf } /** @internal */ + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax public processAsync(meshes: AbstractMesh | AbstractMesh[]): Promise { if (!Array.isArray(meshes)) { meshes = [meshes]; @@ -208,6 +209,7 @@ export class TransformFeedbackBoundingHelper implements IBoundingInfoHelperPlatf } /** @internal */ + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax public registerMeshListAsync(meshes: AbstractMesh | AbstractMesh[]): Promise { if (!Array.isArray(meshes)) { meshes = [meshes]; @@ -230,6 +232,7 @@ export class TransformFeedbackBoundingHelper implements IBoundingInfoHelperPlatf } /** @internal */ + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax public fetchResultsForMeshListAsync(): Promise { this._meshListCounter = 0; diff --git a/packages/dev/core/src/Culling/ray.core.ts b/packages/dev/core/src/Culling/ray.core.ts index 0e4de47737f..7b39bc0277f 100644 --- a/packages/dev/core/src/Culling/ray.core.ts +++ b/packages/dev/core/src/Culling/ray.core.ts @@ -187,7 +187,7 @@ export class Ray { /** * Checks if the ray intersects a box - * This does not account for the ray lenght by design to improve perfs. + * This does not account for the ray length by design to improve perfs. * @param box the bounding box to check * @param intersectionTreshold extra extend to be added to the BoundingBox in all direction * @returns if the box was hit diff --git a/packages/dev/core/src/Debug/debugLayer.ts b/packages/dev/core/src/Debug/debugLayer.ts index 7bf18e31d1a..1778ad78fab 100644 --- a/packages/dev/core/src/Debug/debugLayer.ts +++ b/packages/dev/core/src/Debug/debugLayer.ts @@ -441,7 +441,7 @@ export class DebugLayer { */ // eslint-disable-next-line @typescript-eslint/naming-convention public async show(config?: IInspectorOptions): Promise { - return new Promise((resolve) => { + return await new Promise((resolve) => { if (typeof this.BJSINSPECTOR == "undefined") { const inspectorUrl = config && config.inspectorURL ? config.inspectorURL : DebugLayer.InspectorURL; diff --git a/packages/dev/core/src/Engines/AbstractEngine/abstractEngine.cubeTexture.ts b/packages/dev/core/src/Engines/AbstractEngine/abstractEngine.cubeTexture.ts index 113a5b8bca5..8d330661da8 100644 --- a/packages/dev/core/src/Engines/AbstractEngine/abstractEngine.cubeTexture.ts +++ b/packages/dev/core/src/Engines/AbstractEngine/abstractEngine.cubeTexture.ts @@ -238,6 +238,7 @@ AbstractEngine.prototype.createCubeTextureBase = function ( }; if (loaderPromise) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then loaderPromise.then((loader) => { const onloaddata = (data: ArrayBufferView | ArrayBufferView[]) => { if (beforeLoadCubeDataCallback) { diff --git a/packages/dev/core/src/Engines/Extensions/engine.prefilteredCubeTexture.ts b/packages/dev/core/src/Engines/Extensions/engine.prefilteredCubeTexture.ts index 59c18381cca..0eae8ee28a8 100644 --- a/packages/dev/core/src/Engines/Extensions/engine.prefilteredCubeTexture.ts +++ b/packages/dev/core/src/Engines/Extensions/engine.prefilteredCubeTexture.ts @@ -142,5 +142,6 @@ ThinEngine.prototype.createPrefilteredCubeTexture = function ( } }; + // eslint-disable-next-line @typescript-eslint/no-misused-promises return this.createCubeTexture(rootUrl, scene, null, false, callbackAsync, onError, format, forcedExtension, createPolynomials, lodScale, lodOffset); }; diff --git a/packages/dev/core/src/Engines/Extensions/engine.readTexture.ts b/packages/dev/core/src/Engines/Extensions/engine.readTexture.ts index 3419b477387..4f063d76cd4 100644 --- a/packages/dev/core/src/Engines/Extensions/engine.readTexture.ts +++ b/packages/dev/core/src/Engines/Extensions/engine.readTexture.ts @@ -103,6 +103,7 @@ ThinEngine.prototype._readTexturePixelsSync = function ( return buffer; }; +// eslint-disable-next-line @typescript-eslint/promise-function-async ThinEngine.prototype._readTexturePixels = function ( texture: InternalTexture, width: number, diff --git a/packages/dev/core/src/Engines/WebGPU/Extensions/engine.computeShader.ts b/packages/dev/core/src/Engines/WebGPU/Extensions/engine.computeShader.ts index 3e7a44ace40..1eeaf1a0cc7 100644 --- a/packages/dev/core/src/Engines/WebGPU/Extensions/engine.computeShader.ts +++ b/packages/dev/core/src/Engines/WebGPU/Extensions/engine.computeShader.ts @@ -209,6 +209,7 @@ WebGPUEngine.prototype._executeWhenComputeStateIsCompiled = function ( pipelineContext: WebGPUComputePipelineContext, action: (messages: Nullable) => void ): void { + // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then pipelineContext.stage!.module.getCompilationInfo().then((info) => { const compilationMessages: ComputeCompilationMessages = { numErrors: 0, diff --git a/packages/dev/core/src/Engines/WebGPU/Extensions/engine.readTexture.ts b/packages/dev/core/src/Engines/WebGPU/Extensions/engine.readTexture.ts index 7e0f5e8d839..71ef3c0f774 100644 --- a/packages/dev/core/src/Engines/WebGPU/Extensions/engine.readTexture.ts +++ b/packages/dev/core/src/Engines/WebGPU/Extensions/engine.readTexture.ts @@ -36,6 +36,7 @@ declare module "../../abstractEngine" { } } +// eslint-disable-next-line @typescript-eslint/promise-function-async ThinWebGPUEngine.prototype._readTexturePixels = function ( texture: InternalTexture, width: number, diff --git a/packages/dev/core/src/Engines/WebGPU/Extensions/engine.videoTexture.ts b/packages/dev/core/src/Engines/WebGPU/Extensions/engine.videoTexture.ts index 813a1223b9e..2c0505201d2 100644 --- a/packages/dev/core/src/Engines/WebGPU/Extensions/engine.videoTexture.ts +++ b/packages/dev/core/src/Engines/WebGPU/Extensions/engine.videoTexture.ts @@ -51,6 +51,7 @@ WebGPUEngine.prototype.updateVideoTexture = function (texture: Nullable { this._textureHelper.updateTexture(bitmap, texture, texture.width, texture.height, texture.depth, gpuTextureWrapper.format, 0, 0, !invertY, false, 0, 0); if (texture.generateMipMaps) { @@ -59,6 +60,7 @@ WebGPUEngine.prototype.updateVideoTexture = function (texture: Nullable { // Sometimes createImageBitmap(video) fails with "Failed to execute 'createImageBitmap' on 'Window': The provided element's player has no current data." // Just keep going on diff --git a/packages/dev/core/src/Engines/WebGPU/webgpuBufferManager.ts b/packages/dev/core/src/Engines/WebGPU/webgpuBufferManager.ts index bf0a1c6b670..b61ea23042a 100644 --- a/packages/dev/core/src/Engines/WebGPU/webgpuBufferManager.ts +++ b/packages/dev/core/src/Engines/WebGPU/webgpuBufferManager.ts @@ -121,7 +121,7 @@ export class WebGPUBufferManager { return destArray; } - // eslint-disable-next-line @typescript-eslint/naming-convention + // eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/promise-function-async public readDataFromBuffer( gpuBuffer: GPUBuffer, size: number, @@ -138,6 +138,7 @@ export class WebGPUBufferManager { const floatFormat = type === Constants.TEXTURETYPE_FLOAT ? 2 : type === Constants.TEXTURETYPE_HALF_FLOAT ? 1 : 0; const engineId = this._engine.uniqueId; return new Promise((resolve, reject) => { + // eslint-disable-next-line github/no-then gpuBuffer.mapAsync(WebGPUConstants.MapMode.Read, offset, size).then( () => { const copyArrayBuffer = gpuBuffer.getMappedRange(offset, size); @@ -214,6 +215,7 @@ export class WebGPUBufferManager { // The engine was disposed while waiting for the promise, or a context loss/restoration has occurred: don't reject resolve(new Uint8Array()); } else { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject(reason); } } diff --git a/packages/dev/core/src/Engines/WebGPU/webgpuOcclusionQuery.ts b/packages/dev/core/src/Engines/WebGPU/webgpuOcclusionQuery.ts index 0c50705a505..a621709bf17 100644 --- a/packages/dev/core/src/Engines/WebGPU/webgpuOcclusionQuery.ts +++ b/packages/dev/core/src/Engines/WebGPU/webgpuOcclusionQuery.ts @@ -85,6 +85,7 @@ export class WebGPUOcclusionQuery { if (this._frameLastBuffer !== this._engine.frameId) { this._frameLastBuffer = this._engine.frameId; + // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then this._querySet.readValues(0, this._currentTotalIndices).then((arrayBuffer) => { this._lastBuffer = arrayBuffer; }); diff --git a/packages/dev/core/src/Engines/WebGPU/webgpuQuerySet.ts b/packages/dev/core/src/Engines/WebGPU/webgpuQuerySet.ts index a2985eb35fa..5fd7e0d8e03 100644 --- a/packages/dev/core/src/Engines/WebGPU/webgpuQuerySet.ts +++ b/packages/dev/core/src/Engines/WebGPU/webgpuQuerySet.ts @@ -83,24 +83,22 @@ export class WebGPUQuerySet { } const engineId = this._engine.uniqueId; - return buffer.mapAsync(WebGPUConstants.MapMode.Read).then( - () => { - const arrayBuf = new BigUint64Array(buffer.getMappedRange()).slice(); - - buffer.unmap(); - - this._dstBuffers[this._dstBuffers.length] = buffer; - - return arrayBuf; - }, - (err) => { - if (this._engine.isDisposed || this._engine.uniqueId !== engineId) { - // Engine disposed or context loss/restoration - return null; - } - throw err; + try { + await buffer.mapAsync(WebGPUConstants.MapMode.Read); + const arrayBuf = new BigUint64Array(buffer.getMappedRange()).slice(); + + buffer.unmap(); + + this._dstBuffers[this._dstBuffers.length] = buffer; + + return arrayBuf; + } catch (err) { + if (this._engine.isDisposed || this._engine.uniqueId !== engineId) { + // Engine disposed or context loss/restoration + return null; } - ); + throw err; + } } public async readValue(firstQuery = 0): Promise { @@ -110,25 +108,23 @@ export class WebGPUQuerySet { } const engineId = this._engine.uniqueId; - return buffer.mapAsync(WebGPUConstants.MapMode.Read).then( - () => { - const arrayBuf = new BigUint64Array(buffer.getMappedRange()); - const value = Number(arrayBuf[0]); + try { + await buffer.mapAsync(WebGPUConstants.MapMode.Read); + const arrayBuf = new BigUint64Array(buffer.getMappedRange()); + const value = Number(arrayBuf[0]); - buffer.unmap(); + buffer.unmap(); - this._dstBuffers[this._dstBuffers.length] = buffer; + this._dstBuffers[this._dstBuffers.length] = buffer; - return value; - }, - (err) => { - if (this._engine.isDisposed || this._engine.uniqueId !== engineId) { - // Engine disposed or context loss/restoration - return 0; - } - throw err; + return value; + } catch (err) { + if (this._engine.isDisposed || this._engine.uniqueId !== engineId) { + // Engine disposed or context loss/restoration + return 0; } - ); + throw err; + } } public async readTwoValuesAndSubtract(firstQuery = 0): Promise { @@ -138,25 +134,23 @@ export class WebGPUQuerySet { } const engineId = this._engine.uniqueId; - return buffer.mapAsync(WebGPUConstants.MapMode.Read).then( - () => { - const arrayBuf = new BigUint64Array(buffer.getMappedRange()); - const value = Number(arrayBuf[1] - arrayBuf[0]); + try { + await buffer.mapAsync(WebGPUConstants.MapMode.Read); + const arrayBuf = new BigUint64Array(buffer.getMappedRange()); + const value = Number(arrayBuf[1] - arrayBuf[0]); - buffer.unmap(); + buffer.unmap(); - this._dstBuffers[this._dstBuffers.length] = buffer; + this._dstBuffers[this._dstBuffers.length] = buffer; - return value; - }, - (err) => { - if (this._engine.isDisposed || this._engine.uniqueId !== engineId) { - // Engine disposed or context loss/restoration - return 0; - } - throw err; + return value; + } catch (err) { + if (this._engine.isDisposed || this._engine.uniqueId !== engineId) { + // Engine disposed or context loss/restoration + return 0; } - ); + throw err; + } } public dispose() { diff --git a/packages/dev/core/src/Engines/WebGPU/webgpuTextureManager.ts b/packages/dev/core/src/Engines/WebGPU/webgpuTextureManager.ts index 2fdf9bc45ac..9e87c6a1656 100644 --- a/packages/dev/core/src/Engines/WebGPU/webgpuTextureManager.ts +++ b/packages/dev/core/src/Engines/WebGPU/webgpuTextureManager.ts @@ -1289,6 +1289,7 @@ export class WebGPUTextureManager { } } + // eslint-disable-next-line @typescript-eslint/promise-function-async public readPixels( texture: GPUTexture, x: number, diff --git a/packages/dev/core/src/Engines/WebGPU/webgpuTimestampQuery.ts b/packages/dev/core/src/Engines/WebGPU/webgpuTimestampQuery.ts index 2d54d9308ab..6e8390c0a89 100644 --- a/packages/dev/core/src/Engines/WebGPU/webgpuTimestampQuery.ts +++ b/packages/dev/core/src/Engines/WebGPU/webgpuTimestampQuery.ts @@ -63,6 +63,7 @@ export class WebGPUTimestampQuery { public endFrame(commandEncoder: GPUCommandEncoder): void { if (this._measureDurationState === 1) { this._measureDurationState = 2; + // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then this._measureDuration.stop(commandEncoder).then((duration) => { if (duration !== null && duration >= 0) { this._gpuFrameTimeCounter.fetchNewFrame(); @@ -88,6 +89,7 @@ export class WebGPUTimestampQuery { const currentFrameId = this._engine.frameId; + // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then this._measureDuration.stopPass(index).then((duration_) => { gpuPerfCounter._addDuration(currentFrameId, duration_ !== null && duration_ > 0 ? duration_ : 0); }); @@ -115,7 +117,7 @@ export class WebGPUDurationMeasure { public async stop(encoder: GPUCommandEncoder): Promise { encoder.writeTimestamp?.(this._querySet.querySet, 1); - return encoder.writeTimestamp ? this._querySet.readTwoValuesAndSubtract(0) : 0; + return encoder.writeTimestamp ? await this._querySet.readTwoValuesAndSubtract(0) : 0; } public startPass(descriptor: GPURenderPassDescriptor | GPUComputePassDescriptor, index: number): void { @@ -131,7 +133,7 @@ export class WebGPUDurationMeasure { } public async stopPass(index: number): Promise { - return this._querySet.readTwoValuesAndSubtract(index + 2); + return await this._querySet.readTwoValuesAndSubtract(index + 2); } public dispose() { diff --git a/packages/dev/core/src/Engines/WebGPU/webgpuTintWASM.ts b/packages/dev/core/src/Engines/WebGPU/webgpuTintWASM.ts index 741f42c7927..e4731b4ec58 100644 --- a/packages/dev/core/src/Engines/WebGPU/webgpuTintWASM.ts +++ b/packages/dev/core/src/Engines/WebGPU/webgpuTintWASM.ts @@ -56,6 +56,7 @@ export class WebGPUTintWASM { } if ((self as any).twgsl) { + // eslint-disable-next-line require-atomic-updates WebGPUTintWASM._Twgsl = await (self as any).twgsl(Tools.GetBabylonScriptURL(twgslOptions.wasmPath!)); return; } diff --git a/packages/dev/core/src/Engines/abstractEngine.ts b/packages/dev/core/src/Engines/abstractEngine.ts index edb18137d84..9d53d2daf27 100644 --- a/packages/dev/core/src/Engines/abstractEngine.ts +++ b/packages/dev/core/src/Engines/abstractEngine.ts @@ -1120,7 +1120,7 @@ export abstract class AbstractEngine { public onBeginFrameObservable = new Observable(); /** - * Observable raised when the engine ends the current frame + * Observable raised when the engine ends the current frame (requires a render loop, e.g. 'engine.runRenderLoop(...)') */ public onEndFrameObservable = new Observable(); @@ -1313,7 +1313,7 @@ export abstract class AbstractEngine { } /** - * Activates an effect, making it the current one (ie. the one used for rendering) + * Activates an effect, making it the current one (i.e. the one used for rendering) * @param effect defines the effect to activate */ public abstract enableEffect(effect: Nullable): void; @@ -1678,6 +1678,7 @@ export abstract class AbstractEngine { this._loadFile( url, (data) => { + // eslint-disable-next-line @typescript-eslint/no-floating-promises callbackAsync(new Uint8Array(data as ArrayBuffer)); }, undefined, @@ -1689,8 +1690,10 @@ export abstract class AbstractEngine { ); } else { if (buffer instanceof ArrayBuffer) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises callbackAsync(new Uint8Array(buffer)); } else if (ArrayBuffer.isView(buffer)) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises callbackAsync(buffer); } else { if (onError) { @@ -1893,14 +1896,14 @@ export abstract class AbstractEngine { */ // Not mixed with Version for tooling purpose. public static get NpmPackage(): string { - return "babylonjs@8.6.1"; + return "babylonjs@8.8.0"; } /** * Returns the current version of the framework */ public static get Version(): string { - return "8.6.1"; + return "8.8.0"; } /** diff --git a/packages/dev/core/src/Engines/constants.ts b/packages/dev/core/src/Engines/constants.ts index 74b24ed47ef..a52d32d081a 100644 --- a/packages/dev/core/src/Engines/constants.ts +++ b/packages/dev/core/src/Engines/constants.ts @@ -469,6 +469,21 @@ export class Constants { */ public static readonly MATERIAL_CounterClockWiseSideOrientation = 1; + /** + * Energy-conserving Oren Nayar diffuse model type. + */ + public static readonly MATERIAL_DIFFUSE_MODEL_E_OREN_NAYAR = 0; + + /** + * Burley diffuse model type. + */ + public static readonly MATERIAL_DIFFUSE_MODEL_BURLEY = 1; + + /** + * Lambertian diffuse model type. + */ + public static readonly MATERIAL_DIFFUSE_MODEL_LAMBERT = 2; + /** * Nothing * @see https://doc.babylonjs.com/features/featuresDeepDive/events/actions#triggers @@ -651,7 +666,7 @@ export class Constants { */ public static readonly PREPASS_COLOR_TEXTURE_TYPE = 4; /** - * Constant used to retrieve depth index in the textures array in the prepass + * Constant used to retrieve (camera view) depth index in the textures array in the prepass * using the getIndex(Constants.PREPASS_DEPTH_TEXTURE_TYPE) */ public static readonly PREPASS_DEPTH_TEXTURE_TYPE = 5; diff --git a/packages/dev/core/src/Engines/engine.common.ts b/packages/dev/core/src/Engines/engine.common.ts index 2bb4fae96ec..dfeeb580a0e 100644 --- a/packages/dev/core/src/Engines/engine.common.ts +++ b/packages/dev/core/src/Engines/engine.common.ts @@ -175,16 +175,19 @@ export function GetFontOffset(font: string): { ascent: number; height: number; d /** @internal */ export async function CreateImageBitmapFromSource(engine: AbstractEngine, imageSource: string, options?: ImageBitmapOptions): Promise { - return new Promise((resolve, reject) => { + return await new Promise((resolve, reject) => { const image = new Image(); image.onload = () => { + // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then image.decode().then(() => { + // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then engine.createImageBitmap(image, options).then((imageBitmap) => { resolve(imageBitmap); }); }); }; image.onerror = () => { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject(`Error loading image ${image.src}`); }; @@ -228,6 +231,7 @@ export function ExitFullscreen(): void { const anyDoc = document as any; if (document.exitFullscreen) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises document.exitFullscreen(); } else if (anyDoc.webkitCancelFullScreen) { anyDoc.webkitCancelFullScreen(); @@ -245,9 +249,11 @@ export function RequestPointerlock(element: HTMLElement): void { const promise: unknown = element.requestPointerLock(); if (promise instanceof Promise) { promise + // eslint-disable-next-line github/no-then .then(() => { element.focus(); }) + // eslint-disable-next-line github/no-then .catch(() => {}); } else { element.focus(); diff --git a/packages/dev/core/src/Engines/engine.ts b/packages/dev/core/src/Engines/engine.ts index 98c38557f75..4d359d7fc38 100755 --- a/packages/dev/core/src/Engines/engine.ts +++ b/packages/dev/core/src/Engines/engine.ts @@ -423,7 +423,7 @@ export class Engine extends ThinEngine { */ // eslint-disable-next-line @typescript-eslint/naming-convention public override async _createImageBitmapFromSource(imageSource: string, options?: ImageBitmapOptions): Promise { - return CreateImageBitmapFromSource(this, imageSource, options); + return await CreateImageBitmapFromSource(this, imageSource, options); } /** @@ -551,7 +551,7 @@ export class Engine extends ThinEngine { * @internal */ public async _loadFileAsync(url: string, offlineProvider?: IOfflineProvider, useArrayBuffer?: boolean): Promise { - return new Promise((resolve, reject) => { + return await new Promise((resolve, reject) => { this._loadFile( url, (data) => { @@ -561,6 +561,7 @@ export class Engine extends ThinEngine { offlineProvider, useArrayBuffer, (request, exception) => { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject(exception); } ); @@ -991,7 +992,7 @@ export class Engine extends ThinEngine { private async _clientWaitAsync(sync: WebGLSync, flags = 0, intervalms = 10): Promise { const gl = (this._gl as any); - return new Promise((resolve, reject) => { + return await new Promise((resolve, reject) => { _RetryWithInterval( () => { const res = gl.clientWaitSync(sync, flags, 0); @@ -1034,6 +1035,7 @@ export class Engine extends ThinEngine { gl.flush(); + // eslint-disable-next-line github/no-then return this._clientWaitAsync(sync, 0, 10).then(() => { gl.deleteSync(sync); diff --git a/packages/dev/core/src/Engines/engineFactory.ts b/packages/dev/core/src/Engines/engineFactory.ts index 808a5c6236c..e308e49c090 100644 --- a/packages/dev/core/src/Engines/engineFactory.ts +++ b/packages/dev/core/src/Engines/engineFactory.ts @@ -16,7 +16,7 @@ export class EngineFactory { public static async CreateAsync(canvas: HTMLCanvasElement, options: any): Promise { const supported = await WebGPUEngine.IsSupportedAsync; if (supported) { - return WebGPUEngine.CreateAsync(canvas, options); + return await WebGPUEngine.CreateAsync(canvas, options); } if (Engine.IsSupported) { return new Engine(canvas, undefined, options); diff --git a/packages/dev/core/src/Engines/nativeEngine.ts b/packages/dev/core/src/Engines/nativeEngine.ts index ba8b7e17cc2..1b0e914bfab 100644 --- a/packages/dev/core/src/Engines/nativeEngine.ts +++ b/packages/dev/core/src/Engines/nativeEngine.ts @@ -97,8 +97,8 @@ if (typeof self !== "undefined" && !Object.prototype.hasOwnProperty.call(self, " * Returns _native only after it has been defined by BabylonNative. * @internal */ -export function AcquireNativeObjectAsync(): Promise { - return new Promise((resolve) => { +export async function AcquireNativeObjectAsync(): Promise { + return await new Promise((resolve) => { if (typeof _native === "undefined") { onNativeObjectInitialized.addOnce((nativeObject) => resolve(nativeObject)); } else { @@ -2028,7 +2028,7 @@ export class NativeEngine extends Engine { * @param _options An object that sets options for the image's extraction. * @returns ImageBitmap */ - public override _createImageBitmapFromSource(imageSource: string, _options?: ImageBitmapOptions): Promise { + public override async _createImageBitmapFromSource(imageSource: string, _options?: ImageBitmapOptions): Promise { const promise = new Promise((resolve, reject) => { const image = this.createCanvasImage(); image.onload = () => { @@ -2036,17 +2036,19 @@ export class NativeEngine extends Engine { const imageBitmap = this._engine.createImageBitmap(image); resolve(imageBitmap); } catch (error) { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject(`Error loading image ${image.src} with exception: ${error}`); } }; image.onerror = (error) => { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject(`Error loading image ${image.src} with exception: ${error}`); }; image.src = imageSource; }); - return promise; + return await promise; } /** @@ -2055,8 +2057,8 @@ export class NativeEngine extends Engine { * @param options An object that sets options for the image's extraction. * @returns ImageBitmap */ - public override createImageBitmap(image: ImageBitmapSource, options?: ImageBitmapOptions): Promise { - return new Promise((resolve, reject) => { + public override async createImageBitmap(image: ImageBitmapSource, options?: ImageBitmapOptions): Promise { + return await new Promise((resolve, reject) => { if (Array.isArray(image)) { const arr = >image; if (arr.length) { @@ -2067,6 +2069,7 @@ export class NativeEngine extends Engine { } } } + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject(`Unsupported data for createImageBitmap.`); }); } @@ -2205,12 +2208,15 @@ export class NativeEngine extends Engine { // Reorder from [+X, +Y, +Z, -X, -Y, -Z] to [+X, -X, +Y, -Y, +Z, -Z]. const reorderedFiles = [files[0], files[3], files[1], files[4], files[2], files[5]]; - Promise.all(reorderedFiles.map((file) => this._loadFileAsync(file, undefined, true).then((data) => new Uint8Array(data, 0, data.byteLength)))) - .then((data) => { - return new Promise((resolve, reject) => { + // eslint-disable-next-line github/no-then + Promise.all(reorderedFiles.map(async (file) => await this._loadFileAsync(file, undefined, true).then((data) => new Uint8Array(data, 0, data.byteLength)))) + // eslint-disable-next-line github/no-then + .then(async (data) => { + return await new Promise((resolve, reject) => { this._engine.loadCubeTexture(texture._hardwareTexture!.underlyingResource, data, !noMipmap, true, texture._useSRGBBuffer, resolve, reject); }); }) + // eslint-disable-next-line github/no-then .then( () => { texture.isReady = true; @@ -2696,6 +2702,7 @@ export class NativeEngine extends Engine { */ public override flushFramebuffer(): void {} + // eslint-disable-next-line @typescript-eslint/promise-function-async public override _readTexturePixels( texture: InternalTexture, width: number, @@ -2712,25 +2719,28 @@ export class NativeEngine extends Engine { throw new Error(`Reading cubemap faces is not supported, but faceIndex is ${faceIndex}.`); } - return this._engine - .readTexture( - texture._hardwareTexture?.underlyingResource, - level ?? 0, - x ?? 0, - y ?? 0, - width, - height, - buffer?.buffer ?? null, - buffer?.byteOffset ?? 0, - buffer?.byteLength ?? 0 - ) - .then((rawBuffer) => { - if (!buffer) { - buffer = new Uint8Array(rawBuffer); - } + return ( + this._engine + .readTexture( + texture._hardwareTexture?.underlyingResource, + level ?? 0, + x ?? 0, + y ?? 0, + width, + height, + buffer?.buffer ?? null, + buffer?.byteOffset ?? 0, + buffer?.byteLength ?? 0 + ) + // eslint-disable-next-line github/no-then + .then((rawBuffer) => { + if (!buffer) { + buffer = new Uint8Array(rawBuffer); + } - return buffer; - }); + return buffer; + }) + ); } override startTimeQuery(): Nullable<_TimeToken> { diff --git a/packages/dev/core/src/Engines/webgpuEngine.ts b/packages/dev/core/src/Engines/webgpuEngine.ts index 0c11c8cc70d..3859bf5fac9 100644 --- a/packages/dev/core/src/Engines/webgpuEngine.ts +++ b/packages/dev/core/src/Engines/webgpuEngine.ts @@ -447,10 +447,12 @@ export class WebGPUEngine extends ThinWebGPUEngine { ? Promise.resolve(false) : navigator.gpu .requestAdapter() + // eslint-disable-next-line github/no-then .then( (adapter: GPUAdapter | undefined) => !!adapter, () => false ) + // eslint-disable-next-line github/no-then .catch(() => false); } @@ -541,10 +543,12 @@ export class WebGPUEngine extends ThinWebGPUEngine { * @param options Defines the options passed to the engine to create the GPU context dependencies * @returns a promise that resolves with the created engine */ + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax public static CreateAsync(canvas: HTMLCanvasElement, options: WebGPUEngineOptions = {}): Promise { const engine = new WebGPUEngine(canvas, options); return new Promise((resolve) => { + // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then engine.initAsync(options.glslangOptions, options.twgslOptions).then(() => resolve(engine)); }); } @@ -608,12 +612,15 @@ export class WebGPUEngine extends ThinWebGPUEngine { * Load the glslang and tintWASM libraries and prepare them for use. * @returns a promise that resolves when the engine is ready to use the glslang and tintWASM */ + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax public prepareGlslangAndTintAsync(): Promise { if (!this._workingGlslangAndTintPromise) { this._workingGlslangAndTintPromise = new Promise((resolve) => { + // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then this._initGlslangAsync(this._glslangOptions ?? this._options?.glslangOptions).then((glslang: any) => { this._glslang = glslang; this._tintWASM = new WebGPUTintWASM(); + // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then this._tintWASM.initTwgsl(this._twgslOptions ?? this._options?.twgslOptions).then(() => { this._glslangAndTintAreFullyLoaded = true; resolve(); @@ -631,173 +638,183 @@ export class WebGPUEngine extends ThinWebGPUEngine { * @param twgslOptions Defines the Twgsl compiler options if necessary * @returns a promise notifying the readiness of the engine. */ + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax public initAsync(glslangOptions?: GlslangOptions, twgslOptions?: TwgslOptions): Promise { (this.uniqueId as number) = WebGPUEngine._InstanceId++; this._glslangOptions = glslangOptions; this._twgslOptions = twgslOptions; - return navigator - .gpu!.requestAdapter(this._options) - .then((adapter: GPUAdapter | undefined) => { - if (!adapter) { - // eslint-disable-next-line no-throw-literal - throw "Could not retrieve a WebGPU adapter (adapter is null)."; - } else { - this._adapter = adapter!; - this._adapterSupportedExtensions = []; - this._adapter.features?.forEach((feature) => { - this._adapterSupportedExtensions.push(feature as WebGPUConstants.FeatureName); - }); - this._adapterSupportedLimits = this._adapter.limits; - this._adapterInfo = this._adapter.info; + return ( + navigator + .gpu!.requestAdapter(this._options) + // eslint-disable-next-line github/no-then + .then(async (adapter: GPUAdapter | undefined) => { + if (!adapter) { + // eslint-disable-next-line no-throw-literal + throw "Could not retrieve a WebGPU adapter (adapter is null)."; + } else { + this._adapter = adapter!; + this._adapterSupportedExtensions = []; + this._adapter.features?.forEach((feature) => { + this._adapterSupportedExtensions.push(feature as WebGPUConstants.FeatureName); + }); + this._adapterSupportedLimits = this._adapter.limits; + this._adapterInfo = this._adapter.info; - const deviceDescriptor = this._options.deviceDescriptor ?? {}; - const requiredFeatures = deviceDescriptor?.requiredFeatures ?? (this._options.enableAllFeatures ? this._adapterSupportedExtensions : undefined); + const deviceDescriptor = this._options.deviceDescriptor ?? {}; + const requiredFeatures = deviceDescriptor?.requiredFeatures ?? (this._options.enableAllFeatures ? this._adapterSupportedExtensions : undefined); - if (requiredFeatures) { - const requestedExtensions = requiredFeatures; - const validExtensions: GPUFeatureName[] = []; + if (requiredFeatures) { + const requestedExtensions = requiredFeatures; + const validExtensions: GPUFeatureName[] = []; - for (const extension of requestedExtensions) { - if (this._adapterSupportedExtensions.indexOf(extension) !== -1) { - validExtensions.push(extension); + for (const extension of requestedExtensions) { + if (this._adapterSupportedExtensions.indexOf(extension) !== -1) { + validExtensions.push(extension); + } } - } - deviceDescriptor.requiredFeatures = validExtensions; - } + deviceDescriptor.requiredFeatures = validExtensions; + } - if (this._options.setMaximumLimits && !deviceDescriptor.requiredLimits) { - deviceDescriptor.requiredLimits = {}; - for (const name in this._adapterSupportedLimits) { - if (name === "minSubgroupSize" || name === "maxSubgroupSize") { - // Chrome exposes these limits in "webgpu developer" mode, but these can't be set on the device. - continue; + if (this._options.setMaximumLimits && !deviceDescriptor.requiredLimits) { + deviceDescriptor.requiredLimits = {}; + for (const name in this._adapterSupportedLimits) { + if (name === "minSubgroupSize" || name === "maxSubgroupSize") { + // Chrome exposes these limits in "webgpu developer" mode, but these can't be set on the device. + continue; + } + deviceDescriptor.requiredLimits[name] = this._adapterSupportedLimits[name]; } - deviceDescriptor.requiredLimits[name] = this._adapterSupportedLimits[name]; } - } - deviceDescriptor.label = `BabylonWebGPUDevice${this.uniqueId}`; + deviceDescriptor.label = `BabylonWebGPUDevice${this.uniqueId}`; - return this._adapter.requestDevice(deviceDescriptor); - } - }) - .then((device: GPUDevice) => { - this._device = device; - this._deviceEnabledExtensions = []; - this._device.features?.forEach((feature) => { - this._deviceEnabledExtensions.push(feature as WebGPUConstants.FeatureName); - }); - this._deviceLimits = device.limits; - - let numUncapturedErrors = -1; - this._device.addEventListener("uncapturederror", (event) => { - if (++numUncapturedErrors < this.numMaxUncapturedErrors) { - Logger.Warn(`WebGPU uncaptured error (${numUncapturedErrors + 1}): ${(event).error} - ${(event).error.message}`); - } else if (numUncapturedErrors++ === this.numMaxUncapturedErrors) { - Logger.Warn( - `WebGPU uncaptured error: too many warnings (${this.numMaxUncapturedErrors}), no more warnings will be reported to the console for this engine.` - ); + return await this._adapter.requestDevice(deviceDescriptor); } - }); - - if (!this._doNotHandleContextLost) { - this._device.lost?.then((info) => { - if (this._isDisposed) { - return; + }) + // eslint-disable-next-line github/no-then + .then((device: GPUDevice) => { + this._device = device; + this._deviceEnabledExtensions = []; + this._device.features?.forEach((feature) => { + this._deviceEnabledExtensions.push(feature as WebGPUConstants.FeatureName); + }); + this._deviceLimits = device.limits; + + let numUncapturedErrors = -1; + this._device.addEventListener("uncapturederror", (event) => { + if (++numUncapturedErrors < this.numMaxUncapturedErrors) { + Logger.Warn(`WebGPU uncaptured error (${numUncapturedErrors + 1}): ${(event).error} - ${(event).error.message}`); + } else if (numUncapturedErrors++ === this.numMaxUncapturedErrors) { + Logger.Warn( + `WebGPU uncaptured error: too many warnings (${this.numMaxUncapturedErrors}), no more warnings will be reported to the console for this engine.` + ); } - this._contextWasLost = true; - Logger.Warn("WebGPU context lost. " + info); - this.onContextLostObservable.notifyObservers(this); - this._restoreEngineAfterContextLost(async () => { - const snapshotRenderingMode = this.snapshotRenderingMode; - const snapshotRendering = this.snapshotRendering; - const disableCacheSamplers = this.disableCacheSamplers; - const disableCacheRenderPipelines = this.disableCacheRenderPipelines; - const disableCacheBindGroups = this.disableCacheBindGroups; - const enableGPUTimingMeasurements = this.enableGPUTimingMeasurements; - - await this.initAsync(this._glslangOptions ?? this._options?.glslangOptions, this._twgslOptions ?? this._options?.twgslOptions); - - this.snapshotRenderingMode = snapshotRenderingMode; - this.snapshotRendering = snapshotRendering; - this.disableCacheSamplers = disableCacheSamplers; - this.disableCacheRenderPipelines = disableCacheRenderPipelines; - this.disableCacheBindGroups = disableCacheBindGroups; - this.enableGPUTimingMeasurements = enableGPUTimingMeasurements; - this._currentRenderPass = null; - }); }); - } - }) - .then(() => { - this._initializeLimits(); - - this._bufferManager = new WebGPUBufferManager(this, this._device); - this._textureHelper = new WebGPUTextureManager(this, this._device, this._bufferManager, this._deviceEnabledExtensions); - this._cacheSampler = new WebGPUCacheSampler(this._device); - this._cacheBindGroups = new WebGPUCacheBindGroups(this._device, this._cacheSampler, this); - this._timestampQuery = new WebGPUTimestampQuery(this, this._device, this._bufferManager); - this._occlusionQuery = (this._device as any).createQuerySet ? new WebGPUOcclusionQuery(this, this._device, this._bufferManager) : (undefined as any); - this._bundleList = new WebGPUBundleList(this._device); - this._snapshotRendering = new WebGPUSnapshotRendering(this, this._snapshotRenderingMode, this._bundleList); - - this._ubInvertY = this._bufferManager.createBuffer( - new Float32Array([-1, 0]), - WebGPUConstants.BufferUsage.Uniform | WebGPUConstants.BufferUsage.CopyDst, - "UBInvertY" - ); - this._ubDontInvertY = this._bufferManager.createBuffer( - new Float32Array([1, 0]), - WebGPUConstants.BufferUsage.Uniform | WebGPUConstants.BufferUsage.CopyDst, - "UBDontInvertY" - ); - if (this.dbgVerboseLogsForFirstFrames) { - if ((this as any)._count === undefined) { - (this as any)._count = 0; - Logger.Log(["%c frame #" + (this as any)._count + " - begin", "background: #ffff00"]); + if (!this._doNotHandleContextLost) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then + this._device.lost?.then((info) => { + if (this._isDisposed) { + return; + } + this._contextWasLost = true; + Logger.Warn("WebGPU context lost. " + info); + this.onContextLostObservable.notifyObservers(this); + // eslint-disable-next-line @typescript-eslint/no-misused-promises + this._restoreEngineAfterContextLost(async () => { + const snapshotRenderingMode = this.snapshotRenderingMode; + const snapshotRendering = this.snapshotRendering; + const disableCacheSamplers = this.disableCacheSamplers; + const disableCacheRenderPipelines = this.disableCacheRenderPipelines; + const disableCacheBindGroups = this.disableCacheBindGroups; + const enableGPUTimingMeasurements = this.enableGPUTimingMeasurements; + + await this.initAsync(this._glslangOptions ?? this._options?.glslangOptions, this._twgslOptions ?? this._options?.twgslOptions); + + this.snapshotRenderingMode = snapshotRenderingMode; + this.snapshotRendering = snapshotRendering; + this.disableCacheSamplers = disableCacheSamplers; + this.disableCacheRenderPipelines = disableCacheRenderPipelines; + this.disableCacheBindGroups = disableCacheBindGroups; + this.enableGPUTimingMeasurements = enableGPUTimingMeasurements; + this._currentRenderPass = null; + }); + }); + } + }) + // eslint-disable-next-line github/no-then + .then(() => { + this._initializeLimits(); + + this._bufferManager = new WebGPUBufferManager(this, this._device); + this._textureHelper = new WebGPUTextureManager(this, this._device, this._bufferManager, this._deviceEnabledExtensions); + this._cacheSampler = new WebGPUCacheSampler(this._device); + this._cacheBindGroups = new WebGPUCacheBindGroups(this._device, this._cacheSampler, this); + this._timestampQuery = new WebGPUTimestampQuery(this, this._device, this._bufferManager); + this._occlusionQuery = (this._device as any).createQuerySet ? new WebGPUOcclusionQuery(this, this._device, this._bufferManager) : (undefined as any); + this._bundleList = new WebGPUBundleList(this._device); + this._snapshotRendering = new WebGPUSnapshotRendering(this, this._snapshotRenderingMode, this._bundleList); + + this._ubInvertY = this._bufferManager.createBuffer( + new Float32Array([-1, 0]), + WebGPUConstants.BufferUsage.Uniform | WebGPUConstants.BufferUsage.CopyDst, + "UBInvertY" + ); + this._ubDontInvertY = this._bufferManager.createBuffer( + new Float32Array([1, 0]), + WebGPUConstants.BufferUsage.Uniform | WebGPUConstants.BufferUsage.CopyDst, + "UBDontInvertY" + ); + + if (this.dbgVerboseLogsForFirstFrames) { + if ((this as any)._count === undefined) { + (this as any)._count = 0; + Logger.Log(["%c frame #" + (this as any)._count + " - begin", "background: #ffff00"]); + } } - } - - this._uploadEncoder = this._device.createCommandEncoder(this._uploadEncoderDescriptor); - this._renderEncoder = this._device.createCommandEncoder(this._renderEncoderDescriptor); - - this._emptyVertexBuffer = new VertexBuffer(this, [0], "", { - stride: 1, - offset: 0, - size: 1, - label: "EmptyVertexBuffer", - }); - - this._cacheRenderPipeline = new WebGPUCacheRenderPipelineTree(this._device, this._emptyVertexBuffer); - - this._depthCullingState = new WebGPUDepthCullingState(this._cacheRenderPipeline); - this._stencilStateComposer = new WebGPUStencilStateComposer(this._cacheRenderPipeline); - this._stencilStateComposer.stencilGlobal = this._stencilState; - - this._depthCullingState.depthTest = true; - this._depthCullingState.depthFunc = Constants.LEQUAL; - this._depthCullingState.depthMask = true; - this._textureHelper.setCommandEncoder(this._uploadEncoder); + this._uploadEncoder = this._device.createCommandEncoder(this._uploadEncoderDescriptor); + this._renderEncoder = this._device.createCommandEncoder(this._renderEncoderDescriptor); - this._clearQuad = new WebGPUClearQuad(this._device, this, this._emptyVertexBuffer); - this._defaultDrawContext = this.createDrawContext()!; - this._currentDrawContext = this._defaultDrawContext; - this._defaultMaterialContext = this.createMaterialContext()!; - this._currentMaterialContext = this._defaultMaterialContext; + this._emptyVertexBuffer = new VertexBuffer(this, [0], "", { + stride: 1, + offset: 0, + size: 1, + label: "EmptyVertexBuffer", + }); - this._initializeContextAndSwapChain(); - this._initializeMainAttachments(); - this.resize(); - }) - .catch((e: any) => { - Logger.Error("A fatal error occurred during WebGPU creation/initialization."); - throw e; - }); + this._cacheRenderPipeline = new WebGPUCacheRenderPipelineTree(this._device, this._emptyVertexBuffer); + + this._depthCullingState = new WebGPUDepthCullingState(this._cacheRenderPipeline); + this._stencilStateComposer = new WebGPUStencilStateComposer(this._cacheRenderPipeline); + this._stencilStateComposer.stencilGlobal = this._stencilState; + + this._depthCullingState.depthTest = true; + this._depthCullingState.depthFunc = Constants.LEQUAL; + this._depthCullingState.depthMask = true; + + this._textureHelper.setCommandEncoder(this._uploadEncoder); + + this._clearQuad = new WebGPUClearQuad(this._device, this, this._emptyVertexBuffer); + this._defaultDrawContext = this.createDrawContext()!; + this._currentDrawContext = this._defaultDrawContext; + this._defaultMaterialContext = this.createMaterialContext()!; + this._currentMaterialContext = this._defaultMaterialContext; + + this._initializeContextAndSwapChain(); + this._initializeMainAttachments(); + this.resize(); + }) + // eslint-disable-next-line github/no-then + .catch((e: any) => { + Logger.Error("A fatal error occurred during WebGPU creation/initialization."); + throw e; + }) + ); } + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax private _initGlslangAsync(glslangOptions?: GlslangOptions): Promise { glslangOptions = glslangOptions || {}; glslangOptions = { @@ -814,6 +831,7 @@ export class WebGPUEngine extends ThinWebGPUEngine { } if (glslangOptions.jsPath && glslangOptions.wasmPath) { + // eslint-disable-next-line github/no-then return Tools.LoadBabylonScriptAsync(glslangOptions.jsPath).then(() => { return (self as any).glslang(Tools.GetBabylonScriptURL(glslangOptions.wasmPath!)); }); @@ -1030,6 +1048,12 @@ export class WebGPUEngine extends ThinWebGPUEngine { colorAttachments: mainColorAttachments, depthStencilAttachment: mainDepthAttachment, }; + + this.beginFrame(); + this._startMainRenderPass(true, null, true, false); + this._endCurrentRenderPass(); + this.endFrame(); + this._frameId--; // We don't want to count the frame as a real frame, because it was only used to initialize the depth texture } /** @@ -1069,8 +1093,8 @@ export class WebGPUEngine extends ThinWebGPUEngine { * @returns ImageBitmap */ // eslint-disable-next-line @typescript-eslint/naming-convention - public override _createImageBitmapFromSource(imageSource: string, options?: ImageBitmapOptions): Promise { - return CreateImageBitmapFromSource(this, imageSource, options); + public override async _createImageBitmapFromSource(imageSource: string, options?: ImageBitmapOptions): Promise { + return await CreateImageBitmapFromSource(this, imageSource, options); } /** @@ -2073,6 +2097,7 @@ export class WebGPUEngine extends ThinWebGPUEngine { /** * @internal */ + // eslint-disable-next-line @typescript-eslint/no-misused-promises public async _preparePipelineContextAsync( pipelineContext: IPipelineContext, vertexSourceCode: string, @@ -2910,7 +2935,7 @@ export class WebGPUEngine extends ThinWebGPUEngine { * @param data defines the data to fill with the read pixels (if not provided, a new one will be created) * @returns a ArrayBufferView promise (Uint8Array) containing RGBA colors */ - // eslint-disable-next-line @typescript-eslint/naming-convention + // eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/promise-function-async public readPixels(x: number, y: number, width: number, height: number, _hasAlpha = true, flushRenderer = true, data: Nullable = null): Promise { const renderPassWrapper = this._getCurrentRenderPassWrapper(); const hardwareTexture = renderPassWrapper.colorAttachmentGPUTextures[0]; @@ -3910,9 +3935,10 @@ export class WebGPUEngine extends ThinWebGPUEngine { this._bufferManager.setSubData(dataBuffer, byteOffset, view, 0, byteLength); } - private _readFromGPUBuffer(gpuBuffer: GPUBuffer, size: number, buffer?: ArrayBufferView, noDelay?: boolean): Promise { - return new Promise((resolve, reject) => { + private async _readFromGPUBuffer(gpuBuffer: GPUBuffer, size: number, buffer?: ArrayBufferView, noDelay?: boolean): Promise { + return await new Promise((resolve, reject) => { const readFromBuffer = () => { + // eslint-disable-next-line github/no-then gpuBuffer.mapAsync(WebGPUConstants.MapMode.Read, 0, size).then( () => { const copyArrayBuffer = gpuBuffer.getMappedRange(0, size); @@ -3933,6 +3959,7 @@ export class WebGPUEngine extends ThinWebGPUEngine { if (this.isDisposed) { resolve(new Uint8Array()); } else { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject(reason); } } @@ -3961,7 +3988,7 @@ export class WebGPUEngine extends ThinWebGPUEngine { * @param noDelay If true, a call to flushFramebuffer will be issued so that the data can be read back immediately and not in engine.onEndFrameObservable. This can speed up data retrieval, at the cost of a small perf penalty (default: false). * @returns If not undefined, returns the (promise) buffer (as provided by the 4th parameter) filled with the data, else it returns a (promise) Uint8Array with the data read from the storage buffer */ - // eslint-disable-next-line @typescript-eslint/naming-convention + // eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/promise-function-async public readFromStorageBuffer(storageBuffer: DataBuffer, offset?: number, size?: number, buffer?: ArrayBufferView, noDelay?: boolean): Promise { size = size || storageBuffer.capacity; @@ -3986,7 +4013,7 @@ export class WebGPUEngine extends ThinWebGPUEngine { * @param noDelay If true, a call to flushFramebuffer will be issued so that the data can be read back immediately and not in engine.onEndFrameObservable. This can speed up data retrieval, at the cost of a small perf penalty (default: false). * @returns If not undefined, returns the (promise) buffer (as provided by the 4th parameter) filled with the data, else it returns a (promise) Uint8Array with the data read from the storage buffer */ - // eslint-disable-next-line @typescript-eslint/naming-convention + // eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/promise-function-async public readFromMultipleStorageBuffers(storageBuffers: DataBuffer[], offset?: number, size?: number, buffer?: ArrayBufferView, noDelay?: boolean): Promise { size = size || storageBuffers[0].capacity; diff --git a/packages/dev/core/src/FlowGraph/Blocks/Execution/ControlFlow/flowGraphForLoopBlock.ts b/packages/dev/core/src/FlowGraph/Blocks/Execution/ControlFlow/flowGraphForLoopBlock.ts index 3f05029840b..32ab0e331bf 100644 --- a/packages/dev/core/src/FlowGraph/Blocks/Execution/ControlFlow/flowGraphForLoopBlock.ts +++ b/packages/dev/core/src/FlowGraph/Blocks/Execution/ControlFlow/flowGraphForLoopBlock.ts @@ -19,6 +19,13 @@ export interface IFlowGraphForLoopBlockConfiguration extends IFlowGraphBlockConf * if not set will default to 0 */ initialIndex?: FlowGraphNumber; + + /** + * If set to true, the index of the case will be incremented when the loop is done. + * This will result that the index will equal endIndex when the loop finished its work. + * This is the default behavior in glTF interactivity + */ + incrementIndexWhenLoopDone?: boolean; } /** * Block that executes an action in a loop. @@ -81,11 +88,15 @@ export class FlowGraphForLoopBlock extends FlowGraphExecutionBlockWithOutSignal this.index.setValue(new FlowGraphInteger(i), context); this.executionFlow._activateSignal(context); endIndex = getNumericValue(this.endIndex.getValue(context)); - if (i > FlowGraphForLoopBlock.MaxLoopIterations) { + if (i > FlowGraphForLoopBlock.MaxLoopIterations * step) { break; } } + if (this.config?.incrementIndexWhenLoopDone) { + this.index.setValue(new FlowGraphInteger(getNumericValue(this.index.getValue(context)) + step), context); + } + this.completed._activateSignal(context); } diff --git a/packages/dev/core/src/FlowGraph/Blocks/Execution/ControlFlow/flowGraphWaitAllBlock.ts b/packages/dev/core/src/FlowGraph/Blocks/Execution/ControlFlow/flowGraphWaitAllBlock.ts index 1d0a118fb4a..397c8dd6898 100644 --- a/packages/dev/core/src/FlowGraph/Blocks/Execution/ControlFlow/flowGraphWaitAllBlock.ts +++ b/packages/dev/core/src/FlowGraph/Blocks/Execution/ControlFlow/flowGraphWaitAllBlock.ts @@ -4,8 +4,9 @@ import { FlowGraphExecutionBlockWithOutSignal } from "../../../flowGraphExecutio import type { IFlowGraphBlockConfiguration } from "../../../flowGraphBlock"; import { RegisterClass } from "../../../../Misc/typeStore"; import type { FlowGraphDataConnection } from "core/FlowGraph/flowGraphDataConnection"; -import { RichTypeNumber } from "core/FlowGraph/flowGraphRichTypes"; +import { RichTypeFlowGraphInteger } from "core/FlowGraph/flowGraphRichTypes"; import { FlowGraphBlockNames } from "../../flowGraphBlockNames"; +import { FlowGraphInteger } from "core/FlowGraph/CustomTypes/flowGraphInteger"; /** * Configuration for the wait all block. */ @@ -34,7 +35,7 @@ export class FlowGraphWaitAllBlock extends FlowGraphExecutionBlockWithOutSignal /** * Output connection: The number of remaining inputs to be activated. */ - public remainingInputs: FlowGraphDataConnection; + public remainingInputs: FlowGraphDataConnection; /** * An array of input signals */ @@ -51,7 +52,7 @@ export class FlowGraphWaitAllBlock extends FlowGraphExecutionBlockWithOutSignal this.reset = this._registerSignalInput("reset"); this.completed = this._registerSignalOutput("completed"); - this.remainingInputs = this.registerDataOutput("remainingInputs", RichTypeNumber, this.config.inputSignalCount || 0); + this.remainingInputs = this.registerDataOutput("remainingInputs", RichTypeFlowGraphInteger, new FlowGraphInteger(this.config.inputSignalCount || 0)); // The first inFlow is the default input signal all execution blocks have for (let i = 0; i < this.config.inputSignalCount; i++) { this.inFlows.push(this._registerSignalInput(`in_${i}`)); @@ -88,7 +89,7 @@ export class FlowGraphWaitAllBlock extends FlowGraphExecutionBlockWithOutSignal activationState[index] = true; } } - this.remainingInputs.setValue(activationState.filter((v) => !v).length, context); + this.remainingInputs.setValue(new FlowGraphInteger(activationState.filter((v) => !v).length), context); context._setExecutionVariable(this, "activationState", activationState.slice()); diff --git a/packages/dev/core/src/FlowGraph/flowGraphParser.ts b/packages/dev/core/src/FlowGraph/flowGraphParser.ts index af574960c2b..35914b82b24 100644 --- a/packages/dev/core/src/FlowGraph/flowGraphParser.ts +++ b/packages/dev/core/src/FlowGraph/flowGraphParser.ts @@ -77,8 +77,8 @@ export async function ParseCoordinatorAsync(serializedObject: any, options: IFlo } // async-parse the flow graphs. This can be done in parallel await Promise.all( - serializedObject._flowGraphs?.map(async (serializedGraph: any) => - ParseFlowGraphAsync(serializedGraph, { coordinator, valueParseFunction, pathConverter: options.pathConverter }) + serializedObject._flowGraphs?.map( + async (serializedGraph: any) => await ParseFlowGraphAsync(serializedGraph, { coordinator, valueParseFunction, pathConverter: options.pathConverter }) ) ); return coordinator; @@ -95,7 +95,7 @@ export async function ParseFlowGraphAsync(serializationObject: ISerializedFlowGr const resolvedClasses = await Promise.all( serializationObject.allBlocks.map(async (serializedBlock) => { const classFactory = blockFactory(serializedBlock.className as FlowGraphBlockNames); - return classFactory(); + return await classFactory(); }) ); // async will be used when we start using the block async factory diff --git a/packages/dev/core/src/FrameGraph/Node/Blocks/PostProcesses/motionBlurPostProcessBlock.ts b/packages/dev/core/src/FrameGraph/Node/Blocks/PostProcesses/motionBlurPostProcessBlock.ts new file mode 100644 index 00000000000..08a2e996242 --- /dev/null +++ b/packages/dev/core/src/FrameGraph/Node/Blocks/PostProcesses/motionBlurPostProcessBlock.ts @@ -0,0 +1,123 @@ +// eslint-disable-next-line import/no-internal-modules +import type { NodeRenderGraphConnectionPoint, Scene, NodeRenderGraphBuildState, FrameGraphTextureHandle, FrameGraph } from "core/index"; +import { RegisterClass } from "../../../../Misc/typeStore"; +import { NodeRenderGraphBlockConnectionPointTypes } from "../../Types/nodeRenderGraphTypes"; +import { editableInPropertyPage, PropertyTypeForEdition } from "../../../../Decorators/nodeDecorator"; +import { FrameGraphMotionBlurTask } from "core/FrameGraph/Tasks/PostProcesses/motionBlurTask"; +import { ThinMotionBlurPostProcess } from "core/PostProcesses/thinMotionBlurPostProcess"; +import { NodeRenderGraphBasePostProcessBlock } from "./basePostProcessBlock"; + +/** + * Block that implements the motion blur post process + */ +export class NodeRenderGraphMotionBlurPostProcessBlock extends NodeRenderGraphBasePostProcessBlock { + protected override _frameGraphTask: FrameGraphMotionBlurTask; + + /** + * Gets the frame graph task associated with this block + */ + public override get task() { + return this._frameGraphTask; + } + + /** + * Create a new NodeRenderGraphMotionBlurPostProcessBlock + * @param name defines the block name + * @param frameGraph defines the hosting frame graph + * @param scene defines the hosting scene + */ + public constructor(name: string, frameGraph: FrameGraph, scene: Scene) { + super(name, frameGraph, scene); + + this.registerInput("geomVelocity", NodeRenderGraphBlockConnectionPointTypes.TextureVelocity, true); + this.registerInput("geomViewDepth", NodeRenderGraphBlockConnectionPointTypes.TextureViewDepth, true); + + this._finalizeInputOutputRegistering(); + + this._frameGraphTask = new FrameGraphMotionBlurTask(this.name, frameGraph, new ThinMotionBlurPostProcess(name, frameGraph.scene)); + } + + /** Defines how much the image is blurred by the movement. */ + @editableInPropertyPage("Strength", PropertyTypeForEdition.Float, "PROPERTIES") + public get motionStrength(): number { + return this._frameGraphTask.postProcess.motionStrength; + } + + public set motionStrength(value: number) { + this._frameGraphTask.postProcess.motionStrength = value; + } + + /** Gets the number of iterations that are used for motion blur quality. */ + @editableInPropertyPage("Samples", PropertyTypeForEdition.Float, "PROPERTIES") + public get motionBlurSamples(): number { + return this._frameGraphTask.postProcess.motionBlurSamples; + } + + public set motionBlurSamples(value: number) { + this._frameGraphTask.postProcess.motionBlurSamples = value; + } + + /** Gets whether or not the motion blur post-process is in object based mode. */ + @editableInPropertyPage("Object based", PropertyTypeForEdition.Boolean, "PROPERTIES") + public get isObjectBased(): boolean { + return this._frameGraphTask.postProcess.isObjectBased; + } + + public set isObjectBased(value: boolean) { + this._frameGraphTask.postProcess.isObjectBased = value; + } + + /** + * Gets the current class name + * @returns the class name + */ + public override getClassName() { + return "NodeRenderGraphMotionBlurPostProcessBlock"; + } + + /** + * Gets the geometry velocity input component + */ + public get geomVelocity(): NodeRenderGraphConnectionPoint { + return this._inputs[2]; + } + + /** + * Gets the geometry view depth input component + */ + public get geomViewDepth(): NodeRenderGraphConnectionPoint { + return this._inputs[3]; + } + + protected override _buildBlock(state: NodeRenderGraphBuildState) { + super._buildBlock(state); + + this._frameGraphTask.velocityTexture = this.geomVelocity.connectedPoint?.value as FrameGraphTextureHandle; + this._frameGraphTask.depthTexture = this.geomViewDepth.connectedPoint?.value as FrameGraphTextureHandle; + } + + protected override _dumpPropertiesCode() { + const codes: string[] = []; + codes.push(`${this._codeVariableName}.motionStrength = ${this.motionStrength};`); + codes.push(`${this._codeVariableName}.motionBlurSamples = ${this.motionBlurSamples};`); + codes.push(`${this._codeVariableName}.isObjectBased = ${this.isObjectBased};`); + return super._dumpPropertiesCode() + codes.join("\n"); + } + + public override serialize(): any { + const serializationObject = super.serialize(); + serializationObject.motionStrength = this.motionStrength; + serializationObject.motionBlurSamples = this.motionBlurSamples; + serializationObject.isObjectBased = this.isObjectBased; + return serializationObject; + } + + public override _deserialize(serializationObject: any) { + super._deserialize(serializationObject); + this.motionStrength = serializationObject.motionStrength; + this.motionBlurSamples = serializationObject.motionBlurSamples; + this.isObjectBased = serializationObject.isObjectBased; + } +} + +RegisterClass("BABYLON.NodeRenderGraphMotionBlurPostProcessBlock", NodeRenderGraphMotionBlurPostProcessBlock); diff --git a/packages/dev/core/src/FrameGraph/Node/Blocks/index.ts b/packages/dev/core/src/FrameGraph/Node/Blocks/index.ts index 8eae0273068..5a6cf78e94a 100644 --- a/packages/dev/core/src/FrameGraph/Node/Blocks/index.ts +++ b/packages/dev/core/src/FrameGraph/Node/Blocks/index.ts @@ -19,6 +19,7 @@ export * from "./PostProcesses/extractHighlightsPostProcessBlock"; export * from "./PostProcesses/fxaaPostProcessBlock"; export * from "./PostProcesses/grainPostProcessBlock"; export * from "./PostProcesses/imageProcessingPostProcessBlock"; +export * from "./PostProcesses/motionBlurPostProcessBlock"; export * from "./PostProcesses/passPostProcessBlock"; export * from "./PostProcesses/ssrPostProcessBlock"; diff --git a/packages/dev/core/src/FrameGraph/Node/nodeRenderGraph.ts b/packages/dev/core/src/FrameGraph/Node/nodeRenderGraph.ts index dfdb5330b2a..029168d681e 100644 --- a/packages/dev/core/src/FrameGraph/Node/nodeRenderGraph.ts +++ b/packages/dev/core/src/FrameGraph/Node/nodeRenderGraph.ts @@ -242,7 +242,7 @@ export class NodeRenderGraph { */ // eslint-disable-next-line @typescript-eslint/naming-convention public async edit(config?: INodeRenderGraphEditorOptions): Promise { - return new Promise((resolve) => { + return await new Promise((resolve) => { this.BJSNODERENDERGRAPHEDITOR = this.BJSNODERENDERGRAPHEDITOR || this._getGlobalNodeRenderGraphEditor(); if (typeof this.BJSNODERENDERGRAPHEDITOR == "undefined") { const editorUrl = config && config.editorURL ? config.editorURL : NodeRenderGraph.EditorURL; @@ -353,6 +353,7 @@ export class NodeRenderGraph { * @param maxTimeout Maximum time in ms to wait for the graph to be ready (default is 30000) * @returns The promise that resolves when the graph is ready */ + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax public whenReadyAsync(timeStep = 16, maxTimeout = 30000): Promise { return this._frameGraph.whenReadyAsync(timeStep, maxTimeout); } @@ -757,6 +758,7 @@ export class NodeRenderGraph { * @param skipBuild defines whether to skip building the node render graph (default is true) * @returns a promise that will resolve to the new node render graph */ + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax public static ParseFromSnippetAsync( snippetId: string, scene: Scene, @@ -789,9 +791,11 @@ export class NodeRenderGraph { } resolve(nodeRenderGraph); } catch (err) { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject(err); } } else { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject("Unable to load the snippet " + snippetId); } } diff --git a/packages/dev/core/src/FrameGraph/Node/nodeRenderGraphBlock.ts b/packages/dev/core/src/FrameGraph/Node/nodeRenderGraphBlock.ts index 30462c992a8..0a53e493c55 100644 --- a/packages/dev/core/src/FrameGraph/Node/nodeRenderGraphBlock.ts +++ b/packages/dev/core/src/FrameGraph/Node/nodeRenderGraphBlock.ts @@ -484,7 +484,7 @@ export class NodeRenderGraphBlock { for (const port of serializedInputs) { const input = this.inputs.find((i) => i.name === port.name); if (!input) { - return; + continue; } if (port.displayName) { input.displayName = port.displayName; diff --git a/packages/dev/core/src/FrameGraph/Passes/renderPass.ts b/packages/dev/core/src/FrameGraph/Passes/renderPass.ts index e3e0c99576f..e2f928fe378 100644 --- a/packages/dev/core/src/FrameGraph/Passes/renderPass.ts +++ b/packages/dev/core/src/FrameGraph/Passes/renderPass.ts @@ -61,7 +61,11 @@ export class FrameGraphRenderPass extends FrameGraphPass { + if (this.velocityTexture) { + context.bindTextureHandle(this._postProcessDrawWrapper.effect!, "velocitySampler", this.velocityTexture); + } else if (this.postProcess.isObjectBased) { + throw new Error(`FrameGraphMotionBlurTask "${this.name}": velocityTexture is required for object-based motion blur`); + } + + if (this.depthTexture) { + context.bindTextureHandle(this._postProcessDrawWrapper.effect!, "depthSampler", this.depthTexture); + } else if (!this.postProcess.isObjectBased) { + throw new Error(`FrameGraphMotionBlurTask "${this.name}": depthTexture is required for screen-based motion blur`); + } + }); + + pass.addDependencies(this.velocityTexture); + pass.addDependencies(this.depthTexture); + + this.postProcess.textureWidth = this._sourceWidth; + this.postProcess.textureHeight = this._sourceHeight; + + return pass; + } +} diff --git a/packages/dev/core/src/FrameGraph/Tasks/Rendering/geometryRendererTask.ts b/packages/dev/core/src/FrameGraph/Tasks/Rendering/geometryRendererTask.ts index 3f5438278b6..b0ae61a2848 100644 --- a/packages/dev/core/src/FrameGraph/Tasks/Rendering/geometryRendererTask.ts +++ b/packages/dev/core/src/FrameGraph/Tasks/Rendering/geometryRendererTask.ts @@ -38,7 +38,7 @@ export interface IFrameGraphGeometryRendererTextureDescription { textureFormat: number; } -const ClearColors: Color4[] = [new Color4(0, 0, 0, 0), new Color4(1, 1, 1, 1), new Color4(1e8, 1e8, 1e8, 1e8)]; +const ClearColors: Color4[] = [new Color4(0, 0, 0, 0), new Color4(1, 1, 1, 1), new Color4(0, 0, 0, 0)]; /** * Task used to render geometry to a set of textures. @@ -262,6 +262,33 @@ export class FrameGraphGeometryRendererTask extends FrameGraphTask { return MaterialHelperGeometryRendering.GetConfiguration(this._renderer.renderPassId).excludedSkinnedMesh; } + /** + * Excludes the given skinned mesh from computing bones velocities. + * Computing bones velocities can have a cost. The cost can be saved by calling this function and by passing the skinned mesh to ignore. + * @param skinnedMesh The mesh containing the skeleton to ignore when computing the velocity map. + */ + public excludeSkinnedMeshFromVelocityTexture(skinnedMesh: AbstractMesh): void { + if (skinnedMesh.skeleton) { + const list = this.excludedSkinnedMeshFromVelocityTexture; + if (list.indexOf(skinnedMesh) === -1) { + list.push(skinnedMesh); + } + } + } + + /** + * Removes the given skinned mesh from the excluded meshes to integrate bones velocities while rendering the velocity map. + * @param skinnedMesh The mesh containing the skeleton that has been ignored previously. + * @see excludeSkinnedMesh to exclude a skinned mesh from bones velocity computation. + */ + public removeExcludedSkinnedMeshFromVelocityTexture(skinnedMesh: AbstractMesh): void { + const list = this.excludedSkinnedMeshFromVelocityTexture; + const index = list.indexOf(skinnedMesh); + if (index !== -1) { + list.splice(index, 1); + } + } + public override isReady() { return this._renderer.isReadyForRendering(this._textureWidth, this._textureHeight); } @@ -295,6 +322,8 @@ export class FrameGraphGeometryRendererTask extends FrameGraphTask { pass.setRenderTarget(outputTextureHandle); + let needPreviousWorldMatrices = false; + for (let i = 0; i < this.textureDescriptions.length; i++) { const description = this.textureDescriptions[i]; const handle = outputTextureHandle[i]; @@ -328,13 +357,17 @@ export class FrameGraphGeometryRendererTask extends FrameGraphTask { break; case Constants.PREPASS_VELOCITY_TEXTURE_TYPE: this._frameGraph.textureManager.resolveDanglingHandle(this.geometryVelocityTexture, handle); + needPreviousWorldMatrices = true; break; case Constants.PREPASS_VELOCITY_LINEAR_TEXTURE_TYPE: this._frameGraph.textureManager.resolveDanglingHandle(this.geometryLinearVelocityTexture, handle); + needPreviousWorldMatrices = true; break; } } + this._scene.needsPreviousWorldMatrices = needPreviousWorldMatrices; + pass.setRenderTargetDepth(this.depthTexture); pass.setExecuteFunc((context) => { diff --git a/packages/dev/core/src/FrameGraph/frameGraph.ts b/packages/dev/core/src/FrameGraph/frameGraph.ts index 03f6448b68d..fbe7bf55b01 100644 --- a/packages/dev/core/src/FrameGraph/frameGraph.ts +++ b/packages/dev/core/src/FrameGraph/frameGraph.ts @@ -229,7 +229,7 @@ export class FrameGraph { */ public async whenReadyAsync(timeStep = 16, maxTimeout = 30000): Promise { let firstNotReadyTask: FrameGraphTask | null = null; - return new Promise((resolve) => { + return await new Promise((resolve) => { this._whenReadyAsyncCancel = _RetryWithInterval( () => { let ready = this._renderContext._isReady(); diff --git a/packages/dev/core/src/FrameGraph/index.ts b/packages/dev/core/src/FrameGraph/index.ts index 838d22a7021..c3e3c29b2f8 100644 --- a/packages/dev/core/src/FrameGraph/index.ts +++ b/packages/dev/core/src/FrameGraph/index.ts @@ -13,6 +13,7 @@ export * from "./Passes/renderPass"; export * from "./Tasks/Layers/glowLayerTask"; export * from "./Tasks/Layers/highlightLayerTask"; +export * from "./Tasks/Misc/cullObjectsTask"; export * from "./Tasks/Misc/executeTask"; export * from "./Tasks/PostProcesses/anaglyphTask"; @@ -26,6 +27,7 @@ export * from "./Tasks/PostProcesses/extractHighlightsTask"; export * from "./Tasks/PostProcesses/fxaaTask"; export * from "./Tasks/PostProcesses/grainTask"; export * from "./Tasks/PostProcesses/imageProcessingTask"; +export * from "./Tasks/PostProcesses/motionBlurTask"; export * from "./Tasks/PostProcesses/passTask"; export * from "./Tasks/PostProcesses/postProcessTask"; export * from "./Tasks/PostProcesses/ssrRenderingPipelineTask"; @@ -36,7 +38,6 @@ export * from "./Tasks/Texture/copyToTextureTask"; export * from "./Tasks/Texture/generateMipMapsTask"; export * from "./Tasks/Rendering/csmShadowGeneratorTask"; -export * from "./Tasks/Misc/cullObjectsTask"; export * from "./Tasks/Rendering/geometryRendererTask"; export * from "./Tasks/Rendering/objectRendererTask"; export * from "./Tasks/Rendering/shadowGeneratorTask"; diff --git a/packages/dev/core/src/Gizmos/cameraGizmo.ts b/packages/dev/core/src/Gizmos/cameraGizmo.ts index 6e1c5ce8dc1..4d185d17e81 100644 --- a/packages/dev/core/src/Gizmos/cameraGizmo.ts +++ b/packages/dev/core/src/Gizmos/cameraGizmo.ts @@ -113,9 +113,9 @@ export class CameraGizmo extends Gizmo implements ICameraGizmo { if ( this.gizmoLayer.utilityLayerScene.activeCamera && this.gizmoLayer.utilityLayerScene.activeCamera != camera && - this.gizmoLayer.utilityLayerScene.activeCamera.maxZ < camera.maxZ * 1.5 + this.gizmoLayer.utilityLayerScene.activeCamera.maxZ < camera.maxZ ) { - this.gizmoLayer.utilityLayerScene.activeCamera.maxZ = camera.maxZ * 1.5; + this.gizmoLayer.utilityLayerScene.activeCamera.maxZ = camera.maxZ; } if (!this.attachedNode!.reservedDataStore) { diff --git a/packages/dev/core/src/Helpers/sceneHelpers.ts b/packages/dev/core/src/Helpers/sceneHelpers.ts index ea692a0a289..aa91d941f5a 100644 --- a/packages/dev/core/src/Helpers/sceneHelpers.ts +++ b/packages/dev/core/src/Helpers/sceneHelpers.ts @@ -211,7 +211,5 @@ Scene.prototype.createDefaultVRExperience = function (webVROptions: VRExperience }; Scene.prototype.createDefaultXRExperienceAsync = async function (options: WebXRDefaultExperienceOptions = {}): Promise { - return WebXRDefaultExperience.CreateAsync(this, options).then((helper) => { - return helper; - }); + return await WebXRDefaultExperience.CreateAsync(this, options); }; diff --git a/packages/dev/core/src/Helpers/videoDome.ts b/packages/dev/core/src/Helpers/videoDome.ts index be1601348c6..735cce647d1 100644 --- a/packages/dev/core/src/Helpers/videoDome.ts +++ b/packages/dev/core/src/Helpers/videoDome.ts @@ -66,6 +66,7 @@ export class VideoDome extends TextureDome { if (options.clickToPlay) { this._pointerObserver = scene.onPointerObservable.add((data) => { if (data.pickInfo?.pickedMesh === this.mesh) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises this._texture.video.play(); } }, PointerEventTypes.POINTERDOWN); diff --git a/packages/dev/core/src/Layers/thinEffectLayer.ts b/packages/dev/core/src/Layers/thinEffectLayer.ts index 7d5bcc0500f..d4d00109c21 100644 --- a/packages/dev/core/src/Layers/thinEffectLayer.ts +++ b/packages/dev/core/src/Layers/thinEffectLayer.ts @@ -735,6 +735,7 @@ export class ThinEffectLayer { } else { await Promise.all([import("../Shaders/glowMapGeneration.vertex"), import("../Shaders/glowMapGeneration.fragment")]); } + // eslint-disable-next-line @typescript-eslint/no-floating-promises this._additionalImportShadersAsync?.(); } diff --git a/packages/dev/core/src/LensFlares/lensFlareSystem.ts b/packages/dev/core/src/LensFlares/lensFlareSystem.ts index 0dc328f098c..dae2f01d913 100644 --- a/packages/dev/core/src/LensFlares/lensFlareSystem.ts +++ b/packages/dev/core/src/LensFlares/lensFlareSystem.ts @@ -132,6 +132,7 @@ export class LensFlareSystem { // Indices this._createIndexBuffer(); + // eslint-disable-next-line @typescript-eslint/no-floating-promises this._initShaderSourceAsync(); } diff --git a/packages/dev/core/src/Lights/Shadows/shadowGenerator.ts b/packages/dev/core/src/Lights/Shadows/shadowGenerator.ts index c82a09095df..34eb5b4c658 100644 --- a/packages/dev/core/src/Lights/Shadows/shadowGenerator.ts +++ b/packages/dev/core/src/Lights/Shadows/shadowGenerator.ts @@ -901,6 +901,7 @@ export class ShadowGenerator implements IShadowGenerator { this._camera = camera ?? null; this._useRedTextureType = !!useRedTextureType; + // eslint-disable-next-line @typescript-eslint/no-floating-promises this._initShaderSourceAsync(forceGLSL); let shadowGenerators = light._shadowGenerators; @@ -1517,8 +1518,8 @@ export class ShadowGenerator implements IShadowGenerator { * @param options Sets of optional options forcing the compilation with different modes * @returns A promise that resolves when the compilation completes */ - public forceCompilationAsync(options?: Partial<{ useInstances: boolean }>): Promise { - return new Promise((resolve) => { + public async forceCompilationAsync(options?: Partial<{ useInstances: boolean }>): Promise { + return await new Promise((resolve) => { this.forceCompilation(() => { resolve(); }, options); diff --git a/packages/dev/core/src/Lights/areaLight.ts b/packages/dev/core/src/Lights/areaLight.ts index 213e65973f1..8e8fc755498 100644 --- a/packages/dev/core/src/Lights/areaLight.ts +++ b/packages/dev/core/src/Lights/areaLight.ts @@ -42,6 +42,7 @@ function CreateSceneLTCTextures(scene: Scene): void { scene.useDelayedTextureLoading = useDelayedTextureLoading; DecodeLTCTextureDataAsync() + // eslint-disable-next-line github/no-then .then((textureData) => { if (scene._ltcTextures) { const ltc1 = scene._ltcTextures?.LTC1 as RawTexture; @@ -56,6 +57,7 @@ function CreateSceneLTCTextures(scene: Scene): void { }); } }) + // eslint-disable-next-line github/no-then .catch((error) => { Logger.Error(`Area Light fail to get LTC textures data. Error: ${error}`); }); diff --git a/packages/dev/core/src/Loading/sceneLoader.ts b/packages/dev/core/src/Loading/sceneLoader.ts index 310a47bdd81..b8ae7dcc4fd 100644 --- a/packages/dev/core/src/Loading/sceneLoader.ts +++ b/packages/dev/core/src/Loading/sceneLoader.ts @@ -592,6 +592,7 @@ async function loadDataAsync( const response = await _FetchAsync(fileInfo.url, { method: "HEAD", responseHeaders: ["Content-Type"] }); const mimeType = response.headerValues ? response.headerValues["Content-Type"] : ""; if (mimeType) { + // eslint-disable-next-line require-atomic-updates registeredPlugin = getPluginForMimeType(mimeType); } } @@ -622,6 +623,7 @@ async function loadDataAsync( const pluginFactory = registeredPlugin.plugin; const partialPlugin = pluginFactory.createPlugin(pluginOptions ?? {}); if (partialPlugin instanceof Promise) { + // eslint-disable-next-line github/no-then partialPlugin.then(callback).catch((error) => { onError("Error instantiating plugin.", error); }); @@ -653,9 +655,11 @@ async function loadDataAsync( const result = plugin.directLoad(scene, directLoad); if (result instanceof Promise) { result + // eslint-disable-next-line github/no-then .then((data: unknown) => { onSuccess(plugin, data); }) + // eslint-disable-next-line github/no-then .catch((error: any) => { onError("Error in directLoad of _loadData: " + error, error); }); @@ -853,7 +857,7 @@ export function GetRegisteredSceneLoaderPluginMetadata(): DeepImmutable< */ export async function ImportMeshAsync(source: SceneSource, scene: Scene, options?: ImportMeshOptions): Promise { const { meshNames, rootUrl = "", onProgress, pluginExtension, name, pluginOptions } = options ?? {}; - return importMeshAsyncCoreAsync(meshNames, rootUrl, source, scene, onProgress, pluginExtension, name, pluginOptions); + return await importMeshAsyncCoreAsync(meshNames, rootUrl, source, scene, onProgress, pluginExtension, name, pluginOptions); } async function importMeshAsync( @@ -946,6 +950,7 @@ async function importMeshAsync( const asyncedPlugin = plugin; asyncedPlugin .importMeshAsync(meshNames, scene, data, fileInfo.rootUrl, progressHandler, fileInfo.name) + // eslint-disable-next-line github/no-then .then((result) => { scene.loadingPluginName = plugin.name; successHandler( @@ -959,6 +964,7 @@ async function importMeshAsync( result.spriteManagers ); }) + // eslint-disable-next-line github/no-then .catch((error) => { errorHandler(error.message, error); }); @@ -983,7 +989,7 @@ async function importMeshAsyncCoreAsync( name?: string, pluginOptions?: PluginOptions ): Promise { - return new Promise((resolve, reject) => { + return await new Promise((resolve, reject) => { try { importMeshAsync( meshNames, @@ -1004,13 +1010,16 @@ async function importMeshAsyncCoreAsync( }, onProgress, (scene, message, exception) => { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject(exception || new Error(message)); }, pluginExtension, name, pluginOptions + // eslint-disable-next-line github/no-then ).catch(reject); } catch (error) { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject(error); } }); @@ -1045,7 +1054,7 @@ async function loadSceneImplAsync( */ export async function LoadSceneAsync(source: SceneSource, engine: AbstractEngine, options?: LoadOptions): Promise { const { rootUrl = "", onProgress, pluginExtension, name, pluginOptions } = options ?? {}; - return loadSceneSharedAsync(rootUrl, source, engine, onProgress, pluginExtension, name, pluginOptions); + return await loadSceneSharedAsync(rootUrl, source, engine, onProgress, pluginExtension, name, pluginOptions); } /** @@ -1057,7 +1066,7 @@ export async function LoadSceneAsync(source: SceneSource, engine: AbstractEngine * @returns The loaded scene */ export async function loadSceneAsync(source: SceneSource, engine: AbstractEngine, options?: LoadOptions): Promise { - return LoadSceneAsync(source, engine, options); + return await LoadSceneAsync(source, engine, options); } // This function is shared between the new module level loadSceneAsync and the legacy SceneLoader.LoadAsync @@ -1070,7 +1079,8 @@ async function loadSceneSharedAsync( name?: string, pluginOptions?: PluginOptions ): Promise { - return new Promise((resolve, reject) => { + return await new Promise((resolve, reject) => { + // eslint-disable-next-line @typescript-eslint/no-floating-promises loadSceneImplAsync( rootUrl, sceneFilename, @@ -1080,6 +1090,7 @@ async function loadSceneSharedAsync( }, onProgress, (scene, message, exception) => { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject(exception || new Error(message)); }, pluginExtension, @@ -1178,10 +1189,12 @@ async function appendSceneImplAsync( const asyncedPlugin = plugin; asyncedPlugin .loadAsync(scene, data, fileInfo.rootUrl, progressHandler, fileInfo.name) + // eslint-disable-next-line github/no-then .then(() => { scene.loadingPluginName = plugin.name; successHandler(); }) + // eslint-disable-next-line github/no-then .catch((error) => { errorHandler(error.message, error); }); @@ -1217,7 +1230,7 @@ export async function AppendSceneAsync(source: SceneSource, scene: Scene, option * @returns A promise that resolves when the scene is appended */ export async function appendSceneAsync(source: SceneSource, scene: Scene, options?: AppendOptions): Promise { - return AppendSceneAsync(source, scene, options); + return await AppendSceneAsync(source, scene, options); } // This function is shared between the new module level appendSceneAsync and the legacy SceneLoader.AppendAsync @@ -1230,7 +1243,7 @@ async function appendSceneSharedAsync( name?: string, pluginOptions?: PluginOptions ): Promise { - return new Promise((resolve, reject) => { + return await new Promise((resolve, reject) => { try { appendSceneImplAsync( rootUrl, @@ -1241,13 +1254,16 @@ async function appendSceneSharedAsync( }, onProgress, (scene, message, exception) => { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject(exception || new Error(message)); }, pluginExtension, name, pluginOptions + // eslint-disable-next-line github/no-then ).catch(reject); } catch (error) { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject(error); } }); @@ -1334,11 +1350,13 @@ async function loadAssetContainerImplAsync( const asyncedPlugin = plugin; asyncedPlugin .loadAssetContainerAsync(scene, data, fileInfo.rootUrl, progressHandler, fileInfo.name) + // eslint-disable-next-line github/no-then .then((assetContainer) => { assetContainer.populateRootNodes(); scene.loadingPluginName = plugin.name; successHandler(assetContainer); }) + // eslint-disable-next-line github/no-then .catch((error) => { errorHandler(error.message, error); }); @@ -1364,7 +1382,7 @@ async function loadAssetContainerImplAsync( */ export async function LoadAssetContainerAsync(source: SceneSource, scene: Scene, options?: LoadAssetContainerOptions): Promise { const { rootUrl = "", onProgress, pluginExtension, name, pluginOptions } = options ?? {}; - return loadAssetContainerSharedAsync(rootUrl, source, scene, onProgress, pluginExtension, name, pluginOptions); + return await loadAssetContainerSharedAsync(rootUrl, source, scene, onProgress, pluginExtension, name, pluginOptions); } /** @@ -1376,7 +1394,7 @@ export async function LoadAssetContainerAsync(source: SceneSource, scene: Scene, * @returns The loaded asset container */ export async function loadAssetContainerAsync(source: SceneSource, scene: Scene, options?: LoadAssetContainerOptions): Promise { - return LoadAssetContainerAsync(source, scene, options); + return await LoadAssetContainerAsync(source, scene, options); } // This function is shared between the new module level loadAssetContainerAsync and the legacy SceneLoader.LoadAssetContainerAsync @@ -1389,7 +1407,7 @@ async function loadAssetContainerSharedAsync( name?: string, pluginOptions?: PluginOptions ): Promise { - return new Promise((resolve, reject) => { + return await new Promise((resolve, reject) => { try { loadAssetContainerImplAsync( rootUrl, @@ -1400,13 +1418,16 @@ async function loadAssetContainerSharedAsync( }, onProgress, (scene, message, exception) => { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject(exception || new Error(message)); }, pluginExtension, name, pluginOptions + // eslint-disable-next-line github/no-then ).catch(reject); } catch (error) { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject(error); } }); @@ -1514,7 +1535,7 @@ export async function ImportAnimationsAsync(source: SceneSource, scene: Scene, o * @returns A promise that resolves when the animations are imported */ export async function importAnimationsAsync(source: SceneSource, scene: Scene, options?: ImportAnimationsOptions): Promise { - return ImportAnimationsAsync(source, scene, options); + return await ImportAnimationsAsync(source, scene, options); } // This function is shared between the new module level importAnimationsAsync and the legacy SceneLoader.ImportAnimationsAsync @@ -1530,7 +1551,7 @@ async function importAnimationsSharedAsync( name?: string, pluginOptions?: PluginOptions ): Promise { - return new Promise((resolve, reject) => { + return await new Promise((resolve, reject) => { try { importAnimationsImplAsync( rootUrl, @@ -1544,13 +1565,16 @@ async function importAnimationsSharedAsync( }, onProgress, (scene, message, exception) => { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject(exception || new Error(message)); }, pluginExtension, name, pluginOptions + // eslint-disable-next-line github/no-then ).catch(reject); } catch (error) { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject(error); } }); @@ -1697,6 +1721,7 @@ export class SceneLoader { pluginExtension?: Nullable, name?: string ): void { + // eslint-disable-next-line github/no-then importMeshAsync(meshNames, rootUrl, sceneFilename, scene, onSuccess, onProgress, onError, pluginExtension, name).catch((error) => onError?.(EngineStore.LastCreatedScene!, error?.message, error) ); @@ -1723,7 +1748,7 @@ export class SceneLoader { pluginExtension?: Nullable, name?: string ): Promise { - return importMeshAsyncCoreAsync(meshNames, rootUrl, sceneFilename, scene, onProgress, pluginExtension, name); + return await importMeshAsyncCoreAsync(meshNames, rootUrl, sceneFilename, scene, onProgress, pluginExtension, name); } /** @@ -1748,6 +1773,7 @@ export class SceneLoader { pluginExtension?: Nullable, name?: string ) { + // eslint-disable-next-line github/no-then loadSceneImplAsync(rootUrl, sceneFilename, engine, onSuccess, onProgress, onError, pluginExtension, name).catch((error) => onError?.(EngineStore.LastCreatedScene!, error?.message, error) ); @@ -1772,7 +1798,7 @@ export class SceneLoader { pluginExtension?: Nullable, name?: string ): Promise { - return loadSceneSharedAsync(rootUrl, sceneFilename, engine, onProgress, pluginExtension, name); + return await loadSceneSharedAsync(rootUrl, sceneFilename, engine, onProgress, pluginExtension, name); } /** @@ -1797,6 +1823,7 @@ export class SceneLoader { pluginExtension?: Nullable, name?: string ) { + // eslint-disable-next-line github/no-then appendSceneImplAsync(rootUrl, sceneFilename, scene, onSuccess, onProgress, onError, pluginExtension, name).catch((error) => onError?.((scene ?? EngineStore.LastCreatedScene)!, error?.message, error) ); @@ -1821,7 +1848,7 @@ export class SceneLoader { pluginExtension?: Nullable, name?: string ): Promise { - return appendSceneSharedAsync(rootUrl, sceneFilename, scene, onProgress, pluginExtension, name); + return await appendSceneSharedAsync(rootUrl, sceneFilename, scene, onProgress, pluginExtension, name); } /** @@ -1846,6 +1873,7 @@ export class SceneLoader { pluginExtension?: Nullable, name?: string ) { + // eslint-disable-next-line github/no-then loadAssetContainerImplAsync(rootUrl, sceneFilename, scene, onSuccess, onProgress, onError, pluginExtension, name).catch((error) => onError?.((scene ?? EngineStore.LastCreatedScene)!, error?.message, error) ); @@ -1870,7 +1898,7 @@ export class SceneLoader { pluginExtension?: Nullable, name?: string ): Promise { - return loadAssetContainerSharedAsync(rootUrl, sceneFilename, scene, onProgress, pluginExtension, name); + return await loadAssetContainerSharedAsync(rootUrl, sceneFilename, scene, onProgress, pluginExtension, name); } /** @@ -1913,6 +1941,7 @@ export class SceneLoader { onError, pluginExtension, name + // eslint-disable-next-line github/no-then ).catch((error) => onError?.((scene ?? EngineStore.LastCreatedScene)!, error?.message, error)); } @@ -1947,6 +1976,6 @@ export class SceneLoader { pluginExtension?: Nullable, name?: string ): Promise { - return importAnimationsSharedAsync(rootUrl, sceneFilename, scene, overwriteAnimations, animationGroupLoadingMode, targetConverter, onProgress, pluginExtension, name); + return await importAnimationsSharedAsync(rootUrl, sceneFilename, scene, overwriteAnimations, animationGroupLoadingMode, targetConverter, onProgress, pluginExtension, name); } } diff --git a/packages/dev/core/src/Materials/GaussianSplatting/gaussianSplattingMaterial.ts b/packages/dev/core/src/Materials/GaussianSplatting/gaussianSplattingMaterial.ts index 3d80d48a0b7..ca7b7478c41 100644 --- a/packages/dev/core/src/Materials/GaussianSplatting/gaussianSplattingMaterial.ts +++ b/packages/dev/core/src/Materials/GaussianSplatting/gaussianSplattingMaterial.ts @@ -70,7 +70,7 @@ export class GaussianSplattingMaterial extends PushMaterial { } /** - * Point spread function (default 0.3) + * Point spread function (default 0.3). Can be overriden per GS material */ public static KernelSize: number = 0.3; @@ -79,6 +79,30 @@ export class GaussianSplattingMaterial extends PushMaterial { */ public static Compensation: boolean = false; + /** + * Point spread function (default 0.3). Can be overriden per GS material, otherwise, using default static `KernelSize` value + */ + public kernelSize = GaussianSplattingMaterial.KernelSize; + private _compensation = GaussianSplattingMaterial.Compensation; + + // set to true when material defines are dirty + private _isDirty = false; + + /** + * Set compensation default value is `GaussianSplattingMaterial.Compensation` + */ + public set compensation(value: boolean) { + this._isDirty = this._isDirty != value; + this._compensation = value; + } + + /** + * Get compensation + */ + public get compensation(): boolean { + return this._compensation; + } + /** * Gets a boolean indicating that current material needs to register RTT */ @@ -112,6 +136,11 @@ export class GaussianSplattingMaterial extends PushMaterial { const useInstances = true; const drawWrapper = subMesh._drawWrapper; + let defines = subMesh.materialDefines; + + if (defines && this._isDirty) { + defines.markAsUnprocessed(); + } if (drawWrapper.effect && this.isFrozen) { if (drawWrapper._wasPreviouslyReady && drawWrapper._wasPreviouslyUsingInstances === useInstances) { @@ -120,17 +149,17 @@ export class GaussianSplattingMaterial extends PushMaterial { } if (!subMesh.materialDefines) { - subMesh.materialDefines = new GaussianSplattingMaterialDefines(); + defines = subMesh.materialDefines = new GaussianSplattingMaterialDefines(); } const scene = this.getScene(); - const defines = subMesh.materialDefines; if (this._isReadyForSubMesh(subMesh)) { return true; } const engine = scene.getEngine(); + const gsMesh = mesh as GaussianSplattingMesh; // Misc. PrepareDefinesForMisc(mesh, scene, this._useLogarithmicDepth, this.pointsCloud, this.fogEnabled, false, defines); @@ -143,11 +172,12 @@ export class GaussianSplattingMaterial extends PushMaterial { // SH is disabled for webGL1 if (engine.version > 1 || engine.isWebGPU) { - defines["SH_DEGREE"] = (mesh).shDegree; + defines["SH_DEGREE"] = gsMesh.shDegree; } // Compensation - defines["COMPENSATION"] = GaussianSplattingMaterial.Compensation; + const splatMaterial = gsMesh.material as GaussianSplattingMaterial; + defines["COMPENSATION"] = splatMaterial && splatMaterial.compensation ? splatMaterial.compensation : GaussianSplattingMaterial.Compensation; // Get correct effect if (defines.isDirty) { @@ -217,6 +247,7 @@ export class GaussianSplattingMaterial extends PushMaterial { defines._renderId = scene.getRenderId(); drawWrapper._wasPreviouslyReady = true; drawWrapper._wasPreviouslyUsingInstances = useInstances; + this._isDirty = false; return true; } @@ -234,6 +265,9 @@ export class GaussianSplattingMaterial extends PushMaterial { const renderWidth = engine.getRenderWidth(); const renderHeight = engine.getRenderHeight(); + const gsMesh = mesh as GaussianSplattingMesh; + const gsMaterial = gsMesh.material as GaussianSplattingMaterial; + // check if rigcamera, get number of rigs const numberOfRigs = camera?.rigParent?.rigCameras.length || 1; @@ -258,14 +292,12 @@ export class GaussianSplattingMaterial extends PushMaterial { } effect.setFloat2("focal", focal, focal); - effect.setFloat("kernelSize", GaussianSplattingMaterial.KernelSize); + effect.setFloat("kernelSize", gsMaterial && gsMaterial.kernelSize ? gsMaterial.kernelSize : GaussianSplattingMaterial.KernelSize); // vEyePosition doesn't get automatially bound on MacOS with Chromium for no apparent reason. // Binding it manually here instead. Remove next line when SH rendering is fine on that platform. scene.bindEyePosition(effect); - const gsMesh = mesh as GaussianSplattingMesh; - if (gsMesh.covariancesATexture) { const textureSize = gsMesh.covariancesATexture.getSize(); diff --git a/packages/dev/core/src/Materials/GreasedLine/greasedLinePluginMaterial.ts b/packages/dev/core/src/Materials/GreasedLine/greasedLinePluginMaterial.ts index a0d19b9c2b6..f87ae11a4fc 100644 --- a/packages/dev/core/src/Materials/GreasedLine/greasedLinePluginMaterial.ts +++ b/packages/dev/core/src/Materials/GreasedLine/greasedLinePluginMaterial.ts @@ -20,6 +20,7 @@ import { GreasedLineTools } from "../../Misc/greasedLineTools"; import { GetCustomCode as getCustomCodeGLSL } from "./greasedLinePluginMaterialShadersGLSL"; import { GetCustomCode as getCustomCodeWGSL } from "./greasedLinePluginMaterialShadersWGSL"; import type { GreasedLineBaseMesh } from "../../Meshes"; +import type { GreasedLineBaseMesh } from "../../Meshes"; /** * @internal @@ -53,7 +54,7 @@ export class MaterialGreasedLineDefines extends MaterialDefines { GREASED_LINE_CAMERA_FACING = true; /** - * True if the line uses offsets + * True if the line is in camera facing mode */ // eslint-disable-next-line @typescript-eslint/naming-convention GREASED_LINE_USE_OFFSETS = false; diff --git a/packages/dev/core/src/Materials/GreasedLine/greasedLineSimpleMaterial.ts b/packages/dev/core/src/Materials/GreasedLine/greasedLineSimpleMaterial.ts index 38f35d8e6b1..743f0c5863b 100644 --- a/packages/dev/core/src/Materials/GreasedLine/greasedLineSimpleMaterial.ts +++ b/packages/dev/core/src/Materials/GreasedLine/greasedLineSimpleMaterial.ts @@ -145,10 +145,10 @@ export class GreasedLineSimpleMaterial extends ShaderMaterial implements IGrease this.colorsTexture = options.colorsTexture; } else { if (this._colors) { - this.colorsTexture = GreasedLineTools.CreateColorsTexture(`${this.name}-colors-texture`, this._colors, this.colorsSampling, scene); + this.colorsTexture = GreasedLineTools.CreateColorsTexture(`${this.name}-colors-texture`, this._colors, this.colorsSampling, this._scene); } else { this._color = this._color ?? GreasedLineMaterialDefaults.DEFAULT_COLOR; - this.colorsTexture = GreasedLineTools.PrepareEmptyColorsTexture(scene); + GreasedLineTools.PrepareEmptyColorsTexture(scene); } } diff --git a/packages/dev/core/src/Materials/Node/Blocks/Dual/clipPlanesBlock.ts b/packages/dev/core/src/Materials/Node/Blocks/Dual/clipPlanesBlock.ts index 406855f24dd..9958c689975 100644 --- a/packages/dev/core/src/Materials/Node/Blocks/Dual/clipPlanesBlock.ts +++ b/packages/dev/core/src/Materials/Node/Blocks/Dual/clipPlanesBlock.ts @@ -50,6 +50,7 @@ export class ClipPlanesBlock extends NodeMaterialBlock { state._excludeVariableName("vClipPlane6"); state._excludeVariableName("fClipDistance6"); + // eslint-disable-next-line @typescript-eslint/no-floating-promises this._initShaderSourceAsync(state.shaderLanguage); } diff --git a/packages/dev/core/src/Materials/Node/Blocks/Dual/fogBlock.ts b/packages/dev/core/src/Materials/Node/Blocks/Dual/fogBlock.ts index 234cc442cc9..e07c07faea2 100644 --- a/packages/dev/core/src/Materials/Node/Blocks/Dual/fogBlock.ts +++ b/packages/dev/core/src/Materials/Node/Blocks/Dual/fogBlock.ts @@ -90,6 +90,7 @@ export class FogBlock extends NodeMaterialBlock { } public override initialize(state: NodeMaterialBuildState) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises this._initShaderSourceAsync(state.shaderLanguage); } diff --git a/packages/dev/core/src/Materials/Node/Blocks/Dual/lightBlock.ts b/packages/dev/core/src/Materials/Node/Blocks/Dual/lightBlock.ts index 465bb6aa826..a02d5b58fb4 100644 --- a/packages/dev/core/src/Materials/Node/Blocks/Dual/lightBlock.ts +++ b/packages/dev/core/src/Materials/Node/Blocks/Dual/lightBlock.ts @@ -164,6 +164,7 @@ export class LightBlock extends NodeMaterialBlock { } public override initialize(state: NodeMaterialBuildState) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises this._initShaderSourceAsync(state.shaderLanguage); } diff --git a/packages/dev/core/src/Materials/Node/Blocks/Dual/reflectionTextureBaseBlock.ts b/packages/dev/core/src/Materials/Node/Blocks/Dual/reflectionTextureBaseBlock.ts index 1f9c4657a86..2d066ca4b96 100644 --- a/packages/dev/core/src/Materials/Node/Blocks/Dual/reflectionTextureBaseBlock.ts +++ b/packages/dev/core/src/Materials/Node/Blocks/Dual/reflectionTextureBaseBlock.ts @@ -171,6 +171,7 @@ export abstract class ReflectionTextureBaseBlock extends NodeMaterialBlock { } public override initialize(state: NodeMaterialBuildState) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises this._initShaderSourceAsync(state.shaderLanguage); } diff --git a/packages/dev/core/src/Materials/Node/Blocks/Fragment/imageProcessingBlock.ts b/packages/dev/core/src/Materials/Node/Blocks/Fragment/imageProcessingBlock.ts index cf7446eb566..e5637ef1389 100644 --- a/packages/dev/core/src/Materials/Node/Blocks/Fragment/imageProcessingBlock.ts +++ b/packages/dev/core/src/Materials/Node/Blocks/Fragment/imageProcessingBlock.ts @@ -87,6 +87,7 @@ export class ImageProcessingBlock extends NodeMaterialBlock { state._excludeVariableName("txColorTransform"); state._excludeVariableName("colorTransformSettings"); state._excludeVariableName("ditherIntensity"); + // eslint-disable-next-line @typescript-eslint/no-floating-promises this._initShaderSourceAsync(state.shaderLanguage); } diff --git a/packages/dev/core/src/Materials/Node/Blocks/Fragment/perturbNormalBlock.ts b/packages/dev/core/src/Materials/Node/Blocks/Fragment/perturbNormalBlock.ts index 3e3a57ab1e9..53e4913ed55 100644 --- a/packages/dev/core/src/Materials/Node/Blocks/Fragment/perturbNormalBlock.ts +++ b/packages/dev/core/src/Materials/Node/Blocks/Fragment/perturbNormalBlock.ts @@ -174,6 +174,7 @@ export class PerturbNormalBlock extends NodeMaterialBlock { } public override initialize(state: NodeMaterialBuildState) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises this._initShaderSourceAsync(state.shaderLanguage); } diff --git a/packages/dev/core/src/Materials/Node/Blocks/Fragment/shadowMapBlock.ts b/packages/dev/core/src/Materials/Node/Blocks/Fragment/shadowMapBlock.ts index 236de8c666a..8e1ade0046f 100644 --- a/packages/dev/core/src/Materials/Node/Blocks/Fragment/shadowMapBlock.ts +++ b/packages/dev/core/src/Materials/Node/Blocks/Fragment/shadowMapBlock.ts @@ -47,6 +47,7 @@ export class ShadowMapBlock extends NodeMaterialBlock { state._excludeVariableName("clipPos"); state._excludeVariableName("worldPos"); state._excludeVariableName("zSM"); + // eslint-disable-next-line @typescript-eslint/no-floating-promises this._initShaderSourceAsync(state.shaderLanguage); } diff --git a/packages/dev/core/src/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.ts b/packages/dev/core/src/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.ts index a152ddff738..c32518ae2d0 100644 --- a/packages/dev/core/src/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.ts +++ b/packages/dev/core/src/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.ts @@ -97,6 +97,7 @@ export class PBRMetallicRoughnessBlock extends NodeMaterialBlock { private _metallicReflectanceColor: Color3 = Color3.White(); private _metallicF0Factor = 1; private _vMetallicReflectanceFactorsName: string; + private _baseDiffuseRoughnessName: string; /** * Create a new ReflectionBlock @@ -271,6 +272,19 @@ export class PBRMetallicRoughnessBlock extends NodeMaterialBlock { }) public realTimeFilteringQuality = Constants.TEXTURE_FILTERING_QUALITY_LOW; + /** + * Base Diffuse Model + */ + @editableInPropertyPage("Diffuse Model", PropertyTypeForEdition.List, "RENDERING", { + notifiers: { update: true }, + options: [ + { label: "Lambert", value: Constants.MATERIAL_DIFFUSE_MODEL_LAMBERT }, + { label: "Burley", value: Constants.MATERIAL_DIFFUSE_MODEL_BURLEY }, + { label: "Oren-Nayar", value: Constants.MATERIAL_DIFFUSE_MODEL_E_OREN_NAYAR }, + ], + }) + public baseDiffuseModel = Constants.MATERIAL_DIFFUSE_MODEL_E_OREN_NAYAR; + /** * Defines if the material uses energy conservation. */ @@ -439,6 +453,7 @@ export class PBRMetallicRoughnessBlock extends NodeMaterialBlock { state._excludeVariableName("vClipSpacePosition"); state._excludeVariableName("vDebugMode"); + // eslint-disable-next-line @typescript-eslint/no-floating-promises this._initShaderSourceAsync(state.shaderLanguage); } @@ -762,6 +777,8 @@ export class PBRMetallicRoughnessBlock extends NodeMaterialBlock { defines.setValue("NUM_SAMPLES", "" + this.realTimeFilteringQuality, true); } + defines.setValue("BASE_DIFFUSE_MODEL", this.baseDiffuseModel, true); + // Advanced defines.setValue("BRDF_V_HEIGHT_CORRELATED", true); defines.setValue("MS_BRDF_ENERGY_CONSERVATION", this.useEnergyConservation, true); @@ -1014,6 +1031,9 @@ export class PBRMetallicRoughnessBlock extends NodeMaterialBlock { this._vMetallicReflectanceFactorsName = state._getFreeVariableName("vMetallicReflectanceFactors"); state._emitUniformFromString(this._vMetallicReflectanceFactorsName, NodeMaterialBlockConnectionPointTypes.Vector4); + this._baseDiffuseRoughnessName = state._getFreeVariableName("baseDiffuseRoughness"); + state._emitUniformFromString(this._baseDiffuseRoughnessName, NodeMaterialBlockConnectionPointTypes.Float); + code += `${state._declareLocalVar("baseColor", NodeMaterialBlockConnectionPointTypes.Vector3)} = surfaceAlbedo; ${isWebGPU ? "let" : `vec4${state.fSuffix}`} vReflectivityColor = vec4${state.fSuffix}(${this.metallic.associatedVariableName}, ${this.roughness.associatedVariableName}, ${this.indexOfRefraction.associatedVariableName || "1.5"}, 1.0); reflectivityOut = reflectivityBlock( @@ -1021,6 +1041,11 @@ export class PBRMetallicRoughnessBlock extends NodeMaterialBlock { #ifdef METALLICWORKFLOW , surfaceAlbedo , ${(isWebGPU ? "uniforms." : "") + this._vMetallicReflectanceFactorsName} + #endif + , ${(isWebGPU ? "uniforms." : "") + this._baseDiffuseRoughnessName} + #ifdef BASE_DIFFUSE_ROUGHNESS + , 0. + , vec2${state.fSuffix}(0., 0.) #endif #ifdef REFLECTIVITY , vec3${state.fSuffix}(0., 0., ${aoIntensity}) @@ -1036,6 +1061,7 @@ export class PBRMetallicRoughnessBlock extends NodeMaterialBlock { ${state._declareLocalVar("microSurface", NodeMaterialBlockConnectionPointTypes.Float)} = reflectivityOut.microSurface; ${state._declareLocalVar("roughness", NodeMaterialBlockConnectionPointTypes.Float)} = reflectivityOut.roughness; + ${state._declareLocalVar("diffuseRoughness", NodeMaterialBlockConnectionPointTypes.Float)} = reflectivityOut.diffuseRoughness; #ifdef METALLICWORKFLOW surfaceAlbedo = reflectivityOut.surfaceAlbedo; diff --git a/packages/dev/core/src/Materials/Node/Blocks/PBR/reflectionBlock.ts b/packages/dev/core/src/Materials/Node/Blocks/PBR/reflectionBlock.ts index 3f6dd6cbe7a..53576fc5cb8 100644 --- a/packages/dev/core/src/Materials/Node/Blocks/PBR/reflectionBlock.ts +++ b/packages/dev/core/src/Materials/Node/Blocks/PBR/reflectionBlock.ts @@ -438,6 +438,9 @@ export class ReflectionBlock extends ReflectionTextureBaseBlock { #ifdef USEIRRADIANCEMAP , irradianceSampler // ** not handled ** ${isWebGPU ? `, irradianceSamplerSampler` : ""} + #ifdef USE_IRRADIANCE_DOMINANT_DIRECTION + , vReflectionDominantDirection + #endif #endif #ifndef LODBASEDMICROSFURACE #ifdef ${this._define3DName} @@ -459,6 +462,9 @@ export class ReflectionBlock extends ReflectionTextureBaseBlock { ${isWebGPU ? `, icdfSamplerSampler` : ""} #endif #endif + , viewDirectionW + , diffuseRoughness + , surfaceAlbedo ); #endif\n`; diff --git a/packages/dev/core/src/Materials/Node/Blocks/Vertex/bonesBlock.ts b/packages/dev/core/src/Materials/Node/Blocks/Vertex/bonesBlock.ts index 26eb7aa1981..0f54fcf5947 100644 --- a/packages/dev/core/src/Materials/Node/Blocks/Vertex/bonesBlock.ts +++ b/packages/dev/core/src/Materials/Node/Blocks/Vertex/bonesBlock.ts @@ -45,6 +45,7 @@ export class BonesBlock extends NodeMaterialBlock { state._excludeVariableName("mBones"); state._excludeVariableName("BonesPerMesh"); + // eslint-disable-next-line @typescript-eslint/no-floating-promises this._initShaderSourceAsync(state.shaderLanguage); } diff --git a/packages/dev/core/src/Materials/Node/Blocks/Vertex/morphTargetsBlock.ts b/packages/dev/core/src/Materials/Node/Blocks/Vertex/morphTargetsBlock.ts index ec3d5a13629..04db74d8d5f 100644 --- a/packages/dev/core/src/Materials/Node/Blocks/Vertex/morphTargetsBlock.ts +++ b/packages/dev/core/src/Materials/Node/Blocks/Vertex/morphTargetsBlock.ts @@ -139,6 +139,7 @@ export class MorphTargetsBlock extends NodeMaterialBlock { public override initialize(state: NodeMaterialBuildState) { state._excludeVariableName("morphTargetInfluences"); + // eslint-disable-next-line @typescript-eslint/no-floating-promises this._initShaderSourceAsync(state.shaderLanguage); } diff --git a/packages/dev/core/src/Materials/Node/nodeMaterial.ts b/packages/dev/core/src/Materials/Node/nodeMaterial.ts index 85e6e40eaf0..c4b92fae70b 100644 --- a/packages/dev/core/src/Materials/Node/nodeMaterial.ts +++ b/packages/dev/core/src/Materials/Node/nodeMaterial.ts @@ -1848,7 +1848,7 @@ export class NodeMaterial extends PushMaterial { this.build(); } - return this._fragmentCompilationState.getProcessedShaderAsync(); + return await this._fragmentCompilationState.getProcessedShaderAsync(); } /** @@ -2040,7 +2040,7 @@ export class NodeMaterial extends PushMaterial { * @returns a promise fulfilled when the node editor is visible */ public async edit(config?: INodeMaterialEditorOptions): Promise { - return new Promise((resolve) => { + return await new Promise((resolve) => { this.BJSNODEMATERIALEDITOR = this.BJSNODEMATERIALEDITOR || this._getGlobalNodeMaterialEditor(); if (typeof this.BJSNODEMATERIALEDITOR == "undefined") { const editorUrl = config && config.editorURL ? config.editorURL : NodeMaterial.EditorURL; @@ -2267,7 +2267,7 @@ export class NodeMaterial extends PushMaterial { * @returns a promise that will fulfil when the material is fully loaded */ public async loadAsync(url: string, rootUrl: string = "") { - return NodeMaterial.ParseFromFileAsync("", url, this.getScene(), rootUrl, true, this); + return await NodeMaterial.ParseFromFileAsync("", url, this.getScene(), rootUrl, true, this); } private _gatherBlocks(rootNode: NodeMaterialBlock, list: NodeMaterialBlock[]) { @@ -2579,6 +2579,7 @@ export class NodeMaterial extends PushMaterial { * Awaits for all the material textures to be ready before resolving the returned promise. * @returns A promise that resolves when the textures are ready. */ + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax public whenTexturesReadyAsync(): Promise { // Ensures all textures are ready to render. const textureReadyPromises: Promise[] = []; @@ -2592,6 +2593,7 @@ export class NodeMaterial extends PushMaterial { textureResolve(); }); internalTexture.onErrorObservable.addOnce((e) => { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors textureReject(e); }); }) @@ -2664,6 +2666,7 @@ export class NodeMaterial extends PushMaterial { * @param options defines options to be used with the node material * @returns a promise that will resolve to the new node material */ + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax public static ParseFromSnippetAsync( snippetId: string, scene: Scene = EngineStore.LastCreatedScene!, @@ -2702,22 +2705,27 @@ export class NodeMaterial extends PushMaterial { nodeMaterial.build(); } } catch (err) { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject(err); } if (waitForTextureReadyness) { nodeMaterial .whenTexturesReadyAsync() + // eslint-disable-next-line github/no-then .then(() => { resolve(nodeMaterial!); }) + // eslint-disable-next-line github/no-then .catch((err) => { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject(err); }); } else { resolve(nodeMaterial); } } else { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject("Unable to load the snippet " + snippetId); } } diff --git a/packages/dev/core/src/Materials/Node/nodeMaterialBuildState.ts b/packages/dev/core/src/Materials/Node/nodeMaterialBuildState.ts index c1868335e9c..e439d0608e4 100644 --- a/packages/dev/core/src/Materials/Node/nodeMaterialBuildState.ts +++ b/packages/dev/core/src/Materials/Node/nodeMaterialBuildState.ts @@ -114,6 +114,7 @@ export class NodeMaterialBuildState { * Returns the processed, compiled shader code * @returns the raw shader code used by the engine */ + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax public getProcessedShaderAsync(): Promise { if (!this._builtCompilationString) { throw new Error("Shader not built yet."); diff --git a/packages/dev/core/src/Materials/PBR/pbrBaseMaterial.ts b/packages/dev/core/src/Materials/PBR/pbrBaseMaterial.ts index 55c19dcad43..e6caa6a8d41 100644 --- a/packages/dev/core/src/Materials/PBR/pbrBaseMaterial.ts +++ b/packages/dev/core/src/Materials/PBR/pbrBaseMaterial.ts @@ -81,7 +81,7 @@ export class PBRMaterialDefines extends MaterialDefines implements IImageProcess public NUM_SAMPLES = "0"; public REALTIME_FILTERING = false; public IBL_CDF_FILTERING = false; - + public BASE_DIFFUSE_MODEL = 0; public MAINUV1 = false; public MAINUV2 = false; public MAINUV3 = false; @@ -100,8 +100,10 @@ export class PBRMaterialDefines extends MaterialDefines implements IImageProcess public ALBEDODIRECTUV = 0; public VERTEXCOLOR = false; - public BASEWEIGHT = false; - public BASEWEIGHTDIRECTUV = 0; + public BASE_WEIGHT = false; + public BASE_WEIGHTDIRECTUV = 0; + public BASE_DIFFUSE_ROUGHNESS = false; + public BASE_DIFFUSE_ROUGHNESSDIRECTUV = 0; public BAKED_VERTEX_ANIMATION_TEXTURE = false; @@ -186,6 +188,7 @@ export class PBRMaterialDefines extends MaterialDefines implements IImageProcess public INVERTCUBICMAP = false; public USESPHERICALFROMREFLECTIONMAP = false; public USEIRRADIANCEMAP = false; + public USE_IRRADIANCE_DOMINANT_DIRECTION = false; public USESPHERICALINVERTEX = false; public REFLECTIONMAP_OPPOSITEZ = false; public LODINREFLECTIONALPHA = false; @@ -356,6 +359,11 @@ export abstract class PBRBaseMaterial extends PushMaterial { */ public static DEFAULT_AO_ON_ANALYTICAL_LIGHTS = 0; + /** + * Defines the default diffuse model used by the material. + */ + public static DEFAULT_DIFFUSE_MODEL = Constants.MATERIAL_DIFFUSE_MODEL_E_OREN_NAYAR; + /** * PBRMaterialLightFalloff Physical: light is falling off following the inverse squared distance law. */ @@ -425,11 +433,17 @@ export abstract class PBRBaseMaterial extends PushMaterial { public _albedoTexture: Nullable = null; /** - * OpenPBR Base Weight (multiplier to the diffuse and metal lobes). + * Base Weight texture (multiplier to the diffuse and metal lobes). * @internal */ public _baseWeightTexture: Nullable = null; + /** + * Base Diffuse Roughness texture (roughness of the diffuse lobe). + * @internal + */ + public _baseDiffuseRoughnessTexture: Nullable = null; + /** * AKA Occlusion Texture in other nomenclature. * @internal @@ -573,11 +587,18 @@ export abstract class PBRBaseMaterial extends PushMaterial { public _albedoColor = new Color3(1, 1, 1); /** - * OpenPBR Base Weight (multiplier to the diffuse and metal lobes). + * Base Weight (multiplier to the diffuse and metal lobes). * @internal */ public _baseWeight = 1; + /** + * Base Diffuse Roughness (roughness of the diffuse lobe). + * Can also be used to scale the corresponding texture. + * @internal + */ + public _baseDiffuseRoughness: Nullable = null; + /** * AKA Specular Color in other nomenclature. * @internal @@ -804,6 +825,8 @@ export abstract class PBRBaseMaterial extends PushMaterial { this.markAsDirty(Constants.MATERIAL_TextureDirtyFlag); } + private _baseDiffuseModel: number = PBRBaseMaterial.DEFAULT_DIFFUSE_MODEL; + /** * Can this material render to several textures at once */ @@ -1134,6 +1157,12 @@ export abstract class PBRBaseMaterial extends PushMaterial { } } + if (this._baseDiffuseRoughnessTexture && MaterialFlags.BaseDiffuseRoughnessTextureEnabled) { + if (!this._baseDiffuseRoughnessTexture.isReadyOrNotBlocking()) { + return false; + } + } + if (this._ambientTexture && MaterialFlags.AmbientTextureEnabled) { if (!this._ambientTexture.isReadyOrNotBlocking()) { return false; @@ -1446,6 +1475,7 @@ export abstract class PBRBaseMaterial extends PushMaterial { "vAmbientColor", "vAlbedoColor", "baseWeight", + "baseDiffuseRoughness", "vReflectivityColor", "vMetallicReflectanceFactors", "vEmissiveColor", @@ -1456,6 +1486,7 @@ export abstract class PBRBaseMaterial extends PushMaterial { "pointSize", "vAlbedoInfos", "vBaseWeightInfos", + "vBaseDiffuseRoughnessInfos", "vAmbientInfos", "vOpacityInfos", "vReflectionInfos", @@ -1472,6 +1503,7 @@ export abstract class PBRBaseMaterial extends PushMaterial { "mBones", "albedoMatrix", "baseWeightMatrix", + "baseDiffuseRoughnessMatrix", "ambientMatrix", "opacityMatrix", "reflectionMatrix", @@ -1504,6 +1536,7 @@ export abstract class PBRBaseMaterial extends PushMaterial { "vSphericalL21", "vSphericalL22", "vReflectionMicrosurfaceInfos", + "vReflectionDominantDirection", "vTangentSpaceParams", "boneTextureWidth", "vDebugMode", @@ -1514,6 +1547,7 @@ export abstract class PBRBaseMaterial extends PushMaterial { const samplers = [ "albedoSampler", "baseWeightSampler", + "baseDiffuseRoughnessSampler", "reflectivitySampler", "ambientSampler", "emissiveSampler", @@ -1628,6 +1662,7 @@ export abstract class PBRBaseMaterial extends PushMaterial { // Lights PrepareDefinesForLights(scene, mesh, defines, true, this._maxSimultaneousLights, this._disableLighting); defines._needNormals = true; + defines.BASE_DIFFUSE_MODEL = this._baseDiffuseModel; // Multiview PrepareDefinesForMultiview(scene, defines); @@ -1650,7 +1685,8 @@ export abstract class PBRBaseMaterial extends PushMaterial { } if (scene.texturesEnabled) { defines.ALBEDODIRECTUV = 0; - defines.BASEWEIGHTDIRECTUV = 0; + defines.BASE_WEIGHTDIRECTUV = 0; + defines.BASE_DIFFUSE_ROUGHNESSDIRECTUV = 0; defines.AMBIENTDIRECTUV = 0; defines.OPACITYDIRECTUV = 0; defines.EMISSIVEDIRECTUV = 0; @@ -1673,9 +1709,15 @@ export abstract class PBRBaseMaterial extends PushMaterial { } if (this._baseWeightTexture && MaterialFlags.BaseWeightTextureEnabled) { - PrepareDefinesForMergedUV(this._baseWeightTexture, defines, "BASEWEIGHT"); + PrepareDefinesForMergedUV(this._baseWeightTexture, defines, "BASE_WEIGHT"); } else { - defines.BASEWEIGHT = false; + defines.BASE_WEIGHT = false; + } + + if (this._baseDiffuseRoughnessTexture && MaterialFlags.BaseDiffuseRoughnessTextureEnabled) { + PrepareDefinesForMergedUV(this._baseDiffuseRoughnessTexture, defines, "BASE_DIFFUSE_ROUGHNESS"); + } else { + defines.BASE_DIFFUSE_ROUGHNESS = false; } if (this._ambientTexture && MaterialFlags.AmbientTextureEnabled) { @@ -1767,12 +1809,22 @@ export abstract class PBRBaseMaterial extends PushMaterial { defines.USEIRRADIANCEMAP = true; defines.USESPHERICALFROMREFLECTIONMAP = false; defines.USESPHERICALINVERTEX = false; + if (reflectionTexture.irradianceTexture._dominantDirection) { + defines.USE_IRRADIANCE_DOMINANT_DIRECTION = true; + } } // Assume using spherical polynomial if the reflection texture is a cube map else if (reflectionTexture.isCube) { defines.USESPHERICALFROMREFLECTIONMAP = true; defines.USEIRRADIANCEMAP = false; - if (this._forceIrradianceInFragment || this.realTimeFiltering || this._twoSidedLighting || engine.getCaps().maxVaryingVectors <= 8) { + defines.USE_IRRADIANCE_DOMINANT_DIRECTION = false; + if ( + this._forceIrradianceInFragment || + this.realTimeFiltering || + this._twoSidedLighting || + engine.getCaps().maxVaryingVectors <= 8 || + this._baseDiffuseRoughnessTexture + ) { defines.USESPHERICALINVERTEX = false; } else { defines.USESPHERICALINVERTEX = true; @@ -1795,6 +1847,7 @@ export abstract class PBRBaseMaterial extends PushMaterial { defines.INVERTCUBICMAP = false; defines.USESPHERICALFROMREFLECTIONMAP = false; defines.USEIRRADIANCEMAP = false; + defines.USE_IRRADIANCE_DOMINANT_DIRECTION = false; defines.USESPHERICALINVERTEX = false; defines.REFLECTIONMAP_OPPOSITEZ = false; defines.LODINREFLECTIONALPHA = false; @@ -2031,6 +2084,7 @@ export abstract class PBRBaseMaterial extends PushMaterial { const ubo = this._uniformBuffer; ubo.addUniform("vAlbedoInfos", 2); ubo.addUniform("vBaseWeightInfos", 2); + ubo.addUniform("vBaseDiffuseRoughnessInfos", 2); ubo.addUniform("vAmbientInfos", 4); ubo.addUniform("vOpacityInfos", 2); ubo.addUniform("vEmissiveInfos", 2); @@ -2044,6 +2098,7 @@ export abstract class PBRBaseMaterial extends PushMaterial { ubo.addUniform("vBumpInfos", 3); ubo.addUniform("albedoMatrix", 16); ubo.addUniform("baseWeightMatrix", 16); + ubo.addUniform("baseDiffuseRoughnessMatrix", 16); ubo.addUniform("ambientMatrix", 16); ubo.addUniform("opacityMatrix", 16); ubo.addUniform("emissiveMatrix", 16); @@ -2057,9 +2112,11 @@ export abstract class PBRBaseMaterial extends PushMaterial { ubo.addUniform("vReflectionColor", 3); ubo.addUniform("vAlbedoColor", 4); ubo.addUniform("baseWeight", 1); + ubo.addUniform("baseDiffuseRoughness", 1); ubo.addUniform("vLightingIntensity", 4); ubo.addUniform("vReflectionMicrosurfaceInfos", 3); + ubo.addUniform("vReflectionDominantDirection", 3); ubo.addUniform("pointSize", 1); ubo.addUniform("vReflectivityColor", 4); ubo.addUniform("vEmissiveColor", 3); @@ -2164,6 +2221,11 @@ export abstract class PBRBaseMaterial extends PushMaterial { BindTextureMatrix(this._baseWeightTexture, ubo, "baseWeight"); } + if (this._baseDiffuseRoughnessTexture && MaterialFlags.BaseDiffuseRoughnessTextureEnabled) { + ubo.updateFloat2("vBaseDiffuseRoughnessInfos", this._baseDiffuseRoughnessTexture.coordinatesIndex, this._baseDiffuseRoughnessTexture.level); + BindTextureMatrix(this._baseDiffuseRoughnessTexture, ubo, "baseDiffuseRoughness"); + } + if (this._ambientTexture && MaterialFlags.AmbientTextureEnabled) { ubo.updateFloat4( "vAmbientInfos", @@ -2232,6 +2294,11 @@ export abstract class PBRBaseMaterial extends PushMaterial { ubo.updateFloat3("vSphericalZX", polynomials.zx.x, polynomials.zx.y, polynomials.zx.z); } } + } else { + // If we're using an irradiance map with a dominant direction assigned, set it. + if (defines.USEIRRADIANCEMAP && defines.USE_IRRADIANCE_DOMINANT_DIRECTION) { + ubo.updateVector3("vReflectionDominantDirection", reflectionTexture.irradianceTexture!._dominantDirection!); + } } ubo.updateFloat3( @@ -2325,6 +2392,7 @@ export abstract class PBRBaseMaterial extends PushMaterial { } ubo.updateFloat("baseWeight", this._baseWeight); + ubo.updateFloat("baseDiffuseRoughness", this._baseDiffuseRoughness || 0.0); // Misc this._lightingInfos.x = this._directIntensity; @@ -2352,6 +2420,10 @@ export abstract class PBRBaseMaterial extends PushMaterial { ubo.setTexture("baseWeightSampler", this._baseWeightTexture); } + if (this._baseDiffuseRoughnessTexture && MaterialFlags.BaseDiffuseRoughnessTextureEnabled) { + ubo.setTexture("baseDiffuseRoughnessSampler", this._baseDiffuseRoughnessTexture); + } + if (this._ambientTexture && MaterialFlags.AmbientTextureEnabled) { ubo.setTexture("ambientSampler", this._ambientTexture); } @@ -2490,6 +2562,10 @@ export abstract class PBRBaseMaterial extends PushMaterial { results.push(this._baseWeightTexture); } + if (this._baseDiffuseRoughnessTexture && this._baseDiffuseRoughnessTexture.animations && this._baseDiffuseRoughnessTexture.animations.length > 0) { + results.push(this._baseDiffuseRoughnessTexture); + } + if (this._ambientTexture && this._ambientTexture.animations && this._ambientTexture.animations.length > 0) { results.push(this._ambientTexture); } @@ -2562,6 +2638,10 @@ export abstract class PBRBaseMaterial extends PushMaterial { activeTextures.push(this._baseWeightTexture); } + if (this._baseDiffuseRoughnessTexture) { + activeTextures.push(this._baseDiffuseRoughnessTexture); + } + if (this._ambientTexture) { activeTextures.push(this._ambientTexture); } @@ -2627,6 +2707,10 @@ export abstract class PBRBaseMaterial extends PushMaterial { return true; } + if (this._baseDiffuseRoughnessTexture === texture) { + return true; + } + if (this._ambientTexture === texture) { return true; } @@ -2707,6 +2791,7 @@ export abstract class PBRBaseMaterial extends PushMaterial { this._albedoTexture?.dispose(); this._baseWeightTexture?.dispose(); + this._baseDiffuseRoughnessTexture?.dispose(); this._ambientTexture?.dispose(); this._opacityTexture?.dispose(); this._reflectionTexture?.dispose(); diff --git a/packages/dev/core/src/Materials/PBR/pbrMaterial.ts b/packages/dev/core/src/Materials/PBR/pbrMaterial.ts index df311aa1d02..e381dba2b48 100644 --- a/packages/dev/core/src/Materials/PBR/pbrMaterial.ts +++ b/packages/dev/core/src/Materials/PBR/pbrMaterial.ts @@ -3,6 +3,7 @@ import { GetEnvironmentBRDFTexture } from "../../Misc/brdfTextureTools"; import type { Nullable } from "../../types"; import type { Scene } from "../../scene"; import { Color3 } from "../../Maths/math.color"; +import { Constants } from "../../Engines/constants"; import type { ImageProcessingConfiguration } from "../../Materials/imageProcessingConfiguration"; import type { ColorCurves } from "../../Materials/colorCurves"; import type { BaseTexture } from "../../Materials/Textures/baseTexture"; @@ -46,6 +47,11 @@ export class PBRMaterial extends PBRBaseMaterial { */ public static override DEFAULT_AO_ON_ANALYTICAL_LIGHTS = PBRBaseMaterial.DEFAULT_AO_ON_ANALYTICAL_LIGHTS; + /** + * Defines the default diffuse model used by the material. + */ + public static override DEFAULT_DIFFUSE_MODEL = Constants.MATERIAL_DIFFUSE_MODEL_E_OREN_NAYAR; + /** * Intensity of the direct lights e.g. the four lights available in your scene. * This impacts both the direct diffuse and specular highlights. @@ -93,12 +99,19 @@ export class PBRMaterial extends PBRBaseMaterial { public albedoTexture: Nullable; /** - * OpenPBR Base Weight (multiplier to the diffuse and metal lobes). + * OpenPBR Base Weight texture (multiplier to the diffuse and metal lobes). */ @serializeAsTexture() @expandToProperty("_markAllSubMeshesAsTexturesDirty") public baseWeightTexture: Nullable; + /** + * OpenPBR Base Diffuse Roughness texture (roughness of the diffuse lobe). + */ + @serializeAsTexture() + @expandToProperty("_markAllSubMeshesAsTexturesDirty") + public baseDiffuseRoughnessTexture: Nullable; + /** * AKA Occlusion Texture in other nomenclature. */ @@ -284,6 +297,20 @@ export class PBRMaterial extends PBRBaseMaterial { @expandToProperty("_markAllSubMeshesAsTexturesDirty") public baseWeight = 1; + /** + * OpenPBR Base Diffuse Roughness (roughness of the diffuse lobe). + */ + @serialize("baseDiffuseRoughness") + @expandToProperty("_markAllSubMeshesAsTexturesDirty") + public baseDiffuseRoughness: Nullable; + + /** + * Defines the base diffuse roughness model of the material. + */ + @serialize("baseDiffuseModel") + @expandToProperty("_markAllSubMeshesAsMiscDirty") + public baseDiffuseModel: number = PBRMaterial.DEFAULT_DIFFUSE_MODEL; + /** * AKA Specular Color in other nomenclature. */ diff --git a/packages/dev/core/src/Materials/Textures/Filtering/hdrIrradianceFiltering.ts b/packages/dev/core/src/Materials/Textures/Filtering/hdrIrradianceFiltering.ts index 2df2032866f..9ecc468732a 100644 --- a/packages/dev/core/src/Materials/Textures/Filtering/hdrIrradianceFiltering.ts +++ b/packages/dev/core/src/Materials/Textures/Filtering/hdrIrradianceFiltering.ts @@ -218,6 +218,13 @@ export class HDRIrradianceFiltering { await this._effectWrapper.effect.whenCompiledAsync(); const irradianceTexture = this._prefilterInternal(texture); + + if (this.useCdf) { + // eslint-disable-next-line github/no-then + await this._cdfGenerator.findDominantDirection().then((dir) => { + irradianceTexture._dominantDirection = dir; + }); + } this._effectRenderer.dispose(); this._effectWrapper.dispose(); this._cdfGenerator?.dispose(); diff --git a/packages/dev/core/src/Materials/Textures/Loaders/basisTextureLoader.ts b/packages/dev/core/src/Materials/Textures/Loaders/basisTextureLoader.ts index c092d1ceade..0e88cb49e4a 100644 --- a/packages/dev/core/src/Materials/Textures/Loaders/basisTextureLoader.ts +++ b/packages/dev/core/src/Materials/Textures/Loaders/basisTextureLoader.ts @@ -45,6 +45,7 @@ export class _BasisTextureLoader implements IInternalTextureLoader { }, }; TranscodeAsync(data, transcodeConfig) + // eslint-disable-next-line github/no-then .then((result) => { const hasMipmap = result.fileInfo.images[0].levels.length > 1 && texture.generateMipMaps; LoadTextureFromTranscodeResult(texture, result); @@ -56,6 +57,7 @@ export class _BasisTextureLoader implements IInternalTextureLoader { onLoad(); } }) + // eslint-disable-next-line github/no-then .catch((err) => { const errorMessage = "Failed to transcode Basis file, transcoding may not be supported on this device"; Tools.Warn(errorMessage); @@ -89,6 +91,7 @@ export class _BasisTextureLoader implements IInternalTextureLoader { }, }; TranscodeAsync(data, transcodeConfig) + // eslint-disable-next-line github/no-then .then((result) => { const rootImage = result.fileInfo.images[0].levels[0]; const hasMipmap = result.fileInfo.images[0].levels.length > 1 && texture.generateMipMaps; @@ -96,6 +99,7 @@ export class _BasisTextureLoader implements IInternalTextureLoader { LoadTextureFromTranscodeResult(texture, result); }); }) + // eslint-disable-next-line github/no-then .catch((err) => { Tools.Warn("Failed to transcode Basis file, transcoding may not be supported on this device"); Tools.Warn(`Failed to transcode Basis file: ${err}`); diff --git a/packages/dev/core/src/Materials/Textures/Loaders/envTextureLoader.ts b/packages/dev/core/src/Materials/Textures/Loaders/envTextureLoader.ts index 79321e2b48c..a2c1f723a3e 100644 --- a/packages/dev/core/src/Materials/Textures/Loaders/envTextureLoader.ts +++ b/packages/dev/core/src/Materials/Textures/Loaders/envTextureLoader.ts @@ -40,6 +40,7 @@ export class _ENVTextureLoader implements IInternalTextureLoader { try { UploadEnvSpherical(texture, info); + // eslint-disable-next-line github/no-then UploadEnvLevelsAsync(texture, data, info).then( () => { texture.isReady = true; diff --git a/packages/dev/core/src/Materials/Textures/Loaders/exrTextureLoader.ts b/packages/dev/core/src/Materials/Textures/Loaders/exrTextureLoader.ts index b7a97dd7325..588ae4cc850 100644 --- a/packages/dev/core/src/Materials/Textures/Loaders/exrTextureLoader.ts +++ b/packages/dev/core/src/Materials/Textures/Loaders/exrTextureLoader.ts @@ -129,6 +129,7 @@ export class _ExrTextureLoader implements IInternalTextureLoader { const offset = { value: 0 }; const header = GetExrHeader(dataView, offset); CreateDecoderAsync(header, dataView, offset, ExrLoaderGlobalConfiguration.DefaultOutputType) + // eslint-disable-next-line github/no-then .then((decoder) => { ScanData(decoder, header, dataView, offset); @@ -146,6 +147,7 @@ export class _ExrTextureLoader implements IInternalTextureLoader { } }); }) + // eslint-disable-next-line github/no-then .catch((error) => { Logger.Error("Failed to load EXR texture: ", error); }); diff --git a/packages/dev/core/src/Materials/Textures/Loaders/ktxTextureLoader.ts b/packages/dev/core/src/Materials/Textures/Loaders/ktxTextureLoader.ts index 8ab2a089be7..dd292e6df4f 100644 --- a/packages/dev/core/src/Materials/Textures/Loaders/ktxTextureLoader.ts +++ b/packages/dev/core/src/Materials/Textures/Loaders/ktxTextureLoader.ts @@ -115,6 +115,7 @@ export class _KTXTextureLoader implements IInternalTextureLoader { ); } else if (KhronosTextureContainer2.IsValid(data)) { const ktx2 = new KhronosTextureContainer2(texture.getEngine()); + // eslint-disable-next-line github/no-then ktx2._uploadAsync(data, texture, options).then( () => { callback(texture.width, texture.height, texture.generateMipMaps, true, () => {}, false); diff --git a/packages/dev/core/src/Materials/Textures/Loaders/textureLoaderManager.ts b/packages/dev/core/src/Materials/Textures/Loaders/textureLoaderManager.ts index 6587ac80bc1..99fb223b1f7 100644 --- a/packages/dev/core/src/Materials/Textures/Loaders/textureLoaderManager.ts +++ b/packages/dev/core/src/Materials/Textures/Loaders/textureLoaderManager.ts @@ -1,3 +1,4 @@ +/* eslint-disable github/no-then */ import type { IInternalTextureLoader } from "./internalTextureLoader"; import type { Nullable } from "../../../types"; import { Logger } from "core/Misc/logger"; @@ -40,30 +41,30 @@ export function _GetCompatibleTextureLoader(extension: string, mimeType?: string } if (!RegisteredTextureLoaders.has(extension)) { if (extension.endsWith(".ies")) { - registerTextureLoader(".ies", () => import("./iesTextureLoader").then((module) => new module._IESTextureLoader())); + registerTextureLoader(".ies", async () => await import("./iesTextureLoader").then((module) => new module._IESTextureLoader())); } if (extension.endsWith(".dds")) { - registerTextureLoader(".dds", () => import("./ddsTextureLoader").then((module) => new module._DDSTextureLoader())); + registerTextureLoader(".dds", async () => await import("./ddsTextureLoader").then((module) => new module._DDSTextureLoader())); } if (extension.endsWith(".basis")) { - registerTextureLoader(".basis", () => import("./basisTextureLoader").then((module) => new module._BasisTextureLoader())); + registerTextureLoader(".basis", async () => await import("./basisTextureLoader").then((module) => new module._BasisTextureLoader())); } if (extension.endsWith(".env")) { - registerTextureLoader(".env", () => import("./envTextureLoader").then((module) => new module._ENVTextureLoader())); + registerTextureLoader(".env", async () => await import("./envTextureLoader").then((module) => new module._ENVTextureLoader())); } if (extension.endsWith(".hdr")) { - registerTextureLoader(".hdr", () => import("./hdrTextureLoader").then((module) => new module._HDRTextureLoader())); + registerTextureLoader(".hdr", async () => await import("./hdrTextureLoader").then((module) => new module._HDRTextureLoader())); } // The ".ktx2" file extension is still up for debate: https://github.com/KhronosGroup/KTX-Specification/issues/18 if (extension.endsWith(".ktx") || extension.endsWith(".ktx2")) { - registerTextureLoader(".ktx", () => import("./ktxTextureLoader").then((module) => new module._KTXTextureLoader())); - registerTextureLoader(".ktx2", () => import("./ktxTextureLoader").then((module) => new module._KTXTextureLoader())); + registerTextureLoader(".ktx", async () => await import("./ktxTextureLoader").then((module) => new module._KTXTextureLoader())); + registerTextureLoader(".ktx2", async () => await import("./ktxTextureLoader").then((module) => new module._KTXTextureLoader())); } if (extension.endsWith(".tga")) { - registerTextureLoader(".tga", () => import("./tgaTextureLoader").then((module) => new module._TGATextureLoader())); + registerTextureLoader(".tga", async () => await import("./tgaTextureLoader").then((module) => new module._TGATextureLoader())); } if (extension.endsWith(".exr")) { - registerTextureLoader(".exr", () => import("./exrTextureLoader").then((module) => new module._ExrTextureLoader())); + registerTextureLoader(".exr", async () => await import("./exrTextureLoader").then((module) => new module._ExrTextureLoader())); } } const registered = RegisteredTextureLoaders.get(extension); diff --git a/packages/dev/core/src/Materials/Textures/Packer/packer.ts b/packages/dev/core/src/Materials/Textures/Packer/packer.ts index a4b6ba2ef4c..61b97d6b1e6 100644 --- a/packages/dev/core/src/Materials/Textures/Packer/packer.ts +++ b/packages/dev/core/src/Materials/Textures/Packer/packer.ts @@ -549,7 +549,7 @@ export class TexturePacker { * @returns Promise */ public async processAsync(): Promise { - return new Promise((resolve, reject) => { + return await new Promise((resolve, reject) => { try { if (this.meshes.length === 0) { //Must be a JSON load! @@ -592,11 +592,13 @@ export class TexturePacker { continue; } + // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then material.forceCompilationAsync(mesh).then(() => { doneCheck(material); }); } } catch (e) { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors return reject(e); } }); diff --git a/packages/dev/core/src/Materials/Textures/Procedurals/proceduralTexture.ts b/packages/dev/core/src/Materials/Textures/Procedurals/proceduralTexture.ts index 62b5d245991..f34a22334ca 100644 --- a/packages/dev/core/src/Materials/Textures/Procedurals/proceduralTexture.ts +++ b/packages/dev/core/src/Materials/Textures/Procedurals/proceduralTexture.ts @@ -266,6 +266,7 @@ export class ProceduralTexture extends Texture { } if (this._contentData) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then this._contentData.then((buffer) => { this._contentData = this.readPixels(0, 0, buffer); this._contentUpdateId = this._frameId; diff --git a/packages/dev/core/src/Materials/Textures/baseTexture.polynomial.ts b/packages/dev/core/src/Materials/Textures/baseTexture.polynomial.ts index 39f3f74149e..50ae502acf8 100644 --- a/packages/dev/core/src/Materials/Textures/baseTexture.polynomial.ts +++ b/packages/dev/core/src/Materials/Textures/baseTexture.polynomial.ts @@ -42,6 +42,7 @@ Object.defineProperty(BaseTexture.prototype, "sphericalPolynomial", { if (this._texture._sphericalPolynomialPromise === null) { this._texture._sphericalPolynomialComputed = true; } else { + // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then this._texture._sphericalPolynomialPromise.then((sphericalPolynomial) => { this._texture!._sphericalPolynomial = sphericalPolynomial; this._texture!._sphericalPolynomialComputed = true; diff --git a/packages/dev/core/src/Materials/Textures/baseTexture.ts b/packages/dev/core/src/Materials/Textures/baseTexture.ts index c24d5f466bc..61397e60000 100644 --- a/packages/dev/core/src/Materials/Textures/baseTexture.ts +++ b/packages/dev/core/src/Materials/Textures/baseTexture.ts @@ -4,6 +4,7 @@ import { Observable } from "../../Misc/observable"; import type { Nullable } from "../../types"; import type { Scene } from "../../scene"; import { Matrix } from "../../Maths/math.vector"; +import type { Vector3 } from "../../Maths/math.vector"; import { EngineStore } from "../../Engines/engineStore"; import type { InternalTexture } from "../../Materials/Textures/internalTexture"; import { Constants } from "../../Engines/constants"; @@ -436,6 +437,14 @@ export class BaseTexture extends ThinTexture implements IAnimatable { } } + /** + * Indicates the average direction of light in an environment map. This + * can be treated as the most dominant direction but it's magnitude also + * tells you something about how dominant that direction is. + */ + /** @internal */ + public _dominantDirection: Nullable = null; + /** * Define if the texture is a render target. */ diff --git a/packages/dev/core/src/Materials/Textures/hdrCubeTexture.ts b/packages/dev/core/src/Materials/Textures/hdrCubeTexture.ts index b14454e46b2..2a3d8a8cbd2 100644 --- a/packages/dev/core/src/Materials/Textures/hdrCubeTexture.ts +++ b/packages/dev/core/src/Materials/Textures/hdrCubeTexture.ts @@ -299,6 +299,7 @@ export class HDRCubeTexture extends BaseTexture { if (this._prefilterOnLoad) { radiancePromise = hdrFiltering.prefilter(this); } + // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then Promise.all([irradiancePromise, radiancePromise]).then((results) => { const irradianceTexture = results[0]; if (this._prefilterIrradianceOnLoad && irradianceTexture) { diff --git a/packages/dev/core/src/Materials/Textures/internalTexture.ts b/packages/dev/core/src/Materials/Textures/internalTexture.ts index 0816ee34e06..8e779e81eeb 100644 --- a/packages/dev/core/src/Materials/Textures/internalTexture.ts +++ b/packages/dev/core/src/Materials/Textures/internalTexture.ts @@ -355,6 +355,7 @@ export class InternalTexture extends TextureSampler { this.isReady = data.isReady; }; if (data.isAsync) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then (data.proxy as Promise).then(swapAndSetIsReady); } else { swapAndSetIsReady(data.proxy as InternalTexture); diff --git a/packages/dev/core/src/Materials/Textures/rawCubeTexture.ts b/packages/dev/core/src/Materials/Textures/rawCubeTexture.ts index c13507d8f08..1097185990e 100644 --- a/packages/dev/core/src/Materials/Textures/rawCubeTexture.ts +++ b/packages/dev/core/src/Materials/Textures/rawCubeTexture.ts @@ -59,7 +59,9 @@ export class RawCubeTexture extends CubeTexture { * @param lodOffset defines the offset applied to environment texture. This manages first LOD level used for IBL according to the roughness * @returns a promise that resolves when the operation is complete */ + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax public updateRGBDAsync(data: ArrayBufferView[][], sphericalPolynomial: Nullable = null, lodScale: number = 0.8, lodOffset: number = 0): Promise { + // eslint-disable-next-line github/no-then return UpdateRGBDAsyncEnvTools(this._texture!, data, sphericalPolynomial, lodScale, lodOffset).then(() => {}); } @@ -85,6 +87,7 @@ export class RawCubeTexture extends CubeTexture { ); if (internalTexture.source === InternalTextureSource.CubeRawRGBD) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises texture.updateRGBDAsync( internalTexture._bufferViewArrayArray!, internalTexture._sphericalPolynomial, diff --git a/packages/dev/core/src/Materials/Textures/renderTargetTexture.ts b/packages/dev/core/src/Materials/Textures/renderTargetTexture.ts index e4f85f10875..9050886edcb 100644 --- a/packages/dev/core/src/Materials/Textures/renderTargetTexture.ts +++ b/packages/dev/core/src/Materials/Textures/renderTargetTexture.ts @@ -717,6 +717,7 @@ export class RenderTargetTexture extends Texture implements IRenderTargetTexture if (!this._dumpTools) { Logger.Error("dumpTools module is still being loaded. To speed up the process import dump tools directly in your project"); } else { + // eslint-disable-next-line @typescript-eslint/no-floating-promises this._dumpTools.DumpFramebuffer(this.getRenderWidth(), this.getRenderHeight(), engine); } } @@ -1050,6 +1051,7 @@ export class RenderTargetTexture extends Texture implements IRenderTargetTexture if (!this._dumpToolsLoading) { this._dumpToolsLoading = true; // avoid a static import to allow ignoring the import in some cases + // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then import("../../Misc/dumpTools").then((module) => (this._dumpTools = module)); } diff --git a/packages/dev/core/src/Materials/Textures/videoTexture.ts b/packages/dev/core/src/Materials/Textures/videoTexture.ts index ac2b6afe19e..b0f710370b4 100644 --- a/packages/dev/core/src/Materials/Textures/videoTexture.ts +++ b/packages/dev/core/src/Materials/Textures/videoTexture.ts @@ -130,6 +130,7 @@ export class VideoTexture extends Texture { private _handlePlay() { this._errorFound = false; + // eslint-disable-next-line github/no-then this.video.play().catch((reason) => { if (reason?.name === "NotAllowedError") { if (this._onUserActionRequestedObservable && this._onUserActionRequestedObservable.hasObservers()) { @@ -139,6 +140,7 @@ export class VideoTexture extends Texture { Logger.Warn("Unable to autoplay a video with sound. Trying again with muted turned true"); this.video.muted = true; this._errorFound = false; + // eslint-disable-next-line github/no-then this.video.play().catch((otherReason) => { this._processError(otherReason); }); @@ -469,6 +471,7 @@ export class VideoTexture extends Texture { * @param invertY Defines if the video should be stored with invert Y set to true (true by default) * @returns The created video texture as a promise */ + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax public static CreateFromStreamAsync(scene: Scene, stream: MediaStream, constraints: any, invertY = true): Promise { const video = scene.getEngine().createVideoElement(constraints); @@ -556,6 +559,7 @@ export class VideoTexture extends Texture { return videoTexture; } + // eslint-disable-next-line @typescript-eslint/return-await, @typescript-eslint/prefer-promise-reject-errors return Promise.reject("No support for userMedia on this device"); } @@ -581,11 +585,13 @@ export class VideoTexture extends Texture { invertY = true ): void { this.CreateFromWebCamAsync(scene, constraints, audioConstaints, invertY) + // eslint-disable-next-line github/no-then .then(function (videoTexture) { if (onReady) { onReady(videoTexture); } }) + // eslint-disable-next-line github/no-then .catch(function (err) { Logger.Error(err.name); }); diff --git a/packages/dev/core/src/Materials/effect.ts b/packages/dev/core/src/Materials/effect.ts index 0aeecde4ec5..10d7e37e7b1 100644 --- a/packages/dev/core/src/Materials/effect.ts +++ b/packages/dev/core/src/Materials/effect.ts @@ -391,6 +391,7 @@ export class Effect implements IDisposable { this.uniqueId = Effect._UniqueIdSeed++; if (!cachedPipeline) { // Floating promise - should be checked here. + // eslint-disable-next-line @typescript-eslint/no-floating-promises this._processShaderCodeAsync(null, false, null, extraInitializationsAsync); } else { this._pipelineContext = cachedPipeline; @@ -610,7 +611,7 @@ export class Effect implements IDisposable { * @returns a promise to wait for completion. */ public async whenCompiledAsync(): Promise { - return new Promise((resolve) => { + return await new Promise((resolve) => { this.executeWhenCompiled(resolve); }); } diff --git a/packages/dev/core/src/Materials/effect.webgl.functions.ts b/packages/dev/core/src/Materials/effect.webgl.functions.ts index b0720424c48..af99bef44d8 100644 --- a/packages/dev/core/src/Materials/effect.webgl.functions.ts +++ b/packages/dev/core/src/Materials/effect.webgl.functions.ts @@ -68,7 +68,7 @@ export async function generatePipelineContext( useReverseDepthBuffer: false, ...options.extendedProcessingOptions, }; - return new Promise((resolve, reject) => { + return await new Promise((resolve, reject) => { try { _ProcessShaderCode( processorOptions, @@ -103,12 +103,14 @@ export async function generatePipelineContext( ); } } catch (e) { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject(e); } }, language ); } catch (e) { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject(e); } }); diff --git a/packages/dev/core/src/Materials/effectRenderer.ts b/packages/dev/core/src/Materials/effectRenderer.ts index f782032ba4a..6b2f0b1b232 100644 --- a/packages/dev/core/src/Materials/effectRenderer.ts +++ b/packages/dev/core/src/Materials/effectRenderer.ts @@ -581,6 +581,7 @@ export class EffectWrapper { let extraInitializationsAsync: (() => Promise) | undefined; if (this.options.extraInitializationsAsync) { extraInitializationsAsync = async () => { + // eslint-disable-next-line @typescript-eslint/no-floating-promises waitImportsLoaded?.(); await this.options.extraInitializationsAsync(); }; diff --git a/packages/dev/core/src/Materials/material.ts b/packages/dev/core/src/Materials/material.ts index d07cbbb715b..f99ef0faa5d 100644 --- a/packages/dev/core/src/Materials/material.ts +++ b/packages/dev/core/src/Materials/material.ts @@ -1597,7 +1597,7 @@ export class Material implements IAnimatable, IClipPlanesHolder { * @returns a promise that resolves when the compilation completes */ public async forceCompilationAsync(mesh: AbstractMesh, options?: Partial): Promise { - return new Promise((resolve, reject) => { + return await new Promise((resolve, reject) => { this.forceCompilation( mesh, () => { @@ -1605,6 +1605,7 @@ export class Material implements IAnimatable, IClipPlanesHolder { }, options, (reason) => { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject(reason); } ); diff --git a/packages/dev/core/src/Materials/materialFlags.ts b/packages/dev/core/src/Materials/materialFlags.ts index af013512b86..8f9dde396b6 100644 --- a/packages/dev/core/src/Materials/materialFlags.ts +++ b/packages/dev/core/src/Materials/materialFlags.ts @@ -38,6 +38,22 @@ export class MaterialFlags { AbstractEngine.MarkAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag); } + private static _BaseDiffuseRoughnessTextureEnabled = true; + /** + * Is the OpenPBR Base Diffuse Roughness texture enabled in the application. + */ + public static get BaseDiffuseRoughnessTextureEnabled(): boolean { + return this._BaseDiffuseRoughnessTextureEnabled; + } + public static set BaseDiffuseRoughnessTextureEnabled(value: boolean) { + if (this._BaseDiffuseRoughnessTextureEnabled === value) { + return; + } + + this._BaseDiffuseRoughnessTextureEnabled = value; + AbstractEngine.MarkAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag); + } + private static _DetailTextureEnabled = true; /** * Are detail textures enabled in the application. diff --git a/packages/dev/core/src/Materials/shaderMaterial.ts b/packages/dev/core/src/Materials/shaderMaterial.ts index 2b79ee019e9..785da13619a 100644 --- a/packages/dev/core/src/Materials/shaderMaterial.ts +++ b/packages/dev/core/src/Materials/shaderMaterial.ts @@ -1792,7 +1792,7 @@ export class ShaderMaterial extends PushMaterial { * @returns a promise that will resolve to the new ShaderMaterial */ public static async ParseFromFileAsync(name: Nullable, url: string, scene: Scene, rootUrl = ""): Promise { - return new Promise((resolve, reject) => { + return await new Promise((resolve, reject) => { const request = new WebRequest(); request.addEventListener("readystatechange", () => { if (request.readyState == 4) { @@ -1806,6 +1806,7 @@ export class ShaderMaterial extends PushMaterial { resolve(output); } else { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject("Unable to load the ShaderMaterial"); } } @@ -1824,7 +1825,7 @@ export class ShaderMaterial extends PushMaterial { * @returns a promise that will resolve to the new ShaderMaterial */ public static async ParseFromSnippetAsync(snippetId: string, scene: Scene, rootUrl = ""): Promise { - return new Promise((resolve, reject) => { + return await new Promise((resolve, reject) => { const request = new WebRequest(); request.addEventListener("readystatechange", () => { if (request.readyState == 4) { @@ -1837,6 +1838,7 @@ export class ShaderMaterial extends PushMaterial { resolve(output); } else { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject("Unable to load the snippet " + snippetId); } } diff --git a/packages/dev/core/src/Maths/ThinMaths/index.ts b/packages/dev/core/src/Maths/ThinMaths/index.ts new file mode 100644 index 00000000000..2275118cb69 --- /dev/null +++ b/packages/dev/core/src/Maths/ThinMaths/index.ts @@ -0,0 +1,2 @@ +export * from "./thinMath.matrix"; +export * from "./thinMath.matrix.functions"; diff --git a/packages/dev/core/src/Maths/ThinMaths/thinMath.matrix.functions.ts b/packages/dev/core/src/Maths/ThinMaths/thinMath.matrix.functions.ts new file mode 100644 index 00000000000..144751059e1 --- /dev/null +++ b/packages/dev/core/src/Maths/ThinMaths/thinMath.matrix.functions.ts @@ -0,0 +1,269 @@ +/* eslint-disable @typescript-eslint/naming-convention */ +import type { IMatrixLike } from "../math.like"; +import type { ThinMatrix } from "./thinMath.matrix"; + +function SetMatrixData( + result: ThinMatrix, + m0: number, + m1: number, + m2: number, + m3: number, + m4: number, + m5: number, + m6: number, + m7: number, + m8: number, + m9: number, + m10: number, + m11: number, + m12: number, + m13: number, + m14: number, + m15: number +): void { + const mat = result.asArray(); + mat[0] = m0; + mat[1] = m1; + mat[2] = m2; + mat[3] = m3; + mat[4] = m4; + mat[5] = m5; + mat[6] = m6; + mat[7] = m7; + mat[8] = m8; + mat[9] = m9; + mat[10] = m10; + mat[11] = m11; + mat[12] = m12; + mat[13] = m13; + mat[14] = m14; + mat[15] = m15; + + result.updateFlag++; +} + +/** + * Sets the given matrix to the identity matrix + * @param result defines the target matrix + */ +export function IdentityMatrixToRef(result: ThinMatrix): void { + SetMatrixData(result, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0); +} + +/** + * Creates a new translation matrix. + * @param x defines the x coordinate + * @param y defines the y coordinate + * @param z defines the z coordinate + * @param result defines the target matrix + */ +export function TranslationMatrixToRef(x: number, y: number, z: number, result: ThinMatrix): void { + SetMatrixData(result, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, x, y, z, 1.0); +} + +/** + * Creates a new scaling matrix. + * @param x defines the scale factor on X axis + * @param y defines the scale factor on Y axis + * @param z defines the scale factor on Z axis + * @param result defines the target matrix + */ +export function ScalingMatrixToRef(x: number, y: number, z: number, result: ThinMatrix): void { + SetMatrixData(result, x, 0.0, 0.0, 0.0, 0.0, y, 0.0, 0.0, 0.0, 0.0, z, 0.0, 0.0, 0.0, 0.0, 1.0); +} + +/** + * Multiplies two matrices and stores the result in the target array. + * @param a defines the first matrix + * @param b defines the second matrix + * @param output defines the target array + * @param offset defines the offset in the target array where to store the result (0 by default) + */ +export function MultiplyMatricesToArray(a: IMatrixLike, b: IMatrixLike, output: Float32Array | Array, offset = 0): void { + const m = a.asArray(); + const otherM = b.asArray(); + const tm0 = m[0], + tm1 = m[1], + tm2 = m[2], + tm3 = m[3]; + const tm4 = m[4], + tm5 = m[5], + tm6 = m[6], + tm7 = m[7]; + const tm8 = m[8], + tm9 = m[9], + tm10 = m[10], + tm11 = m[11]; + const tm12 = m[12], + tm13 = m[13], + tm14 = m[14], + tm15 = m[15]; + + const om0 = otherM[0], + om1 = otherM[1], + om2 = otherM[2], + om3 = otherM[3]; + const om4 = otherM[4], + om5 = otherM[5], + om6 = otherM[6], + om7 = otherM[7]; + const om8 = otherM[8], + om9 = otherM[9], + om10 = otherM[10], + om11 = otherM[11]; + const om12 = otherM[12], + om13 = otherM[13], + om14 = otherM[14], + om15 = otherM[15]; + output[offset] = tm0 * om0 + tm1 * om4 + tm2 * om8 + tm3 * om12; + output[offset + 1] = tm0 * om1 + tm1 * om5 + tm2 * om9 + tm3 * om13; + output[offset + 2] = tm0 * om2 + tm1 * om6 + tm2 * om10 + tm3 * om14; + output[offset + 3] = tm0 * om3 + tm1 * om7 + tm2 * om11 + tm3 * om15; + + output[offset + 4] = tm4 * om0 + tm5 * om4 + tm6 * om8 + tm7 * om12; + output[offset + 5] = tm4 * om1 + tm5 * om5 + tm6 * om9 + tm7 * om13; + output[offset + 6] = tm4 * om2 + tm5 * om6 + tm6 * om10 + tm7 * om14; + output[offset + 7] = tm4 * om3 + tm5 * om7 + tm6 * om11 + tm7 * om15; + + output[offset + 8] = tm8 * om0 + tm9 * om4 + tm10 * om8 + tm11 * om12; + output[offset + 9] = tm8 * om1 + tm9 * om5 + tm10 * om9 + tm11 * om13; + output[offset + 10] = tm8 * om2 + tm9 * om6 + tm10 * om10 + tm11 * om14; + output[offset + 11] = tm8 * om3 + tm9 * om7 + tm10 * om11 + tm11 * om15; + + output[offset + 12] = tm12 * om0 + tm13 * om4 + tm14 * om8 + tm15 * om12; + output[offset + 13] = tm12 * om1 + tm13 * om5 + tm14 * om9 + tm15 * om13; + output[offset + 14] = tm12 * om2 + tm13 * om6 + tm14 * om10 + tm15 * om14; + output[offset + 15] = tm12 * om3 + tm13 * om7 + tm14 * om11 + tm15 * om15; +} + +/** + * Multiplies two matrices and stores the result in a third matrix. + * @param a defines the first matrix + * @param b defines the second matrix + * @param result defines the target matrix + * @param offset defines the offset in the target matrix where to store the result (0 by default) + */ +export function MultiplyMatricesToRef(a: IMatrixLike, b: IMatrixLike, result: ThinMatrix, offset = 0): void { + MultiplyMatricesToArray(a, b, result.asArray(), offset); + result.updateFlag++; +} + +/** + * Populates the given array from the starting index with the current matrix values + * @param matrix defines the source matrix + * @param array defines the target array + * @param offset defines the offset in the target array where to start storing values + */ +export function CopyMatrixToArray(matrix: IMatrixLike, array: Float32Array | Array, offset: number = 0) { + const source = matrix.asArray(); + array[offset] = source[0]; + array[offset + 1] = source[1]; + array[offset + 2] = source[2]; + array[offset + 3] = source[3]; + array[offset + 4] = source[4]; + array[offset + 5] = source[5]; + array[offset + 6] = source[6]; + array[offset + 7] = source[7]; + array[offset + 8] = source[8]; + array[offset + 9] = source[9]; + array[offset + 10] = source[10]; + array[offset + 11] = source[11]; + array[offset + 12] = source[12]; + array[offset + 13] = source[13]; + array[offset + 14] = source[14]; + array[offset + 15] = source[15]; +} + +/** + * Inverts the given matrix and stores the result in the target array + * @param source defines the source matrix + * @param target defines the target array + * @returns true if the matrix was inverted successfully, false otherwise + */ +export function InvertMatrixToRef(source: IMatrixLike, target: Float32Array | Array) { + // the inverse of a matrix is the transpose of cofactor matrix divided by the determinant + const m = source.asArray(); + const m00 = m[0], + m01 = m[1], + m02 = m[2], + m03 = m[3]; + const m10 = m[4], + m11 = m[5], + m12 = m[6], + m13 = m[7]; + const m20 = m[8], + m21 = m[9], + m22 = m[10], + m23 = m[11]; + const m30 = m[12], + m31 = m[13], + m32 = m[14], + m33 = m[15]; + + const det_22_33 = m22 * m33 - m32 * m23; + const det_21_33 = m21 * m33 - m31 * m23; + const det_21_32 = m21 * m32 - m31 * m22; + const det_20_33 = m20 * m33 - m30 * m23; + const det_20_32 = m20 * m32 - m22 * m30; + const det_20_31 = m20 * m31 - m30 * m21; + + const cofact_00 = +(m11 * det_22_33 - m12 * det_21_33 + m13 * det_21_32); + const cofact_01 = -(m10 * det_22_33 - m12 * det_20_33 + m13 * det_20_32); + const cofact_02 = +(m10 * det_21_33 - m11 * det_20_33 + m13 * det_20_31); + const cofact_03 = -(m10 * det_21_32 - m11 * det_20_32 + m12 * det_20_31); + + const det = m00 * cofact_00 + m01 * cofact_01 + m02 * cofact_02 + m03 * cofact_03; + + if (det === 0) { + // Not invertible + return false; + } + + const detInv = 1 / det; + const det_12_33 = m12 * m33 - m32 * m13; + const det_11_33 = m11 * m33 - m31 * m13; + const det_11_32 = m11 * m32 - m31 * m12; + const det_10_33 = m10 * m33 - m30 * m13; + const det_10_32 = m10 * m32 - m30 * m12; + const det_10_31 = m10 * m31 - m30 * m11; + const det_12_23 = m12 * m23 - m22 * m13; + const det_11_23 = m11 * m23 - m21 * m13; + const det_11_22 = m11 * m22 - m21 * m12; + const det_10_23 = m10 * m23 - m20 * m13; + const det_10_22 = m10 * m22 - m20 * m12; + const det_10_21 = m10 * m21 - m20 * m11; + + const cofact_10 = -(m01 * det_22_33 - m02 * det_21_33 + m03 * det_21_32); + const cofact_11 = +(m00 * det_22_33 - m02 * det_20_33 + m03 * det_20_32); + const cofact_12 = -(m00 * det_21_33 - m01 * det_20_33 + m03 * det_20_31); + const cofact_13 = +(m00 * det_21_32 - m01 * det_20_32 + m02 * det_20_31); + + const cofact_20 = +(m01 * det_12_33 - m02 * det_11_33 + m03 * det_11_32); + const cofact_21 = -(m00 * det_12_33 - m02 * det_10_33 + m03 * det_10_32); + const cofact_22 = +(m00 * det_11_33 - m01 * det_10_33 + m03 * det_10_31); + const cofact_23 = -(m00 * det_11_32 - m01 * det_10_32 + m02 * det_10_31); + + const cofact_30 = -(m01 * det_12_23 - m02 * det_11_23 + m03 * det_11_22); + const cofact_31 = +(m00 * det_12_23 - m02 * det_10_23 + m03 * det_10_22); + const cofact_32 = -(m00 * det_11_23 - m01 * det_10_23 + m03 * det_10_21); + const cofact_33 = +(m00 * det_11_22 - m01 * det_10_22 + m02 * det_10_21); + + target[0] = cofact_00 * detInv; + target[1] = cofact_10 * detInv; + target[2] = cofact_20 * detInv; + target[3] = cofact_30 * detInv; + target[4] = cofact_01 * detInv; + target[5] = cofact_11 * detInv; + target[6] = cofact_21 * detInv; + target[7] = cofact_31 * detInv; + target[8] = cofact_02 * detInv; + target[9] = cofact_12 * detInv; + target[10] = cofact_22 * detInv; + target[11] = cofact_32 * detInv; + target[12] = cofact_03 * detInv; + target[13] = cofact_13 * detInv; + target[14] = cofact_23 * detInv; + target[15] = cofact_33 * detInv; + + return true; +} diff --git a/packages/dev/core/src/Maths/ThinMaths/thinMath.matrix.ts b/packages/dev/core/src/Maths/ThinMaths/thinMath.matrix.ts new file mode 100644 index 00000000000..8b2c45734e2 --- /dev/null +++ b/packages/dev/core/src/Maths/ThinMaths/thinMath.matrix.ts @@ -0,0 +1,25 @@ +import type { Tuple } from "core/types"; +import type { IMatrixLike } from "../math.like"; + +/** + * A thin matrix class that is used for size reasons. + * The class is identity by default + */ +export class ThinMatrix implements IMatrixLike { + private readonly _m: Tuple = [1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0]; + + /** + * Returns the matrix as a Array + * @returns the matrix underlying array. + */ + public asArray(): Tuple { + return this._m; + } + + /** + * Gets the update flag of the matrix which is an unique number for the matrix. + * It will be incremented every time the matrix data change. + * You can use it to speed the comparison between two versions of the same matrix. + */ + public updateFlag: number = 0; +} diff --git a/packages/dev/core/src/Maths/index.ts b/packages/dev/core/src/Maths/index.ts index 00bf1a453d2..e7363f53bdf 100644 --- a/packages/dev/core/src/Maths/index.ts +++ b/packages/dev/core/src/Maths/index.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-internal-modules */ export * from "./math.scalar"; export * from "./math.functions"; export * from "./math.polar"; @@ -6,3 +7,4 @@ export * from "./math"; export * from "./sphericalPolynomial"; export * from "./halton2DSequence"; export * from "./math.vector.functions"; +export * from "./ThinMaths/index"; diff --git a/packages/dev/core/src/Maths/math.vector.ts b/packages/dev/core/src/Maths/math.vector.ts index 40d94a9fef5..5819eeb3fa7 100644 --- a/packages/dev/core/src/Maths/math.vector.ts +++ b/packages/dev/core/src/Maths/math.vector.ts @@ -11,6 +11,7 @@ import type { TransformNode } from "../Meshes/transformNode"; import type { Dimension, Tensor, TensorLike, TensorStatic } from "./tensor"; import type { IVector2Like, IVector3Like, IVector4Like, IQuaternionLike, IMatrixLike, IPlaneLike, IVector3LikeInternal } from "./math.like"; import { Clamp, Lerp, NormalizeRadians, RandomRange, WithinEpsilon } from "./math.scalar.functions"; +import { CopyMatrixToArray, InvertMatrixToRef, MultiplyMatricesToArray } from "./ThinMaths/thinMath.matrix.functions"; // eslint-disable-next-line @typescript-eslint/naming-convention const ExtractAsInt = (value: number) => { @@ -6453,94 +6454,11 @@ export class Matrix implements Tensor, 4>, Matrix>, IMatr return other; } - // the inverse of a Matrix is the transpose of cofactor matrix divided by the determinant - const m = this._m; - const m00 = m[0], - m01 = m[1], - m02 = m[2], - m03 = m[3]; - const m10 = m[4], - m11 = m[5], - m12 = m[6], - m13 = m[7]; - const m20 = m[8], - m21 = m[9], - m22 = m[10], - m23 = m[11]; - const m30 = m[12], - m31 = m[13], - m32 = m[14], - m33 = m[15]; - - const det_22_33 = m22 * m33 - m32 * m23; - const det_21_33 = m21 * m33 - m31 * m23; - const det_21_32 = m21 * m32 - m31 * m22; - const det_20_33 = m20 * m33 - m30 * m23; - const det_20_32 = m20 * m32 - m22 * m30; - const det_20_31 = m20 * m31 - m30 * m21; - - const cofact_00 = +(m11 * det_22_33 - m12 * det_21_33 + m13 * det_21_32); - const cofact_01 = -(m10 * det_22_33 - m12 * det_20_33 + m13 * det_20_32); - const cofact_02 = +(m10 * det_21_33 - m11 * det_20_33 + m13 * det_20_31); - const cofact_03 = -(m10 * det_21_32 - m11 * det_20_32 + m12 * det_20_31); - - const det = m00 * cofact_00 + m01 * cofact_01 + m02 * cofact_02 + m03 * cofact_03; - - if (det === 0) { - // not invertible + if (InvertMatrixToRef(this, other.asArray())) { + other.markAsUpdated(); + } else { other.copyFrom(this); - return other; } - - const detInv = 1 / det; - const det_12_33 = m12 * m33 - m32 * m13; - const det_11_33 = m11 * m33 - m31 * m13; - const det_11_32 = m11 * m32 - m31 * m12; - const det_10_33 = m10 * m33 - m30 * m13; - const det_10_32 = m10 * m32 - m30 * m12; - const det_10_31 = m10 * m31 - m30 * m11; - const det_12_23 = m12 * m23 - m22 * m13; - const det_11_23 = m11 * m23 - m21 * m13; - const det_11_22 = m11 * m22 - m21 * m12; - const det_10_23 = m10 * m23 - m20 * m13; - const det_10_22 = m10 * m22 - m20 * m12; - const det_10_21 = m10 * m21 - m20 * m11; - - const cofact_10 = -(m01 * det_22_33 - m02 * det_21_33 + m03 * det_21_32); - const cofact_11 = +(m00 * det_22_33 - m02 * det_20_33 + m03 * det_20_32); - const cofact_12 = -(m00 * det_21_33 - m01 * det_20_33 + m03 * det_20_31); - const cofact_13 = +(m00 * det_21_32 - m01 * det_20_32 + m02 * det_20_31); - - const cofact_20 = +(m01 * det_12_33 - m02 * det_11_33 + m03 * det_11_32); - const cofact_21 = -(m00 * det_12_33 - m02 * det_10_33 + m03 * det_10_32); - const cofact_22 = +(m00 * det_11_33 - m01 * det_10_33 + m03 * det_10_31); - const cofact_23 = -(m00 * det_11_32 - m01 * det_10_32 + m02 * det_10_31); - - const cofact_30 = -(m01 * det_12_23 - m02 * det_11_23 + m03 * det_11_22); - const cofact_31 = +(m00 * det_12_23 - m02 * det_10_23 + m03 * det_10_22); - const cofact_32 = -(m00 * det_11_23 - m01 * det_10_23 + m03 * det_10_21); - const cofact_33 = +(m00 * det_11_22 - m01 * det_10_22 + m02 * det_10_21); - - Matrix.FromValuesToRef( - cofact_00 * detInv, - cofact_10 * detInv, - cofact_20 * detInv, - cofact_30 * detInv, - cofact_01 * detInv, - cofact_11 * detInv, - cofact_21 * detInv, - cofact_31 * detInv, - cofact_02 * detInv, - cofact_12 * detInv, - cofact_22 * detInv, - cofact_32 * detInv, - cofact_03 * detInv, - cofact_13 * detInv, - cofact_23 * detInv, - cofact_33 * detInv, - other - ); - return other; } @@ -6666,24 +6584,7 @@ export class Matrix implements Tensor, 4>, Matrix>, IMatr * @returns the current matrix */ public copyToArray(array: Float32Array | Array, offset: number = 0): this { - const source = this._m; - array[offset] = source[0]; - array[offset + 1] = source[1]; - array[offset + 2] = source[2]; - array[offset + 3] = source[3]; - array[offset + 4] = source[4]; - array[offset + 5] = source[5]; - array[offset + 6] = source[6]; - array[offset + 7] = source[7]; - array[offset + 8] = source[8]; - array[offset + 9] = source[9]; - array[offset + 10] = source[10]; - array[offset + 11] = source[11]; - array[offset + 12] = source[12]; - array[offset + 13] = source[13]; - array[offset + 14] = source[14]; - array[offset + 15] = source[15]; - + CopyMatrixToArray(this, array, offset); return this; } @@ -6779,61 +6680,7 @@ export class Matrix implements Tensor, 4>, Matrix>, IMatr * @returns the current matrix */ public multiplyToArray(other: DeepImmutable, result: Float32Array | Array, offset: number): this { - const m = this._m; - const otherM = other.m; - const tm0 = m[0], - tm1 = m[1], - tm2 = m[2], - tm3 = m[3]; - const tm4 = m[4], - tm5 = m[5], - tm6 = m[6], - tm7 = m[7]; - const tm8 = m[8], - tm9 = m[9], - tm10 = m[10], - tm11 = m[11]; - const tm12 = m[12], - tm13 = m[13], - tm14 = m[14], - tm15 = m[15]; - - const om0 = otherM[0], - om1 = otherM[1], - om2 = otherM[2], - om3 = otherM[3]; - const om4 = otherM[4], - om5 = otherM[5], - om6 = otherM[6], - om7 = otherM[7]; - const om8 = otherM[8], - om9 = otherM[9], - om10 = otherM[10], - om11 = otherM[11]; - const om12 = otherM[12], - om13 = otherM[13], - om14 = otherM[14], - om15 = otherM[15]; - - result[offset] = tm0 * om0 + tm1 * om4 + tm2 * om8 + tm3 * om12; - result[offset + 1] = tm0 * om1 + tm1 * om5 + tm2 * om9 + tm3 * om13; - result[offset + 2] = tm0 * om2 + tm1 * om6 + tm2 * om10 + tm3 * om14; - result[offset + 3] = tm0 * om3 + tm1 * om7 + tm2 * om11 + tm3 * om15; - - result[offset + 4] = tm4 * om0 + tm5 * om4 + tm6 * om8 + tm7 * om12; - result[offset + 5] = tm4 * om1 + tm5 * om5 + tm6 * om9 + tm7 * om13; - result[offset + 6] = tm4 * om2 + tm5 * om6 + tm6 * om10 + tm7 * om14; - result[offset + 7] = tm4 * om3 + tm5 * om7 + tm6 * om11 + tm7 * om15; - - result[offset + 8] = tm8 * om0 + tm9 * om4 + tm10 * om8 + tm11 * om12; - result[offset + 9] = tm8 * om1 + tm9 * om5 + tm10 * om9 + tm11 * om13; - result[offset + 10] = tm8 * om2 + tm9 * om6 + tm10 * om10 + tm11 * om14; - result[offset + 11] = tm8 * om3 + tm9 * om7 + tm10 * om11 + tm11 * om15; - - result[offset + 12] = tm12 * om0 + tm13 * om4 + tm14 * om8 + tm15 * om12; - result[offset + 13] = tm12 * om1 + tm13 * om5 + tm14 * om9 + tm15 * om13; - result[offset + 14] = tm12 * om2 + tm13 * om6 + tm14 * om10 + tm15 * om14; - result[offset + 15] = tm12 * om3 + tm13 * om7 + tm14 * om11 + tm15 * om15; + MultiplyMatricesToArray(this, other, result, offset); return this; } diff --git a/packages/dev/core/src/Meshes/Compression/dracoCodec.ts b/packages/dev/core/src/Meshes/Compression/dracoCodec.ts index cd921920cec..a8e8f14f1be 100644 --- a/packages/dev/core/src/Meshes/Compression/dracoCodec.ts +++ b/packages/dev/core/src/Meshes/Compression/dracoCodec.ts @@ -126,16 +126,19 @@ export abstract class DracoCodec implements IDisposable { }; // If using workers, initialize a worker pool with either the wasm or url? if (useWorkers) { + // eslint-disable-next-line github/no-then this._workerPoolPromise = codecInfo.wasmBinaryPromise.then((wasmBinary) => { const workerContent = this._getWorkerContent(); const workerBlobUrl = URL.createObjectURL(new Blob([workerContent], { type: "application/javascript" })); + // eslint-disable-next-line @typescript-eslint/promise-function-async return new AutoReleaseWorkerPool(numberOfWorkers, () => { const worker = new Worker(workerBlobUrl); return initializeWebWorker(worker, wasmBinary, codecInfo.url); }); }); } else { + // eslint-disable-next-line github/no-then this._modulePromise = codecInfo.wasmBinaryPromise.then(async (wasmBinary) => { if (!this._isModuleAvailable()) { if (!configuration.jsModule) { @@ -145,7 +148,7 @@ export abstract class DracoCodec implements IDisposable { await Tools.LoadBabylonScriptAsync(codecInfo.url); } } - return this._createModuleAsync(wasmBinary as ArrayBuffer, configuration.jsModule); + return await this._createModuleAsync(wasmBinary as ArrayBuffer, configuration.jsModule); }); } } @@ -171,6 +174,7 @@ export abstract class DracoCodec implements IDisposable { */ public dispose(): void { if (this._workerPoolPromise) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then this._workerPoolPromise.then((workerPool) => { workerPool.dispose(); }); diff --git a/packages/dev/core/src/Meshes/Compression/dracoCompression.ts b/packages/dev/core/src/Meshes/Compression/dracoCompression.ts index ef75c679e39..0ae34e6efa2 100644 --- a/packages/dev/core/src/Meshes/Compression/dracoCompression.ts +++ b/packages/dev/core/src/Meshes/Compression/dracoCompression.ts @@ -145,7 +145,7 @@ export class DracoCompression { * @returns a promise that resolves when ready */ public async whenReadyAsync(): Promise { - return this._decoder.whenReadyAsync(); + return await this._decoder.whenReadyAsync(); } /** @@ -155,6 +155,7 @@ export class DracoCompression { * @param gltfNormalizedOverride A map of attributes from vertex buffer kinds to normalized flags to override the Draco normalization * @returns A promise that resolves with the decoded mesh data */ + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax public decodeMeshToMeshDataAsync( data: ArrayBuffer | ArrayBufferView, attributes?: { [kind: string]: number }, @@ -172,7 +173,7 @@ export class DracoCompression { * @returns A promise that resolves with the decoded geometry */ public async decodeMeshToGeometryAsync(name: string, scene: Scene, data: ArrayBuffer | ArrayBufferView, attributes?: { [kind: string]: number }): Promise { - return this._decoder.decodeMeshToGeometryAsync(name, scene, data, attributes); + return await this._decoder.decodeMeshToGeometryAsync(name, scene, data, attributes); } /** @internal */ @@ -184,7 +185,7 @@ export class DracoCompression { gltfNormalizedOverride: { [kind: string]: boolean }, boundingInfo: Nullable ): Promise { - return this._decoder._decodeMeshToGeometryForGltfAsync(name, scene, data, attributes, gltfNormalizedOverride, boundingInfo); + return await this._decoder._decodeMeshToGeometryForGltfAsync(name, scene, data, attributes, gltfNormalizedOverride, boundingInfo); } /** diff --git a/packages/dev/core/src/Meshes/Compression/dracoCompressionWorker.ts b/packages/dev/core/src/Meshes/Compression/dracoCompressionWorker.ts index cb1f5017683..62ca810bc12 100644 --- a/packages/dev/core/src/Meshes/Compression/dracoCompressionWorker.ts +++ b/packages/dev/core/src/Meshes/Compression/dracoCompressionWorker.ts @@ -149,6 +149,7 @@ export function EncoderWorkerFunction(): void { if (!encoderPromise) { throw new Error("Draco encoder module is not available"); } + // eslint-disable-next-line github/no-then encoderPromise.then((encoder) => { const result = EncodeMesh(encoder, message.attributes, message.indices, message.options); postMessage({ id: "encodeMeshDone", encodedMeshData: result }, result ? [result.data.buffer] : undefined); @@ -322,6 +323,7 @@ export function DecoderWorkerFunction(): void { if (!decoderPromise) { throw new Error("Draco decoder module is not available"); } + // eslint-disable-next-line github/no-then decoderPromise.then((decoder) => { const numPoints = DecodeMesh( decoder, @@ -353,11 +355,12 @@ export { DecoderWorkerFunction as workerFunction }; * @returns A promise that resolves when the worker is initialized */ // eslint-disable-next-line @typescript-eslint/naming-convention -export function initializeWebWorker(worker: Worker, wasmBinary?: ArrayBuffer, moduleUrl?: string): Promise { - return new Promise((resolve, reject) => { +export async function initializeWebWorker(worker: Worker, wasmBinary?: ArrayBuffer, moduleUrl?: string): Promise { + return await new Promise((resolve, reject) => { const onError = (error: ErrorEvent) => { worker.removeEventListener("error", onError); worker.removeEventListener("message", onMessage); + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject(error); }; diff --git a/packages/dev/core/src/Meshes/Compression/dracoDecoder.ts b/packages/dev/core/src/Meshes/Compression/dracoDecoder.ts index 410463d499e..81f2ecc0610 100644 --- a/packages/dev/core/src/Meshes/Compression/dracoDecoder.ts +++ b/packages/dev/core/src/Meshes/Compression/dracoDecoder.ts @@ -113,6 +113,7 @@ export class DracoDecoder extends DracoCodec { * @param gltfNormalizedOverride A map of attributes from vertex buffer kinds to normalized flags to override the Draco normalization * @returns A promise that resolves with the decoded mesh data */ + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax public decodeMeshToMeshDataAsync( data: ArrayBuffer | ArrayBufferView, attributes?: { [kind: string]: number }, @@ -135,8 +136,9 @@ export class DracoDecoder extends DracoCodec { }; if (this._workerPoolPromise) { + // eslint-disable-next-line github/no-then return this._workerPoolPromise.then(async (workerPool) => { - return new Promise((resolve, reject) => { + return await new Promise((resolve, reject) => { workerPool.push((worker, onComplete) => { let resultIndices: Nullable = null; const resultAttributes: Array = []; @@ -144,6 +146,7 @@ export class DracoDecoder extends DracoCodec { const onError = (error: ErrorEvent) => { worker.removeEventListener("error", onError); worker.removeEventListener("message", onMessage); + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject(error); onComplete(); }; @@ -187,6 +190,7 @@ export class DracoDecoder extends DracoCodec { } if (this._modulePromise) { + // eslint-disable-next-line github/no-then return this._modulePromise.then((decoder) => { let resultIndices: Nullable = null; const resultAttributes: Array = []; diff --git a/packages/dev/core/src/Meshes/Compression/dracoEncoder.ts b/packages/dev/core/src/Meshes/Compression/dracoEncoder.ts index 4cf9f7cfe33..9a46f3e5714 100644 --- a/packages/dev/core/src/Meshes/Compression/dracoEncoder.ts +++ b/packages/dev/core/src/Meshes/Compression/dracoEncoder.ts @@ -221,11 +221,12 @@ export class DracoEncoder extends DracoCodec { if (this._workerPoolPromise) { const workerPool = await this._workerPoolPromise; - return new Promise>((resolve, reject) => { + return await new Promise>((resolve, reject) => { workerPool.push((worker, onComplete) => { const onError = (error: ErrorEvent) => { worker.removeEventListener("error", onError); worker.removeEventListener("message", onMessage); + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject(error); onComplete(); }; @@ -285,6 +286,6 @@ export class DracoEncoder extends DracoCodec { const indices = PrepareIndicesForDraco(input); const attributes = PrepareAttributesForDraco(input, options?.excludedAttributes); - return this._encodeAsync(attributes, indices, options); + return await this._encodeAsync(attributes, indices, options); } } diff --git a/packages/dev/core/src/Meshes/Compression/meshoptCompression.ts b/packages/dev/core/src/Meshes/Compression/meshoptCompression.ts index fafc90d470f..10c8435c52e 100644 --- a/packages/dev/core/src/Meshes/Compression/meshoptCompression.ts +++ b/packages/dev/core/src/Meshes/Compression/meshoptCompression.ts @@ -83,6 +83,7 @@ export class MeshoptCompression implements IDisposable { constructor() { const decoder = MeshoptCompression.Configuration.decoder; + // eslint-disable-next-line github/no-then this._decoderModulePromise = Tools.LoadBabylonScriptAsync(decoder.url).then(() => { // Wait for WebAssembly compilation before resolving promise return MeshoptDecoder.ready; @@ -106,23 +107,22 @@ export class MeshoptCompression implements IDisposable { * @param filter The compression filter. * @returns a Promise that resolves to the decoded data */ - public decodeGltfBufferAsync(source: Uint8Array, count: number, stride: number, mode: "ATTRIBUTES" | "TRIANGLES" | "INDICES", filter?: string): Promise { - return this._decoderModulePromise!.then(async () => { - if (NumberOfWorkers === 0) { - MeshoptDecoder.useWorkers(1); - NumberOfWorkers = 1; - } - const result = await MeshoptDecoder.decodeGltfBufferAsync(count, stride, source, mode, filter); - // a simple debounce to avoid switching back and forth between workers and no workers while decoding - if (WorkerTimeout !== null) { - clearTimeout(WorkerTimeout); - } - WorkerTimeout = setTimeout(() => { - MeshoptDecoder.useWorkers(0); - NumberOfWorkers = 0; - WorkerTimeout = null; - }, 1000); - return result; - }); + public async decodeGltfBufferAsync(source: Uint8Array, count: number, stride: number, mode: "ATTRIBUTES" | "TRIANGLES" | "INDICES", filter?: string): Promise { + await this._decoderModulePromise!; + if (NumberOfWorkers === 0) { + MeshoptDecoder.useWorkers(1); + NumberOfWorkers = 1; + } + const result = await MeshoptDecoder.decodeGltfBufferAsync(count, stride, source, mode, filter); + // a simple debounce to avoid switching back and forth between workers and no workers while decoding + if (WorkerTimeout !== null) { + clearTimeout(WorkerTimeout); + } + WorkerTimeout = setTimeout(() => { + MeshoptDecoder.useWorkers(0); + NumberOfWorkers = 0; + WorkerTimeout = null; + }, 1000); + return result; } } diff --git a/packages/dev/core/src/Meshes/GaussianSplatting/gaussianSplattingMesh.ts b/packages/dev/core/src/Meshes/GaussianSplatting/gaussianSplattingMesh.ts index 2683bb36373..cf51bd6716e 100644 --- a/packages/dev/core/src/Meshes/GaussianSplatting/gaussianSplattingMesh.ts +++ b/packages/dev/core/src/Meshes/GaussianSplatting/gaussianSplattingMesh.ts @@ -412,6 +412,7 @@ export class GaussianSplattingMesh extends Mesh { this._keepInRam = keepInRam; if (url) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises this.loadFileAsync(url); } this._material = new GaussianSplattingMaterial(this.name + "_material", this._scene); @@ -1045,10 +1046,10 @@ export class GaussianSplattingMesh extends Mesh { q.set(r1, r2, r3, r0); q.normalize(); - rot[0] = q.w * 128 + 128; - rot[1] = q.x * 128 + 128; - rot[2] = q.y * 128 + 128; - rot[3] = q.z * 128 + 128; + rot[0] = q.w * 127.5 + 127.5; + rot[1] = q.x * 127.5 + 127.5; + rot[2] = q.y * 127.5 + 127.5; + rot[3] = q.z * 127.5 + 127.5; offset.value += header.rowVertexLength; } @@ -1147,7 +1148,7 @@ export class GaussianSplattingMesh extends Mesh { * @returns the loaded splat buffer */ public static async ConvertPLYToSplatAsync(data: ArrayBuffer) { - return runCoroutineAsync(GaussianSplattingMesh.ConvertPLYToSplat(data, true), createYieldingScheduler()); + return await runCoroutineAsync(GaussianSplattingMesh.ConvertPLYToSplat(data, true), createYieldingScheduler()); } /** @@ -1157,7 +1158,7 @@ export class GaussianSplattingMesh extends Mesh { * @returns the loaded splat buffer with SH */ public static async ConvertPLYWithSHToSplatAsync(data: ArrayBuffer) { - return runCoroutineAsync(GaussianSplattingMesh.ConvertPLYWithSHToSplat(data, true), createYieldingScheduler()); + return await runCoroutineAsync(GaussianSplattingMesh.ConvertPLYWithSHToSplat(data, true), createYieldingScheduler()); } /** * Loads a .splat Gaussian Splatting array buffer asynchronously @@ -1165,8 +1166,8 @@ export class GaussianSplattingMesh extends Mesh { * @returns a promise that resolves when the operation is complete */ - public loadDataAsync(data: ArrayBuffer): Promise { - return this.updateDataAsync(data); + public async loadDataAsync(data: ArrayBuffer): Promise { + return await this.updateDataAsync(data); } /** @@ -1175,12 +1176,10 @@ export class GaussianSplattingMesh extends Mesh { * @returns a promise that resolves when the operation is complete * @deprecated Please use SceneLoader.ImportMeshAsync instead */ - public loadFileAsync(url: string): Promise { - return Tools.LoadFileAsync(url, true).then((plyBuffer) => { - return (GaussianSplattingMesh.ConvertPLYWithSHToSplatAsync(plyBuffer) as any).then((splatsData: IPLYConversionBuffers) => { - this.updateDataAsync(splatsData.buffer, splatsData.sh); - }); - }); + public async loadFileAsync(url: string): Promise { + const plyBuffer = await Tools.LoadFileAsync(url, true); + const splatsData: IPLYConversionBuffers = await (GaussianSplattingMesh.ConvertPLYWithSHToSplatAsync(plyBuffer) as any); + await this.updateDataAsync(splatsData.buffer, splatsData.sh); } /** @@ -1498,7 +1497,7 @@ export class GaussianSplattingMesh extends Mesh { * @returns a promise */ public async updateDataAsync(data: ArrayBuffer, sh?: Uint8Array[]): Promise { - return runCoroutineAsync(this._updateData(data, true, sh), createYieldingScheduler()); + return await runCoroutineAsync(this._updateData(data, true, sh), createYieldingScheduler()); } /** diff --git a/packages/dev/core/src/Meshes/GreasedLine/greasedLineBaseMesh.ts b/packages/dev/core/src/Meshes/GreasedLine/greasedLineBaseMesh.ts index 0854a78061e..a211de5a9ff 100644 --- a/packages/dev/core/src/Meshes/GreasedLine/greasedLineBaseMesh.ts +++ b/packages/dev/core/src/Meshes/GreasedLine/greasedLineBaseMesh.ts @@ -7,6 +7,7 @@ import type { Vector3 } from "../../Maths/math.vector"; import { VertexData } from "../mesh.vertexData"; import { DeepCopier } from "../../Misc/deepCopier"; import { GreasedLineSimpleMaterial, GreasedLineUseOffsetsSimpleMaterialDefine } from "../../Materials/GreasedLine/greasedLineSimpleMaterial"; +import { GreasedLineSimpleMaterial, GreasedLineUseOffsetsSimpleMaterialDefine } from "../../Materials/GreasedLine/greasedLineSimpleMaterial"; import type { AbstractEngine } from "../../Engines/abstractEngine"; import type { FloatArray, IndicesArray } from "../../types"; import { GreasedLineTools } from "../../Misc/greasedLineTools"; @@ -289,7 +290,7 @@ export abstract class GreasedLineBaseMesh extends Mesh { */ set offsets(offsets: number[]) { if (this.material instanceof GreasedLineSimpleMaterial) { - this.material.setDefine(GreasedLineUseOffsetsSimpleMaterialDefine, offsets?.length > 0); + this.material.setDefine(GreasedLineUseOffsetsSimpleMaterialDefine, offsets.length > 0); } this._offsets = offsets; if (!this._offsetsBuffer) { diff --git a/packages/dev/core/src/Meshes/Node/Blocks/Textures/geometryTextureBlock.ts b/packages/dev/core/src/Meshes/Node/Blocks/Textures/geometryTextureBlock.ts index a42cd3b5cba..7efd9032b7a 100644 --- a/packages/dev/core/src/Meshes/Node/Blocks/Textures/geometryTextureBlock.ts +++ b/packages/dev/core/src/Meshes/Node/Blocks/Textures/geometryTextureBlock.ts @@ -67,8 +67,8 @@ export class GeometryTextureBlock extends NodeGeometryBlock { return this._outputs[0]; } - private _prepareImgToLoadAsync(url: string) { - return new Promise((resolve, reject) => { + private async _prepareImgToLoadAsync(url: string) { + return await new Promise((resolve, reject) => { const img = new Image(); const canvas = document.createElement("canvas"); const ctx = canvas.getContext("2d"); @@ -95,7 +95,7 @@ export class GeometryTextureBlock extends NodeGeometryBlock { img.onerror = () => { this._data = null; - reject(); + reject(new Error("Failed to load image")); }; img.src = url; @@ -114,8 +114,8 @@ export class GeometryTextureBlock extends NodeGeometryBlock { * @param imageFile defines the file to load data from * @returns a promise fulfilled when image data is loaded */ - public loadTextureFromFileAsync(imageFile: File) { - return this._prepareImgToLoadAsync(URL.createObjectURL(imageFile)); + public async loadTextureFromFileAsync(imageFile: File) { + return await this._prepareImgToLoadAsync(URL.createObjectURL(imageFile)); } /** @@ -123,8 +123,8 @@ export class GeometryTextureBlock extends NodeGeometryBlock { * @param url defines the url to load data from * @returns a promise fulfilled when image data is loaded */ - public loadTextureFromUrlAsync(url: string) { - return this._prepareImgToLoadAsync(url); + public async loadTextureFromUrlAsync(url: string) { + return await this._prepareImgToLoadAsync(url); } /** @@ -132,16 +132,24 @@ export class GeometryTextureBlock extends NodeGeometryBlock { * @param texture defines the source texture * @returns a promise fulfilled when image data is loaded */ - public extractFromTextureAsync(texture: Texture) { - return new Promise((resolve, reject) => { + public async extractFromTextureAsync(texture: Texture) { + return await new Promise((resolve, reject) => { if (!texture.isReady()) { + // eslint-disable-next-line @typescript-eslint/no-misused-promises texture.onLoadObservable.addOnce(async () => { - return this.extractFromTextureAsync(texture).then(resolve).catch(reject); + try { + await this.extractFromTextureAsync(texture); + resolve(); + } catch (e) { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors + reject(e); + } }); return; } const size = texture.getSize(); TextureTools.GetTextureDataAsync(texture, size.width, size.height) + // eslint-disable-next-line github/no-then .then((data) => { const floatArray = new Float32Array(data.length); @@ -153,6 +161,7 @@ export class GeometryTextureBlock extends NodeGeometryBlock { this._height = size.height; resolve(); }) + // eslint-disable-next-line github/no-then .catch(reject); }); } diff --git a/packages/dev/core/src/Meshes/Node/Blocks/booleanGeometryBlock.ts b/packages/dev/core/src/Meshes/Node/Blocks/booleanGeometryBlock.ts index ca18e11a85c..561156f99d6 100644 --- a/packages/dev/core/src/Meshes/Node/Blocks/booleanGeometryBlock.ts +++ b/packages/dev/core/src/Meshes/Node/Blocks/booleanGeometryBlock.ts @@ -62,6 +62,7 @@ export class BooleanGeometryBlock extends NodeGeometryBlock { return null; } + // eslint-disable-next-line @typescript-eslint/no-misused-promises if (!this._csg2LoadingPromise) { this._csg2LoadingPromise = InitializeCSG2Async(); } diff --git a/packages/dev/core/src/Meshes/Node/nodeGeometry.ts b/packages/dev/core/src/Meshes/Node/nodeGeometry.ts index 850a63940c9..51c5b365bda 100644 --- a/packages/dev/core/src/Meshes/Node/nodeGeometry.ts +++ b/packages/dev/core/src/Meshes/Node/nodeGeometry.ts @@ -199,7 +199,7 @@ export class NodeGeometry { */ // eslint-disable-next-line @typescript-eslint/naming-convention public async edit(config?: INodeGeometryEditorOptions): Promise { - return new Promise((resolve) => { + return await new Promise((resolve) => { this.BJSNODEGEOMETRYEDITOR = this.BJSNODEGEOMETRYEDITOR || this._getGlobalNodeGeometryEditor(); if (typeof this.BJSNODEGEOMETRYEDITOR == "undefined") { const editorUrl = config && config.editorURL ? config.editorURL : NodeGeometry.EditorURL; @@ -256,6 +256,7 @@ export class NodeGeometry { } if (promises.length) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then Promise.all(promises).then(() => { this.build(verbose, updateBuildId, autoConfigure); }); @@ -684,6 +685,7 @@ export class NodeGeometry { * @param skipBuild defines whether to build the node geometry * @returns a promise that will resolve to the new node geometry */ + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax public static ParseFromSnippetAsync(snippetId: string, nodeGeometry?: NodeGeometry, skipBuild: boolean = false): Promise { if (snippetId === "_BLANK") { return Promise.resolve(NodeGeometry.CreateDefault("blank")); @@ -710,9 +712,11 @@ export class NodeGeometry { } resolve(nodeGeometry); } catch (err) { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject(err); } } else { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject("Unable to load the snippet " + snippetId); } } diff --git a/packages/dev/core/src/Meshes/abstractMesh.ts b/packages/dev/core/src/Meshes/abstractMesh.ts index b520db8cf0d..3095e2786ac 100644 --- a/packages/dev/core/src/Meshes/abstractMesh.ts +++ b/packages/dev/core/src/Meshes/abstractMesh.ts @@ -1929,9 +1929,10 @@ export abstract class AbstractMesh extends TransformNode implements IDisposable, * Move the mesh using collision engine * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/camera_collisions * @param displacement defines the requested displacement vector + * @param slideOnCollide If true, the mesh will slide along a collider's surface. If false, it will stop moving at the first collision. (true by default) * @returns the current mesh */ - public moveWithCollisions(displacement: Vector3): AbstractMesh { + public moveWithCollisions(displacement: Vector3, slideOnCollide: boolean = true): AbstractMesh { const globalPosition = this.getAbsolutePosition(); globalPosition.addToRef(this.ellipsoidOffset, this._internalAbstractMeshDataInfo._meshCollisionData._oldPositionForCollisions); @@ -1950,7 +1951,8 @@ export abstract class AbstractMesh extends TransformNode implements IDisposable, this.collisionRetryCount, this, this._onCollisionPositionChange, - this.uniqueId + this.uniqueId, + slideOnCollide ); return this; } diff --git a/packages/dev/core/src/Meshes/mesh.ts b/packages/dev/core/src/Meshes/mesh.ts index 459c7e06fd2..8b6cedc3ffd 100644 --- a/packages/dev/core/src/Meshes/mesh.ts +++ b/packages/dev/core/src/Meshes/mesh.ts @@ -4866,7 +4866,7 @@ export class Mesh extends AbstractMesh implements IGetSetVerticesData { * @param multiMultiMaterials when true (false default), subdivide mesh into subMeshes with multiple materials, ignores subdivideWithSubMeshes. * @returns a new mesh */ - public static MergeMeshesAsync( + public static async MergeMeshesAsync( meshes: Array, disposeSource = true, allow32BitsIndices?: boolean, @@ -4874,7 +4874,7 @@ export class Mesh extends AbstractMesh implements IGetSetVerticesData { subdivideWithSubMeshes?: boolean, multiMultiMaterials?: boolean ) { - return runCoroutineAsync( + return await runCoroutineAsync( Mesh._MergeMeshesCoroutine(meshes, disposeSource, allow32BitsIndices, meshSubclass, subdivideWithSubMeshes, multiMultiMaterials, true), createYieldingScheduler() ); diff --git a/packages/dev/core/src/Meshes/meshUVSpaceRenderer.ts b/packages/dev/core/src/Meshes/meshUVSpaceRenderer.ts index 7dc4a0513dd..5d01e16d84f 100644 --- a/packages/dev/core/src/Meshes/meshUVSpaceRenderer.ts +++ b/packages/dev/core/src/Meshes/meshUVSpaceRenderer.ts @@ -175,6 +175,7 @@ export class MeshUVSpaceRenderer { ...options, }; + // eslint-disable-next-line @typescript-eslint/no-floating-promises this._initShaderSourceAsync(); } diff --git a/packages/dev/core/src/Misc/HighDynamicRange/cubemapToSphericalPolynomial.ts b/packages/dev/core/src/Misc/HighDynamicRange/cubemapToSphericalPolynomial.ts index f83f91ea10d..cbef5e6fdaa 100644 --- a/packages/dev/core/src/Misc/HighDynamicRange/cubemapToSphericalPolynomial.ts +++ b/packages/dev/core/src/Misc/HighDynamicRange/cubemapToSphericalPolynomial.ts @@ -82,6 +82,7 @@ export class CubeMapToSphericalPolynomialTools { } return new Promise((resolve) => { + // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then Promise.all([leftPromise, rightPromise, upPromise, downPromise, frontPromise, backPromise]).then(([left, right, up, down, front, back]) => { const cubeInfo: CubeMapInfo = { size, diff --git a/packages/dev/core/src/Misc/assetsManager.ts b/packages/dev/core/src/Misc/assetsManager.ts index a98a2ba106e..187575251a9 100644 --- a/packages/dev/core/src/Misc/assetsManager.ts +++ b/packages/dev/core/src/Misc/assetsManager.ts @@ -3,7 +3,7 @@ import type { AbstractMesh } from "../Meshes/abstractMesh"; import type { TransformNode } from "../Meshes/transformNode"; import type { IParticleSystem } from "../Particles/IParticleSystem"; import type { Skeleton } from "../Bones/skeleton"; -import { ImportAnimationsAsync, ImportMeshAsync, LoadAssetContainerAsync, SceneLoaderAnimationGroupLoadingMode } from "../Loading/sceneLoader"; +import { SceneLoader, SceneLoaderAnimationGroupLoadingMode } from "../Loading/sceneLoader"; import { Tools } from "./tools"; import { Observable } from "./observable"; import type { BaseTexture } from "../Materials/Textures/baseTexture"; @@ -300,9 +300,10 @@ export class ContainerAssetTask extends AbstractAssetTask { * @param onError is a callback called if an error occurs */ public override runTask(scene: Scene, onSuccess: () => void, onError: (message?: string, exception?: any) => void) { - LoadAssetContainerAsync(this.rootUrl + "/" + (this.sceneFilename as string).toString(), scene, { - pluginExtension: this.extension, - }).then( + SceneLoader.LoadAssetContainer( + this.rootUrl, + this.sceneFilename, + scene, (container: AssetContainer) => { this.loadedContainer = container; this.loadedMeshes = container.meshes; @@ -312,9 +313,11 @@ export class ContainerAssetTask extends AbstractAssetTask { this.loadedAnimationGroups = container.animationGroups; onSuccess(); }, - (error) => { - onError(error.message, error); - } + null, + (scene, message, exception) => { + onError(message, exception); + }, + this.extension ); } } @@ -394,11 +397,12 @@ export class MeshAssetTask extends AbstractAssetTask { * @param onError is a callback called if an error occurs */ public override runTask(scene: Scene, onSuccess: () => void, onError: (message?: string, exception?: any) => void) { - ImportMeshAsync(this.rootUrl + "/" + (this.sceneFilename as string), scene, { - meshNames: this.meshesNames, - pluginExtension: this.extension, - }).then( - ({ meshes, particleSystems, skeletons, animationGroups, transformNodes }) => { + SceneLoader.ImportMesh( + this.meshesNames, + this.rootUrl, + this.sceneFilename, + scene, + (meshes: AbstractMesh[], particleSystems: IParticleSystem[], skeletons: Skeleton[], animationGroups: AnimationGroup[], transformNodes: TransformNode[]) => { this.loadedMeshes = meshes; this.loadedTransformNodes = transformNodes; this.loadedParticleSystems = particleSystems; @@ -406,9 +410,11 @@ export class MeshAssetTask extends AbstractAssetTask { this.loadedAnimationGroups = animationGroups; onSuccess(); }, - (error) => { - onError(error.message, error); - } + null, + (scene, message, exception) => { + onError(message, exception); + }, + this.extension ); } } @@ -480,21 +486,24 @@ export class AnimationAssetTask extends AbstractAssetTask { const startingIndexForNewAnimationGroups = scene.animationGroups.length; this.loadedAnimatables = []; this.loadedAnimationGroups = []; - ImportAnimationsAsync(this.rootUrl + "/" + (this.filename as string), scene, { - pluginExtension: this.extension, - targetConverter: this.targetConverter, - overwriteAnimations: false, - animationGroupLoadingMode: SceneLoaderAnimationGroupLoadingMode.NoSync, - }).then( + SceneLoader.ImportAnimations( + this.rootUrl, + this.filename, + scene, + false, + SceneLoaderAnimationGroupLoadingMode.NoSync, + this.targetConverter, () => { this.loadedAnimatables = scene.animatables.slice(startingIndexForNewAnimatables); this.loadedAnimationGroups = scene.animationGroups.slice(startingIndexForNewAnimationGroups); onSuccess(); }, - (exception) => { - onError(exception.message, exception); - } + null, + (scene, message, exception) => { + onError(message, exception); + }, + this.extension ); } } @@ -1362,13 +1371,14 @@ export class AssetsManager { * @returns a promise returning the list of failed tasks */ public async loadAsync(): Promise { - return new Promise((resolve, reject) => { + return await new Promise((resolve, reject) => { if (this._isLoading) { resolve(); return; } this.onTasksDoneObservable.addOnce((remainingTasks) => { if (remainingTasks && remainingTasks.length) { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject(remainingTasks); } else { resolve(); diff --git a/packages/dev/core/src/Misc/asyncLock.ts b/packages/dev/core/src/Misc/asyncLock.ts index 29a8b4ad374..7c534ef8f3f 100644 --- a/packages/dev/core/src/Misc/asyncLock.ts +++ b/packages/dev/core/src/Misc/asyncLock.ts @@ -36,9 +36,11 @@ export class AsyncLock { } : func; + // eslint-disable-next-line github/no-then const newOperation = this._currentOperation.then(wrappedFunc); // NOTE: It would be simpler to just hold a Promise, but this class should not prevent an object held by the returned promise from being garbage collected. this._currentOperation = new Promise((resolve) => { + // eslint-disable-next-line github/no-then newOperation.then(() => resolve(), resolve); }); return newOperation; @@ -67,10 +69,11 @@ export class AsyncLock { if (acquiredLocks === locks.length) { deferred.resolve(await func()); } - return deferred.promise; + return await deferred.promise; + // eslint-disable-next-line github/no-then }, signal).catch((e) => deferred.reject(e)); } - return deferred.promise; + return await deferred.promise; } } diff --git a/packages/dev/core/src/Misc/basis.ts b/packages/dev/core/src/Misc/basis.ts index b9a7c5592bb..2a2b91f8439 100644 --- a/packages/dev/core/src/Misc/basis.ts +++ b/packages/dev/core/src/Misc/basis.ts @@ -171,20 +171,24 @@ const CreateWorkerAsync = async () => { res(LocalWorker); } else { Tools.LoadFileAsync(Tools.GetBabylonScriptURL(BasisToolsOptions.WasmModuleURL)) + // eslint-disable-next-line github/no-then .then((wasmBinary) => { if (typeof URL !== "function") { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors return reject("Basis transcoder requires an environment with a URL constructor"); } // eslint-disable-next-line @typescript-eslint/restrict-template-expressions const workerBlobUrl = URL.createObjectURL(new Blob([`(${workerFunction})()`], { type: "application/javascript" })); LocalWorker = new Worker(workerBlobUrl); + // eslint-disable-next-line github/no-then initializeWebWorker(LocalWorker, wasmBinary, BasisToolsOptions.JSModuleURL).then(res, reject); }) + // eslint-disable-next-line github/no-then .catch(reject); } }); } - return WorkerPromise; + return await WorkerPromise; }; /** @@ -204,7 +208,8 @@ export const SetBasisTranscoderWorker = (worker: Worker) => { export const TranscodeAsync = async (data: ArrayBuffer | ArrayBufferView, config: BasisTranscodeConfiguration): Promise => { const dataView = data instanceof ArrayBuffer ? new Uint8Array(data) : data; - return new Promise((res, rej) => { + return await new Promise((res, rej) => { + // eslint-disable-next-line github/no-then CreateWorkerAsync().then( () => { const actionId = ActionId++; @@ -212,6 +217,7 @@ export const TranscodeAsync = async (data: ArrayBuffer | ArrayBufferView, config if (msg.data.action === "transcode" && msg.data.id === actionId) { LocalWorker!.removeEventListener("message", messageHandler); if (!msg.data.success) { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors rej("Transcode is not supported on this device"); } else { res(msg.data); @@ -227,6 +233,7 @@ export const TranscodeAsync = async (data: ArrayBuffer | ArrayBufferView, config ]); }, (error) => { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors rej(error); } ); diff --git a/packages/dev/core/src/Misc/basisWorker.ts b/packages/dev/core/src/Misc/basisWorker.ts index 006f648b30b..4904d436eae 100644 --- a/packages/dev/core/src/Misc/basisWorker.ts +++ b/packages/dev/core/src/Misc/basisWorker.ts @@ -54,6 +54,7 @@ export function workerFunction(): void { }); } if (transcoderModulePromise !== null) { + // eslint-disable-next-line github/no-then transcoderModulePromise.then((m) => { BASIS = m; m.initializeBasis(); @@ -242,12 +243,13 @@ export function workerFunction(): void { */ // eslint-disable-next-line no-restricted-syntax export async function initializeWebWorker(worker: Worker, wasmBinary: ArrayBuffer, moduleUrl?: string) { - return new Promise((res, reject) => { + return await new Promise((res, reject) => { const initHandler = (msg: any) => { if (msg.data.action === "init") { worker.removeEventListener("message", initHandler); res(worker); } else if (msg.data.action === "error") { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject(msg.data.error || "error initializing worker"); } }; diff --git a/packages/dev/core/src/Misc/copyTextureToTexture.ts b/packages/dev/core/src/Misc/copyTextureToTexture.ts index 11200fc4f56..d83026454bc 100644 --- a/packages/dev/core/src/Misc/copyTextureToTexture.ts +++ b/packages/dev/core/src/Misc/copyTextureToTexture.ts @@ -53,6 +53,7 @@ export class CopyTextureToTexture { this._renderer = new EffectRenderer(engine); + // eslint-disable-next-line @typescript-eslint/no-floating-promises this._initShaderSourceAsync(isDepthTexture); } diff --git a/packages/dev/core/src/Misc/coroutine.ts b/packages/dev/core/src/Misc/coroutine.ts index 44a95416b59..284def005bd 100644 --- a/packages/dev/core/src/Misc/coroutine.ts +++ b/packages/dev/core/src/Misc/coroutine.ts @@ -51,6 +51,7 @@ export function inlineScheduler(coroutine: AsyncCoroutine, onStep: (stepRe // NOTE: The properties of step have been narrowed, but the type of step itself is not narrowed, so the cast below is the most type safe way to deal with this without instantiating a new object to hold the values. onStep(step as { done: typeof step.done; value: typeof step.value }); } else { + // eslint-disable-next-line github/no-then step.value.then(() => { step.value = undefined; onStep(step as { done: typeof step.done; value: typeof step.value }); @@ -162,7 +163,7 @@ export function runCoroutineSync(coroutine: Coroutine, abortSignal?: Abort */ export async function runCoroutineAsync(coroutine: AsyncCoroutine, scheduler: CoroutineScheduler, abortSignal?: AbortSignal): Promise { // Run the coroutine with a yielding scheduler, resolving or rejecting the result promise when the coroutine finishes. - return new Promise((resolve, reject) => { + return await new Promise((resolve, reject) => { runCoroutine(coroutine, scheduler, resolve, reject, abortSignal); }); } diff --git a/packages/dev/core/src/Misc/dataReader.ts b/packages/dev/core/src/Misc/dataReader.ts index b4840cd38df..f7f4eecfec2 100644 --- a/packages/dev/core/src/Misc/dataReader.ts +++ b/packages/dev/core/src/Misc/dataReader.ts @@ -49,10 +49,9 @@ export class DataReader { * @returns A promise that resolves when the load is complete */ public async loadAsync(byteLength: number): Promise { - return this.buffer.readAsync(this.byteOffset, byteLength).then((data) => { - this._dataView = new DataView(data.buffer, data.byteOffset, data.byteLength); - this._dataByteOffset = 0; - }); + const data = await this.buffer.readAsync(this.byteOffset, byteLength); + this._dataView = new DataView(data.buffer, data.byteOffset, data.byteLength); + this._dataByteOffset = 0; } /** diff --git a/packages/dev/core/src/Misc/dumpTools.ts b/packages/dev/core/src/Misc/dumpTools.ts index 671ec5cbe44..c3a580617aa 100644 --- a/packages/dev/core/src/Misc/dumpTools.ts +++ b/packages/dev/core/src/Misc/dumpTools.ts @@ -36,6 +36,7 @@ async function _CreateDumpRendererAsync(): Promise { failIfMajorPerformanceCaveat: false, }; import("../Engines/thinEngine") + // eslint-disable-next-line github/no-then .then(({ ThinEngine: thinEngineClass }) => { const engineInstanceCount = EngineStore.Instances.length; try { @@ -63,8 +64,10 @@ async function _CreateDumpRendererAsync(): Promise { }); engine.getCaps().parallelShaderCompile = undefined; const renderer = new EffectRenderer(engine); + // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then import("../Shaders/pass.fragment").then(({ passPixelShader }) => { if (!engine) { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject("Engine is not defined"); return; } @@ -83,6 +86,7 @@ async function _CreateDumpRendererAsync(): Promise { resolve(DumpToolsEngine); }); }) + // eslint-disable-next-line github/no-then .catch(reject); }); } @@ -141,7 +145,7 @@ export async function DumpDataAsync( toArrayBuffer = false, quality?: number ): Promise { - return new Promise((resolve) => { + return await new Promise((resolve) => { DumpData(width, height, data, (result) => resolve(result), mimeType, fileName, invertY, toArrayBuffer, quality); }); } @@ -169,6 +173,7 @@ export function DumpData( toArrayBuffer = false, quality?: number ): void { + // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then _CreateDumpRendererAsync().then((renderer) => { renderer.engine.setSize(width, height, true); @@ -225,6 +230,7 @@ export function Dispose() { DumpToolsEngine.engine.dispose(); } else { // in cases where the engine is not yet created, we need to wait for it to dispose it + // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then EnginePromise?.then((dumpToolsEngine) => { dumpToolsEngine.wrapper.dispose(); dumpToolsEngine.renderer.dispose(); diff --git a/packages/dev/core/src/Misc/environmentTextureTools.ts b/packages/dev/core/src/Misc/environmentTextureTools.ts index 04f6efd7c00..fb201efde13 100644 --- a/packages/dev/core/src/Misc/environmentTextureTools.ts +++ b/packages/dev/core/src/Misc/environmentTextureTools.ts @@ -238,14 +238,13 @@ export function normalizeEnvInfo(info: EnvironmentTextureInfo): EnvironmentTextu * Creates an environment texture from a loaded cube texture. * @param texture defines the cube texture to convert in env file * @param options options for the conversion process - * @param options.imageType the mime type for the encoded images, with support for "image/png" (default) and "image/webp" - * @param options.imageQuality the image quality of encoded WebP images. * @returns a promise containing the environment data if successful. */ export async function CreateEnvTextureAsync(texture: BaseTexture, options: CreateEnvTextureOptions = {}): Promise { const internalTexture = texture.getInternalTexture(); if (!internalTexture) { - return Promise.reject("The cube texture is invalid."); + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors + return await Promise.reject("The cube texture is invalid."); } const engine = internalTexture.getEngine(); @@ -258,14 +257,16 @@ export async function CreateEnvTextureAsync(texture: BaseTexture, options: Creat texture.textureType !== Constants.TEXTURETYPE_UNSIGNED_INTEGER && texture.textureType !== -1 ) { - return Promise.reject("The cube texture should allow HDR (Full Float or Half Float)."); + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors + return await Promise.reject("The cube texture should allow HDR (Full Float or Half Float)."); } let textureType = Constants.TEXTURETYPE_FLOAT; if (!engine.getCaps().textureFloatRender) { textureType = Constants.TEXTURETYPE_HALF_FLOAT; if (!engine.getCaps().textureHalfFloatRender) { - return Promise.reject("Env texture can only be created when the browser supports half float or full float rendering."); + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors + return await Promise.reject("Env texture can only be created when the browser supports half float or full float rendering."); } } @@ -293,6 +294,7 @@ export async function CreateEnvTextureAsync(texture: BaseTexture, options: Creat // All faces of the cube. for (let face = 0; face < 6; face++) { + // eslint-disable-next-line no-await-in-loop specularTextures[i * 6 + face] = await _GetTextureEncodedDataAsync(hostingScene, texture, textureType, face, i, faceWidth, imageType, options.imageQuality); } } @@ -304,6 +306,7 @@ export async function CreateEnvTextureAsync(texture: BaseTexture, options: Creat // All faces of the cube. for (let face = 0; face < 6; face++) { + // eslint-disable-next-line no-await-in-loop diffuseTextures[face] = await _GetTextureEncodedDataAsync(hostingScene, irradianceTexture, textureType, face, 0, faceWidth, imageType, options.imageQuality); } } @@ -551,6 +554,7 @@ export function CreateIrradianceImageDataArrayBufferViews(data: ArrayBufferView, * @param info defines the texture info retrieved through the GetEnvInfo method * @returns a promise */ +// eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax export function UploadEnvLevelsAsync(texture: InternalTexture, data: ArrayBufferView, info: EnvironmentTextureInfo): Promise { info = normalizeEnvInfo(info); @@ -589,7 +593,7 @@ async function _OnImageReadyAsync( cubeRtt: Nullable, texture: InternalTexture ): Promise { - return new Promise((resolve, reject) => { + return await new Promise((resolve, reject) => { if (expandTexture) { const tempTexture = engine.createTexture( null, @@ -599,6 +603,7 @@ async function _OnImageReadyAsync( Constants.TEXTURE_NEAREST_SAMPLINGMODE, null, (message) => { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject(message); }, image @@ -848,8 +853,9 @@ async function _UploadLevelsAsync( let promise: Promise; if (engine._features.forceBitmapOverHTMLImageElement) { + // eslint-disable-next-line github/no-then promise = engine.createImageBitmap(blob, { premultiplyAlpha: "none" }).then(async (img) => { - return _OnImageReadyAsync(img, engine, expandTexture, rgbdPostProcess, url, face, i, generateNonLODTextures, lodTextures, cubeRtt, texture); + return await _OnImageReadyAsync(img, engine, expandTexture, rgbdPostProcess, url, face, i, generateNonLODTextures, lodTextures, cubeRtt, texture); }); } else { const image = new Image(); @@ -859,12 +865,16 @@ async function _UploadLevelsAsync( promise = new Promise((resolve, reject) => { image.onload = () => { _OnImageReadyAsync(image, engine, expandTexture, rgbdPostProcess, url, face, i, generateNonLODTextures, lodTextures, cubeRtt, texture) + // eslint-disable-next-line github/no-then .then(() => resolve()) + // eslint-disable-next-line github/no-then .catch((reason) => { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject(reason); }); }; image.onerror = (error) => { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject(error); }; }); @@ -956,6 +966,7 @@ export function UploadEnvSpherical(texture: InternalTexture, info: EnvironmentTe /** * @internal */ +// eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax export function _UpdateRGBDAsync( internalTexture: InternalTexture, data: ArrayBufferView[][], @@ -975,6 +986,7 @@ export function _UpdateRGBDAsync( internalTexture.samplingMode, internalTexture._compression ); + // eslint-disable-next-line github/no-then const proxyPromise = UploadRadianceLevelsAsync(proxy, data).then(() => internalTexture); internalTexture.onRebuildCallback = (_internalTexture) => { return { @@ -989,6 +1001,7 @@ export function _UpdateRGBDAsync( internalTexture._lodGenerationOffset = lodOffset; internalTexture._sphericalPolynomial = sphericalPolynomial; + // eslint-disable-next-line github/no-then return UploadRadianceLevelsAsync(internalTexture, data).then(() => { internalTexture.isReady = true; return internalTexture; diff --git a/packages/dev/core/src/Misc/equirectangularCapture.ts b/packages/dev/core/src/Misc/equirectangularCapture.ts index b08e19599a2..aa39265c4ca 100644 --- a/packages/dev/core/src/Misc/equirectangularCapture.ts +++ b/packages/dev/core/src/Misc/equirectangularCapture.ts @@ -63,7 +63,7 @@ export async function captureEquirectangularFromScene(scene: Scene, options: Equ probe.cubeTexture.render(); const dumpTexture = new CustomProceduralTexture("tempProceduralTexture", "equirectangularPanorama", { width: options.size * 2, height: options.size }, scene); dumpTexture.setTexture("cubeMap", probe.cubeTexture); - return new Promise((resolve, reject) => { + return await new Promise((resolve, reject) => { dumpTexture.onGeneratedObservable.addOnce(() => { const pixelDataPromise = dumpTexture.readPixels(); if (!pixelDataPromise) { @@ -74,6 +74,7 @@ export async function captureEquirectangularFromScene(scene: Scene, options: Equ } return; } + // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then pixelDataPromise.then((pixelData) => { dumpTexture.dispose(); if (!wasProbeProvided) { diff --git a/packages/dev/core/src/Misc/fileTools.ts b/packages/dev/core/src/Misc/fileTools.ts index 384b24d4a63..7549dd3520d 100644 --- a/packages/dev/core/src/Misc/fileTools.ts +++ b/packages/dev/core/src/Misc/fileTools.ts @@ -247,12 +247,14 @@ export const LoadImage = ( (data) => { engine .createImageBitmap(new Blob([data], { type: mimeType }), { premultiplyAlpha: "none", ...imageBitmapOptions }) + // eslint-disable-next-line github/no-then .then((imgBmp) => { onLoad(imgBmp); if (usingObjectURL) { URL.revokeObjectURL(url); } }) + // eslint-disable-next-line github/no-then .catch((reason) => { if (onError) { // eslint-disable-next-line @typescript-eslint/restrict-plus-operands diff --git a/packages/dev/core/src/Misc/filesInput.ts b/packages/dev/core/src/Misc/filesInput.ts index 47d66eb0f78..6140c6fba4a 100644 --- a/packages/dev/core/src/Misc/filesInput.ts +++ b/packages/dev/core/src/Misc/filesInput.ts @@ -38,7 +38,9 @@ export class FilesInput { * @returns a promise completing when the load is complete */ public loadAsync: (sceneFile: File, onProgress: Nullable<(event: ISceneLoaderProgressEvent) => void>) => Promise = async (sceneFile, onProgress) => - this.useAppend ? SceneLoader.AppendAsync("file:", sceneFile, this._currentScene, onProgress) : SceneLoader.LoadAsync("file:", sceneFile, this._engine, onProgress); + this.useAppend + ? await SceneLoader.AppendAsync("file:", sceneFile, this._currentScene, onProgress) + : await SceneLoader.LoadAsync("file:", sceneFile, this._engine, onProgress); private _engine: AbstractEngine; private _currentScene: Nullable; @@ -315,6 +317,7 @@ export class FilesInput { } this.loadAsync(this._sceneFileToLoad, this._progressCallback) + // eslint-disable-next-line github/no-then .then((scene) => { // if appending do nothing if (!this.useAppend) { @@ -344,6 +347,7 @@ export class FilesInput { this._sceneLoadedCallback(this._sceneFileToLoad, this._currentScene); } }) + // eslint-disable-next-line github/no-then .catch((error) => { if (this.displayLoadingUI) { this._engine.hideLoadingUI(); diff --git a/packages/dev/core/src/Misc/khronosTextureContainer2.ts b/packages/dev/core/src/Misc/khronosTextureContainer2.ts index 0339b215d12..52482828627 100644 --- a/packages/dev/core/src/Misc/khronosTextureContainer2.ts +++ b/packages/dev/core/src/Misc/khronosTextureContainer2.ts @@ -290,10 +290,11 @@ export class KhronosTextureContainer2 { // eslint-disable-next-line @typescript-eslint/restrict-template-expressions const workerContent = `${applyConfig}(${workerFunction})()`; const workerBlobUrl = URL.createObjectURL(new Blob([workerContent], { type: "application/javascript" })); - resolve(new AutoReleaseWorkerPool(numWorkers, async () => initializeWebWorker(new Worker(workerBlobUrl), undefined, urls))); + resolve(new AutoReleaseWorkerPool(numWorkers, async () => await initializeWebWorker(new Worker(workerBlobUrl), undefined, urls))); }); } else { if (typeof KhronosTextureContainer2._KTX2DecoderModule === "undefined") { + // eslint-disable-next-line github/no-then KhronosTextureContainer2._DecoderModulePromise = Tools.LoadBabylonScriptAsync(urls.jsDecoderModule).then(() => { KhronosTextureContainer2._KTX2DecoderModule = KTX2DECODER; KhronosTextureContainer2._KTX2DecoderModule.MSCTranscoder.UseFromWorkerThread = false; @@ -349,11 +350,12 @@ export class KhronosTextureContainer2 { if (KhronosTextureContainer2._WorkerPoolPromise) { const workerPool = await KhronosTextureContainer2._WorkerPoolPromise; - return new Promise((resolve, reject) => { + return await new Promise((resolve, reject) => { workerPool.push((worker, onComplete) => { const onError = (error: ErrorEvent) => { worker.removeEventListener("error", onError); worker.removeEventListener("message", onMessage); + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject(error); onComplete(); }; @@ -363,12 +365,14 @@ export class KhronosTextureContainer2 { worker.removeEventListener("error", onError); worker.removeEventListener("message", onMessage); if (!message.data.success) { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject({ message: message.data.msg }); } else { try { this._createTexture(message.data.decodedData, internalTexture, options); resolve(); } catch (err) { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject({ message: err }); } } @@ -391,14 +395,17 @@ export class KhronosTextureContainer2 { if (KhronosTextureContainer2.DefaultDecoderOptions.isDirty) { KhronosTextureContainer2._KTX2DecoderModule.KTX2Decoder.DefaultDecoderOptions = KhronosTextureContainer2.DefaultDecoderOptions._getKTX2DecoderOptions(); } - return new Promise((resolve, reject) => { + return await new Promise((resolve, reject) => { decoder .decode(data, caps) + // eslint-disable-next-line github/no-then .then((data: IDecodedData) => { this._createTexture(data, internalTexture); resolve(); }) + // eslint-disable-next-line github/no-then .catch((reason: any) => { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject({ message: reason }); }); }); diff --git a/packages/dev/core/src/Misc/khronosTextureContainer2Worker.ts b/packages/dev/core/src/Misc/khronosTextureContainer2Worker.ts index 9ffca466209..b16ac7fc56e 100644 --- a/packages/dev/core/src/Misc/khronosTextureContainer2Worker.ts +++ b/packages/dev/core/src/Misc/khronosTextureContainer2Worker.ts @@ -122,6 +122,7 @@ export function workerFunction(KTX2DecoderModule: any): void { case "decode": ktx2Decoder .decode(event.data.data, event.data.caps, event.data.options) + // eslint-disable-next-line github/no-then .then((data: IDecodedData) => { const buffers = []; for (let mip = 0; mip < data.mipmaps.length; ++mip) { @@ -132,6 +133,7 @@ export function workerFunction(KTX2DecoderModule: any): void { } postMessage({ action: "decoded", success: true, decodedData: data }, buffers); }) + // eslint-disable-next-line github/no-then .catch((reason: any) => { postMessage({ action: "decoded", success: false, msg: reason }); }); @@ -141,10 +143,11 @@ export function workerFunction(KTX2DecoderModule: any): void { } export async function initializeWebWorker(worker: Worker, wasmBinaries?: { [key in AllowedKeys]?: ArrayBuffer }, urls?: { [key in AllowedKeys]: string }): Promise { - return new Promise((resolve, reject) => { + return await new Promise((resolve, reject) => { const onError = (error: ErrorEvent) => { worker.removeEventListener("error", onError); worker.removeEventListener("message", onMessage); + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject(error); }; diff --git a/packages/dev/core/src/Misc/minMaxReducer.ts b/packages/dev/core/src/Misc/minMaxReducer.ts index fb771b8d08a..fa63a4b38a0 100644 --- a/packages/dev/core/src/Misc/minMaxReducer.ts +++ b/packages/dev/core/src/Misc/minMaxReducer.ts @@ -161,6 +161,7 @@ export class MinMaxReducer { const buffer = new Float32Array(4 * w * h), minmax = { min: 0, max: 0 }; return () => { + // eslint-disable-next-line @typescript-eslint/no-floating-promises scene.getEngine()._readTexturePixels(reduction.inputTexture.texture!, w, h, -1, 0, buffer, false); minmax.min = buffer[0]; minmax.max = buffer[1]; diff --git a/packages/dev/core/src/Misc/observable.extensions.ts b/packages/dev/core/src/Misc/observable.extensions.ts index 5ac26887e1b..c17c5c63a59 100644 --- a/packages/dev/core/src/Misc/observable.extensions.ts +++ b/packages/dev/core/src/Misc/observable.extensions.ts @@ -75,7 +75,7 @@ Observable.prototype.notifyObserversWithPromise = async function (eventData: // no observers? return this promise. if (!this.observers.length) { - return p; + return await p; } const state = this._eventState; @@ -95,11 +95,13 @@ Observable.prototype.notifyObserversWithPromise = async function (eventData: } if (obs.mask & mask) { if (obs.scope) { + // eslint-disable-next-line github/no-then p = p.then((lastReturnedValue) => { state.lastReturnValue = lastReturnedValue; return obs.callback.apply(obs.scope, [eventData, state]); }); } else { + // eslint-disable-next-line github/no-then p = p.then((lastReturnedValue) => { state.lastReturnValue = lastReturnedValue; return obs.callback(eventData, state); diff --git a/packages/dev/core/src/Misc/observable.ts b/packages/dev/core/src/Misc/observable.ts index c44eb66945a..c62045b6bbc 100644 --- a/packages/dev/core/src/Misc/observable.ts +++ b/packages/dev/core/src/Misc/observable.ts @@ -149,9 +149,11 @@ export class Observable { const observable = new Observable(); promise + // eslint-disable-next-line github/no-then .then((ret: T) => { observable.notifyObservers(ret); }) + // eslint-disable-next-line github/no-then .catch((err) => { if (onErrorObservable) { onErrorObservable.notifyObservers(err as E); diff --git a/packages/dev/core/src/Misc/observableCoroutine.ts b/packages/dev/core/src/Misc/observableCoroutine.ts index 3de4e9f20ac..95ed5216a02 100644 --- a/packages/dev/core/src/Misc/observableCoroutine.ts +++ b/packages/dev/core/src/Misc/observableCoroutine.ts @@ -55,6 +55,7 @@ declare module "./observable" { } } +// eslint-disable-next-line @typescript-eslint/promise-function-async Observable.prototype.runCoroutineAsync = function (coroutine: AsyncCoroutine) { if (!this._coroutineScheduler) { const schedulerAndDispose = CreateObservableScheduler(this); diff --git a/packages/dev/core/src/Misc/reflector.ts b/packages/dev/core/src/Misc/reflector.ts index b0b903f1e15..87a18f41761 100644 --- a/packages/dev/core/src/Misc/reflector.ts +++ b/packages/dev/core/src/Misc/reflector.ts @@ -52,6 +52,7 @@ export class Reflector { private _handleServerMessage(message: string): void { switch (message) { case "connected": { + // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then SceneSerializer.SerializeAsync(this._scene).then((serialized) => { this._webSocket.send(`load|${JSON.stringify(serialized)}`); }); diff --git a/packages/dev/core/src/Misc/rgbdTextureTools.ts b/packages/dev/core/src/Misc/rgbdTextureTools.ts index c51312a4b80..ed8ede2ae51 100644 --- a/packages/dev/core/src/Misc/rgbdTextureTools.ts +++ b/packages/dev/core/src/Misc/rgbdTextureTools.ts @@ -116,6 +116,7 @@ export class RGBDTextureTools { if (expandTexture) { if (isReady) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises expandRgbdTextureAsync(); } else { // eslint-disable-next-line @typescript-eslint/no-misused-promises @@ -139,6 +140,6 @@ export class RGBDTextureTools { } else { await import("../ShadersWGSL/rgbdEncode.fragment"); } - return ApplyPostProcess("rgbdEncode", internalTexture, scene, outputTextureType, Constants.TEXTURE_NEAREST_SAMPLINGMODE, Constants.TEXTUREFORMAT_RGBA); + return await ApplyPostProcess("rgbdEncode", internalTexture, scene, outputTextureType, Constants.TEXTURE_NEAREST_SAMPLINGMODE, Constants.TEXTUREFORMAT_RGBA); } } diff --git a/packages/dev/core/src/Misc/sceneSerializer.ts b/packages/dev/core/src/Misc/sceneSerializer.ts index ce0c5195bfa..6e354121835 100644 --- a/packages/dev/core/src/Misc/sceneSerializer.ts +++ b/packages/dev/core/src/Misc/sceneSerializer.ts @@ -389,7 +389,7 @@ export class SceneSerializer { for (let i = 0; i < obj.length; ++i) { const o = obj[i]; if (o instanceof Promise) { - // eslint-disable-next-line @typescript-eslint/no-unsafe-return + // eslint-disable-next-line @typescript-eslint/no-unsafe-return, github/no-then promises.push(o.then((res: any) => (obj[i] = res))); } else if (o instanceof Object || Array.isArray(o)) { this._CollectPromises(o, promises); @@ -400,7 +400,7 @@ export class SceneSerializer { if (Object.prototype.hasOwnProperty.call(obj, name)) { const o = obj[name]; if (o instanceof Promise) { - // eslint-disable-next-line @typescript-eslint/no-unsafe-return + // eslint-disable-next-line @typescript-eslint/no-unsafe-return, github/no-then promises.push(o.then((res: any) => (obj[name] = res))); } else if (o instanceof Object || Array.isArray(o)) { this._CollectPromises(o, promises); diff --git a/packages/dev/core/src/Misc/screenshotTools.ts b/packages/dev/core/src/Misc/screenshotTools.ts index 5fb23a65387..f64f907712a 100644 --- a/packages/dev/core/src/Misc/screenshotTools.ts +++ b/packages/dev/core/src/Misc/screenshotTools.ts @@ -150,7 +150,7 @@ export async function CreateScreenshotAsync( quality?: number, useFill = false ): Promise { - return new Promise((resolve, reject) => { + return await new Promise((resolve, reject) => { CreateScreenshot( engine, camera, @@ -193,7 +193,7 @@ export async function CreateScreenshotWithResizeAsync( quality?: number, useFill = false ): Promise { - return new Promise((resolve) => { + return await new Promise((resolve) => { CreateScreenshot( engine, camera, @@ -332,29 +332,34 @@ export function CreateScreenshotUsingRenderTarget( () => { engine.onEndFrameObservable.addOnce(() => { if (finalWidth === width && finalHeight === height) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then texture.readPixels(undefined, undefined, undefined, false)!.then((data) => { dumpDataFunc(width, height, data, successCallback as (data: string | ArrayBuffer) => void, mimeType, fileName, true, undefined, quality); texture.dispose(); }); } else { const importPromise = engine.isWebGPU ? import("../ShadersWGSL/pass.fragment") : import("../Shaders/pass.fragment"); - importPromise.then(async () => - ApplyPostProcess("pass", texture.getInternalTexture()!, scene, undefined, undefined, undefined, finalWidth, finalHeight).then((texture) => { - engine._readTexturePixels(texture, finalWidth, finalHeight, -1, 0, null, true, false, 0, 0).then((data) => { - dumpDataFunc( - finalWidth, - finalHeight, - data, - successCallback as (data: string | ArrayBuffer) => void, - mimeType, - fileName, - true, - undefined, - quality - ); - texture.dispose(); - }); - }) + // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then + importPromise.then( + async () => + // eslint-disable-next-line github/no-then + await ApplyPostProcess("pass", texture.getInternalTexture()!, scene, undefined, undefined, undefined, finalWidth, finalHeight).then((texture) => { + // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then + engine._readTexturePixels(texture, finalWidth, finalHeight, -1, 0, null, true, false, 0, 0).then((data) => { + dumpDataFunc( + finalWidth, + finalHeight, + data, + successCallback as (data: string | ArrayBuffer) => void, + mimeType, + fileName, + true, + undefined, + quality + ); + texture.dispose(); + }); + }) ); } }); @@ -420,6 +425,9 @@ export function CreateScreenshotUsingRenderTarget( if (antialiasing) { const fxaaPostProcess = new FxaaPostProcess("antialiasing", 1.0, scene.activeCamera); texture.addPostProcess(fxaaPostProcess); + // Ensures the correct background color is used + fxaaPostProcess.autoClear = true; + // Async Shader Compilation can lead to none ready effects in synchronous code fxaaPostProcess.onEffectCreatedObservable.addOnce((e) => { if (!e.isReady()) { @@ -487,7 +495,7 @@ export async function CreateScreenshotUsingRenderTargetAsync( quality?: number ) => void ): Promise { - return new Promise((resolve, reject) => { + return await new Promise((resolve, reject) => { CreateScreenshotUsingRenderTarget( engine, camera, diff --git a/packages/dev/core/src/Misc/textureTools.ts b/packages/dev/core/src/Misc/textureTools.ts index 2aedd9e3894..b56512c05b3 100644 --- a/packages/dev/core/src/Misc/textureTools.ts +++ b/packages/dev/core/src/Misc/textureTools.ts @@ -95,6 +95,7 @@ export function CreateResizedCopy(texture: Texture, width: number, height: numbe * @param height height of the output texture. If not provided, use the one from internalTexture * @returns a promise with the internalTexture having its texture replaced by the result of the processing */ +// eslint-disable-next-line @typescript-eslint/promise-function-async export function ApplyPostProcess( postProcessName: string, internalTexture: InternalTexture, @@ -336,6 +337,7 @@ export async function GetTextureDataAsync(texture: BaseTexture, width: number, h if (!texture.isReady() && texture._texture) { await new Promise((resolve, reject) => { if (texture._texture === null) { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject(0); return; } diff --git a/packages/dev/core/src/Misc/tools.internals.ts b/packages/dev/core/src/Misc/tools.internals.ts index 74fe3f80419..663ec7c7890 100644 --- a/packages/dev/core/src/Misc/tools.internals.ts +++ b/packages/dev/core/src/Misc/tools.internals.ts @@ -18,7 +18,7 @@ let UniqueResolveID = 0; * @internal DO NOT USE outside of Babylon.js core */ export async function _LoadScriptModuleAsync(scriptUrl: string, scriptId?: string): Promise { - return new Promise((resolve, reject) => { + return await new Promise((resolve, reject) => { // Need a relay let windowAsAny: any; let windowString: string; @@ -49,6 +49,7 @@ export async function _LoadScriptModuleAsync(scriptUrl: string, scriptId?: strin scriptUrl, undefined, (message, exception) => { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject(exception || new Error(message)); }, scriptId, diff --git a/packages/dev/core/src/Misc/tools.ts b/packages/dev/core/src/Misc/tools.ts index 871a951d51e..dee03279e9e 100644 --- a/packages/dev/core/src/Misc/tools.ts +++ b/packages/dev/core/src/Misc/tools.ts @@ -470,7 +470,7 @@ export class Tools { * @returns a promise containing an ArrayBuffer corresponding to the loaded file */ public static async LoadFileAsync(url: string, useArrayBuffer = true): Promise { - return new Promise((resolve, reject) => { + return await new Promise((resolve, reject) => { FileToolsLoadFile( url, (data) => { @@ -480,6 +480,7 @@ export class Tools { undefined, useArrayBuffer, (request, exception) => { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject(exception); } ); @@ -566,7 +567,7 @@ export class Tools { */ public static async LoadBabylonScriptAsync(scriptUrl: string): Promise { scriptUrl = Tools.GetBabylonScriptURL(scriptUrl); - return Tools.LoadScriptAsync(scriptUrl); + return await Tools.LoadScriptAsync(scriptUrl); } /** @@ -629,13 +630,14 @@ export class Tools { * @returns a promise request object */ public static async LoadScriptAsync(scriptUrl: string, scriptId?: string): Promise { - return new Promise((resolve, reject) => { + return await new Promise((resolve, reject) => { this.LoadScript( scriptUrl, () => { resolve(); }, (message, exception) => { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject(exception || new Error(message)); }, scriptId @@ -888,11 +890,13 @@ export class Tools { }; } if (Tools._IsOffScreenCanvas(canvas)) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises canvas .convertToBlob({ type: mimeType, quality, }) + // eslint-disable-next-line github/no-then .then((blob) => successCallback(blob)); } else { canvas.toBlob( @@ -970,11 +974,13 @@ export class Tools { ); } else if (successCallback) { if (Tools._IsOffScreenCanvas(canvas)) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises canvas .convertToBlob({ type: mimeType, quality, }) + // eslint-disable-next-line github/no-then .then((blob) => { const reader = new FileReader(); reader.readAsDataURL(blob); diff --git a/packages/dev/core/src/Misc/videoRecorder.ts b/packages/dev/core/src/Misc/videoRecorder.ts index b3b98d7af75..4bfb0d303fb 100644 --- a/packages/dev/core/src/Misc/videoRecorder.ts +++ b/packages/dev/core/src/Misc/videoRecorder.ts @@ -169,6 +169,7 @@ export class VideoRecorder { * It defaults to 7 seconds. A value of zero will not stop automatically, you would need to call stopRecording manually. * @returns A promise callback at the end of the recording with the video data in Blob. */ + // eslint-disable-next-line @typescript-eslint/promise-function-async public startRecording(fileName: Nullable = "babylonjs.webm", maxDuration = 7): Promise { if (!this._canvas || !this._mediaRecorder) { // eslint-disable-next-line no-throw-literal diff --git a/packages/dev/core/src/Misc/webRequest.fetch.ts b/packages/dev/core/src/Misc/webRequest.fetch.ts index 431bb755f14..fc4cc8db14c 100644 --- a/packages/dev/core/src/Misc/webRequest.fetch.ts +++ b/packages/dev/core/src/Misc/webRequest.fetch.ts @@ -12,7 +12,7 @@ export async function _FetchAsync( options: Partial<{ method: string; responseHeaders?: string[] }> ): Promise<{ response: Response; headerValues: { [key: string]: string } }> { const method = options.method || "GET"; - return new Promise((resolve, reject) => { + return await new Promise((resolve, reject) => { const request = new WebRequest(); request.addEventListener("readystatechange", () => { if (request.readyState == 4) { @@ -26,6 +26,7 @@ export async function _FetchAsync( resolve({ response: request.response, headerValues: headerValues }); } else { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject(`Unable to fetch data from ${url}. Error code: ${request.status}`); } } diff --git a/packages/dev/core/src/Misc/workerPool.ts b/packages/dev/core/src/Misc/workerPool.ts index e77ecf1510b..106fc642639 100644 --- a/packages/dev/core/src/Misc/workerPool.ts +++ b/packages/dev/core/src/Misc/workerPool.ts @@ -29,6 +29,7 @@ export class WorkerPool implements IDisposable { */ public dispose(): void { for (const workerInfo of this._workerInfos) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then workerInfo.workerPromise.then((worker) => { worker.terminate(); }); @@ -62,6 +63,7 @@ export class WorkerPool implements IDisposable { protected _execute(workerInfo: IWorkerInfo, action: (worker: Worker, onComplete: () => void) => void): void { workerInfo.idle = false; + // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then workerInfo.workerPromise.then((worker) => { action(worker, () => { const nextAction = this._pendingActions.shift(); @@ -140,6 +142,7 @@ export class AutoReleaseWorkerPool extends WorkerPool { if (workerInfo.idle) { // Schedule the worker to be terminated after the elapsed time. workerInfo.timeoutId = setTimeout(() => { + // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then workerInfo.workerPromise.then((worker) => { worker.terminate(); }); diff --git a/packages/dev/core/src/Navigation/INavigationEngine.ts b/packages/dev/core/src/Navigation/INavigationEngine.ts index bb139d9057a..b385557f5f1 100644 --- a/packages/dev/core/src/Navigation/INavigationEngine.ts +++ b/packages/dev/core/src/Navigation/INavigationEngine.ts @@ -2,11 +2,12 @@ import type { TransformNode } from "../Meshes/transformNode"; import type { Vector3 } from "../Maths/math"; import type { Mesh } from "../Meshes/mesh"; import type { Scene } from "../scene"; +import type { IVector3Like } from "../Maths/math.like"; /** * Navigation plugin interface to add navigation constrained by a navigation mesh */ -export interface INavigationEnginePlugin { +export interface INavigationEnginePlugin0 { /** * plugin name */ @@ -17,7 +18,7 @@ export interface INavigationEnginePlugin { * @param meshes array of all the geometry used to compute the navigation mesh * @param parameters bunch of parameters used to filter geometry */ - createNavMesh(meshes: Array, parameters: INavMeshParameters): void; + createNavMesh(meshes: Array, parameters: INavMeshParameters0): void; /** * Create a navigation mesh debug mesh @@ -196,6 +197,106 @@ export interface INavigationEnginePlugin { dispose(): void; } +/** + * + */ +export interface INavigationEnginePlugin extends INavigationEnginePlugin0 { + /** + * + */ + navMesh?: any; + + /** + * + */ + navMeshQuery: any; + /** + * + */ + setWorker: (worker: Worker) => void; + getClosestPoint( + position: IVector3Like, + options?: { + /** + * + */ + halfExtents?: IVector3Like; + } + ): Vector3; + getClosestPointToRef( + position: IVector3Like, + result: Vector3, + options?: { + /** + * + */ + halfExtents?: IVector3Like; + } + ): void; + getRandomPointAround( + position: IVector3Like, + maxRadius: number, + options?: { + /** + * + */ + startRef?: number; + /** + * + */ + halfExtents?: IVector3Like; + } + ): Vector3; + getRandomPointAroundToRef( + position: IVector3Like, + maxRadius: number, + result: Vector3, + options?: { + /** + * + */ + startRef?: number; + /** + * + */ + halfExtents?: IVector3Like; + } + ): void; + + createNavMesh(meshes: Array, parameters: INavMeshParameters0, completion?: (navmeshData: Uint8Array) => void): void; + createNavMeshWorker(meshes: Array, parameters: INavMeshParameters0, completion: (data?: Uint8Array) => void): void; + computePathSmooth( + start: Vector3, + end: Vector3, + options?: { + /** + * + */ + halfExtents?: IVector3Like; + + /** + * @default 256 + */ + maxPathPolys?: number; + + /** + * @default 2048 + */ + maxSmoothPathPoints?: number; + + /** + * @default 0.5 + */ + stepSize?: number; + + /** + * @default 0.01 + */ + slop?: number; + } + ): Vector3[]; +} + /** * Obstacle interface */ @@ -392,7 +493,7 @@ export interface IAgentParameters { /** * Configures the navigation mesh creation */ -export interface INavMeshParameters { +export interface INavMeshParameters0 { /** * The xz-plane cell size to use for fields. [Limit: > 0] [Units: wu] */ @@ -472,6 +573,27 @@ export interface INavMeshParameters { */ tileSize?: number; + /** + * A hint to Recast for how many walkable surface layers might exist per tile + * allowing better memory and performance tuning during navmesh generation. + */ + expectedLayersPerTile?: number; + + /** + * The hard limit on how many stacked walkable surfaces (layers) a tile can have. + * If Recast finds more layers than maxLayers, tile generation may fail or lose data. + * Use a higher value (e.g. 4–8) for complex multi-level scenes; 1–2 is fine for flat terrain. + */ + maxLayers?: number; + + /** + * If set to true, intermediate objects used during the generation process will be retained. + * This is useful for debugging purposes or if you want to process the intermediate data in any other way. + * For example you can use it to trace countours, calculate heightfields, etc. + * Defaults to false. + */ + keepIntermediates?: boolean; + /** * The size of the non-navigable border around the heightfield. */ diff --git a/packages/dev/core/src/Navigation/Plugins/recastJSPlugin.ts b/packages/dev/core/src/Navigation/Plugins/recastJSPlugin.ts index 1085beb0028..0913df3b830 100644 --- a/packages/dev/core/src/Navigation/Plugins/recastJSPlugin.ts +++ b/packages/dev/core/src/Navigation/Plugins/recastJSPlugin.ts @@ -1,17 +1,96 @@ -import type { INavigationEnginePlugin, ICrowd, IAgentParameters, INavMeshParameters, IObstacle } from "../../Navigation/INavigationEngine"; +import type { ICrowd, IAgentParameters, INavMeshParameters0, IObstacle, INavigationEnginePlugin } from "../INavigationEngine"; import { Logger } from "../../Misc/logger"; import { VertexData } from "../../Meshes/mesh.vertexData"; import { Mesh } from "../../Meshes/mesh"; import type { Scene } from "../../scene"; -import { Epsilon, Vector3, Matrix } from "../../Maths/math"; +import { Epsilon, Matrix, Vector3 } from "../../Maths/math"; import type { TransformNode } from "../../Meshes/transformNode"; import type { Observer } from "../../Misc/observable"; import { Observable } from "../../Misc/observable"; import type { Nullable } from "../../types"; import { VertexBuffer } from "../../Buffers/buffer"; +import type { IVector3Like } from "../../Maths/math.like"; + +type TiledParams = INavMeshParameters0 & { tileSize: number; expectedLayersPerTile: number }; + +type SoloNavMeshGeneratorConfig = any; +type SoloNavMeshGeneratorIntermediates = any; +type TiledNavMeshGeneratorConfig = any; +type TiledNavMeshGeneratorIntermediates = any; + +// // eslint-disable-next-line @typescript-eslint/naming-convention +// type generateSoloNavMesh = any; +// // eslint-disable-next-line @typescript-eslint/naming-convention +// type generateTileCache = any; +// // eslint-disable-next-line @typescript-eslint/naming-convention +// type generateTiledNavMesh = any; + +type NavMesh = any; +type QueryFilter = any; +type TileCache = any; + +type Crowd = any; +const Detour: any = {}; +type NavMeshQuery = any; +// // eslint-disable-next-line @typescript-eslint/naming-convention +// type exportNavMesh = any; +// // eslint-disable-next-line @typescript-eslint/naming-convention +// type getNavMeshPositionsAndIndices = any; +// // eslint-disable-next-line @typescript-eslint/naming-convention +// type getRandomSeed = any; +// // eslint-disable-next-line @typescript-eslint/naming-convention +// type importNavMesh = any; +// // eslint-disable-next-line @typescript-eslint/naming-convention +// type setRandomSeed = any; + +// import type { SoloNavMeshGeneratorConfig, SoloNavMeshGeneratorIntermediates, TiledNavMeshGeneratorConfig, TiledNavMeshGeneratorIntermediates } from "recast-navigation/generators"; +// import { generateSoloNavMesh, generateTileCache, generateTiledNavMesh } from "recast-navigation/generators"; +// import type { NavMesh, QueryFilter, TileCache } from "recast-navigation"; +// import { Crowd, Detour, exportNavMesh, getNavMeshPositionsAndIndices, getRandomSeed, importNavMesh, NavMeshQuery, setRandomSeed } from "recast-navigation"; // eslint-disable-next-line @typescript-eslint/naming-convention declare let Recast: any; +// eslint-disable-next-line @typescript-eslint/naming-convention +declare let RecastGenerators: any; + +// interface INavMeshParameters { +// expectedLayersPerTile: number; +// maxLayers: number; +// } + +const tmpDelta = new Vector3(); +const tmpMoveTarget = new Vector3(); + +type ComputeSmoothPathErrorType = (typeof ComputePathError)[keyof typeof ComputePathError]; + +type ComputeSmoothPathResult = { + success: boolean; + error?: { + type: ComputeSmoothPathErrorType; + status?: number; + }; + path: Vector3[]; +}; + +type GetSteerTargetResult = + | { + success: false; + } + | { + success: true; + steerPos: Vector3; + steerPosFlag: number; + steerPosRef: number; + points: Vector3[]; + }; + +const ComputePathError = { + START_NEAREST_POLY_FAILED: "START_NEAREST_POLY_FAILED", + END_NEAREST_POLY_FAILED: "END_NEAREST_POLY_FAILED", + FIND_PATH_FAILED: "FIND_PATH_FAILED", + NO_POLYGON_PATH_FOUND: "NO_POLYGON_PATH_FOUND", + NO_CLOSEST_POINT_ON_LAST_POLYGON_FOUND: "NO_CLOSEST_POINT_ON_LAST_POLYGON_FOUND", +}; /** * RecastJS navigation plugin @@ -31,26 +110,50 @@ export class RecastJSPlugin implements INavigationEnginePlugin { /** * the first navmesh created. We might extend this to support multiple navmeshes */ - public navMesh: any; + public navMesh?: NavMesh; + /** + * + */ + public navMeshQuery!: NavMeshQuery; + + /** + * + */ + public intermediates?: SoloNavMeshGeneratorIntermediates; private _maximumSubStepCount: number = 10; private _timeStep: number = 1 / 60; private _timeFactor: number = 1; - private _tempVec1: any; - private _tempVec2: any; + private _tileCache?: TileCache; private _worker: Nullable = null; + // TODO: Nullable? + private _positions: Float32Array = new Float32Array(); + private _indices: Uint32Array = new Uint32Array(); + + public get positions() { + return this._positions; + } + + public get indices() { + return this._indices; + } + + private _tempVec1: any; + private _tempVec2: any; + /** * Initializes the recastJS plugin * @param recastInjection can be used to inject your own recast reference + * @param recastGeneratorsInjection can be used to inject your own generators */ - public constructor(recastInjection: any = Recast) { + public constructor(recastInjection: any = Recast, recastGeneratorsInjection: any = RecastGenerators) { if (typeof recastInjection === "function") { Logger.Error("RecastJS is not ready. Please make sure you await Recast() before using the plugin."); } else { - this.bjsRECAST = recastInjection; + this.bjsRECAST = { ...recastInjection, ...recastGeneratorsInjection }; } if (!this.isSupported()) { @@ -59,8 +162,14 @@ export class RecastJSPlugin implements INavigationEnginePlugin { } this.setTimeStep(); - this._tempVec1 = new this.bjsRECAST.Vec3(); - this._tempVec2 = new this.bjsRECAST.Vec3(); + // TODO: use these wherever possible + this._tempVec1 = new this.bjsRECAST.vec3(); + this._tempVec2 = new this.bjsRECAST.vec3(); + } + + createNavMeshWorker(_meshes: Array, _parameters: INavMeshParameters0, _completion: (data?: Uint8Array) => void): void { + // TODO: implement + throw new Error("Method not implemented."); } /** @@ -70,7 +179,17 @@ export class RecastJSPlugin implements INavigationEnginePlugin { */ public setWorkerURL(workerURL: string | URL): boolean { if (window && window.Worker) { - this._worker = new Worker(workerURL); + this._worker = new Worker(workerURL, { + type: "module", + }); + return true; + } + return false; + } + + public setWorker(worker: Worker): boolean { + if (window && window.Worker) { + this._worker = worker; return true; } return false; @@ -129,36 +248,46 @@ export class RecastJSPlugin implements INavigationEnginePlugin { return this._timeFactor; } - /** - * Creates a navigation mesh - * @param meshes array of all the geometry used to compute the navigation mesh - * @param parameters bunch of parameters used to filter geometry - * @param completion callback when data is available from the worker. Not used without a worker - */ - createNavMesh(meshes: Array, parameters: INavMeshParameters, completion?: (navmeshData: Uint8Array) => void): void { - if (this._worker && !completion) { - Logger.Warn("A worker is avaible but no completion callback. Defaulting to blocking navmesh creation"); - } else if (!this._worker && completion) { - Logger.Warn("A completion callback is avaible but no worker. Defaulting to blocking navmesh creation"); + private _getReversedIndices(mesh: Mesh) { + const indices = mesh.getIndices(false, true); + + if (indices) { + // Reverse the order of vertices in each triangle (3 indices per face) + for (let i = 0; i < indices.length; i += 3) { + // Swap the second and third index to reverse the winding order + const temp = indices[i + 1]; + indices[i + 1] = indices[i + 2]; + indices[i + 2] = temp; + } } - this.navMesh = new this.bjsRECAST.NavMesh(); + return indices; + } + private _getPositionsAndIndices( + meshes: Mesh[], + positionsOffset: IVector3Like = { + x: 0, + y: 0, + z: 0, + } + ): [positions: Float32Array, indices: Uint32Array] { + let offset = 0; let index: number; let tri: number; let pt: number; - - const indices = []; const positions = []; - let offset = 0; + const indices = []; + for (index = 0; index < meshes.length; index++) { if (meshes[index]) { const mesh = meshes[index]; - const meshIndices = mesh.getIndices(); + const meshIndices = this._getReversedIndices(mesh); if (!meshIndices) { continue; } + const meshPositions = mesh.getVerticesData(VertexBuffer.PositionKind, false, false); if (!meshPositions) { continue; @@ -185,12 +314,13 @@ export class RecastJSPlugin implements INavigationEnginePlugin { indices.push(meshIndices[tri] + offset); } + // TODO: use tmp vectors const transformed = Vector3.Zero(); const position = Vector3.Zero(); for (pt = 0; pt < meshPositions.length; pt += 3) { Vector3.FromArrayToRef(meshPositions, pt, position); Vector3.TransformCoordinatesToRef(position, wm, transformed); - positions.push(transformed.x, transformed.y, transformed.z); + positions.push(transformed.x + positionsOffset.x, transformed.y + positionsOffset.y, transformed.z + positionsOffset.z); } offset += meshPositions.length / 3; @@ -198,32 +328,172 @@ export class RecastJSPlugin implements INavigationEnginePlugin { } } + return [Float32Array.from(positions), Uint32Array.from(indices)]; + } + + // https://docs.recast-navigation-js.isaacmason.com/types/index.RecastConfig.html + // Detailed config info: https://rwindegger.github.io/recastnavigation/structrcConfig.html + private static _CreateNavMeshConfig( + parameters: T + ): T extends { tileSize: number } ? Partial : SoloNavMeshGeneratorConfig { + const cfg = { + // The size of the non-navigatable border around the heightfield. + // [Limit: >=0] + // [Units: vx] [0] + borderSize: parameters.borderSize ? parameters.borderSize : 0, + + // The xz-plane cell size to use for fields. [Limit: > 0] [Units: wu] [0.2] + cs: parameters.cs, + + // The y-axis cell size to use for fields. Limit: > 0] [Units: wu] [0.2] + ch: parameters.ch, + + // Sets the sampling distance to use when generating the detail mesh. (For height detail only.) + // [Limits: 0 or >= 0.9] + // [Units: wu] [6] + detailSampleDist: parameters.detailSampleDist, + + // The maximum distance the detail mesh surface should deviate from heightfield data. (For height detail only.) + // [Limit: >=0] + // [Units: wu] [1] + detailSampleMaxError: parameters.detailSampleMaxError, + + // expectedLayersPerTile: parameters.expectedLayersPerTile, + + // The maximum allowed length for contour edges along the border of the mesh. + // [Limit: >=0] + // [Units: vx] [12] + maxEdgeLen: parameters.maxEdgeLen, + + // maxLayers: parameters.maxLayers, + + //The maximum distance a simplified contour's border edges should deviate from the original raw contour. + // [Limit: >=0] + // [Units: vx] [1.3] + maxSimplificationError: parameters.maxSimplificationError, + + // The maximum number of vertices allowed for polygons generated during the be merged with larger regions. + // [Limit: >=0] + // [Units: vx] [6] + maxVertsPerPoly: parameters.maxVertsPerPoly, + + // Any regions with a span count smaller than this value will, if possible, be merged with larger regions. + // [Limit: >=0] + // [Units: vx] [20] + mergeRegionArea: parameters.mergeRegionArea, + + // The minimum number of cells allowed to form isolated island areas. + // [Limit: >=0] + // [Units: vx] [8] + minRegionArea: parameters.minRegionArea, + + // Maximum ledge height that is considered to still be traversable. + // [Limit: >=0] + // [Units: vx] [2] + walkableClimb: parameters.walkableClimb, + + // The maximum slope that is considered walkable. + // [Limits: 0 <= value < 90] + // [Units: Degrees] [60] + walkableSlopeAngle: parameters.walkableSlopeAngle, + + // Minimum floor to 'ceiling' height that will still allow the floor area to be considered walkable. + // [Limit: >= 3] + // [Units: vx] [2] ??? >=3 + walkableHeight: parameters.walkableHeight, + + // The distance to erode/shrink the walkable area of the heightfield away from obstructions. + // [Limit: >=0] + // [Units: vx] [0.5] + walkableRadius: parameters.walkableRadius, + }; + + if (RecastJSPlugin._IsTiledParams(parameters)) { + return { + ...cfg, + expectedLayersPerTile: parameters.expectedLayersPerTile, + maxLayers: parameters.maxLayers, + tileSize: parameters.tileSize, + } as Partial; + } + + delete parameters.tileSize; + + // If no tileSize, return the config as SoloNavMeshGeneratorConfig + return cfg as SoloNavMeshGeneratorConfig; + } + + // If tileSize is present and > 0, return the config as TiledNavMeshGeneratorConfig + private static _IsTiledParams(p: INavMeshParameters0): p is TiledParams { + return typeof (p as any).tileSize === "number" && (p as any).tileSize > 0 && typeof (p as any).expectedLayersPerTile === "number"; + } + + /** + * Creates a navigation mesh + * @param meshes array of all the geometry used to compute the navigation mesh + * @param parameters bunch of parameters used to filter geometry + * @param completion callback when data is available from the worker. Not used without a worker + * @param positionOffset offsets the navmesh by this value + */ + createNavMesh(meshes: Array, parameters: INavMeshParameters0, completion?: (navmeshData: Uint8Array) => void, positionOffset?: IVector3Like): void { + if (this._worker && !completion) { + Logger.Warn("A worker is avaible but no completion callback. Defaulting to blocking navmesh creation"); + } else if (!this._worker && completion) { + Logger.Warn("A completion callback is avaible but no worker. Defaulting to blocking navmesh creation"); + } + + if (meshes.length === 0) { + throw new Error("At least one mesh is needed to create the nav mesh."); + } + + const [positions, indices] = this._getPositionsAndIndices(meshes, positionOffset); + + this._positions = positions; + this._indices = indices; + + const config = RecastJSPlugin._CreateNavMeshConfig(parameters); + if (this._worker && completion) { // spawn worker and send message - this._worker.postMessage([positions, offset, indices, indices.length, parameters]); - this._worker.onmessage = function (e) { - completion(e.data); + this._worker.postMessage( + { + positions: this._positions, + indices: this._indices, + config, + }, + [this._positions.buffer, this._indices.buffer] + ); + this._worker.onmessage = (e) => { + if (e.data?.succes === false) { + throw new Error(`Unable to generateSoloNavMesh:${e}`); + } else { + this.buildFromNavmeshData(e.data); + completion(e.data); + + if (this.navMesh) { + this.navMeshQuery = new this.bjsRECAST.NavMeshQuery(this.navMesh); + } + } }; } else { // blocking calls - const rc = new this.bjsRECAST.rcConfig(); - rc.cs = parameters.cs; - rc.ch = parameters.ch; - rc.borderSize = parameters.borderSize ? parameters.borderSize : 0; - rc.tileSize = parameters.tileSize ? parameters.tileSize : 0; - rc.walkableSlopeAngle = parameters.walkableSlopeAngle; - rc.walkableHeight = parameters.walkableHeight; - rc.walkableClimb = parameters.walkableClimb; - rc.walkableRadius = parameters.walkableRadius; - rc.maxEdgeLen = parameters.maxEdgeLen; - rc.maxSimplificationError = parameters.maxSimplificationError; - rc.minRegionArea = parameters.minRegionArea; - rc.mergeRegionArea = parameters.mergeRegionArea; - rc.maxVertsPerPoly = parameters.maxVertsPerPoly; - rc.detailSampleDist = parameters.detailSampleDist; - rc.detailSampleMaxError = parameters.detailSampleMaxError; + if (!this._positions || !this._indices) { + throw new Error("Unable to get nav mesh. No vertices or indices."); + } - this.navMesh.build(positions, offset, indices, indices.length, rc); + // generate solo or tiled navmesh + const navMeshResult = + "tileSize" in config + ? this.bjsRECAST.generateTiledNavMesh(positions, indices, config as TiledNavMeshGeneratorConfig, parameters.keepIntermediates) + : this.bjsRECAST.generateSoloNavMesh(positions, indices, config, parameters.keepIntermediates); + + if (!navMeshResult.success) { + throw new Error(`Unable to generateSoloNavMesh:${navMeshResult.error}`); + } + + this.navMesh = navMeshResult.navMesh; + this.navMeshQuery = new this.bjsRECAST.NavMeshQuery(navMeshResult.navMesh); + this.intermediates = navMeshResult.intermediates; } } @@ -233,29 +503,24 @@ export class RecastJSPlugin implements INavigationEnginePlugin { * @returns debug display mesh */ createDebugNavMesh(scene: Scene): Mesh { - let tri: number; - let pt: number; - const debugNavMesh = this.navMesh.getDebugNavMesh(); - const triangleCount = debugNavMesh.getTriangleCount(); - - const indices = []; - const positions = []; - for (tri = 0; tri < triangleCount * 3; tri++) { - indices.push(tri); - } - for (tri = 0; tri < triangleCount; tri++) { - for (pt = 0; pt < 3; pt++) { - const point = debugNavMesh.getTriangle(tri).getPoint(pt); - positions.push(point.x, point.y, point.z); - } + if (!this.navMesh) { + throw new Error("There is no NavMesh generated."); } + const [positions, indices] = this.bjsRECAST.getNavMeshPositionsAndIndices(this.navMesh); + const mesh = new Mesh("NavMeshDebug", scene); const vertexData = new VertexData(); + for (let i = 0; i < indices.length; i += 3) { + // Swap the order of the second and third vertex in each triangle + [indices[i + 1], indices[i + 2]] = [indices[i + 2], indices[i + 1]]; + } + vertexData.indices = indices; vertexData.positions = positions; vertexData.applyToMesh(mesh, false); + return mesh; } @@ -264,12 +529,15 @@ export class RecastJSPlugin implements INavigationEnginePlugin { * @param position world position * @returns the closest point to position constrained by the navigation mesh */ - getClosestPoint(position: Vector3): Vector3 { - this._tempVec1.x = position.x; - this._tempVec1.y = position.y; - this._tempVec1.z = position.z; - const ret = this.navMesh.getClosestPoint(this._tempVec1); - const pr = new Vector3(ret.x, ret.y, ret.z); + getClosestPoint( + position: IVector3Like, + options?: { + filter?: QueryFilter; + halfExtents?: Vector3; + } + ): Vector3 { + const ret = this.navMeshQuery.findClosestPoint(position, options); + const pr = new Vector3(ret.point.x, ret.point.y, ret.point.z); return pr; } @@ -278,12 +546,16 @@ export class RecastJSPlugin implements INavigationEnginePlugin { * @param position world position * @param result output the closest point to position constrained by the navigation mesh */ - getClosestPointToRef(position: Vector3, result: Vector3): void { - this._tempVec1.x = position.x; - this._tempVec1.y = position.y; - this._tempVec1.z = position.z; - const ret = this.navMesh.getClosestPoint(this._tempVec1); - result.set(ret.x, ret.y, ret.z); + getClosestPointToRef( + position: IVector3Like, + result: Vector3, + options?: { + filter?: QueryFilter; + halfExtents?: Vector3; + } + ): void { + const ret = this.navMeshQuery.findClosestPoint(position, options); + result.set(ret.point.x, ret.point.y, ret.point.z); } /** @@ -292,12 +564,17 @@ export class RecastJSPlugin implements INavigationEnginePlugin { * @param maxRadius the maximum distance to the constrained world position * @returns the closest point to position constrained by the navigation mesh */ - getRandomPointAround(position: Vector3, maxRadius: number): Vector3 { - this._tempVec1.x = position.x; - this._tempVec1.y = position.y; - this._tempVec1.z = position.z; - const ret = this.navMesh.getRandomPointAround(this._tempVec1, maxRadius); - const pr = new Vector3(ret.x, ret.y, ret.z); + getRandomPointAround( + position: IVector3Like, + maxRadius: number, + options?: { + startRef?: number; + filter?: QueryFilter; + halfExtents?: Vector3; + } + ): Vector3 { + const ret = this.navMeshQuery.findRandomPointAroundCircle(position, maxRadius, options); + const pr = new Vector3(ret.randomPoint.x, ret.randomPoint.y, ret.randomPoint.z); return pr; } @@ -307,12 +584,18 @@ export class RecastJSPlugin implements INavigationEnginePlugin { * @param maxRadius the maximum distance to the constrained world position * @param result output the closest point to position constrained by the navigation mesh */ - getRandomPointAroundToRef(position: Vector3, maxRadius: number, result: Vector3): void { - this._tempVec1.x = position.x; - this._tempVec1.y = position.y; - this._tempVec1.z = position.z; - const ret = this.navMesh.getRandomPointAround(this._tempVec1, maxRadius); - result.set(ret.x, ret.y, ret.z); + getRandomPointAroundToRef( + position: IVector3Like, + maxRadius: number, + result: Vector3, + options?: { + startRef?: number; + filter?: QueryFilter; + halfExtents?: Vector3; + } + ): void { + const ret = this.navMeshQuery.findRandomPointAroundCircle(position, maxRadius, options); + result.set(ret.randomPoint.x, ret.randomPoint.y, ret.randomPoint.z); } /** @@ -321,15 +604,9 @@ export class RecastJSPlugin implements INavigationEnginePlugin { * @param destination world position * @returns the resulting point along the navmesh */ - moveAlong(position: Vector3, destination: Vector3): Vector3 { - this._tempVec1.x = position.x; - this._tempVec1.y = position.y; - this._tempVec1.z = position.z; - this._tempVec2.x = destination.x; - this._tempVec2.y = destination.y; - this._tempVec2.z = destination.z; - const ret = this.navMesh.moveAlong(this._tempVec1, this._tempVec2); - const pr = new Vector3(ret.x, ret.y, ret.z); + moveAlong(position: IVector3Like, destination: IVector3Like): Vector3 { + const ret = this.navMeshQuery.moveAlongSurface(0, position, destination); + const pr = new Vector3(ret.resultPosition.x, ret.resultPosition.y, ret.resultPosition.z); return pr; } @@ -339,25 +616,35 @@ export class RecastJSPlugin implements INavigationEnginePlugin { * @param destination world position * @param result output the resulting point along the navmesh */ - moveAlongToRef(position: Vector3, destination: Vector3, result: Vector3): void { - this._tempVec1.x = position.x; - this._tempVec1.y = position.y; - this._tempVec1.z = position.z; - this._tempVec2.x = destination.x; - this._tempVec2.y = destination.y; - this._tempVec2.z = destination.z; - const ret = this.navMesh.moveAlong(this._tempVec1, this._tempVec2); - result.set(ret.x, ret.y, ret.z); + moveAlongToRef(position: IVector3Like, destination: IVector3Like, result: Vector3): void { + const ret = this.navMeshQuery.moveAlongSurface(0, position, destination); + result.set(ret.resultPosition.x, ret.resultPosition.y, ret.resultPosition.z); } - private _convertNavPathPoints(navPath: any): Vector3[] { - let pt: number; - const pointCount = navPath.getPointCount(); + private _convertNavPathPoints( + navPath: + | { + error?: { + name: string; + status?: number; + }; + path: IVector3Like[]; + success: boolean; + } + | ComputeSmoothPathResult + ): Vector3[] { const positions = []; - for (pt = 0; pt < pointCount; pt++) { - const p = navPath.getPoint(pt); - positions.push(new Vector3(p.x, p.y, p.z)); + + if (navPath.success) { + const pointCount = navPath.path.length; + for (let pt = 0; pt < pointCount; pt++) { + const p = navPath.path[pt]; + positions.push(new Vector3(p.x, p.y, p.z)); + } + } else { + Logger.Warn("Unable to convert navigation path point, because navPath generation has failed."); } + return positions; } @@ -368,34 +655,463 @@ export class RecastJSPlugin implements INavigationEnginePlugin { * @param end world position * @returns array containing world position composing the path */ - computePath(start: Vector3, end: Vector3): Vector3[] { - this._tempVec1.x = start.x; - this._tempVec1.y = start.y; - this._tempVec1.z = start.z; - this._tempVec2.x = end.x; - this._tempVec2.y = end.y; - this._tempVec2.z = end.z; - const navPath = this.navMesh.computePath(this._tempVec1, this._tempVec2); - return this._convertNavPathPoints(navPath); + computePath(start: IVector3Like, end: IVector3Like): Vector3[] { + return this._convertNavPathPoints( + this.navMeshQuery.computePath(start, end, { + // halfExtents: new Vector3(3, 3, 3), + }) + ); } /** - * Compute a navigation path from start to end. Returns an empty array if no path can be computed. - * Path follows navigation mesh geometry. + * Compute a smooth navigation path from start to end. Returns an empty array if no path can be computed * @param start world position * @param end world position + * @param options options object * @returns array containing world position composing the path */ - computePathSmooth(start: Vector3, end: Vector3): Vector3[] { - this._tempVec1.x = start.x; - this._tempVec1.y = start.y; - this._tempVec1.z = start.z; - this._tempVec2.x = end.x; - this._tempVec2.y = end.y; - this._tempVec2.z = end.z; - const navPath = this.navMesh.computePathSmooth(this._tempVec1, this._tempVec2); - return this._convertNavPathPoints(navPath); + computePathSmooth( + start: IVector3Like, + end: IVector3Like, + options?: { + filter?: QueryFilter; + halfExtents?: IVector3Like; + + /** + * @default 256 + */ + maxPathPolys?: number; + + /** + * @default 2048 + */ + maxSmoothPathPoints?: number; + + /** + * @default 0.5 + */ + stepSize?: number; + + /** + * @default 0.01 + */ + slop?: number; + } + ): Vector3[] { + if (!this.navMesh) { + return []; + } + + return this._convertNavPathPoints(this._computeSmoothPath(this.navMesh, start, end, options)); } + + private _computeSmoothPath( + navMesh: NavMesh, + start: IVector3Like, + end: IVector3Like, + options?: { + filter?: QueryFilter; + halfExtents?: IVector3Like; + maxPathPolys?: number; + maxSmoothPathPoints?: number; + stepSize?: number; + slop?: number; + } + ): ComputeSmoothPathResult { + const filter = options?.filter ?? this.navMeshQuery.defaultFilter; + const halfExtents = options?.halfExtents ?? this.navMeshQuery.defaultQueryHalfExtents; + + const maxSmoothPathPoints = options?.maxSmoothPathPoints ?? 2048; + + const maxPathPolys = options?.maxPathPolys ?? 256; + + const stepSize = options?.stepSize ?? 0.5; + const slop = options?.slop ?? 0.01; + + // find nearest polygons for start and end positions + const startNearestPolyResult = this.navMeshQuery.findNearestPoly(start, { + filter, + halfExtents, + }); + + if (!startNearestPolyResult.success) { + return { + success: false, + error: { + type: ComputePathError.START_NEAREST_POLY_FAILED, + status: startNearestPolyResult.status, + }, + path: [], + }; + } + + const endNearestPolyResult = this.navMeshQuery.findNearestPoly(end, { + filter, + halfExtents, + }); + + if (!endNearestPolyResult.success) { + return { + success: false, + error: { + type: ComputePathError.END_NEAREST_POLY_FAILED, + status: endNearestPolyResult.status, + }, + path: [], + }; + } + + const startRef = startNearestPolyResult.nearestRef; + const endRef = endNearestPolyResult.nearestRef; + + // find polygon path + const findPathResult = this.navMeshQuery.findPath(startRef, endRef, start, end, { + filter, + maxPathPolys, + }); + + if (!findPathResult.success) { + return { + success: false, + error: { + type: ComputePathError.FIND_PATH_FAILED, + status: findPathResult.status, + }, + path: [], + }; + } + + if (findPathResult.polys.size <= 0) { + return { + success: false, + error: { + type: ComputePathError.NO_POLYGON_PATH_FOUND, + }, + path: [], + }; + } + + const lastPoly = findPathResult.polys.get(findPathResult.polys.size - 1); + + let closestEnd = end; + + if (lastPoly !== endRef) { + const lastPolyClosestPointResult = this.navMeshQuery.closestPointOnPoly(lastPoly, end); + + if (!lastPolyClosestPointResult.success) { + return { + success: false, + error: { + type: ComputePathError.NO_CLOSEST_POINT_ON_LAST_POLYGON_FOUND, + status: lastPolyClosestPointResult.status, + }, + path: [], + }; + } + + closestEnd = lastPolyClosestPointResult.closestPoint; + } + + // Iterate over the path to find a smooth path on the detail mesh + const iterPos = new Vector3(start.x, start.y, start.z); + const targetPos = new Vector3(closestEnd.x, closestEnd.y, closestEnd.z); + + const polys = [...findPathResult.polys.getHeapView()]; + const smoothPath: Vector3[] = []; + + smoothPath.push(iterPos.clone()); + + while (polys.length > 0 && smoothPath.length < maxSmoothPathPoints) { + // Find location to steer towards + const steerTarget = RecastJSPlugin._GetSteerTarget(this.navMeshQuery, iterPos, targetPos, slop, polys); + + if (!steerTarget.success) { + break; + } + + const isEndOfPath = steerTarget.steerPosFlag & Detour.DT_STRAIGHTPATH_END; + + const isOffMeshConnection = steerTarget.steerPosFlag & Detour.DT_STRAIGHTPATH_OFFMESH_CONNECTION; + + // Find movement delta. + const steerPos = steerTarget.steerPos; + + const delta = tmpDelta.copyFrom(steerPos).subtract(iterPos); + + let len = Math.sqrt(delta.dot(delta)); + + // If the steer target is the end of the path or an off-mesh connection, do not move past the location. + if ((isEndOfPath || isOffMeshConnection) && len < stepSize) { + len = 1; + } else { + len = stepSize / len; + } + + const moveTarget = tmpMoveTarget.copyFrom(iterPos).addInPlace(delta.scale(len)); + + // Move + const moveAlongSurface = this.navMeshQuery.moveAlongSurface(polys[0], iterPos, moveTarget, { filter, maxVisitedSize: 16 }); + + if (!moveAlongSurface.success) { + break; + } + + const result = moveAlongSurface.resultPosition; + + RecastJSPlugin._FixupCorridor(polys, maxPathPolys, moveAlongSurface.visited); + RecastJSPlugin._FixupShortcuts(polys, navMesh); + + const polyHeightResult = this.navMeshQuery.getPolyHeight(polys[0], result); + + if (polyHeightResult.success) { + result.y = polyHeightResult.height; + } + + iterPos.copyFromFloats(result.x, result.y, result.z); + + // Handle end of path and off-mesh links when close enough + if (isEndOfPath && RecastJSPlugin._InRange(iterPos, steerTarget.steerPos, slop, 1.0)) { + // Reached end of path + iterPos.copyFrom(targetPos); + + if (smoothPath.length < maxSmoothPathPoints) { + smoothPath.push(new Vector3(iterPos.x, iterPos.y, iterPos.z)); + } + + break; + } else if (isOffMeshConnection && RecastJSPlugin._InRange(iterPos, steerTarget.steerPos, slop, 1.0)) { + // Reached off-mesh connection. + + // Advance the path up to and over the off-mesh connection. + const offMeshConRef = steerTarget.steerPosRef; + + // Advance the path up to and over the off-mesh connection. + let prevPolyRef = 0; + let polyRef = polys[0]; + + let npos = 0; + + while (npos < polys.length && polyRef !== offMeshConRef) { + prevPolyRef = polyRef; + polyRef = polys[npos]; + npos++; + } + + for (let i = npos; i < polys.length; i++) { + polys[i - npos] = polys[i]; + } + polys.splice(npos, polys.length - npos); + + // Handle the connection + const offMeshConnectionPolyEndPoints = navMesh.getOffMeshConnectionPolyEndPoints(prevPolyRef, polyRef); + + if (offMeshConnectionPolyEndPoints.success) { + if (smoothPath.length < maxSmoothPathPoints) { + smoothPath.push(new Vector3(iterPos.x, iterPos.y, iterPos.z)); + + // Hack to make the dotted path not visible during off-mesh connection. + if (smoothPath.length & 1) { + smoothPath.push(new Vector3(iterPos.x, iterPos.y, iterPos.z)); + } + + // Move position at the other side of the off-mesh link. + iterPos.copyFromFloats(offMeshConnectionPolyEndPoints.end.x, offMeshConnectionPolyEndPoints.end.y, offMeshConnectionPolyEndPoints.end.z); + + const endPositionPolyHeight = this.navMeshQuery.getPolyHeight(polys[0], iterPos); + + if (endPositionPolyHeight.success) { + iterPos.y = endPositionPolyHeight.height; + } + } + } + } + + // Store results. + if (smoothPath.length < maxSmoothPathPoints) { + smoothPath.push(new Vector3(iterPos.x, iterPos.y, iterPos.z)); + } + } + + return { + success: true, + path: smoothPath, + }; + } + + private static _GetSteerTarget(navMeshQuery: NavMeshQuery, start: Vector3, end: Vector3, minTargetDist: number, pathPolys: number[]): GetSteerTargetResult { + const maxSteerPoints = 3; + + const straightPath = navMeshQuery.findStraightPath(start, end, pathPolys, { + maxStraightPathPoints: maxSteerPoints, + }); + + if (!straightPath.success) { + return { + success: false, + }; + } + + const outPoints: Vector3[] = []; + for (let i = 0; i < straightPath.straightPathCount; i++) { + const point = new Vector3(straightPath.straightPath.get(i * 3), straightPath.straightPath.get(i * 3 + 1), straightPath.straightPath.get(i * 3 + 2)); + + outPoints.push(point); + } + + // Find vertex far enough to steer to + let ns = 0; + while (ns < outPoints.length) { + // Stop at Off-Mesh link or when point is further than slop away + if (straightPath.straightPathFlags.get(ns) & Detour.DT_STRAIGHTPATH_OFFMESH_CONNECTION) { + break; + } + + const posA = outPoints[ns]; + const posB = start; + + if (!RecastJSPlugin._InRange(posA, posB, minTargetDist, 1000.0)) { + break; + } + + ns++; + } + + // Failed to find good point to steer to + if (ns >= straightPath.straightPathCount) { + return { + success: false, + }; + } + + const steerPos = outPoints[ns]; + const steerPosFlag = straightPath.straightPathFlags.get(ns); + const steerPosRef = straightPath.straightPathRefs.get(ns); + + return { + success: true, + steerPos, + steerPosFlag, + steerPosRef, + points: outPoints, + }; + } + + private static _InRange(a: Vector3, b: Vector3, r: number, h: number) { + const dx = b.x - a.x; + const dy = b.y - a.y; + const dz = b.z - a.z; + return dx * dx + dz * dz < r && Math.abs(dy) < h; + } + + private static _FixupCorridor(pathPolys: number[], maxPath: number, visitedPolyRefs: number[]) { + let furthestPath = -1; + let furthestVisited = -1; + + // Find furthest common polygon. + for (let i = pathPolys.length - 1; i >= 0; i--) { + let found = false; + for (let j = visitedPolyRefs.length - 1; j >= 0; j--) { + if (pathPolys[i] === visitedPolyRefs[j]) { + furthestPath = i; + furthestVisited = j; + found = true; + } + } + if (found) { + break; + } + } + + // If no intersection found just return current path. + if (furthestPath === -1 || furthestVisited === -1) { + return pathPolys; + } + + // Concatenate paths. + + // Adjust beginning of the buffer to include the visited. + const req = visitedPolyRefs.length - furthestVisited; + const orig = Math.min(furthestPath + 1, pathPolys.length); + + let size = Math.max(0, pathPolys.length - orig); + + if (req + size > maxPath) { + size = maxPath - req; + } + if (size) { + pathPolys.splice(req, size, ...pathPolys.slice(orig, orig + size)); + } + + // Store visited + for (let i = 0; i < req; i++) { + pathPolys[i] = visitedPolyRefs[visitedPolyRefs.length - (1 + i)]; + } + + return pathPolys; + } + + // eslint-disable-next-line jsdoc/require-param + /** + * + * This function checks if the path has a small U-turn, that is, + * a polygon further in the path is adjacent to the first polygon + * in the path. If that happens, a shortcut is taken. + * This can happen if the target (T) location is at tile boundary, + * and we're (S) approaching it parallel to the tile edge. + * The choice at the vertex can be arbitrary, + * +---+---+ + * |:::|:::| + * +-S-+-T-+ + * |:::| | <-- the step can end up in here, resulting U-turn path. + * +---+---+ + */ + private static _FixupShortcuts(pathPolys: number[], navMesh: NavMesh) { + if (pathPolys.length < 3) { + return; + } + + // Get connected polygons + const maxNeis = 16; + let nneis = 0; + const neis: number[] = []; + + const tileAndPoly = navMesh.getTileAndPolyByRef(pathPolys[0]); + + if (!tileAndPoly.success) { + return; + } + + const poly = tileAndPoly.poly; + const tile = tileAndPoly.tile; + for (let k = poly.firstLink(); k !== Detour.DT_NULL_LINK; k = tile.links(k).next()) { + const link = tile.links(k); + + if (link.ref() !== 0) { + if (nneis < maxNeis) { + neis.push(link.ref()); + nneis++; + } + } + } + + // If any of the neighbour polygons is within the next few polygons + // in the path, short cut to that polygon directly. + const maxLookAhead = 6; + let cut = 0; + for (let i = Math.min(maxLookAhead, pathPolys.length) - 1; i > 1 && cut === 0; i--) { + for (let j = 0; j < nneis; j++) { + if (pathPolys[i] === neis[j]) { + cut = i; + break; + } + } + } + + if (cut > 1) { + pathPolys.splice(1, cut - 1); + } + } + /** * Create a new Crowd so you can add agents * @param maxAgents the maximum agent count in the crowd @@ -414,11 +1130,8 @@ export class RecastJSPlugin implements INavigationEnginePlugin { * default is (1,1,1) * @param extent x,y,z value that define the extent around the queries point of reference */ - setDefaultQueryExtent(extent: Vector3): void { - this._tempVec1.x = extent.x; - this._tempVec1.y = extent.y; - this._tempVec1.z = extent.z; - this.navMesh.setDefaultQueryExtent(this._tempVec1); + setDefaultQueryExtent(extent: IVector3Like): void { + this.navMeshQuery.defaultQueryHalfExtents = extent; } /** @@ -426,8 +1139,15 @@ export class RecastJSPlugin implements INavigationEnginePlugin { * @returns the box extent values */ getDefaultQueryExtent(): Vector3 { - const p = this.navMesh.getDefaultQueryExtent(); - return new Vector3(p.x, p.y, p.z); + return new Vector3(this.navMeshQuery.defaultQueryHalfExtents.x, this.navMeshQuery.defaultQueryHalfExtents.y, this.navMeshQuery.defaultQueryHalfExtents.z); + } + + /** + * Get the Bounding box extent result specified by setDefaultQueryExtent + * @param result output the box extent values + */ + getDefaultQueryExtentToRef(result: Vector3): void { + result.set(this.navMeshQuery.defaultQueryHalfExtents.x, this.navMeshQuery.defaultQueryHalfExtents.y, this.navMeshQuery.defaultQueryHalfExtents.z); } /** @@ -435,20 +1155,9 @@ export class RecastJSPlugin implements INavigationEnginePlugin { * @param data the Uint8Array returned by getNavmeshData */ buildFromNavmeshData(data: Uint8Array): void { - const nDataBytes = data.length * data.BYTES_PER_ELEMENT; - const dataPtr = this.bjsRECAST._malloc(nDataBytes); - - const dataHeap = new Uint8Array(this.bjsRECAST.HEAPU8.buffer, dataPtr, nDataBytes); - dataHeap.set(data); - - const buf = new this.bjsRECAST.NavmeshData(); - buf.dataPointer = dataHeap.byteOffset; - buf.size = data.length; - this.navMesh = new this.bjsRECAST.NavMesh(); - this.navMesh.buildFromNavmeshData(buf); - - // Free memory - this.bjsRECAST._free(dataHeap.byteOffset); + const result = this.bjsRECAST.importNavMesh(data); + this.navMesh = result.navMesh; + this.navMeshQuery = new this.bjsRECAST.NavMeshQuery(this.navMesh); } /** @@ -456,27 +1165,69 @@ export class RecastJSPlugin implements INavigationEnginePlugin { * @returns data the Uint8Array that can be saved and reused */ getNavmeshData(): Uint8Array { - const navmeshData = this.navMesh.getNavmeshData(); - const arrView = new Uint8Array(this.bjsRECAST.HEAPU8.buffer, navmeshData.dataPointer, navmeshData.size); - const ret = new Uint8Array(navmeshData.size); - ret.set(arrView); - this.navMesh.freeNavmeshData(navmeshData); - return ret; + if (!this.navMesh) { + throw new Error("There is no NavMesh generated."); + } + return this.bjsRECAST.exportNavMesh(this.navMesh); } /** - * Get the Bounding box extent result specified by setDefaultQueryExtent - * @param result output the box extent values + * Disposes */ - getDefaultQueryExtentToRef(result: Vector3): void { - const p = this.navMesh.getDefaultQueryExtent(); - result.set(p.x, p.y, p.z); + public dispose() { + // clea up recast stuff + this.destroy(); + + // clean up babylonjs stuff + // } /** - * Disposes + * Destroys recast related raw data */ - public dispose() {} + public destroy() { + if (!this.navMesh) { + return; + } + this.navMeshQuery.destroy(); + this.navMesh?.destroy(); + this.navMesh = undefined; + } + + private _createTileCache(tileSize = 32) { + if (!this._tileCache) { + const { success, navMesh, tileCache } = this.bjsRECAST.generateTileCache(this._positions, this._indices, { + tileSize, + }); + if (!success) { + Logger.Error("Unable to generateTileCache."); + } else { + this._tileCache = tileCache; + this.navMesh = navMesh; + } + } + } + + /** + * Updates the tile cache + */ + public updateTileCache() { + if (!this.navMesh || !this._tileCache) { + return; + } + + let upToDate; + while (!upToDate) { + const result = this._tileCache.update(this.navMesh); + if (!result.success) { + Logger.Error(["Unable to update tile cache.", result.status]); + return; + } + upToDate = result.upToDate; + } + + this.navMeshQuery = new this.bjsRECAST.NavMeshQuery(this.navMesh); + } /** * Creates a cylinder obstacle and add it to the navigation @@ -485,11 +1236,10 @@ export class RecastJSPlugin implements INavigationEnginePlugin { * @param height cylinder height * @returns the obstacle freshly created */ - addCylinderObstacle(position: Vector3, radius: number, height: number): IObstacle { - this._tempVec1.x = position.x; - this._tempVec1.y = position.y; - this._tempVec1.z = position.z; - return this.navMesh.addCylinderObstacle(this._tempVec1, radius, height); + addCylinderObstacle(position: IVector3Like, radius: number, height: number): IObstacle { + this._createTileCache(); + + return this._tileCache?.addCylinderObstacle(position, radius, height) ?? (null as unknown as IObstacle); } /** @@ -499,14 +1249,10 @@ export class RecastJSPlugin implements INavigationEnginePlugin { * @param angle angle in radians of the box orientation on Y axis * @returns the obstacle freshly created */ - addBoxObstacle(position: Vector3, extent: Vector3, angle: number): IObstacle { - this._tempVec1.x = position.x; - this._tempVec1.y = position.y; - this._tempVec1.z = position.z; - this._tempVec2.x = extent.x; - this._tempVec2.y = extent.y; - this._tempVec2.z = extent.z; - return this.navMesh.addBoxObstacle(this._tempVec1, this._tempVec2, angle); + addBoxObstacle(position: IVector3Like, extent: IVector3Like, angle: number): IObstacle { + this._createTileCache(); + + return this._tileCache?.addBoxObstacle(position, extent, angle) ?? (null as unknown as IObstacle); } /** @@ -514,7 +1260,7 @@ export class RecastJSPlugin implements INavigationEnginePlugin { * @param obstacle obstacle to remove from the navigation */ removeObstacle(obstacle: IObstacle): void { - this.navMesh.removeObstacle(obstacle); + this._tileCache?.removeObstacle(obstacle); } /** @@ -522,7 +1268,7 @@ export class RecastJSPlugin implements INavigationEnginePlugin { * @returns true if plugin is supported */ public isSupported(): boolean { - return this.bjsRECAST !== undefined; + return true; } /** @@ -530,7 +1276,7 @@ export class RecastJSPlugin implements INavigationEnginePlugin { * @returns seed number */ public getRandomSeed(): number { - return this.bjsRECAST._getRandomSeed(); + return this.bjsRECAST.getRandomSeed(); } /** @@ -538,7 +1284,7 @@ export class RecastJSPlugin implements INavigationEnginePlugin { * @param seed number used as seed for random functions */ public setRandomSeed(seed: number): void { - this.bjsRECAST._setRandomSeed(seed); + this.bjsRECAST.setRandomSeed(seed); } } @@ -554,7 +1300,7 @@ export class RecastJSCrowd implements ICrowd { /** * Link to the detour crowd */ - public recastCrowd: any = {}; + public recastCrowd: Crowd; /** * One transform per agent */ @@ -588,7 +1334,10 @@ export class RecastJSCrowd implements ICrowd { /** * Fires each time an agent is in reach radius of its destination */ - public onReachTargetObservable = new Observable<{ agentIndex: number; destination: Vector3 }>(); + public onReachTargetObservable = new Observable<{ + agentIndex: number; + destination: Vector3; + }>(); /** * Constructor @@ -600,7 +1349,16 @@ export class RecastJSCrowd implements ICrowd { */ public constructor(plugin: RecastJSPlugin, maxAgents: number, maxAgentRadius: number, scene: Scene) { this.bjsRECASTPlugin = plugin; - this.recastCrowd = new this.bjsRECASTPlugin.bjsRECAST.Crowd(maxAgents, maxAgentRadius, this.bjsRECASTPlugin.navMesh.getNavMesh()); + + if (!plugin.navMesh) { + throw new Error("There is no NavMesh generated."); + } + + this.recastCrowd = new this.bjsRECASTPlugin.bjsRECAST.Crowd(plugin.navMesh, { + maxAgents, + maxAgentRadius, + }); + this._scene = scene; this._onBeforeAnimationsObserver = scene.onBeforeAnimationsObservable.add(() => { @@ -616,27 +1374,32 @@ export class RecastJSCrowd implements ICrowd { * @param transform hooked to the agent that will be update by the scene * @returns agent index */ - addAgent(pos: Vector3, parameters: IAgentParameters, transform: TransformNode): number { - const agentParams = new this.bjsRECASTPlugin.bjsRECAST.dtCrowdAgentParams(); - agentParams.radius = parameters.radius; - agentParams.height = parameters.height; - agentParams.maxAcceleration = parameters.maxAcceleration; - agentParams.maxSpeed = parameters.maxSpeed; - agentParams.collisionQueryRange = parameters.collisionQueryRange; - agentParams.pathOptimizationRange = parameters.pathOptimizationRange; - agentParams.separationWeight = parameters.separationWeight; - agentParams.updateFlags = 7; - agentParams.obstacleAvoidanceType = 0; - agentParams.queryFilterType = 0; - agentParams.userData = 0; - - const agentIndex = this.recastCrowd.addAgent(new this.bjsRECASTPlugin.bjsRECAST.Vec3(pos.x, pos.y, pos.z), agentParams); + addAgent(pos: IVector3Like, parameters: IAgentParameters, transform: TransformNode): number { + const agentParams: IAgentParameters = { + radius: parameters.radius, + height: parameters.height, + maxAcceleration: parameters.maxAcceleration, + maxSpeed: parameters.maxSpeed, + collisionQueryRange: parameters.collisionQueryRange, + pathOptimizationRange: parameters.pathOptimizationRange, + separationWeight: parameters.separationWeight, + reachRadius: parameters.reachRadius ? parameters.reachRadius : parameters.radius, + + // updateFlags : 7, + // obstacleAvoidanceType : 0, + // queryFilterType : 0, + // userData : 0, + }; + + const agent = this.recastCrowd.addAgent({ x: pos.x, y: pos.y, z: pos.z }, agentParams); + this.transforms.push(transform); - this.agents.push(agentIndex); + this.agents.push(agent.agentIndex); this.reachRadii.push(parameters.reachRadius ? parameters.reachRadius : parameters.radius); this._agentDestinationArmed.push(false); this._agentDestination.push(new Vector3(0, 0, 0)); - return agentIndex; + + return agent.agentIndex; } /** @@ -645,7 +1408,11 @@ export class RecastJSCrowd implements ICrowd { * @returns world space position */ getAgentPosition(index: number): Vector3 { - const agentPos = this.recastCrowd.getAgentPosition(index); + const agentPos = this.recastCrowd.getAgent(index)?.position() ?? { + x: 0, + y: 0, + z: 0, + }; return new Vector3(agentPos.x, agentPos.y, agentPos.z); } @@ -655,7 +1422,11 @@ export class RecastJSCrowd implements ICrowd { * @param result output world space position */ getAgentPositionToRef(index: number, result: Vector3): void { - const agentPos = this.recastCrowd.getAgentPosition(index); + const agentPos = this.recastCrowd.getAgent(index)?.position() ?? { + x: 0, + y: 0, + z: 0, + }; result.set(agentPos.x, agentPos.y, agentPos.z); } @@ -665,7 +1436,11 @@ export class RecastJSCrowd implements ICrowd { * @returns world space velocity */ getAgentVelocity(index: number): Vector3 { - const agentVel = this.recastCrowd.getAgentVelocity(index); + const agentVel = this.recastCrowd.getAgent(index)?.velocity() ?? { + x: 0, + y: 0, + z: 0, + }; return new Vector3(agentVel.x, agentVel.y, agentVel.z); } @@ -675,7 +1450,11 @@ export class RecastJSCrowd implements ICrowd { * @param result output world space velocity */ getAgentVelocityToRef(index: number, result: Vector3): void { - const agentVel = this.recastCrowd.getAgentVelocity(index); + const agentVel = this.recastCrowd.getAgent(index)?.velocity() ?? { + x: 0, + y: 0, + z: 0, + }; result.set(agentVel.x, agentVel.y, agentVel.z); } @@ -685,7 +1464,11 @@ export class RecastJSCrowd implements ICrowd { * @returns world space position */ getAgentNextTargetPath(index: number): Vector3 { - const pathTargetPos = this.recastCrowd.getAgentNextTargetPath(index); + const pathTargetPos = this.recastCrowd.getAgent(index)?.nextTargetInPath() ?? { + x: 0, + y: 0, + z: 0, + }; return new Vector3(pathTargetPos.x, pathTargetPos.y, pathTargetPos.z); } @@ -695,7 +1478,11 @@ export class RecastJSCrowd implements ICrowd { * @param result output world space position */ getAgentNextTargetPathToRef(index: number, result: Vector3): void { - const pathTargetPos = this.recastCrowd.getAgentNextTargetPath(index); + const pathTargetPos = this.recastCrowd.getAgent(index)?.nextTargetInPath() ?? { + x: 0, + y: 0, + z: 0, + }; result.set(pathTargetPos.x, pathTargetPos.y, pathTargetPos.z); } @@ -705,7 +1492,7 @@ export class RecastJSCrowd implements ICrowd { * @returns agent state */ getAgentState(index: number): number { - return this.recastCrowd.getAgentState(index); + return this.recastCrowd.getAgent(index)?.state() ?? 0; // invalid } /** @@ -714,7 +1501,7 @@ export class RecastJSCrowd implements ICrowd { * @returns true if over an off mesh link connection */ overOffmeshConnection(index: number): boolean { - return this.recastCrowd.overOffmeshConnection(index); + return this.recastCrowd.getAgent(index)?.overOffMeshConnection() ?? false; } /** @@ -722,8 +1509,8 @@ export class RecastJSCrowd implements ICrowd { * @param index agent index returned by addAgent * @param destination targeted world position */ - agentGoto(index: number, destination: Vector3): void { - this.recastCrowd.agentGoto(index, new this.bjsRECASTPlugin.bjsRECAST.Vec3(destination.x, destination.y, destination.z)); + agentGoto(index: number, destination: IVector3Like): void { + this.recastCrowd.getAgent(index)?.requestMoveTarget(destination); // arm observer const item = this.agents.indexOf(index); @@ -738,8 +1525,8 @@ export class RecastJSCrowd implements ICrowd { * @param index agent index returned by addAgent * @param destination targeted world position */ - agentTeleport(index: number, destination: Vector3): void { - this.recastCrowd.agentTeleport(index, new this.bjsRECASTPlugin.bjsRECAST.Vec3(destination.x, destination.y, destination.z)); + agentTeleport(index: number, destination: IVector3Like): void { + this.recastCrowd.getAgent(index)?.teleport(destination); } /** @@ -748,7 +1535,16 @@ export class RecastJSCrowd implements ICrowd { * @param parameters agent parameters */ updateAgentParameters(index: number, parameters: IAgentParameters): void { - const agentParams = this.recastCrowd.getAgentParameters(index); + const agent = this.recastCrowd.getAgent(index); + if (!agent) { + return; + } + + const agentParams = agent.parameters(); + + if (!agentParams) { + return; + } if (parameters.radius !== undefined) { agentParams.radius = parameters.radius; @@ -772,7 +1568,7 @@ export class RecastJSCrowd implements ICrowd { agentParams.separationWeight = parameters.separationWeight; } - this.recastCrowd.setAgentParameters(index, agentParams); + agent.updateParameters(agentParams); } /** @@ -806,11 +1602,12 @@ export class RecastJSCrowd implements ICrowd { */ update(deltaTime: number): void { // update obstacles - this.bjsRECASTPlugin.navMesh.update(); + this.recastCrowd.update(deltaTime); if (deltaTime <= Epsilon) { return; } + // update crowd const timeStep = this.bjsRECASTPlugin.getTimeStep(); const maxStepCount = this.bjsRECASTPlugin.getMaximumSubStepCount(); @@ -847,7 +1644,10 @@ export class RecastJSCrowd implements ICrowd { const distanceXZSquared = dx * dx + dz * dz; if (agentPosition.y > groundY && agentPosition.y < ceilingY && distanceXZSquared < radius * radius) { this._agentDestinationArmed[index] = false; - this.onReachTargetObservable.notifyObservers({ agentIndex: agentIndex, destination: this._agentDestination[index] }); + this.onReachTargetObservable.notifyObservers({ + agentIndex: agentIndex, + destination: this._agentDestination[index], + }); } } } @@ -859,9 +1659,9 @@ export class RecastJSCrowd implements ICrowd { * default is (1,1,1) * @param extent x,y,z value that define the extent around the queries point of reference */ - setDefaultQueryExtent(extent: Vector3): void { + setDefaultQueryExtent(extent: IVector3Like): void { const ext = new this.bjsRECASTPlugin.bjsRECAST.Vec3(extent.x, extent.y, extent.z); - this.recastCrowd.setDefaultQueryExtent(ext); + this.bjsRECASTPlugin.setDefaultQueryExtent(ext); } /** @@ -869,7 +1669,7 @@ export class RecastJSCrowd implements ICrowd { * @returns the box extent values */ getDefaultQueryExtent(): Vector3 { - const p = this.recastCrowd.getDefaultQueryExtent(); + const p = this.bjsRECASTPlugin.getDefaultQueryExtent(); return new Vector3(p.x, p.y, p.z); } @@ -878,7 +1678,7 @@ export class RecastJSCrowd implements ICrowd { * @param result output the box extent values */ getDefaultQueryExtentToRef(result: Vector3): void { - const p = this.recastCrowd.getDefaultQueryExtent(); + const p = this.bjsRECASTPlugin.getDefaultQueryExtent(); result.set(p.x, p.y, p.z); } @@ -888,13 +1688,14 @@ export class RecastJSCrowd implements ICrowd { * @returns array containing world position composing the path */ getCorners(index: number): Vector3[] { - let pt: number; - const navPath = this.recastCrowd.getCorners(index); - const pointCount = navPath.getPointCount(); + const corners = this.recastCrowd.getAgent(index)?.corners(); + if (!corners) { + return []; + } + const positions = []; - for (pt = 0; pt < pointCount; pt++) { - const p = navPath.getPoint(pt); - positions.push(new Vector3(p.x, p.y, p.z)); + for (let i = 0; i < corners.length; i++) { + positions.push(new Vector3(corners[i].x, corners[i].y, corners[i].z)); } return positions; } @@ -904,8 +1705,922 @@ export class RecastJSCrowd implements ICrowd { */ dispose(): void { this.recastCrowd.destroy(); - this._scene.onBeforeAnimationsObservable.remove(this._onBeforeAnimationsObserver); - this._onBeforeAnimationsObserver = null; + + if (this._onBeforeAnimationsObserver) { + this._scene.onBeforeAnimationsObservable.remove(this._onBeforeAnimationsObserver); + this._onBeforeAnimationsObserver = null; + } + this.onReachTargetObservable.clear(); } } + +// import type { INavigationEnginePlugin, ICrowd, IAgentParameters, INavMeshParameters, IObstacle } from "../../Navigation/INavigationEngine"; +// import { Logger } from "../../Misc/logger"; +// import { VertexData } from "../../Meshes/mesh.vertexData"; +// import { Mesh } from "../../Meshes/mesh"; +// import type { Scene } from "../../scene"; +// import { Epsilon, Vector3, Matrix } from "../../Maths/math"; +// import type { TransformNode } from "../../Meshes/transformNode"; +// import type { Observer } from "../../Misc/observable"; +// import { Observable } from "../../Misc/observable"; +// import type { Nullable } from "../../types"; +// import { VertexBuffer } from "../../Buffers/buffer"; + +// // eslint-disable-next-line @typescript-eslint/naming-convention +// declare let Recast: any; + +// /** +// * RecastJS navigation plugin +// */ +// export class RecastJSPlugin implements INavigationEnginePlugin { +// /** +// * Reference to the Recast library +// */ +// public bjsRECAST: any = {}; + +// /** +// * plugin name +// */ +// public name: string = "RecastJSPlugin"; + +// /** +// * the first navmesh created. We might extend this to support multiple navmeshes +// */ +// public navMesh: any; + +// private _maximumSubStepCount: number = 10; +// private _timeStep: number = 1 / 60; +// private _timeFactor: number = 1; + +// private _tempVec1: any; +// private _tempVec2: any; + +// private _worker: Nullable = null; + +// /** +// * Initializes the recastJS plugin +// * @param recastInjection can be used to inject your own recast reference +// */ +// public constructor(recastInjection: any = Recast) { +// if (typeof recastInjection === "function") { +// Logger.Error("RecastJS is not ready. Please make sure you await Recast() before using the plugin."); +// } else { +// this.bjsRECAST = recastInjection; +// } + +// if (!this.isSupported()) { +// Logger.Error("RecastJS is not available. Please make sure you included the js file."); +// return; +// } +// this.setTimeStep(); + +// this._tempVec1 = new this.bjsRECAST.Vec3(); +// this._tempVec2 = new this.bjsRECAST.Vec3(); +// } + +// /** +// * Set worker URL to be used when generating a new navmesh +// * @param workerURL url string +// * @returns boolean indicating if worker is created +// */ +// public setWorkerURL(workerURL: string | URL): boolean { +// if (window && window.Worker) { +// this._worker = new Worker(workerURL); +// return true; +// } +// return false; +// } + +// /** +// * Set the time step of the navigation tick update. +// * Default is 1/60. +// * A value of 0 will disable fixed time update +// * @param newTimeStep the new timestep to apply to this world. +// */ +// setTimeStep(newTimeStep: number = 1 / 60): void { +// this._timeStep = newTimeStep; +// } + +// /** +// * Get the time step of the navigation tick update. +// * @returns the current time step +// */ +// getTimeStep(): number { +// return this._timeStep; +// } + +// /** +// * If delta time in navigation tick update is greater than the time step +// * a number of sub iterations are done. If more iterations are need to reach deltatime +// * they will be discarded. +// * A value of 0 will set to no maximum and update will use as many substeps as needed +// * @param newStepCount the maximum number of iterations +// */ +// setMaximumSubStepCount(newStepCount: number = 10): void { +// this._maximumSubStepCount = newStepCount; +// } + +// /** +// * Get the maximum number of iterations per navigation tick update +// * @returns the maximum number of iterations +// */ +// getMaximumSubStepCount(): number { +// return this._maximumSubStepCount; +// } + +// /** +// * Time factor applied when updating crowd agents (default 1). A value of 0 will pause crowd updates. +// * @param value the time factor applied at update +// */ +// public set timeFactor(value: number) { +// this._timeFactor = Math.max(value, 0); +// } + +// /** +// * Get the time factor used for crowd agent update +// * @returns the time factor +// */ +// public get timeFactor(): number { +// return this._timeFactor; +// } + +// /** +// * Creates a navigation mesh +// * @param meshes array of all the geometry used to compute the navigation mesh +// * @param parameters bunch of parameters used to filter geometry +// * @param completion callback when data is available from the worker. Not used without a worker +// */ +// createNavMesh(meshes: Array, parameters: INavMeshParameters, completion?: (navmeshData: Uint8Array) => void): void { +// if (this._worker && !completion) { +// Logger.Warn("A worker is avaible but no completion callback. Defaulting to blocking navmesh creation"); +// } else if (!this._worker && completion) { +// Logger.Warn("A completion callback is avaible but no worker. Defaulting to blocking navmesh creation"); +// } + +// this.navMesh = new this.bjsRECAST.NavMesh(); + +// let index: number; +// let tri: number; +// let pt: number; + +// const indices = []; +// const positions = []; +// let offset = 0; +// for (index = 0; index < meshes.length; index++) { +// if (meshes[index]) { +// const mesh = meshes[index]; + +// const meshIndices = mesh.getIndices(); +// if (!meshIndices) { +// continue; +// } +// const meshPositions = mesh.getVerticesData(VertexBuffer.PositionKind, false, false); +// if (!meshPositions) { +// continue; +// } + +// const worldMatrices = []; +// const worldMatrix = mesh.computeWorldMatrix(true); + +// if (mesh.hasThinInstances) { +// const thinMatrices = (mesh as Mesh).thinInstanceGetWorldMatrices(); +// for (let instanceIndex = 0; instanceIndex < thinMatrices.length; instanceIndex++) { +// const tmpMatrix = new Matrix(); +// const thinMatrix = thinMatrices[instanceIndex]; +// thinMatrix.multiplyToRef(worldMatrix, tmpMatrix); +// worldMatrices.push(tmpMatrix); +// } +// } else { +// worldMatrices.push(worldMatrix); +// } + +// for (let matrixIndex = 0; matrixIndex < worldMatrices.length; matrixIndex++) { +// const wm = worldMatrices[matrixIndex]; +// for (tri = 0; tri < meshIndices.length; tri++) { +// indices.push(meshIndices[tri] + offset); +// } + +// const transformed = Vector3.Zero(); +// const position = Vector3.Zero(); +// for (pt = 0; pt < meshPositions.length; pt += 3) { +// Vector3.FromArrayToRef(meshPositions, pt, position); +// Vector3.TransformCoordinatesToRef(position, wm, transformed); +// positions.push(transformed.x, transformed.y, transformed.z); +// } + +// offset += meshPositions.length / 3; +// } +// } +// } + +// if (this._worker && completion) { +// // spawn worker and send message +// this._worker.postMessage([positions, offset, indices, indices.length, parameters]); +// this._worker.onmessage = function (e) { +// completion(e.data); +// }; +// } else { +// // blocking calls +// const rc = new this.bjsRECAST.rcConfig(); +// rc.cs = parameters.cs; +// rc.ch = parameters.ch; +// rc.borderSize = parameters.borderSize ? parameters.borderSize : 0; +// rc.tileSize = parameters.tileSize ? parameters.tileSize : 0; +// rc.walkableSlopeAngle = parameters.walkableSlopeAngle; +// rc.walkableHeight = parameters.walkableHeight; +// rc.walkableClimb = parameters.walkableClimb; +// rc.walkableRadius = parameters.walkableRadius; +// rc.maxEdgeLen = parameters.maxEdgeLen; +// rc.maxSimplificationError = parameters.maxSimplificationError; +// rc.minRegionArea = parameters.minRegionArea; +// rc.mergeRegionArea = parameters.mergeRegionArea; +// rc.maxVertsPerPoly = parameters.maxVertsPerPoly; +// rc.detailSampleDist = parameters.detailSampleDist; +// rc.detailSampleMaxError = parameters.detailSampleMaxError; + +// this.navMesh.build(positions, offset, indices, indices.length, rc); +// } +// } + +// /** +// * Create a navigation mesh debug mesh +// * @param scene is where the mesh will be added +// * @returns debug display mesh +// */ +// createDebugNavMesh(scene: Scene): Mesh { +// let tri: number; +// let pt: number; +// const debugNavMesh = this.navMesh.getDebugNavMesh(); +// const triangleCount = debugNavMesh.getTriangleCount(); + +// const indices = []; +// const positions = []; +// for (tri = 0; tri < triangleCount * 3; tri++) { +// indices.push(tri); +// } +// for (tri = 0; tri < triangleCount; tri++) { +// for (pt = 0; pt < 3; pt++) { +// const point = debugNavMesh.getTriangle(tri).getPoint(pt); +// positions.push(point.x, point.y, point.z); +// } +// } + +// const mesh = new Mesh("NavMeshDebug", scene); +// const vertexData = new VertexData(); + +// vertexData.indices = indices; +// vertexData.positions = positions; +// vertexData.applyToMesh(mesh, false); +// return mesh; +// } + +// /** +// * Get a navigation mesh constrained position, closest to the parameter position +// * @param position world position +// * @returns the closest point to position constrained by the navigation mesh +// */ +// getClosestPoint(position: Vector3): Vector3 { +// this._tempVec1.x = position.x; +// this._tempVec1.y = position.y; +// this._tempVec1.z = position.z; +// const ret = this.navMesh.getClosestPoint(this._tempVec1); +// const pr = new Vector3(ret.x, ret.y, ret.z); +// return pr; +// } + +// /** +// * Get a navigation mesh constrained position, closest to the parameter position +// * @param position world position +// * @param result output the closest point to position constrained by the navigation mesh +// */ +// getClosestPointToRef(position: Vector3, result: Vector3): void { +// this._tempVec1.x = position.x; +// this._tempVec1.y = position.y; +// this._tempVec1.z = position.z; +// const ret = this.navMesh.getClosestPoint(this._tempVec1); +// result.set(ret.x, ret.y, ret.z); +// } + +// /** +// * Get a navigation mesh constrained position, within a particular radius +// * @param position world position +// * @param maxRadius the maximum distance to the constrained world position +// * @returns the closest point to position constrained by the navigation mesh +// */ +// getRandomPointAround(position: Vector3, maxRadius: number): Vector3 { +// this._tempVec1.x = position.x; +// this._tempVec1.y = position.y; +// this._tempVec1.z = position.z; +// const ret = this.navMesh.getRandomPointAround(this._tempVec1, maxRadius); +// const pr = new Vector3(ret.x, ret.y, ret.z); +// return pr; +// } + +// /** +// * Get a navigation mesh constrained position, within a particular radius +// * @param position world position +// * @param maxRadius the maximum distance to the constrained world position +// * @param result output the closest point to position constrained by the navigation mesh +// */ +// getRandomPointAroundToRef(position: Vector3, maxRadius: number, result: Vector3): void { +// this._tempVec1.x = position.x; +// this._tempVec1.y = position.y; +// this._tempVec1.z = position.z; +// const ret = this.navMesh.getRandomPointAround(this._tempVec1, maxRadius); +// result.set(ret.x, ret.y, ret.z); +// } + +// /** +// * Compute the final position from a segment made of destination-position +// * @param position world position +// * @param destination world position +// * @returns the resulting point along the navmesh +// */ +// moveAlong(position: Vector3, destination: Vector3): Vector3 { +// this._tempVec1.x = position.x; +// this._tempVec1.y = position.y; +// this._tempVec1.z = position.z; +// this._tempVec2.x = destination.x; +// this._tempVec2.y = destination.y; +// this._tempVec2.z = destination.z; +// const ret = this.navMesh.moveAlong(this._tempVec1, this._tempVec2); +// const pr = new Vector3(ret.x, ret.y, ret.z); +// return pr; +// } + +// /** +// * Compute the final position from a segment made of destination-position +// * @param position world position +// * @param destination world position +// * @param result output the resulting point along the navmesh +// */ +// moveAlongToRef(position: Vector3, destination: Vector3, result: Vector3): void { +// this._tempVec1.x = position.x; +// this._tempVec1.y = position.y; +// this._tempVec1.z = position.z; +// this._tempVec2.x = destination.x; +// this._tempVec2.y = destination.y; +// this._tempVec2.z = destination.z; +// const ret = this.navMesh.moveAlong(this._tempVec1, this._tempVec2); +// result.set(ret.x, ret.y, ret.z); +// } + +// private _convertNavPathPoints(navPath: any): Vector3[] { +// let pt: number; +// const pointCount = navPath.getPointCount(); +// const positions = []; +// for (pt = 0; pt < pointCount; pt++) { +// const p = navPath.getPoint(pt); +// positions.push(new Vector3(p.x, p.y, p.z)); +// } +// return positions; +// } + +// /** +// * Compute a navigation path from start to end. Returns an empty array if no path can be computed +// * Path is straight. +// * @param start world position +// * @param end world position +// * @returns array containing world position composing the path +// */ +// computePath(start: Vector3, end: Vector3): Vector3[] { +// this._tempVec1.x = start.x; +// this._tempVec1.y = start.y; +// this._tempVec1.z = start.z; +// this._tempVec2.x = end.x; +// this._tempVec2.y = end.y; +// this._tempVec2.z = end.z; +// const navPath = this.navMesh.computePath(this._tempVec1, this._tempVec2); +// return this._convertNavPathPoints(navPath); +// } + +// /** +// * Compute a navigation path from start to end. Returns an empty array if no path can be computed. +// * Path follows navigation mesh geometry. +// * @param start world position +// * @param end world position +// * @returns array containing world position composing the path +// */ +// computePathSmooth(start: Vector3, end: Vector3): Vector3[] { +// this._tempVec1.x = start.x; +// this._tempVec1.y = start.y; +// this._tempVec1.z = start.z; +// this._tempVec2.x = end.x; +// this._tempVec2.y = end.y; +// this._tempVec2.z = end.z; +// const navPath = this.navMesh.computePathSmooth(this._tempVec1, this._tempVec2); +// return this._convertNavPathPoints(navPath); +// } +// /** +// * Create a new Crowd so you can add agents +// * @param maxAgents the maximum agent count in the crowd +// * @param maxAgentRadius the maximum radius an agent can have +// * @param scene to attach the crowd to +// * @returns the crowd you can add agents to +// */ +// createCrowd(maxAgents: number, maxAgentRadius: number, scene: Scene): ICrowd { +// const crowd = new RecastJSCrowd(this, maxAgents, maxAgentRadius, scene); +// return crowd; +// } + +// /** +// * Set the Bounding box extent for doing spatial queries (getClosestPoint, getRandomPointAround, ...) +// * The queries will try to find a solution within those bounds +// * default is (1,1,1) +// * @param extent x,y,z value that define the extent around the queries point of reference +// */ +// setDefaultQueryExtent(extent: Vector3): void { +// this._tempVec1.x = extent.x; +// this._tempVec1.y = extent.y; +// this._tempVec1.z = extent.z; +// this.navMesh.setDefaultQueryExtent(this._tempVec1); +// } + +// /** +// * Get the Bounding box extent specified by setDefaultQueryExtent +// * @returns the box extent values +// */ +// getDefaultQueryExtent(): Vector3 { +// const p = this.navMesh.getDefaultQueryExtent(); +// return new Vector3(p.x, p.y, p.z); +// } + +// /** +// * build the navmesh from a previously saved state using getNavmeshData +// * @param data the Uint8Array returned by getNavmeshData +// */ +// buildFromNavmeshData(data: Uint8Array): void { +// const nDataBytes = data.length * data.BYTES_PER_ELEMENT; +// const dataPtr = this.bjsRECAST._malloc(nDataBytes); + +// const dataHeap = new Uint8Array(this.bjsRECAST.HEAPU8.buffer, dataPtr, nDataBytes); +// dataHeap.set(data); + +// const buf = new this.bjsRECAST.NavmeshData(); +// buf.dataPointer = dataHeap.byteOffset; +// buf.size = data.length; +// this.navMesh = new this.bjsRECAST.NavMesh(); +// this.navMesh.buildFromNavmeshData(buf); + +// // Free memory +// this.bjsRECAST._free(dataHeap.byteOffset); +// } + +// /** +// * returns the navmesh data that can be used later. The navmesh must be built before retrieving the data +// * @returns data the Uint8Array that can be saved and reused +// */ +// getNavmeshData(): Uint8Array { +// const navmeshData = this.navMesh.getNavmeshData(); +// const arrView = new Uint8Array(this.bjsRECAST.HEAPU8.buffer, navmeshData.dataPointer, navmeshData.size); +// const ret = new Uint8Array(navmeshData.size); +// ret.set(arrView); +// this.navMesh.freeNavmeshData(navmeshData); +// return ret; +// } + +// /** +// * Get the Bounding box extent result specified by setDefaultQueryExtent +// * @param result output the box extent values +// */ +// getDefaultQueryExtentToRef(result: Vector3): void { +// const p = this.navMesh.getDefaultQueryExtent(); +// result.set(p.x, p.y, p.z); +// } + +// /** +// * Disposes +// */ +// public dispose() {} + +// /** +// * Creates a cylinder obstacle and add it to the navigation +// * @param position world position +// * @param radius cylinder radius +// * @param height cylinder height +// * @returns the obstacle freshly created +// */ +// addCylinderObstacle(position: Vector3, radius: number, height: number): IObstacle { +// this._tempVec1.x = position.x; +// this._tempVec1.y = position.y; +// this._tempVec1.z = position.z; +// return this.navMesh.addCylinderObstacle(this._tempVec1, radius, height); +// } + +// /** +// * Creates an oriented box obstacle and add it to the navigation +// * @param position world position +// * @param extent box size +// * @param angle angle in radians of the box orientation on Y axis +// * @returns the obstacle freshly created +// */ +// addBoxObstacle(position: Vector3, extent: Vector3, angle: number): IObstacle { +// this._tempVec1.x = position.x; +// this._tempVec1.y = position.y; +// this._tempVec1.z = position.z; +// this._tempVec2.x = extent.x; +// this._tempVec2.y = extent.y; +// this._tempVec2.z = extent.z; +// return this.navMesh.addBoxObstacle(this._tempVec1, this._tempVec2, angle); +// } + +// /** +// * Removes an obstacle created by addCylinderObstacle or addBoxObstacle +// * @param obstacle obstacle to remove from the navigation +// */ +// removeObstacle(obstacle: IObstacle): void { +// this.navMesh.removeObstacle(obstacle); +// } + +// /** +// * If this plugin is supported +// * @returns true if plugin is supported +// */ +// public isSupported(): boolean { +// return this.bjsRECAST !== undefined; +// } + +// /** +// * Returns the seed used for randomized functions like `getRandomPointAround` +// * @returns seed number +// */ +// public getRandomSeed(): number { +// return this.bjsRECAST._getRandomSeed(); +// } + +// /** +// * Set the seed used for randomized functions like `getRandomPointAround` +// * @param seed number used as seed for random functions +// */ +// public setRandomSeed(seed: number): void { +// this.bjsRECAST._setRandomSeed(seed); +// } +// } + +// /** +// * Recast detour crowd implementation +// */ +// export class RecastJSCrowd implements ICrowd { +// /** +// * Recast/detour plugin +// */ +// public bjsRECASTPlugin: RecastJSPlugin; +// /** +// * Link to the detour crowd +// */ +// public recastCrowd: any = {}; +// /** +// * One transform per agent +// */ +// public transforms: TransformNode[] = new Array(); +// /** +// * All agents created +// */ +// public agents: number[] = new Array(); +// /** +// * agents reach radius +// */ +// public reachRadii: number[] = new Array(); +// /** +// * true when a destination is active for an agent and notifier hasn't been notified of reach +// */ +// private _agentDestinationArmed: boolean[] = new Array(); +// /** +// * agent current target +// */ +// private _agentDestination: Vector3[] = new Array(); +// /** +// * Link to the scene is kept to unregister the crowd from the scene +// */ +// private _scene: Scene; + +// /** +// * Observer for crowd updates +// */ +// private _onBeforeAnimationsObserver: Nullable> = null; + +// /** +// * Fires each time an agent is in reach radius of its destination +// */ +// public onReachTargetObservable = new Observable<{ agentIndex: number; destination: Vector3 }>(); + +// /** +// * Constructor +// * @param plugin recastJS plugin +// * @param maxAgents the maximum agent count in the crowd +// * @param maxAgentRadius the maximum radius an agent can have +// * @param scene to attach the crowd to +// * @returns the crowd you can add agents to +// */ +// public constructor(plugin: RecastJSPlugin, maxAgents: number, maxAgentRadius: number, scene: Scene) { +// this.bjsRECASTPlugin = plugin; +// this.recastCrowd = new this.bjsRECASTPlugin.bjsRECAST.Crowd(maxAgents, maxAgentRadius, this.bjsRECASTPlugin.navMesh.getNavMesh()); +// this._scene = scene; + +// this._onBeforeAnimationsObserver = scene.onBeforeAnimationsObservable.add(() => { +// this.update(scene.getEngine().getDeltaTime() * 0.001 * plugin.timeFactor); +// }); +// } + +// /** +// * Add a new agent to the crowd with the specified parameter a corresponding transformNode. +// * You can attach anything to that node. The node position is updated in the scene update tick. +// * @param pos world position that will be constrained by the navigation mesh +// * @param parameters agent parameters +// * @param transform hooked to the agent that will be update by the scene +// * @returns agent index +// */ +// addAgent(pos: Vector3, parameters: IAgentParameters, transform: TransformNode): number { +// const agentParams = new this.bjsRECASTPlugin.bjsRECAST.dtCrowdAgentParams(); +// agentParams.radius = parameters.radius; +// agentParams.height = parameters.height; +// agentParams.maxAcceleration = parameters.maxAcceleration; +// agentParams.maxSpeed = parameters.maxSpeed; +// agentParams.collisionQueryRange = parameters.collisionQueryRange; +// agentParams.pathOptimizationRange = parameters.pathOptimizationRange; +// agentParams.separationWeight = parameters.separationWeight; +// agentParams.updateFlags = 7; +// agentParams.obstacleAvoidanceType = 0; +// agentParams.queryFilterType = 0; +// agentParams.userData = 0; + +// const agentIndex = this.recastCrowd.addAgent(new this.bjsRECASTPlugin.bjsRECAST.Vec3(pos.x, pos.y, pos.z), agentParams); +// this.transforms.push(transform); +// this.agents.push(agentIndex); +// this.reachRadii.push(parameters.reachRadius ? parameters.reachRadius : parameters.radius); +// this._agentDestinationArmed.push(false); +// this._agentDestination.push(new Vector3(0, 0, 0)); +// return agentIndex; +// } + +// /** +// * Returns the agent position in world space +// * @param index agent index returned by addAgent +// * @returns world space position +// */ +// getAgentPosition(index: number): Vector3 { +// const agentPos = this.recastCrowd.getAgentPosition(index); +// return new Vector3(agentPos.x, agentPos.y, agentPos.z); +// } + +// /** +// * Returns the agent position result in world space +// * @param index agent index returned by addAgent +// * @param result output world space position +// */ +// getAgentPositionToRef(index: number, result: Vector3): void { +// const agentPos = this.recastCrowd.getAgentPosition(index); +// result.set(agentPos.x, agentPos.y, agentPos.z); +// } + +// /** +// * Returns the agent velocity in world space +// * @param index agent index returned by addAgent +// * @returns world space velocity +// */ +// getAgentVelocity(index: number): Vector3 { +// const agentVel = this.recastCrowd.getAgentVelocity(index); +// return new Vector3(agentVel.x, agentVel.y, agentVel.z); +// } + +// /** +// * Returns the agent velocity result in world space +// * @param index agent index returned by addAgent +// * @param result output world space velocity +// */ +// getAgentVelocityToRef(index: number, result: Vector3): void { +// const agentVel = this.recastCrowd.getAgentVelocity(index); +// result.set(agentVel.x, agentVel.y, agentVel.z); +// } + +// /** +// * Returns the agent next target point on the path +// * @param index agent index returned by addAgent +// * @returns world space position +// */ +// getAgentNextTargetPath(index: number): Vector3 { +// const pathTargetPos = this.recastCrowd.getAgentNextTargetPath(index); +// return new Vector3(pathTargetPos.x, pathTargetPos.y, pathTargetPos.z); +// } + +// /** +// * Returns the agent next target point on the path +// * @param index agent index returned by addAgent +// * @param result output world space position +// */ +// getAgentNextTargetPathToRef(index: number, result: Vector3): void { +// const pathTargetPos = this.recastCrowd.getAgentNextTargetPath(index); +// result.set(pathTargetPos.x, pathTargetPos.y, pathTargetPos.z); +// } + +// /** +// * Gets the agent state +// * @param index agent index returned by addAgent +// * @returns agent state +// */ +// getAgentState(index: number): number { +// return this.recastCrowd.getAgentState(index); +// } + +// /** +// * returns true if the agent in over an off mesh link connection +// * @param index agent index returned by addAgent +// * @returns true if over an off mesh link connection +// */ +// overOffmeshConnection(index: number): boolean { +// return this.recastCrowd.overOffmeshConnection(index); +// } + +// /** +// * Asks a particular agent to go to a destination. That destination is constrained by the navigation mesh +// * @param index agent index returned by addAgent +// * @param destination targeted world position +// */ +// agentGoto(index: number, destination: Vector3): void { +// this.recastCrowd.agentGoto(index, new this.bjsRECASTPlugin.bjsRECAST.Vec3(destination.x, destination.y, destination.z)); + +// // arm observer +// const item = this.agents.indexOf(index); +// if (item > -1) { +// this._agentDestinationArmed[item] = true; +// this._agentDestination[item].set(destination.x, destination.y, destination.z); +// } +// } + +// /** +// * Teleport the agent to a new position +// * @param index agent index returned by addAgent +// * @param destination targeted world position +// */ +// agentTeleport(index: number, destination: Vector3): void { +// this.recastCrowd.agentTeleport(index, new this.bjsRECASTPlugin.bjsRECAST.Vec3(destination.x, destination.y, destination.z)); +// } + +// /** +// * Update agent parameters +// * @param index agent index returned by addAgent +// * @param parameters agent parameters +// */ +// updateAgentParameters(index: number, parameters: IAgentParameters): void { +// const agentParams = this.recastCrowd.getAgentParameters(index); + +// if (parameters.radius !== undefined) { +// agentParams.radius = parameters.radius; +// } +// if (parameters.height !== undefined) { +// agentParams.height = parameters.height; +// } +// if (parameters.maxAcceleration !== undefined) { +// agentParams.maxAcceleration = parameters.maxAcceleration; +// } +// if (parameters.maxSpeed !== undefined) { +// agentParams.maxSpeed = parameters.maxSpeed; +// } +// if (parameters.collisionQueryRange !== undefined) { +// agentParams.collisionQueryRange = parameters.collisionQueryRange; +// } +// if (parameters.pathOptimizationRange !== undefined) { +// agentParams.pathOptimizationRange = parameters.pathOptimizationRange; +// } +// if (parameters.separationWeight !== undefined) { +// agentParams.separationWeight = parameters.separationWeight; +// } + +// this.recastCrowd.setAgentParameters(index, agentParams); +// } + +// /** +// * remove a particular agent previously created +// * @param index agent index returned by addAgent +// */ +// removeAgent(index: number): void { +// this.recastCrowd.removeAgent(index); + +// const item = this.agents.indexOf(index); +// if (item > -1) { +// this.agents.splice(item, 1); +// this.transforms.splice(item, 1); +// this.reachRadii.splice(item, 1); +// this._agentDestinationArmed.splice(item, 1); +// this._agentDestination.splice(item, 1); +// } +// } + +// /** +// * get the list of all agents attached to this crowd +// * @returns list of agent indices +// */ +// getAgents(): number[] { +// return this.agents; +// } + +// /** +// * Tick update done by the Scene. Agent position/velocity/acceleration is updated by this function +// * @param deltaTime in seconds +// */ +// update(deltaTime: number): void { +// // update obstacles +// this.bjsRECASTPlugin.navMesh.update(); + +// if (deltaTime <= Epsilon) { +// return; +// } +// // update crowd +// const timeStep = this.bjsRECASTPlugin.getTimeStep(); +// const maxStepCount = this.bjsRECASTPlugin.getMaximumSubStepCount(); +// if (timeStep <= Epsilon) { +// this.recastCrowd.update(deltaTime); +// } else { +// let iterationCount = Math.floor(deltaTime / timeStep); +// if (maxStepCount && iterationCount > maxStepCount) { +// iterationCount = maxStepCount; +// } +// if (iterationCount < 1) { +// iterationCount = 1; +// } + +// const step = deltaTime / iterationCount; +// for (let i = 0; i < iterationCount; i++) { +// this.recastCrowd.update(step); +// } +// } + +// // update transforms +// for (let index = 0; index < this.agents.length; index++) { +// // update transform position +// const agentIndex = this.agents[index]; +// const agentPosition = this.getAgentPosition(agentIndex); +// this.transforms[index].position = agentPosition; +// // check agent reach destination +// if (this._agentDestinationArmed[index]) { +// const dx = agentPosition.x - this._agentDestination[index].x; +// const dz = agentPosition.z - this._agentDestination[index].z; +// const radius = this.reachRadii[index]; +// const groundY = this._agentDestination[index].y - this.reachRadii[index]; +// const ceilingY = this._agentDestination[index].y + this.reachRadii[index]; +// const distanceXZSquared = dx * dx + dz * dz; +// if (agentPosition.y > groundY && agentPosition.y < ceilingY && distanceXZSquared < radius * radius) { +// this._agentDestinationArmed[index] = false; +// this.onReachTargetObservable.notifyObservers({ agentIndex: agentIndex, destination: this._agentDestination[index] }); +// } +// } +// } +// } + +// /** +// * Set the Bounding box extent for doing spatial queries (getClosestPoint, getRandomPointAround, ...) +// * The queries will try to find a solution within those bounds +// * default is (1,1,1) +// * @param extent x,y,z value that define the extent around the queries point of reference +// */ +// setDefaultQueryExtent(extent: Vector3): void { +// const ext = new this.bjsRECASTPlugin.bjsRECAST.Vec3(extent.x, extent.y, extent.z); +// this.recastCrowd.setDefaultQueryExtent(ext); +// } + +// /** +// * Get the Bounding box extent specified by setDefaultQueryExtent +// * @returns the box extent values +// */ +// getDefaultQueryExtent(): Vector3 { +// const p = this.recastCrowd.getDefaultQueryExtent(); +// return new Vector3(p.x, p.y, p.z); +// } + +// /** +// * Get the Bounding box extent result specified by setDefaultQueryExtent +// * @param result output the box extent values +// */ +// getDefaultQueryExtentToRef(result: Vector3): void { +// const p = this.recastCrowd.getDefaultQueryExtent(); +// result.set(p.x, p.y, p.z); +// } + +// /** +// * Get the next corner points composing the path (max 4 points) +// * @param index agent index returned by addAgent +// * @returns array containing world position composing the path +// */ +// getCorners(index: number): Vector3[] { +// let pt: number; +// const navPath = this.recastCrowd.getCorners(index); +// const pointCount = navPath.getPointCount(); +// const positions = []; +// for (pt = 0; pt < pointCount; pt++) { +// const p = navPath.getPoint(pt); +// positions.push(new Vector3(p.x, p.y, p.z)); +// } +// return positions; +// } + +// /** +// * Release all resources +// */ +// dispose(): void { +// this.recastCrowd.destroy(); +// this._scene.onBeforeAnimationsObservable.remove(this._onBeforeAnimationsObserver); +// this._onBeforeAnimationsObserver = null; +// this.onReachTargetObservable.clear(); +// } +// } diff --git a/packages/dev/core/src/Offline/database.ts b/packages/dev/core/src/Offline/database.ts index 7e15a0aaf40..28feac69567 100644 --- a/packages/dev/core/src/Offline/database.ts +++ b/packages/dev/core/src/Offline/database.ts @@ -289,7 +289,13 @@ export class Database implements IOfflineProvider { transaction.oncomplete = () => { let blobTextureURL: string; if (texture && typeof URL === "function") { - blobTextureURL = URL.createObjectURL(texture.data); + // check if data is an array buffer and create a Blob if it is + let data = texture.data; + if (texture.data instanceof ArrayBuffer) { + const blob = new Blob([texture.data], { type: "image/png" }); + data = blob; + } + blobTextureURL = URL.createObjectURL(data); image.onerror = () => { Logger.Error("Error loading image from blob URL: " + blobTextureURL + " switching back to web url: " + url); image.src = url; @@ -540,7 +546,7 @@ export class Database implements IOfflineProvider { private _loadFile(url: string, callback: (data?: any) => void, notInDBCallback: () => void, progressCallBack?: (data: any) => void) { if (this._isSupported && this._db) { let targetStore: string; - if (url.indexOf(".babylon") !== -1) { + if (url.split("?")[0].endsWith(".babylon")) { targetStore = "scenes"; } else { targetStore = "textures"; @@ -550,16 +556,28 @@ export class Database implements IOfflineProvider { const transaction = this._db.transaction([targetStore]); transaction.oncomplete = () => { - if (file) { + function loadArrayBuffer(arrayBuffer: ArrayBuffer) { if (progressCallBack) { - const numberToLoad = file.data?.byteLength || 0; + const numberToLoad = arrayBuffer.byteLength || 0; progressCallBack({ total: numberToLoad, loaded: numberToLoad, lengthComputable: true, }); } - callback(file.data); + callback(arrayBuffer); + } + if (file) { + // check if data is a Blob, and get the array Data from the blob if it is + if (file.data instanceof Blob) { + const reader = new FileReader(); + reader.onload = (ev) => { + loadArrayBuffer(ev.target?.result as ArrayBuffer); + }; + reader.readAsArrayBuffer(file.data); + } else { + loadArrayBuffer(file.data); + } } // file was not found in DB else { @@ -595,7 +613,7 @@ export class Database implements IOfflineProvider { ) { if (this._isSupported) { let targetStore: string; - if (url.indexOf(".babylon") !== -1) { + if (url.split("?")[0].endsWith(".babylon")) { targetStore = "scenes"; } else { targetStore = "textures"; diff --git a/packages/dev/core/src/Particles/flowMap.ts b/packages/dev/core/src/Particles/flowMap.ts index 3893a1b7ad4..d3a0a3d0395 100644 --- a/packages/dev/core/src/Particles/flowMap.ts +++ b/packages/dev/core/src/Particles/flowMap.ts @@ -1,11 +1,26 @@ -import { Vector3 } from "core/Maths/math.vector"; -import type { Particle } from "./particle"; -import type { ThinParticleSystem } from "./thinParticleSystem"; +import { Matrix, Vector3 } from "../Maths/math.vector"; +import type { Particle } from "../Particles/particle"; +import type { IVector3Like } from "../Maths/math.like"; const FlowVector = new Vector3(0, 0, 0); const ScaledFlowVector = new Vector3(0, 0, 0); const ScreenPos = new Vector3(0, 0, 0); +/** + * Represents an object that can move or be influenced by FlowMap + */ +export interface IFlowable { + /** + * The direction vector indicating the flow or movement direction of the object. + */ + direction: Vector3; + + /** + * The current position of the object in 3D space. + */ + position: Vector3; +} + /** * Class used to represent a particle flow map. * #5DM02T#7 @@ -25,12 +40,19 @@ export class FlowMap { public readonly data: Uint8ClampedArray ) {} - /** @internal */ - public _processParticle(particle: Particle, system: ThinParticleSystem, strength = 1) { - const scene = system.getScene()!; + public processFlowable(flowable: IFlowable, strength = 1, flowMapSamplePosOrTransformationMatrix?: IVector3Like | Matrix) { + if (!flowMapSamplePosOrTransformationMatrix) { + return; + } // Convert world pos to screen pos - Vector3.TransformCoordinatesToRef(particle.position, scene.getTransformMatrix(), ScreenPos); + if (flowMapSamplePosOrTransformationMatrix instanceof Matrix) { + Vector3.TransformCoordinatesToRef(flowable.position, flowMapSamplePosOrTransformationMatrix, ScreenPos); + } else { + ScreenPos.x = flowMapSamplePosOrTransformationMatrix.x; + ScreenPos.y = flowMapSamplePosOrTransformationMatrix.y; + ScreenPos.z = flowMapSamplePosOrTransformationMatrix.z; + } const u = ScreenPos.x * 0.5 + 0.5; const v = 1.0 - (ScreenPos.y * 0.5 + 0.5); @@ -55,9 +77,14 @@ export class FlowMap { const localStrength = a / 255.0; FlowVector.set(fx, fy, fz); - FlowVector.scaleToRef(system._tempScaledUpdateSpeed * strength * localStrength, ScaledFlowVector); + FlowVector.scaleToRef(strength * localStrength, ScaledFlowVector); + + flowable.direction.addInPlace(ScaledFlowVector); // Update IFlowable velocity + } - particle.direction.addInPlace(ScaledFlowVector); // Update particle velocity + /** @internal */ + public _processParticle(particle: Particle, strength = 1, matrix?: Matrix) { + this.processFlowable(particle, strength, matrix); } /** @@ -66,7 +93,7 @@ export class FlowMap { * @returns a promise that resolves to a FlowMap object */ public static async FromUrlAsync(url: string): Promise { - return new Promise((resolve, reject) => { + return await new Promise((resolve, reject) => { const flowCanvas = document.createElement("canvas"); const flowCtx = flowCanvas.getContext("2d")!; let flowImageData = null; diff --git a/packages/dev/core/src/Particles/particleHelper.ts b/packages/dev/core/src/Particles/particleHelper.ts index 11adb5563f3..fda74726fa0 100644 --- a/packages/dev/core/src/Particles/particleHelper.ts +++ b/packages/dev/core/src/Particles/particleHelper.ts @@ -75,6 +75,7 @@ export class ParticleHelper { * @param capacity defines the system capacity (if null or undefined the sotred capacity will be used) * @returns the ParticleSystemSet created */ + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax public static CreateAsync(type: string, scene: Nullable, gpu: boolean = false, capacity?: number): Promise { if (!scene) { scene = EngineStore.LastCreatedScene; @@ -87,6 +88,7 @@ export class ParticleHelper { return new Promise((resolve, reject) => { if (gpu && !GPUParticleSystem.IsSupported) { scene!.removePendingData(token); + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors return reject("Particle system with GPU is not supported."); } @@ -102,6 +104,7 @@ export class ParticleHelper { undefined, () => { scene!.removePendingData(token); + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors return reject(`An error occurred with the creation of your particle system. Check if your type '${type}' exists.`); } ); @@ -134,6 +137,7 @@ export class ParticleHelper { * @param capacity defines the system capacity (if null or undefined the sotred capacity will be used) * @returns a promise that will resolve to the new particle system */ + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax public static ParseFromFileAsync(name: Nullable, url: string, scene: Scene, gpu: boolean = false, rootUrl: string = "", capacity?: number): Promise { return new Promise((resolve, reject) => { const request = new WebRequest(); @@ -155,6 +159,7 @@ export class ParticleHelper { resolve(output); } else { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject("Unable to load the particle system"); } } @@ -174,6 +179,7 @@ export class ParticleHelper { * @param capacity defines the system capacity (if null or undefined the sotred capacity will be used) * @returns a promise that will resolve to the new particle system */ + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax public static ParseFromSnippetAsync(snippetId: string, scene: Scene, gpu: boolean = false, rootUrl: string = "", capacity?: number): Promise { if (snippetId === "_BLANK") { const system = this.CreateDefault(null); @@ -199,6 +205,7 @@ export class ParticleHelper { resolve(output); } else { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject("Unable to load the snippet " + snippetId); } } diff --git a/packages/dev/core/src/Particles/particleSystem.ts b/packages/dev/core/src/Particles/particleSystem.ts index 3487667d9b6..5b43f044bfe 100644 --- a/packages/dev/core/src/Particles/particleSystem.ts +++ b/packages/dev/core/src/Particles/particleSystem.ts @@ -118,9 +118,10 @@ export class ParticleSystem extends ThinParticleSystem { this._flowMapUpdate = null; } if (value) { + const matrix = this.getScene()?.getTransformMatrix(); this._flowMapUpdate = { process: (particle: Particle) => { - this._flowMap!._processParticle(particle, this, this.flowMapStrength); + this._flowMap!._processParticle(particle, this.flowMapStrength * this._tempScaledUpdateSpeed, matrix); }, previousItem: null, nextItem: null, diff --git a/packages/dev/core/src/Particles/pointsCloudSystem.ts b/packages/dev/core/src/Particles/pointsCloudSystem.ts index cc6312b0fc1..68c411fb51c 100644 --- a/packages/dev/core/src/Particles/pointsCloudSystem.ts +++ b/packages/dev/core/src/Particles/pointsCloudSystem.ts @@ -136,14 +136,13 @@ export class PointsCloudSystem implements IDisposable { * @param material The material to use to render the mesh. If not provided, will create a default one * @returns a promise for the created mesh */ - public buildMeshAsync(material?: Material): Promise { - return Promise.all(this._promises).then(async () => { - this._isReady = true; - return this._buildMeshAsync(material); - }); + public async buildMeshAsync(material?: Material): Promise { + await Promise.all(this._promises); + this._isReady = true; + return await this._buildMeshAsync(material); } - private _buildMeshAsync(material?: Material): Promise { + private async _buildMeshAsync(material?: Material): Promise { if (this.nbParticles === 0) { this.addPoints(1); } @@ -187,7 +186,7 @@ export class PointsCloudSystem implements IDisposable { } mesh.material = mat; - return new Promise((resolve) => resolve(mesh)); + return mesh; } // adds a new particle object in the particles array @@ -524,6 +523,7 @@ export class PointsCloudSystem implements IDisposable { if (!dataPromise) { finalize(); } else { + // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then dataPromise.then((data) => { pointsGroup._groupImageData = data; finalize(); diff --git a/packages/dev/core/src/Particles/thinParticleSystem.ts b/packages/dev/core/src/Particles/thinParticleSystem.ts index 024ffeb94b4..c7ae4ed133a 100644 --- a/packages/dev/core/src/Particles/thinParticleSystem.ts +++ b/packages/dev/core/src/Particles/thinParticleSystem.ts @@ -540,6 +540,7 @@ export class ThinParticleSystem extends BaseParticleSystem implements IDisposabl this._vertexArrayObject = null; } + // eslint-disable-next-line @typescript-eslint/no-floating-promises this._initShaderSourceAsync(); // Creation queue @@ -654,6 +655,7 @@ export class ThinParticleSystem extends BaseParticleSystem implements IDisposabl if (this.noiseTexture) { // We need to get texture data back to CPU this._noiseTextureSize = this.noiseTexture.getSize(); + // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then this.noiseTexture.getContent()?.then((data) => { this._noiseTextureData = data as Uint8Array; }); diff --git a/packages/dev/core/src/Physics/physicsHelper.ts b/packages/dev/core/src/Physics/physicsHelper.ts index df29189880e..98f2c6acd14 100644 --- a/packages/dev/core/src/Physics/physicsHelper.ts +++ b/packages/dev/core/src/Physics/physicsHelper.ts @@ -782,7 +782,7 @@ class PhysicsUpdraftEvent { const impostors = (this._physicsEngine).getImpostors(); for (const impostor of impostors) { if (!this._getImpostorHitData(impostor, hitData)) { - return; + continue; } impostor.applyForce(hitData.force, hitData.contactPoint); @@ -997,7 +997,7 @@ class PhysicsVortexEvent { const impostors = (this._physicsEngine).getImpostors(); for (const impostor of impostors) { if (!this._getImpostorHitData(impostor, hitData)) { - return; + continue; } impostor.applyForce(hitData.force, hitData.contactPoint); diff --git a/packages/dev/core/src/Physics/v1/Plugins/oimoJSPlugin.ts b/packages/dev/core/src/Physics/v1/Plugins/oimoJSPlugin.ts index eb6a2969cd2..2a7206540b2 100644 --- a/packages/dev/core/src/Physics/v1/Plugins/oimoJSPlugin.ts +++ b/packages/dev/core/src/Physics/v1/Plugins/oimoJSPlugin.ts @@ -156,7 +156,7 @@ export class OimoJSPlugin implements IPhysicsEnginePlugin { for (const i of impostors) { if (!i.object.rotationQuaternion) { - return; + continue; } //get the correct bounding box const oldQuaternion = i.object.rotationQuaternion; diff --git a/packages/dev/core/src/PostProcesses/RenderPipeline/Pipelines/ssrRenderingPipeline.ts b/packages/dev/core/src/PostProcesses/RenderPipeline/Pipelines/ssrRenderingPipeline.ts index ade0e312b9c..9531376a121 100644 --- a/packages/dev/core/src/PostProcesses/RenderPipeline/Pipelines/ssrRenderingPipeline.ts +++ b/packages/dev/core/src/PostProcesses/RenderPipeline/Pipelines/ssrRenderingPipeline.ts @@ -747,9 +747,6 @@ export class SSRRenderingPipeline extends PostProcessRenderPipeline { !this._useScreenspaceDepth, "SSRBackDepth" ); - if (!this._useScreenspaceDepth) { - this._depthRenderer.clearColor.r = 1e8; // "infinity": put a big value because we use the storeCameraSpaceZ mode - } this._depthRenderer.reverseCulling = true; // we generate depth for the back faces this._depthRenderer.forceDepthWriteTransparentMeshes = this.backfaceForceDepthWriteTransparentMeshes; diff --git a/packages/dev/core/src/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.ts b/packages/dev/core/src/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.ts index 1f2f39e31da..3e796315bfa 100644 --- a/packages/dev/core/src/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.ts +++ b/packages/dev/core/src/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.ts @@ -1214,6 +1214,7 @@ export class StandardRenderingPipeline extends PostProcessRenderPipeline impleme pp.onAfterRender = () => { const pixel = scene.getEngine().readPixels(0, 0, 1, 1); const bit_shift = new Vector4(1.0 / (255.0 * 255.0 * 255.0), 1.0 / (255.0 * 255.0), 1.0 / 255.0, 1.0); + // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then pixel.then((pixel) => { const data = new Uint8Array(pixel.buffer); this._hdrCurrentLuminance = (data[0] * bit_shift.x + data[1] * bit_shift.y + data[2] * bit_shift.z + data[3] * bit_shift.w) / 100.0; diff --git a/packages/dev/core/src/PostProcesses/index.ts b/packages/dev/core/src/PostProcesses/index.ts index 80bb01b5eff..92234a476f7 100644 --- a/packages/dev/core/src/PostProcesses/index.ts +++ b/packages/dev/core/src/PostProcesses/index.ts @@ -44,6 +44,7 @@ export * from "./thinExtractHighlightsPostProcess"; export * from "./thinFXAAPostProcess"; export * from "./thinGrainPostProcess"; export * from "./thinImageProcessingPostProcess"; +export * from "./thinMotionBlurPostProcess"; export * from "./thinPassPostProcess"; // Postprocess diff --git a/packages/dev/core/src/PostProcesses/motionBlurPostProcess.ts b/packages/dev/core/src/PostProcesses/motionBlurPostProcess.ts index 67b3c969869..73f108240ef 100644 --- a/packages/dev/core/src/PostProcesses/motionBlurPostProcess.ts +++ b/packages/dev/core/src/PostProcesses/motionBlurPostProcess.ts @@ -1,6 +1,5 @@ import type { Nullable } from "../types"; import { Logger } from "../Misc/logger"; -import { Matrix, TmpVectors, Vector2 } from "../Maths/math.vector"; import type { Camera } from "../Cameras/camera"; import type { Effect } from "../Materials/effect"; import type { PostProcessOptions } from "./postProcess"; @@ -19,6 +18,7 @@ import { RegisterClass } from "../Misc/typeStore"; import type { AbstractEngine } from "../Engines/abstractEngine"; import type { Scene } from "../scene"; +import { ThinMotionBlurPostProcess } from "./thinMotionBlurPostProcess"; /** * The Motion Blur Post Process which blurs an image based on the objects velocity in scene. @@ -37,48 +37,49 @@ export class MotionBlurPostProcess extends PostProcess { * Defines how much the image is blurred by the movement. Default value is equal to 1 */ @serialize() - public motionStrength: number = 1; + public get motionStrength() { + return this._effectWrapper.motionStrength; + } + + public set motionStrength(value: number) { + this._effectWrapper.motionStrength = value; + } /** * Gets the number of iterations are used for motion blur quality. Default value is equal to 32 */ @serialize() public get motionBlurSamples(): number { - return this._motionBlurSamples; + return this._effectWrapper.motionBlurSamples; } /** * Sets the number of iterations to be used for motion blur quality */ public set motionBlurSamples(samples: number) { - this._motionBlurSamples = samples; - this._updateEffect(); + this._effectWrapper.motionBlurSamples = samples; } - private _motionBlurSamples: number = 32; - /** * Gets whether or not the motion blur post-process is in object based mode. */ @serialize() public get isObjectBased(): boolean { - return this._isObjectBased; + return this._effectWrapper.isObjectBased; } /** * Sets whether or not the motion blur post-process is in object based mode. */ public set isObjectBased(value: boolean) { - if (this._isObjectBased === value) { + if (this.isObjectBased === value) { return; } - this._isObjectBased = value; + this._effectWrapper.isObjectBased = value; this._applyMode(); } - private _isObjectBased: boolean = true; - private _forceGeometryBuffer: boolean = false; private get _geometryBufferRenderer(): Nullable { if (!this._forceGeometryBuffer) { @@ -96,9 +97,6 @@ export class MotionBlurPostProcess extends PostProcess { return this._scene.prePassRenderer; } - private _invViewProjection: Nullable = null; - private _previousViewProjection: Nullable = null; - /** * Gets a string identifying the name of the class * @returns "MotionBlurPostProcess" string @@ -107,6 +105,8 @@ export class MotionBlurPostProcess extends PostProcess { return "MotionBlurPostProcess"; } + protected override _effectWrapper: ThinMotionBlurPostProcess; + /** * Creates a new instance MotionBlurPostProcess * @param name The name of the effect. @@ -132,22 +132,24 @@ export class MotionBlurPostProcess extends PostProcess { blockCompilation = false, forceGeometryBuffer = false ) { - super( - name, - "motionBlur", - ["motionStrength", "motionScale", "screenSize", "inverseViewProjection", "prevViewProjection", "projection"], - ["velocitySampler", "depthSampler"], - options, + const localOptions = { + uniforms: ThinMotionBlurPostProcess.Uniforms, + samplers: ThinMotionBlurPostProcess.Samplers, + defines: ThinMotionBlurPostProcess.Defines, + size: typeof options === "number" ? options : undefined, camera, samplingMode, engine, reusable, - "#define GEOMETRY_SUPPORTED\n#define SAMPLES 64.0\n#define OBJECT_BASED", textureType, - undefined, - null, - blockCompilation - ); + blockCompilation, + ...(options as PostProcessOptions), + }; + + super(name, ThinMotionBlurPostProcess.FragmentUrl, { + effectWrapper: typeof options === "number" || !options.effectWrapper ? new ThinMotionBlurPostProcess(name, scene, localOptions) : undefined, + ...localOptions, + }); this._forceGeometryBuffer = forceGeometryBuffer; @@ -156,7 +158,7 @@ export class MotionBlurPostProcess extends PostProcess { scene.enableGeometryBufferRenderer(); if (this._geometryBufferRenderer) { - this._geometryBufferRenderer.enableVelocity = this._isObjectBased; + this._geometryBufferRenderer.enableVelocity = this.isObjectBased; } } else { scene.enablePrePassRenderer(); @@ -170,17 +172,6 @@ export class MotionBlurPostProcess extends PostProcess { this._applyMode(); } - protected override _gatherImports(useWebGPU: boolean, list: Promise[]) { - if (useWebGPU) { - this._webGPUReady = true; - list.push(Promise.all([import("../ShadersWGSL/motionBlur.fragment")])); - } else { - list.push(Promise.all([import("../Shaders/motionBlur.fragment")])); - } - - super._gatherImports(useWebGPU, list); - } - /** * Excludes the given skinned mesh from computing bones velocities. * Computing bones velocities can have a cost and that cost. The cost can be saved by calling this function and by passing the skinned mesh reference to ignore. @@ -240,24 +231,18 @@ export class MotionBlurPostProcess extends PostProcess { /** * Called on the mode changed (object based or screen based). - * @returns void */ private _applyMode() { if (!this._geometryBufferRenderer && !this._prePassRenderer) { // We can't get a velocity or depth texture. So, work as a passthrough. Logger.Warn("Multiple Render Target support needed to compute object based motion blur"); - return this.updateEffect(); + return; } if (this._geometryBufferRenderer) { - this._geometryBufferRenderer.enableVelocity = this._isObjectBased; + this._geometryBufferRenderer.enableVelocity = this.isObjectBased; } - this._updateEffect(); - - this._invViewProjection = null; - this._previousViewProjection = null; - if (this.isObjectBased) { if (this._prePassRenderer && this._prePassEffectConfiguration) { this._prePassEffectConfiguration.texturesRequired[0] = Constants.PREPASS_VELOCITY_TEXTURE_TYPE; @@ -265,9 +250,6 @@ export class MotionBlurPostProcess extends PostProcess { this.onApply = (effect: Effect) => this._onApplyObjectBased(effect); } else { - this._invViewProjection = Matrix.Identity(); - this._previousViewProjection = this._scene.getTransformMatrix().clone(); - if (this._prePassRenderer && this._prePassEffectConfiguration) { this._prePassEffectConfiguration.texturesRequired[0] = Constants.PREPASS_DEPTH_TEXTURE_TYPE; } @@ -281,11 +263,8 @@ export class MotionBlurPostProcess extends PostProcess { * @param effect */ private _onApplyObjectBased(effect: Effect): void { - effect.setVector2("screenSize", new Vector2(this.width, this.height)); - - effect.setFloat("motionScale", this._scene.getAnimationRatio()); - effect.setFloat("motionStrength", this.motionStrength); - + this._effectWrapper.textureWidth = this.width; + this._effectWrapper.textureHeight = this.height; if (this._geometryBufferRenderer) { const velocityIndex = this._geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.VELOCITY_TEXTURE_TYPE); effect.setTexture("velocitySampler", this._geometryBufferRenderer.getGBuffer().textures[velocityIndex]); @@ -300,22 +279,8 @@ export class MotionBlurPostProcess extends PostProcess { * @param effect */ private _onApplyScreenBased(effect: Effect): void { - const viewProjection = TmpVectors.Matrix[0]; - viewProjection.copyFrom(this._scene.getTransformMatrix()); - - viewProjection.invertToRef(this._invViewProjection!); - effect.setMatrix("inverseViewProjection", this._invViewProjection!); - - effect.setMatrix("prevViewProjection", this._previousViewProjection!); - this._previousViewProjection!.copyFrom(viewProjection); - - effect.setMatrix("projection", this._scene.getProjectionMatrix()); - - effect.setVector2("screenSize", new Vector2(this.width, this.height)); - - effect.setFloat("motionScale", this._scene.getAnimationRatio()); - effect.setFloat("motionStrength", this.motionStrength); - + this._effectWrapper.textureWidth = this.width; + this._effectWrapper.textureHeight = this.height; if (this._geometryBufferRenderer) { const depthIndex = this._geometryBufferRenderer.getTextureIndex(GeometryBufferRenderer.DEPTH_TEXTURE_TYPE); effect.setTexture("depthSampler", this._geometryBufferRenderer.getGBuffer().textures[depthIndex]); @@ -325,21 +290,6 @@ export class MotionBlurPostProcess extends PostProcess { } } - /** - * Called on the effect must be updated (changed mode, samples count, etc.). - */ - private _updateEffect(): void { - if (this._geometryBufferRenderer || this._prePassRenderer) { - const defines: string[] = [ - "#define GEOMETRY_SUPPORTED", - "#define SAMPLES " + this._motionBlurSamples.toFixed(1), - this._isObjectBased ? "#define OBJECT_BASED" : "#define SCREEN_BASED", - ]; - - this.updateEffect(defines.join("\n")); - } - } - /** * @internal */ diff --git a/packages/dev/core/src/PostProcesses/thinMotionBlurPostProcess.ts b/packages/dev/core/src/PostProcesses/thinMotionBlurPostProcess.ts new file mode 100644 index 00000000000..94a53633e93 --- /dev/null +++ b/packages/dev/core/src/PostProcesses/thinMotionBlurPostProcess.ts @@ -0,0 +1,157 @@ +// eslint-disable-next-line import/no-internal-modules +import type { EffectWrapperCreationOptions, Scene } from "core/index"; +import { EffectWrapper } from "../Materials/effectRenderer"; +import { Matrix, TmpVectors } from "../Maths/math.vector"; + +/** + * Post process used to apply a motion blur post process + */ +export class ThinMotionBlurPostProcess extends EffectWrapper { + /** + * The fragment shader url + */ + public static readonly FragmentUrl = "motionBlur"; + + /** + * The list of uniforms used by the effect + */ + public static readonly Uniforms = ["motionStrength", "motionScale", "screenSize", "inverseViewProjection", "prevViewProjection", "projection"]; + + /** + * The list of samplers used by the effect + */ + public static readonly Samplers = ["velocitySampler", "depthSampler"]; + + /** + * The default defines used by the effect + */ + public static readonly Defines = "#define GEOMETRY_SUPPORTED\n#define SAMPLES 64.0\n#define OBJECT_BASED"; + + protected override _gatherImports(useWebGPU: boolean, list: Promise[]) { + if (useWebGPU) { + this._webGPUReady = true; + list.push(import("../ShadersWGSL/motionBlur.fragment")); + } else { + list.push(import("../Shaders/motionBlur.fragment")); + } + } + + private _scene: Scene; + private _invViewProjection = Matrix.Identity(); + private _previousViewProjection = Matrix.Identity(); + + /** + * Constructs a new motion blur post process + * @param name Name of the effect + * @param scene The scene the effect belongs to + * @param options Options to configure the effect + */ + constructor(name: string, scene: Scene, options?: EffectWrapperCreationOptions) { + super({ + ...options, + name, + engine: scene.getEngine(), + useShaderStore: true, + useAsPostProcess: true, + fragmentShader: ThinMotionBlurPostProcess.FragmentUrl, + uniforms: ThinMotionBlurPostProcess.Uniforms, + samplers: ThinMotionBlurPostProcess.Samplers, + defines: ThinMotionBlurPostProcess.Defines, + }); + + this._scene = scene; + + this._applyMode(); + } + + /** + * Defines how much the image is blurred by the movement. Default value is equal to 1 + */ + public motionStrength: number = 1; + + private _motionBlurSamples: number = 32; + + /** + * Gets the number of iterations that are used for motion blur quality. Default value is equal to 32 + */ + public get motionBlurSamples(): number { + return this._motionBlurSamples; + } + + /** + * Sets the number of iterations to be used for motion blur quality + */ + public set motionBlurSamples(samples: number) { + this._motionBlurSamples = samples; + this._updateEffect(); + } + + private _isObjectBased: boolean = true; + + /** + * Gets whether or not the motion blur post-process is in object based mode. + */ + public get isObjectBased(): boolean { + return this._isObjectBased; + } + + /** + * Sets whether or not the motion blur post-process is in object based mode. + */ + public set isObjectBased(value: boolean) { + if (this._isObjectBased === value) { + return; + } + + this._isObjectBased = value; + this._applyMode(); + } + + /** + * The width of the source texture + */ + public textureWidth: number = 0; + + /** + * The height of the source texture + */ + public textureHeight: number = 0; + + public override bind(noDefaultBindings = false) { + super.bind(noDefaultBindings); + + const effect = this._drawWrapper.effect!; + + effect.setFloat2("screenSize", this.textureWidth, this.textureHeight); + effect.setFloat("motionScale", this._scene.getAnimationRatio()); + effect.setFloat("motionStrength", this.motionStrength); + + if (!this.isObjectBased) { + const viewProjection = TmpVectors.Matrix[0]; + viewProjection.copyFrom(this._scene.getTransformMatrix()); + + viewProjection.invertToRef(this._invViewProjection); + effect.setMatrix("inverseViewProjection", this._invViewProjection); + + effect.setMatrix("prevViewProjection", this._previousViewProjection); + this._previousViewProjection.copyFrom(viewProjection); + + effect.setMatrix("projection", this._scene.getProjectionMatrix()); + } + } + + private _updateEffect(): void { + const defines: string[] = [ + "#define GEOMETRY_SUPPORTED", + "#define SAMPLES " + this._motionBlurSamples.toFixed(1), + this._isObjectBased ? "#define OBJECT_BASED" : "#define SCREEN_BASED", + ]; + + this.updateEffect(defines.join("\n")); + } + + private _applyMode() { + this._updateEffect(); + this._previousViewProjection.copyFrom(this._scene.getTransformMatrix()); + } +} diff --git a/packages/dev/core/src/PostProcesses/thinSSRPostProcess.ts b/packages/dev/core/src/PostProcesses/thinSSRPostProcess.ts index 4a5275972c8..3c1f386167f 100644 --- a/packages/dev/core/src/PostProcesses/thinSSRPostProcess.ts +++ b/packages/dev/core/src/PostProcesses/thinSSRPostProcess.ts @@ -1,7 +1,6 @@ // eslint-disable-next-line import/no-internal-modules import type { Nullable, Scene, CubeTexture, Camera, EffectWrapperCreationOptions } from "core/index"; import { Constants } from "core/Engines/constants"; -import { Engine } from "core/Engines/engine"; import { EffectWrapper } from "core/Materials/effectRenderer"; import { ShaderLanguage } from "core/Materials/shaderLanguage"; import { Vector3, Matrix, Quaternion, TmpVectors } from "core/Maths/math.vector"; @@ -384,7 +383,7 @@ export class ThinSSRPostProcess extends EffectWrapper { super({ ...options, name, - engine: scene.getEngine() || Engine.LastCreatedEngine!, + engine: scene.getEngine(), useShaderStore: true, useAsPostProcess: true, fragmentShader: ThinSSRPostProcess.FragmentUrl, diff --git a/packages/dev/core/src/Rendering/GlobalIllumination/giRSMManager.ts b/packages/dev/core/src/Rendering/GlobalIllumination/giRSMManager.ts index 04b7e2ca1e3..6c14338d5e7 100644 --- a/packages/dev/core/src/Rendering/GlobalIllumination/giRSMManager.ts +++ b/packages/dev/core/src/Rendering/GlobalIllumination/giRSMManager.ts @@ -453,6 +453,7 @@ export class GIRSMManager { this._counters = []; this._countersRTW = []; + // eslint-disable-next-line @typescript-eslint/no-floating-promises this._initShaderSourceAsync(); this.generateSampleTexture(maxSamples); diff --git a/packages/dev/core/src/Rendering/IBLShadows/iblShadowsAccumulationPass.ts b/packages/dev/core/src/Rendering/IBLShadows/iblShadowsAccumulationPass.ts index 0cef6458944..b16c115a928 100644 --- a/packages/dev/core/src/Rendering/IBLShadows/iblShadowsAccumulationPass.ts +++ b/packages/dev/core/src/Rendering/IBLShadows/iblShadowsAccumulationPass.ts @@ -200,7 +200,7 @@ export class _IblShadowsAccumulationPass { this._scene, outputTextureOptions ); - this._outputTexture.refreshRate = -1; + this._outputTexture.refreshRate = 1; this._outputTexture.autoClear = false; this._outputTexture.onGeneratedObservable.addOnce(() => { this.onReadyObservable.notifyObservers(); diff --git a/packages/dev/core/src/Rendering/IBLShadows/iblShadowsVoxelRenderer.ts b/packages/dev/core/src/Rendering/IBLShadows/iblShadowsVoxelRenderer.ts index c661771da3e..c9951b10cb5 100644 --- a/packages/dev/core/src/Rendering/IBLShadows/iblShadowsVoxelRenderer.ts +++ b/packages/dev/core/src/Rendering/IBLShadows/iblShadowsVoxelRenderer.ts @@ -665,6 +665,7 @@ export class _IblShadowsVoxelRenderer { this._voxelGridRT.render(); } this._generateMipMaps(); + // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then this._copyMipEffectWrapper.effect.whenCompiledAsync().then(() => { this._copyMipMaps(); this._scene.onAfterRenderObservable.removeCallback(this._renderVoxelGridBound); diff --git a/packages/dev/core/src/Rendering/depthRenderer.ts b/packages/dev/core/src/Rendering/depthRenderer.ts index 6931c440a82..d036abc78b5 100644 --- a/packages/dev/core/src/Rendering/depthRenderer.ts +++ b/packages/dev/core/src/Rendering/depthRenderer.ts @@ -116,9 +116,10 @@ export class DepthRenderer { if (this.isPacked) { this.clearColor = new Color4(1.0, 1.0, 1.0, 1.0); } else { - this.clearColor = new Color4(storeCameraSpaceZ ? 1e8 : 1.0, 0.0, 0.0, 1.0); + this.clearColor = new Color4(storeCameraSpaceZ ? 0.0 : 1.0, 0.0, 0.0, 1.0); } + // eslint-disable-next-line @typescript-eslint/no-floating-promises this._initShaderSourceAsync(); DepthRenderer._SceneComponentInitialization(this._scene); diff --git a/packages/dev/core/src/Rendering/fluidRenderer/fluidRenderingTargetRenderer.ts b/packages/dev/core/src/Rendering/fluidRenderer/fluidRenderingTargetRenderer.ts index c2a408934a2..7b2d149934a 100644 --- a/packages/dev/core/src/Rendering/fluidRenderer/fluidRenderingTargetRenderer.ts +++ b/packages/dev/core/src/Rendering/fluidRenderer/fluidRenderingTargetRenderer.ts @@ -757,6 +757,7 @@ export class FluidRenderingTargetRenderer { true, undefined, this._shaderLanguage, + // eslint-disable-next-line @typescript-eslint/no-misused-promises async () => { if (this._shaderLanguage === ShaderLanguage.WGSL) { await import("../../ShadersWGSL/fluidRenderingRender.fragment"); diff --git a/packages/dev/core/src/Rendering/fluidRenderer/fluidRenderingTextures.ts b/packages/dev/core/src/Rendering/fluidRenderer/fluidRenderingTextures.ts index 21ff7957b9b..6fcc3e45321 100644 --- a/packages/dev/core/src/Rendering/fluidRenderer/fluidRenderingTextures.ts +++ b/packages/dev/core/src/Rendering/fluidRenderer/fluidRenderingTextures.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-misused-promises */ import type { Camera } from "core/Cameras/camera"; import { Constants } from "core/Engines/constants"; import type { AbstractEngine } from "core/Engines/abstractEngine"; diff --git a/packages/dev/core/src/Rendering/geometryBufferRenderer.ts b/packages/dev/core/src/Rendering/geometryBufferRenderer.ts index d7a21a72b8a..887104b004a 100644 --- a/packages/dev/core/src/Rendering/geometryBufferRenderer.ts +++ b/packages/dev/core/src/Rendering/geometryBufferRenderer.ts @@ -154,7 +154,7 @@ export class GeometryBufferRenderer { private _enableScreenspaceDepth: boolean = false; private _depthFormat: number; private _clearColor = new Color4(0, 0, 0, 0); - private _clearDepthColor = new Color4(1e8, 0, 0, 1); // "infinity" value - depth in the depth texture is view.z, not a 0..1 value! + private _clearDepthColor = new Color4(0, 0, 0, 1); // sets an invalid value by default - depth in the depth texture is view.z, so 0 is not possible because view.z can't be less than camera.minZ private _positionIndex: number = -1; private _velocityIndex: number = -1; @@ -508,6 +508,7 @@ export class GeometryBufferRenderer { this._depthFormat = depthFormat; this._textureTypesAndFormats = textureTypesAndFormats || {}; + // eslint-disable-next-line @typescript-eslint/no-floating-promises this._initShaderSourceAsync(); GeometryBufferRenderer._SceneComponentInitialization(this._scene); diff --git a/packages/dev/core/src/Rendering/iblCdfGenerator.ts b/packages/dev/core/src/Rendering/iblCdfGenerator.ts index ce25d310c0c..97c76d8d3e5 100644 --- a/packages/dev/core/src/Rendering/iblCdfGenerator.ts +++ b/packages/dev/core/src/Rendering/iblCdfGenerator.ts @@ -8,7 +8,7 @@ import { ProceduralTexture } from "../Materials/Textures/Procedurals/proceduralT import type { IProceduralTextureCreationOptions } from "../Materials/Textures/Procedurals/proceduralTexture"; import { PostProcess } from "../PostProcesses/postProcess"; import type { PostProcessOptions } from "../PostProcesses/postProcess"; -import { Vector4 } from "../Maths/math.vector"; +import { Vector3, Vector4 } from "../Maths/math.vector"; import { RawTexture } from "../Materials/Textures/rawTexture"; import type { BaseTexture } from "../Materials/Textures/baseTexture"; import { Observable } from "../Misc/observable"; @@ -18,6 +18,7 @@ import { Engine } from "../Engines/engine"; import { _WarnImport } from "../Misc/devTools"; import type { Nullable } from "../types"; import { EngineStore } from "../Engines/engineStore"; +import { Logger } from "../Misc/logger"; /** * Build cdf maps to be used for IBL importance sampling. @@ -30,8 +31,23 @@ export class IblCdfGenerator { private _cdfxPT: ProceduralTexture; private _icdfPT: ProceduralTexture; private _scaledLuminancePT: ProceduralTexture; + private _dominantDirectionPT: ProceduralTexture; private _iblSource: Nullable; private _dummyTexture: RawTexture; + + private _cachedDominantDirection: Nullable = null; + + /** + * Returns whether the CDF renderer is supported by the current engine + */ + public get isSupported(): boolean { + const engine = EngineStore.LastCreatedEngine; + if (!engine) { + return false; + } + return engine.getCaps().texelFetch; + } + /** * Gets the IBL source texture being used by the CDF renderer */ @@ -148,6 +164,10 @@ export class IblCdfGenerator { if (this._scene) { this._engine = this._scene.getEngine(); } + if (!this.isSupported) { + Logger.Warn("CDF renderer is not supported by the current engine."); + return; + } const blackPixels = new Uint16Array([0, 0, 0, 255]); this._dummyTexture = new RawTexture(blackPixels, 1, 1, Engine.TEXTUREFORMAT_RGBA, sceneOrEngine, false, false, undefined, Constants.TEXTURETYPE_HALF_FLOAT); if (this._scene) { @@ -214,9 +234,9 @@ export class IblCdfGenerator { gammaSpace: false, extraInitializationsAsync: async () => { if (isWebGPU) { - await Promise.all([import("../ShadersWGSL/iblIcdf.fragment")]); + await Promise.all([import("../ShadersWGSL/iblIcdf.fragment"), import("../ShadersWGSL/iblDominantDirection.fragment")]); } else { - await Promise.all([import("../Shaders/iblIcdf.fragment")]); + await Promise.all([import("../Shaders/iblIcdf.fragment"), import("../Shaders/iblDominantDirection.fragment")]); } }, }; @@ -269,6 +289,12 @@ export class IblCdfGenerator { this._icdfPT.onGeneratedObservable.addOnce(() => { this.onGeneratedObservable.notifyObservers(); }); + + this._dominantDirectionPT = new ProceduralTexture("iblDominantDirection", { width: 1, height: 1 }, "iblDominantDirection", this._scene, icdfOptions, false, false); + this._dominantDirectionPT.autoClear = false; + this._dominantDirectionPT.setTexture("icdfSampler", this._icdfPT); + this._dominantDirectionPT.refreshRate = 0; + this._dominantDirectionPT.defines = "#define NUM_SAMPLES 32u\n"; } private _disposeTextures() { @@ -276,6 +302,7 @@ export class IblCdfGenerator { this._cdfxPT?.dispose(); this._icdfPT?.dispose(); this._scaledLuminancePT?.dispose(); + this._dominantDirectionPT?.dispose(); } private _createDebugPass() { @@ -342,8 +369,9 @@ export class IblCdfGenerator { * Explicitly trigger generation of CDF maps when they are ready to render. * @returns Promise that resolves when the CDF maps are rendered. */ - // eslint-disable-next-line @typescript-eslint/naming-convention + // eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/promise-function-async public renderWhenReady(): Promise { + this._cachedDominantDirection = null; // Once the textures are generated, notify that they are ready to use. this._icdfPT.onGeneratedObservable.addOnce(() => { this.onGeneratedObservable.notifyObservers(); @@ -363,6 +391,7 @@ export class IblCdfGenerator { }) ); } + // eslint-disable-next-line github/no-then return Promise.all(promises).then(() => { for (const target of renderTargets) { target.render(); @@ -370,6 +399,47 @@ export class IblCdfGenerator { }); } + /** + * Finds the average direction of the highest intensity areas of the IBL source + * @returns Async promise that resolves to the dominant direction of the IBL source + */ + // eslint-disable-next-line @typescript-eslint/promise-function-async + public findDominantDirection(): Promise { + if (this._cachedDominantDirection) { + return Promise.resolve(this._cachedDominantDirection); + } + return new Promise((resolve) => { + this._dominantDirectionPT.onGeneratedObservable.addOnce(() => { + const data = new Float32Array(4); + // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then + this._dominantDirectionPT.readPixels(0, 0, data, true)!.then(() => { + const dominantDirection = new Vector3(data[0], data[1], data[2]); + this._cachedDominantDirection = dominantDirection; + resolve(dominantDirection); + }); + }); + if (this.isReady()) { + if (this._dominantDirectionPT.isReady()) { + this._dominantDirectionPT.render(); + } else { + this._dominantDirectionPT.getEffect().executeWhenCompiled(() => { + this._dominantDirectionPT.render(); + }); + } + } else { + this.onGeneratedObservable.addOnce(() => { + if (this._dominantDirectionPT.isReady()) { + this._dominantDirectionPT.render(); + } else { + this._dominantDirectionPT.getEffect().executeWhenCompiled(() => { + this._dominantDirectionPT.render(); + }); + } + }); + } + }); + } + /** * Disposes the CDF renderer and associated resources */ diff --git a/packages/dev/core/src/Rendering/iblCdfGeneratorSceneComponent.ts b/packages/dev/core/src/Rendering/iblCdfGeneratorSceneComponent.ts index 2281444d24a..a598982ac28 100644 --- a/packages/dev/core/src/Rendering/iblCdfGeneratorSceneComponent.ts +++ b/packages/dev/core/src/Rendering/iblCdfGeneratorSceneComponent.ts @@ -52,6 +52,10 @@ Scene.prototype.enableIblCdfGenerator = function (): Nullable { } this._iblCdfGenerator = new IblCdfGenerator(this); + if (!this._iblCdfGenerator.isSupported) { + this._iblCdfGenerator = null; + return null; + } if (this.environmentTexture) { this._iblCdfGenerator.iblSource = this.environmentTexture; } diff --git a/packages/dev/core/src/Rendering/index.ts b/packages/dev/core/src/Rendering/index.ts index 01ac0285226..f00e93f6f88 100644 --- a/packages/dev/core/src/Rendering/index.ts +++ b/packages/dev/core/src/Rendering/index.ts @@ -81,6 +81,8 @@ export * from "../ShadersWGSL/iblCdfDebug.fragment"; export * from "../Shaders/iblCdfDebug.fragment"; export * from "../ShadersWGSL/iblScaledLuminance.fragment"; export * from "../Shaders/iblScaledLuminance.fragment"; +export * from "../ShadersWGSL/iblDominantDirection.fragment"; +export * from "../Shaders/iblDominantDirection.fragment"; export * from "../Shaders/iblVoxelGrid2dArrayDebug.fragment"; export * from "../ShadersWGSL/iblVoxelGrid2dArrayDebug.fragment"; export * from "../Shaders/iblVoxelGrid.fragment"; diff --git a/packages/dev/core/src/Rendering/prePassRenderer.ts b/packages/dev/core/src/Rendering/prePassRenderer.ts index 56e8e184b81..4c995026949 100644 --- a/packages/dev/core/src/Rendering/prePassRenderer.ts +++ b/packages/dev/core/src/Rendering/prePassRenderer.ts @@ -274,7 +274,7 @@ export class PrePassRenderer { public renderTargets: PrePassRenderTarget[] = []; private readonly _clearColor = new Color4(0, 0, 0, 0); - private readonly _clearDepthColor = new Color4(1e8, 0, 0, 1); // "infinity" value - depth in the depth texture is view.z, not a 0..1 value! + private readonly _clearDepthColor = new Color4(0, 0, 0, 1); // // sets an invalid value by default - depth in the depth texture is view.z, so 0 is not possible because view.z can't be less than camera.minZ private _enabled: boolean = false; diff --git a/packages/dev/core/src/Shaders/ShadersInclude/hdrFilteringFunctions.fx b/packages/dev/core/src/Shaders/ShadersInclude/hdrFilteringFunctions.fx index d803f164f8e..d788a4d0acd 100644 --- a/packages/dev/core/src/Shaders/ShadersInclude/hdrFilteringFunctions.fx +++ b/packages/dev/core/src/Shaders/ShadersInclude/hdrFilteringFunctions.fx @@ -184,7 +184,7 @@ // #define inline - vec3 irradiance(samplerCube inputTexture, vec3 inputN, vec2 filteringInfo + vec3 irradiance(samplerCube inputTexture, vec3 inputN, vec2 filteringInfo, float diffuseRoughness, vec3 surfaceAlbedo, vec3 inputV #ifdef IBL_CDF_FILTERING , sampler2D icdfSampler #endif @@ -198,12 +198,15 @@ tangent = normalize(cross(tangent, n)); vec3 bitangent = cross(n, tangent); mat3 tbn = mat3(tangent, bitangent, n); + // The inverse is just the transpose of the TBN matrix. However, WebGL 1.0 doesn't support mat3 transpose. + // So, we have to calculate it manually. + mat3 tbnInverse = mat3(tangent.x, bitangent.x, n.x, tangent.y, bitangent.y, n.y, tangent.z, bitangent.z, n.z); #endif float maxLevel = filteringInfo.y; float dim0 = filteringInfo.x; float omegaP = (4. * PI) / (6. * dim0 * dim0); - + vec3 clampedAlbedo = clamp(surfaceAlbedo, vec3(0.1), vec3(1.0)); #if defined(WEBGL2) || defined(WEBGPU) || defined(NATIVE) for(uint i = 0u; i < NUM_SAMPLES; ++i) #else @@ -214,20 +217,36 @@ #ifdef IBL_CDF_FILTERING vec2 T; - T.x = textureLod(icdfSampler, vec2(Xi.x, 0.0), 0.0).x; - T.y = textureLod(icdfSampler, vec2(T.x, Xi.y), 0.0).y; + T.x = texture2D(icdfSampler, vec2(Xi.x, 0.0)).x; + T.y = texture2D(icdfSampler, vec2(T.x, Xi.y)).y; vec3 Ls = uv_to_normal(vec2(1.0 - fract(T.x + 0.25), T.y)); float NoL = dot(n, Ls); + float NoV = dot(n, inputV); + #if BASE_DIFFUSE_MODEL == BRDF_DIFFUSE_MODEL_EON + float LoV = dot (Ls, inputV); + #elif BASE_DIFFUSE_MODEL == BRDF_DIFFUSE_MODEL_BURLEY + vec3 H = (inputV + Ls) * 0.5; + float VoH = dot(inputV, H); + #endif #else vec3 Ls = hemisphereCosSample(Xi); Ls = normalize(Ls); vec3 Ns = vec3(0., 0., 1.); float NoL = dot(Ns, Ls); + vec3 V = tbnInverse * inputV; + float NoV = dot(Ns, V); + #if BASE_DIFFUSE_MODEL == BRDF_DIFFUSE_MODEL_EON + float LoV = dot (Ls, V); + #elif BASE_DIFFUSE_MODEL == BRDF_DIFFUSE_MODEL_BURLEY + vec3 H = (V + Ls) * 0.5; + float VoH = dot(V, H); + #endif + #endif if (NoL > 0.) { #ifdef IBL_CDF_FILTERING - float pdf = textureLod(icdfSampler, T, 0.0).z; + float pdf = texture2D(icdfSampler, T).z; vec3 c = textureCubeLodEXT(inputTexture, Ls, 0.0).rgb; #else float pdf_inversed = PI / NoL; @@ -240,17 +259,28 @@ c = toLinearSpace(c); #endif + vec3 diffuseRoughnessTerm = vec3(1.0); + #if BASE_DIFFUSE_MODEL == BRDF_DIFFUSE_MODEL_EON + diffuseRoughnessTerm = diffuseBRDF_EON(clampedAlbedo, diffuseRoughness, NoL, NoV, LoV) * PI; + #elif BASE_DIFFUSE_MODEL == BRDF_DIFFUSE_MODEL_BURLEY + diffuseRoughnessTerm = vec3(diffuseBRDF_Burley(NoL, NoV, VoH, diffuseRoughness) * PI); + #endif + #ifdef IBL_CDF_FILTERING vec3 light = pdf < 1e-6 ? vec3(0.0) : vec3(1.0) / vec3(pdf) * c; - result += NoL * light; + result += NoL * diffuseRoughnessTerm * light; #else - result += c; + result += c * diffuseRoughnessTerm; #endif } } result = result * NUM_SAMPLES_FLOAT_INVERSED; + #if BASE_DIFFUSE_MODEL == BRDF_DIFFUSE_MODEL_EON + result = result / clampedAlbedo; + #endif + return result; } diff --git a/packages/dev/core/src/Shaders/ShadersInclude/lightFragment.fx b/packages/dev/core/src/Shaders/ShadersInclude/lightFragment.fx index 8a36a7474b3..181fb06ff4e 100644 --- a/packages/dev/core/src/Shaders/ShadersInclude/lightFragment.fx +++ b/packages/dev/core/src/Shaders/ShadersInclude/lightFragment.fx @@ -51,7 +51,7 @@ preInfo.attenuation *= computeDirectionalLightFalloff_IES(light{X}.vLightDirection.xyz, preInfo.L, iesLightTexture{X}); #else preInfo.attenuation *= computeDirectionalLightFalloff(light{X}.vLightDirection.xyz, preInfo.L, light{X}.vLightDirection.w, light{X}.vLightData.w, light{X}.vLightFalloff.z, light{X}.vLightFalloff.w); - #endif + #endif #endif #elif defined(POINTLIGHT{X}) #ifdef LIGHT_FALLOFF_GLTF{X} @@ -74,6 +74,8 @@ #else preInfo.roughness = adjustRoughnessFromLightProperties(roughness, light{X}.vLightSpecular.a, preInfo.lightDistance); #endif + preInfo.diffuseRoughness = diffuseRoughness; + preInfo.surfaceAlbedo = surfaceAlbedo; #ifdef IRIDESCENCE preInfo.iridescenceIntensity = iridescenceIntensity; @@ -135,7 +137,7 @@ #endif info.clearCoat = computeClearCoatLighting(preInfo, clearcoatOut.clearCoatNormalW, clearcoatOut.clearCoatAARoughnessFactors.x, clearcoatOut.clearCoatIntensity, diffuse{X}.rgb); - + #ifdef CLEARCOAT_TINT // Absorption absorption = computeClearCoatLightingAbsorption(clearcoatOut.clearCoatNdotVRefract, preInfo.L, clearcoatOut.clearCoatNormalW, clearcoatOut.clearCoatColor, clearcoatOut.clearCoatThickness, clearcoatOut.clearCoatIntensity); @@ -190,7 +192,7 @@ #ifdef SHADOW{X} #ifdef SHADOWCSM{X} - for (int i = 0; i < SHADOWCSMNUM_CASCADES{X}; i++) + for (int i = 0; i < SHADOWCSMNUM_CASCADES{X}; i++) { #ifdef SHADOWCSM_RIGHTHANDED{X} diff{X} = viewFrustumZ{X}[i] + vPositionFromCamera{X}.z; @@ -347,7 +349,7 @@ #else #ifdef SHADOWCSMDEBUG{X} diffuseBase += info.diffuse * shadowDebug{X}; - #else + #else diffuseBase += info.diffuse * shadow; #endif #ifdef SS_TRANSLUCENCY diff --git a/packages/dev/core/src/Shaders/ShadersInclude/pbrBRDFFunctions.fx b/packages/dev/core/src/Shaders/ShadersInclude/pbrBRDFFunctions.fx index 3c5653c559c..91a6cbcf54c 100644 --- a/packages/dev/core/src/Shaders/ShadersInclude/pbrBRDFFunctions.fx +++ b/packages/dev/core/src/Shaders/ShadersInclude/pbrBRDFFunctions.fx @@ -1,5 +1,8 @@ // Constants #define FRESNEL_MAXIMUM_ON_ROUGH 0.25 +#define BRDF_DIFFUSE_MODEL_EON 0 +#define BRDF_DIFFUSE_MODEL_BURLEY 1 +#define BRDF_DIFFUSE_MODEL_LAMBERT 2 // ______________________________________________________________________ // @@ -429,6 +432,42 @@ float diffuseBRDF_Burley(float NdotL, float NdotV, float VdotH, float roughness) return fresnel / PI; } +const float constant1_FON = 0.5 - 2.0 / (3.0 * PI); +const float constant2_FON = 2.0 / 3.0 - 28.0 / (15.0 * PI); + +// Fujii Oren-Nayar (FON) directional albedo (approximate). +float E_FON_approx(float mu, float roughness) +{ + float sigma = roughness; // FON sigma prime + float mucomp = 1.0 - mu; + float mucomp2 = mucomp * mucomp; + const mat2 Gcoeffs = mat2(0.0571085289, -0.332181442, + 0.491881867, 0.0714429953); + float GoverPi = dot(Gcoeffs * vec2(mucomp, mucomp2), vec2(1.0, mucomp2)); + return (1.0 + sigma * GoverPi) / (1.0 + constant1_FON * sigma); +} + +vec3 diffuseBRDF_EON(vec3 albedo, float roughness, float NdotL, float NdotV, float LdotV) +{ + vec3 rho = albedo; + float sigma = roughness; // FON sigma prime + float mu_i = NdotL; // input angle cos + float mu_o = NdotV; // output angle cos + float s = LdotV - mu_i * mu_o; // QON s term + float sovertF = s > 0.0 ? s / max(mu_i, mu_o) : s; // FON s/t + float AF = 1.0 / (1.0 + constant1_FON * sigma); // FON A coeff. + vec3 f_ss = (rho * RECIPROCAL_PI) * AF * (1.0 + sigma * sovertF); // single-scatter + float EFo = E_FON_approx(mu_o, sigma); // FON wo albedo (approx) + float EFi = E_FON_approx(mu_i, sigma); // FON wi albedo (approx) + float avgEF = AF * (1.0 + constant2_FON * sigma); // avg. albedo + vec3 rho_ms = (rho * rho) * avgEF / (vec3(1.0) - rho * (1.0 - avgEF)); + const float eps = 1.0e-7; + vec3 f_ms = (rho_ms * RECIPROCAL_PI) * max(eps, 1.0 - EFo) // multi-scatter lobe + * max(eps, 1.0 - EFi) + / max(eps, 1.0 - avgEF); + return (f_ss + f_ms); +} + #ifdef SS_TRANSLUCENCY // Pixar diffusion profile // http://graphics.pixar.com/library/ApproxBSSRDF/paper.pdf diff --git a/packages/dev/core/src/Shaders/ShadersInclude/pbrBlockAlbedoOpacity.fx b/packages/dev/core/src/Shaders/ShadersInclude/pbrBlockAlbedoOpacity.fx index 30732fdc922..e0e51184fa5 100644 --- a/packages/dev/core/src/Shaders/ShadersInclude/pbrBlockAlbedoOpacity.fx +++ b/packages/dev/core/src/Shaders/ShadersInclude/pbrBlockAlbedoOpacity.fx @@ -12,7 +12,7 @@ albedoOpacityOutParams albedoOpacityBlock( ,in vec2 albedoInfos #endif , in float baseWeight -#ifdef BASEWEIGHT +#ifdef BASE_WEIGHT , in vec4 baseWeightTexture , in vec2 vBaseWeightInfos #endif @@ -75,7 +75,7 @@ albedoOpacityOutParams albedoOpacityBlock( // applied in computeDiffuseLighting), but with the diffuse model *currently* used // in Babylon.js, factoring it into the surfaceAlbedo is equivalent. surfaceAlbedo *= baseWeight; - #ifdef BASEWEIGHT + #ifdef BASE_WEIGHT surfaceAlbedo *= baseWeightTexture.r; #endif diff --git a/packages/dev/core/src/Shaders/ShadersInclude/pbrBlockReflection.fx b/packages/dev/core/src/Shaders/ShadersInclude/pbrBlockReflection.fx index f31fa0724d3..6d3a3f78394 100644 --- a/packages/dev/core/src/Shaders/ShadersInclude/pbrBlockReflection.fx +++ b/packages/dev/core/src/Shaders/ShadersInclude/pbrBlockReflection.fx @@ -190,6 +190,9 @@ #else , in sampler2D irradianceSampler #endif + #ifdef USE_IRRADIANCE_DOMINANT_DIRECTION + , in vec3 reflectionDominantDirection + #endif #endif #ifndef LODBASEDMICROSFURACE #ifdef REFLECTIONMAP_3D @@ -206,6 +209,9 @@ , in sampler2D icdfSampler #endif #endif + , in vec3 viewDirectionW + , in float diffuseRoughness + , in vec3 surfaceAlbedo ) { reflectionOutParams outParams; @@ -264,7 +270,15 @@ #else vec3 irradianceVector = vec3(reflectionMatrix * vec4(normalW, 0)).xyz; #endif - + vec3 irradianceView = vec3(reflectionMatrix * vec4(viewDirectionW, 0)).xyz; + #if !defined(USE_IRRADIANCE_DOMINANT_DIRECTION) && !defined(REALTIME_FILTERING) + // Approximate diffuse roughness by bending the surface normal away from the view. + #if BASE_DIFFUSE_MODEL != BRDF_DIFFUSE_MODEL_LAMBERT + float NdotV = max(dot(normalW, viewDirectionW), 0.0); + irradianceVector = mix(irradianceVector, irradianceView, (0.5 * (1.0 - NdotV)) * diffuseRoughness); + #endif + #endif + #ifdef REFLECTIONMAP_OPPOSITEZ irradianceVector.z *= -1.0; #endif @@ -278,7 +292,7 @@ environmentIrradiance = vEnvironmentIrradiance; #else #if defined(REALTIME_FILTERING) - environmentIrradiance = irradiance(reflectionSampler, irradianceVector, vReflectionFilteringInfo + environmentIrradiance = irradiance(reflectionSampler, irradianceVector, vReflectionFilteringInfo, diffuseRoughness, surfaceAlbedo, irradianceView #ifdef IBL_CDF_FILTERING , icdfSampler #endif @@ -297,6 +311,7 @@ #else vec4 environmentIrradiance4 = sampleReflection(irradianceSampler, reflectionCoords); #endif + environmentIrradiance = environmentIrradiance4.rgb; #ifdef RGBDREFLECTION environmentIrradiance.rgb = fromRGBD(environmentIrradiance4); @@ -305,6 +320,28 @@ #ifdef GAMMAREFLECTION environmentIrradiance.rgb = toLinearSpace(environmentIrradiance.rgb); #endif + // If we have a predominant light direction, use it to compute the diffuse roughness term.abort + // Otherwise, bend the irradiance vector to simulate retro-reflectivity of diffuse roughness. + #ifdef USE_IRRADIANCE_DOMINANT_DIRECTION + vec3 Ls = normalize(reflectionDominantDirection); + float NoL = dot(irradianceVector, Ls); + float NoV = dot(irradianceVector, irradianceView); + + vec3 diffuseRoughnessTerm = vec3(1.0); + #if BASE_DIFFUSE_MODEL == BRDF_DIFFUSE_MODEL_EON + float LoV = dot (Ls, irradianceView); + float mag = length(reflectionDominantDirection) * 2.0; + vec3 clampedAlbedo = clamp(surfaceAlbedo, vec3(0.1), vec3(1.0)); + diffuseRoughnessTerm = diffuseBRDF_EON(clampedAlbedo, diffuseRoughness, NoL, NoV, LoV) * PI; + diffuseRoughnessTerm = diffuseRoughnessTerm / clampedAlbedo; + diffuseRoughnessTerm = mix(vec3(1.0), diffuseRoughnessTerm, sqrt(clamp(mag * NoV, 0.0, 1.0))); + #elif BASE_DIFFUSE_MODEL == BRDF_DIFFUSE_MODEL_BURLEY + vec3 H = (irradianceView + Ls)*0.5; + float VoH = dot(irradianceView, H); + diffuseRoughnessTerm = vec3(diffuseBRDF_Burley(NoL, NoV, VoH, diffuseRoughness) * PI); + #endif + environmentIrradiance = environmentIrradiance.rgb * diffuseRoughnessTerm; + #endif #endif environmentIrradiance *= vReflectionColor.rgb * vReflectionInfos.x; diff --git a/packages/dev/core/src/Shaders/ShadersInclude/pbrBlockReflectivity.fx b/packages/dev/core/src/Shaders/ShadersInclude/pbrBlockReflectivity.fx index 8fed9824237..6aaba22f259 100644 --- a/packages/dev/core/src/Shaders/ShadersInclude/pbrBlockReflectivity.fx +++ b/packages/dev/core/src/Shaders/ShadersInclude/pbrBlockReflectivity.fx @@ -2,6 +2,7 @@ struct reflectivityOutParams { float microSurface; float roughness; + float diffuseRoughness; vec3 surfaceReflectivityColor; #ifdef METALLICWORKFLOW vec3 surfaceAlbedo; @@ -32,6 +33,11 @@ reflectivityOutParams reflectivityBlock( #ifdef METALLICWORKFLOW , in vec3 surfaceAlbedo , in vec4 metallicReflectanceFactors +#endif + , in float baseDiffuseRoughness +#ifdef BASE_DIFFUSE_ROUGHNESS + , in float baseDiffuseRoughnessTexture + , in vec2 baseDiffuseRoughnessInfos #endif #ifdef REFLECTIVITY , in vec3 reflectivityInfos @@ -97,7 +103,7 @@ reflectivityOutParams reflectivityBlock( #endif #define CUSTOM_FRAGMENT_UPDATE_METALLICROUGHNESS - + // Compute microsurface from roughness. microSurface = 1.0 - metallicRoughness.g; @@ -148,9 +154,9 @@ reflectivityOutParams reflectivityBlock( #ifdef MICROSURFACEMAP microSurface *= microSurfaceTexel.r; #endif - + #define CUSTOM_FRAGMENT_UPDATE_MICROSURFACE - + #endif #endif #endif @@ -160,8 +166,14 @@ reflectivityOutParams reflectivityBlock( // Compute roughness. float roughness = 1. - microSurface; + float diffuseRoughness = baseDiffuseRoughness; +#ifdef BASE_DIFFUSE_ROUGHNESS + diffuseRoughness *= baseDiffuseRoughnessTexture * baseDiffuseRoughnessInfos.y; +#endif + outParams.microSurface = microSurface; outParams.roughness = roughness; + outParams.diffuseRoughness = diffuseRoughness; outParams.surfaceReflectivityColor = surfaceReflectivityColor; return outParams; diff --git a/packages/dev/core/src/Shaders/ShadersInclude/pbrBlockSubSurface.fx b/packages/dev/core/src/Shaders/ShadersInclude/pbrBlockSubSurface.fx index 9c9e1e42041..2c34872d586 100644 --- a/packages/dev/core/src/Shaders/ShadersInclude/pbrBlockSubSurface.fx +++ b/packages/dev/core/src/Shaders/ShadersInclude/pbrBlockSubSurface.fx @@ -493,7 +493,7 @@ struct subSurfaceOutParams #if defined(USESPHERICALFROMREFLECTIONMAP) #if defined(REALTIME_FILTERING) - vec3 refractionIrradiance = irradiance(reflectionSampler, -irradianceVector, vReflectionFilteringInfo + vec3 refractionIrradiance = irradiance(reflectionSampler, -irradianceVector, vReflectionFilteringInfo, 0.0, surfaceAlbedo, irradianceVector #ifdef IBL_CDF_FILTERING , icdfSampler #endif diff --git a/packages/dev/core/src/Shaders/ShadersInclude/pbrDirectLightingFunctions.fx b/packages/dev/core/src/Shaders/ShadersInclude/pbrDirectLightingFunctions.fx index ab5075a4927..97f79e02b0c 100644 --- a/packages/dev/core/src/Shaders/ShadersInclude/pbrDirectLightingFunctions.fx +++ b/packages/dev/core/src/Shaders/ShadersInclude/pbrDirectLightingFunctions.fx @@ -23,7 +23,7 @@ struct lightingInfo // Simulate area (small) lights by increasing roughness float adjustRoughnessFromLightProperties(float roughness, float lightRadius, float lightDistance) { #if defined(USEPHYSICALLIGHTFALLOFF) || defined(USEGLTFLIGHTFALLOFF) - // At small angle this approximation works. + // At small angle this approximation works. float lightRoughness = lightRadius / lightDistance; // Distribution can sum. float totalRoughness = saturate(lightRoughness + roughness); @@ -44,7 +44,14 @@ vec3 computeHemisphericDiffuseLighting(preLightingInfo info, vec3 lightColor, ve #endif vec3 computeDiffuseLighting(preLightingInfo info, vec3 lightColor) { - float diffuseTerm = diffuseBRDF_Burley(info.NdotL, info.NdotV, info.VdotH, info.roughness); + vec3 diffuseTerm = vec3(1.0 / PI); + #if BASE_DIFFUSE_MODEL == BRDF_DIFFUSE_MODEL_BURLEY + diffuseTerm = vec3(diffuseBRDF_Burley(info.NdotL, info.NdotV, info.VdotH, info.diffuseRoughness)); + #elif BASE_DIFFUSE_MODEL == BRDF_DIFFUSE_MODEL_EON + vec3 clampedAlbedo = clamp(info.surfaceAlbedo, vec3(0.1), vec3(1.0)); + diffuseTerm = diffuseBRDF_EON(clampedAlbedo, info.diffuseRoughness, info.NdotL, info.NdotV, info.LdotV); + diffuseTerm /= clampedAlbedo; + #endif return diffuseTerm * info.attenuation * info.NdotL * lightColor; } @@ -71,11 +78,17 @@ vec3 computeProjectionTextureDiffuseLighting(sampler2D projectionLightSampler, m transmittanceNdotL = mix(transmittance * wrapNdotL, vec3(wrapNdotL), trAdapt); #ifndef SS_TRANSLUCENCY_LEGACY } - - return (transmittanceNdotL / PI) * info.attenuation * lightColor; - #endif - + vec3 diffuseTerm = vec3(1.0 / PI); + #if BASE_DIFFUSE_MODEL == BRDF_DIFFUSE_MODEL_BURLEY + diffuseTerm = vec3(diffuseBRDF_Burley(info.NdotL, info.NdotV, info.VdotH, info.diffuseRoughness)); + #elif BASE_DIFFUSE_MODEL == BRDF_DIFFUSE_MODEL_EON + vec3 clampedAlbedo = clamp(info.surfaceAlbedo, vec3(0.1), vec3(1.0)); + diffuseTerm = diffuseBRDF_EON(clampedAlbedo, info.diffuseRoughness, info.NdotL, info.NdotV, info.LdotV); + diffuseTerm /= clampedAlbedo; + #endif + #else float diffuseTerm = diffuseBRDF_Burley(NdotL, info.NdotV, info.VdotH, info.roughness); + #endif return diffuseTerm * transmittanceNdotL * info.attenuation * lightColor; } #endif diff --git a/packages/dev/core/src/Shaders/ShadersInclude/pbrDirectLightingSetupFunctions.fx b/packages/dev/core/src/Shaders/ShadersInclude/pbrDirectLightingSetupFunctions.fx index 1113cb5aecb..b5c59788c20 100644 --- a/packages/dev/core/src/Shaders/ShadersInclude/pbrDirectLightingSetupFunctions.fx +++ b/packages/dev/core/src/Shaders/ShadersInclude/pbrDirectLightingSetupFunctions.fx @@ -16,7 +16,12 @@ struct preLightingInfo float NdotLUnclamped; float NdotL; float VdotH; + float LdotV; + + // TODO: the code would probably be leaner with material properties out of the structure. float roughness; + float diffuseRoughness; + vec3 surfaceAlbedo; #ifdef IRIDESCENCE float iridescenceIntensity; @@ -50,6 +55,10 @@ preLightingInfo computePointAndSpotPreLightingInfo(vec4 lightData, vec3 V, vec3 result.NdotLUnclamped = dot(N, result.L); result.NdotL = saturateEps(result.NdotLUnclamped); + result.LdotV = 0.; + result.roughness = 0.; + result.diffuseRoughness = 0.; + result.surfaceAlbedo = vec3(0.); return result; } @@ -66,7 +75,11 @@ preLightingInfo computeDirectionalPreLightingInfo(vec4 lightData, vec3 V, vec3 N result.NdotLUnclamped = dot(N, result.L); result.NdotL = saturateEps(result.NdotLUnclamped); + result.LdotV = dot(result.L, V); + result.roughness = 0.; + result.diffuseRoughness = 0.; + result.surfaceAlbedo = vec3(0.); return result; } @@ -84,14 +97,20 @@ preLightingInfo computeHemisphericPreLightingInfo(vec4 lightData, vec3 V, vec3 N result.H = normalize(V + result.L); result.VdotH = saturate(dot(V, result.H)); #endif - + result.LdotV = 0.; + result.roughness = 0.; + result.diffuseRoughness = 0.; + result.surfaceAlbedo = vec3(0.); return result; } #if defined(AREALIGHTUSED) && defined(AREALIGHTSUPPORTED) #include -preLightingInfo computeAreaPreLightingInfo(sampler2D ltc1, sampler2D ltc2, vec3 viewDirectionW, vec3 vNormal, vec3 vPosition, vec4 lightData, vec3 halfWidth, vec3 halfHeight, float roughness ) +uniform sampler2D areaLightsLTC1Sampler; +uniform sampler2D areaLightsLTC2Sampler; + +preLightingInfo computeAreaPreLightingInfo(sampler2D ltc1, sampler2D ltc2, vec3 viewDirectionW, vec3 vNormal, vec3 vPosition, vec4 lightData, vec3 halfWidth, vec3 halfHeight, float roughness ) { preLightingInfo result; result.lightOffset = lightData.xyz - vPosition; @@ -103,9 +122,14 @@ preLightingInfo computeAreaPreLightingInfo(sampler2D ltc1, sampler2D ltc2, vec3 #ifdef SPECULARTERM result.areaLightFresnel = data.Fresnel; - result.areaLightSpecular = data.Specular; + result.areaLightSpecular = data.Specular; #endif result.areaLightDiffuse = data.Diffuse; + + result.LdotV = 0.; + result.roughness = 0.; + result.diffuseRoughness = 0.; + result.surfaceAlbedo = vec3(0.); return result; } #endif \ No newline at end of file diff --git a/packages/dev/core/src/Shaders/ShadersInclude/pbrFragmentDeclaration.fx b/packages/dev/core/src/Shaders/ShadersInclude/pbrFragmentDeclaration.fx index 8d0aa34965d..a12485a4607 100644 --- a/packages/dev/core/src/Shaders/ShadersInclude/pbrFragmentDeclaration.fx +++ b/packages/dev/core/src/Shaders/ShadersInclude/pbrFragmentDeclaration.fx @@ -3,6 +3,7 @@ uniform vec4 vEyePosition; uniform vec3 vReflectionColor; uniform vec4 vAlbedoColor; uniform float baseWeight; +uniform float baseDiffuseRoughness; // CUSTOM CONTROLS uniform vec4 vLightingIntensity; @@ -20,10 +21,14 @@ uniform vec3 vAmbientColor; uniform vec2 vAlbedoInfos; #endif -#ifdef BASEWEIGHT +#ifdef BASE_WEIGHT uniform vec2 vBaseWeightInfos; #endif +#ifdef BASE_DIFFUSE_ROUGHNESS +uniform vec2 vBaseDiffuseRoughnessInfos; +#endif + #ifdef AMBIENT uniform vec4 vAmbientInfos; #endif @@ -67,6 +72,9 @@ uniform mat4 view; #endif uniform mat4 reflectionMatrix; uniform vec3 vReflectionMicrosurfaceInfos; + #if defined(USEIRRADIANCEMAP) && defined(USE_IRRADIANCE_DOMINANT_DIRECTION) + uniform vec3 vReflectionDominantDirection; + #endif #if defined(USE_LOCAL_REFLECTIONMAP_CUBIC) && defined(REFLECTIONMAP_CUBIC) uniform vec3 vReflectionPosition; diff --git a/packages/dev/core/src/Shaders/ShadersInclude/pbrFragmentSamplersDeclaration.fx b/packages/dev/core/src/Shaders/ShadersInclude/pbrFragmentSamplersDeclaration.fx index c2d49f788fa..9fe8bba8567 100644 --- a/packages/dev/core/src/Shaders/ShadersInclude/pbrFragmentSamplersDeclaration.fx +++ b/packages/dev/core/src/Shaders/ShadersInclude/pbrFragmentSamplersDeclaration.fx @@ -1,5 +1,6 @@ #include(_DEFINENAME_,ALBEDO,_VARYINGNAME_,Albedo,_SAMPLERNAME_,albedo) -#include(_DEFINENAME_,BASEWEIGHT,_VARYINGNAME_,BaseWeight,_SAMPLERNAME_,baseWeight) +#include(_DEFINENAME_,BASE_WEIGHT,_VARYINGNAME_,BaseWeight,_SAMPLERNAME_,baseWeight) +#include(_DEFINENAME_,BASE_DIFFUSE_ROUGHNESS,_VARYINGNAME_,BaseDiffuseRoughness,_SAMPLERNAME_,baseDiffuseRoughness) #include(_DEFINENAME_,AMBIENT,_VARYINGNAME_,Ambient,_SAMPLERNAME_,ambient) #include(_DEFINENAME_,OPACITY,_VARYINGNAME_,Opacity,_SAMPLERNAME_,opacity) #include(_DEFINENAME_,EMISSIVE,_VARYINGNAME_,Emissive,_SAMPLERNAME_,emissive) @@ -84,11 +85,6 @@ uniform sampler2D environmentBrdfSampler; #endif -#if defined(AREALIGHTUSED) && defined(AREALIGHTSUPPORTED) - uniform sampler2D areaLightsLTC1Sampler; - uniform sampler2D areaLightsLTC2Sampler; -#endif - // SUBSURFACE #ifdef SUBSURFACE #ifdef SS_REFRACTION diff --git a/packages/dev/core/src/Shaders/ShadersInclude/pbrUboDeclaration.fx b/packages/dev/core/src/Shaders/ShadersInclude/pbrUboDeclaration.fx index dbef7e7c0a4..0845a60e489 100644 --- a/packages/dev/core/src/Shaders/ShadersInclude/pbrUboDeclaration.fx +++ b/packages/dev/core/src/Shaders/ShadersInclude/pbrUboDeclaration.fx @@ -25,6 +25,7 @@ layout(std140, column_major) uniform; uniform Material { vec2 vAlbedoInfos; vec2 vBaseWeightInfos; + vec2 vBaseDiffuseRoughnessInfos; vec4 vAmbientInfos; vec2 vOpacityInfos; vec2 vEmissiveInfos; @@ -38,6 +39,7 @@ uniform Material { vec3 vBumpInfos; mat4 albedoMatrix; mat4 baseWeightMatrix; + mat4 baseDiffuseRoughnessMatrix; mat4 ambientMatrix; mat4 opacityMatrix; mat4 emissiveMatrix; @@ -50,8 +52,10 @@ uniform Material { vec3 vReflectionColor; vec4 vAlbedoColor; float baseWeight; + float baseDiffuseRoughness; vec4 vLightingIntensity; vec3 vReflectionMicrosurfaceInfos; + vec3 vReflectionDominantDirection; float pointSize; vec4 vReflectivityColor; vec3 vEmissiveColor; diff --git a/packages/dev/core/src/Shaders/ShadersInclude/pbrVertexDeclaration.fx b/packages/dev/core/src/Shaders/ShadersInclude/pbrVertexDeclaration.fx index d9142aaa417..943f913a2ae 100644 --- a/packages/dev/core/src/Shaders/ShadersInclude/pbrVertexDeclaration.fx +++ b/packages/dev/core/src/Shaders/ShadersInclude/pbrVertexDeclaration.fx @@ -1,5 +1,6 @@ uniform mat4 view; uniform mat4 viewProjection; +uniform vec4 vEyePosition; #ifdef MULTIVIEW mat4 viewProjectionR; #endif @@ -9,11 +10,17 @@ uniform mat4 albedoMatrix; uniform vec2 vAlbedoInfos; #endif -#ifdef BASEWEIGHT +#ifdef BASE_WEIGHT uniform mat4 baseWeightMatrix; uniform vec2 vBaseWeightInfos; #endif +uniform float baseDiffuseRoughness; +#ifdef BASE_DIFFUSE_ROUGHNESS +uniform mat4 baseDiffuseRoughnessMatrix; +uniform vec2 vBaseDiffuseRoughnessInfos; +#endif + #ifdef AMBIENT uniform mat4 ambientMatrix; uniform vec4 vAmbientInfos; diff --git a/packages/dev/core/src/Shaders/ShadersInclude/screenSpaceRayTrace.fx b/packages/dev/core/src/Shaders/ShadersInclude/screenSpaceRayTrace.fx index 1145ae6bd55..acef08ccc0a 100644 --- a/packages/dev/core/src/Shaders/ShadersInclude/screenSpaceRayTrace.fx +++ b/packages/dev/core/src/Shaders/ShadersInclude/screenSpaceRayTrace.fx @@ -220,12 +220,15 @@ bool traceScreenSpaceRay1( #ifdef SSRAYTRACE_SCREENSPACE_DEPTH sceneZMax = linearizeDepth(sceneZMax, nearPlaneZ, farPlaneZ); #endif + if (sceneZMax == 0.0) sceneZMax = 1e8; + #ifdef SSRAYTRACE_RIGHT_HANDED_SCENE #ifdef SSRAYTRACE_USE_BACK_DEPTHBUFFER float sceneBackZ = texelFetch(csZBackBuffer, ivec2(hitPixel / csZBackSizeFactor), 0).r; #ifdef SSRAYTRACE_SCREENSPACE_DEPTH sceneBackZ = linearizeDepth(sceneBackZ, nearPlaneZ, farPlaneZ); #endif + if (sceneBackZ == 0.0) sceneBackZ = -1e8; hit = (rayZMax >= sceneBackZ - csZThickness) && (rayZMin <= sceneZMax); #else hit = (rayZMax >= sceneZMax - csZThickness) && (rayZMin <= sceneZMax); @@ -236,6 +239,7 @@ bool traceScreenSpaceRay1( #ifdef SSRAYTRACE_SCREENSPACE_DEPTH sceneBackZ = linearizeDepth(sceneBackZ, nearPlaneZ, farPlaneZ); #endif + if (sceneBackZ == 0.0) sceneBackZ = 1e8; hit = (rayZMin <= sceneBackZ + csZThickness) && (rayZMax >= sceneZMax) && (sceneZMax != 0.0); #else hit = (rayZMin <= sceneZMax + csZThickness) && (rayZMax >= sceneZMax); diff --git a/packages/dev/core/src/Shaders/hdrIrradianceFiltering.fragment.fx b/packages/dev/core/src/Shaders/hdrIrradianceFiltering.fragment.fx index 49a44d9d44b..b2aa4b64cab 100644 --- a/packages/dev/core/src/Shaders/hdrIrradianceFiltering.fragment.fx +++ b/packages/dev/core/src/Shaders/hdrIrradianceFiltering.fragment.fx @@ -13,7 +13,7 @@ uniform float hdrScale; varying vec3 direction; void main() { - vec3 color = irradiance(inputTexture, direction, vFilteringInfo + vec3 color = irradiance(inputTexture, direction, vFilteringInfo, 0.0, vec3(1.0), direction #ifdef IBL_CDF_FILTERING , icdfTexture #endif diff --git a/packages/dev/core/src/Shaders/iblDominantDirection.fragment.fx b/packages/dev/core/src/Shaders/iblDominantDirection.fragment.fx new file mode 100644 index 00000000000..28ac908c778 --- /dev/null +++ b/packages/dev/core/src/Shaders/iblDominantDirection.fragment.fx @@ -0,0 +1,27 @@ +precision highp sampler2D; +precision highp samplerCube; + +#include +#include +#include +#include + +varying vec2 vUV; + +uniform sampler2D icdfSampler; + + +void main(void) { + vec3 lightDir = vec3(0.0, 0.0, 0.0); + for(uint i = 0u; i < NUM_SAMPLES; ++i) + { + vec2 Xi = hammersley(i, NUM_SAMPLES); + vec2 T; + T.x = texture2D(icdfSampler, vec2(Xi.x, 0.0)).x; + T.y = texture2D(icdfSampler, vec2(T.x, Xi.y)).y; + vec3 Ls = uv_to_normal(vec2(1.0 - fract(T.x + 0.25), T.y)); + lightDir += Ls; + } + lightDir /= float(NUM_SAMPLES); + gl_FragColor = vec4(lightDir, 1.0); +} \ No newline at end of file diff --git a/packages/dev/core/src/Shaders/motionBlur.fragment.fx b/packages/dev/core/src/Shaders/motionBlur.fragment.fx index f41fabc0f0b..0f43d2d0514 100644 --- a/packages/dev/core/src/Shaders/motionBlur.fragment.fx +++ b/packages/dev/core/src/Shaders/motionBlur.fragment.fx @@ -24,7 +24,7 @@ void main(void) #ifdef GEOMETRY_SUPPORTED #ifdef OBJECT_BASED vec2 texelSize = 1.0 / screenSize; - vec4 velocityColor = texture2D(velocitySampler, vUV); + vec4 velocityColor = textureLod(velocitySampler, vUV, 0.0); velocityColor.rg = velocityColor.rg * 2.0 - vec2(1.0); vec2 signs = sign(velocityColor.rg); vec2 velocity = pow(abs(velocityColor.rg), vec2(3.0)) * signs * velocityColor.a; @@ -35,7 +35,7 @@ void main(void) velocity = normalize(velocity) * texelSize; float hlim = float(-samplesCount) * 0.5 + 0.5; - vec4 result = texture2D(textureSampler, vUV); + vec4 result = textureLod(textureSampler, vUV, 0.0); for (int i = 1; i < int(SAMPLES); ++i) { @@ -43,18 +43,21 @@ void main(void) break; vec2 offset = vUV + velocity * (hlim + float(i)); - #if defined(WEBGPU) - result += texture2DLodEXT(textureSampler, offset, 0.0); - #else - result += texture2D(textureSampler, offset); - #endif + result += textureLod(textureSampler, offset, 0.0); } gl_FragColor = result / float(samplesCount); gl_FragColor.a = 1.0; #else + vec4 result = textureLod(textureSampler, vUV, 0.0); + vec2 texelSize = 1.0 / screenSize; - float depth = texture2D(depthSampler, vUV).r; + float depth = textureLod(depthSampler, vUV, 0.0).r; + if (depth == 0.0) { + gl_FragColor = result; + return; + } + depth = projection[2].z + projection[3].z / depth; // convert from view linear z to NDC z vec4 cpos = vec4(vUV * 2.0 - 1.0, depth, 1.0); @@ -69,18 +72,12 @@ void main(void) float speed = length(velocity / texelSize); int nSamples = int(clamp(speed, 1.0, SAMPLES)); - vec4 result = texture2D(textureSampler, vUV); - for (int i = 1; i < int(SAMPLES); ++i) { if (i >= nSamples) break; vec2 offset1 = vUV + velocity * (float(i) / float(nSamples - 1) - 0.5); - #if defined(WEBGPU) - result += texture2DLodEXT(textureSampler, offset1, 0.0); - #else - result += texture2D(textureSampler, offset1); - #endif + result += textureLod(textureSampler, offset1, 0.0); } gl_FragColor = result / float(nSamples); diff --git a/packages/dev/core/src/Shaders/pbr.fragment.fx b/packages/dev/core/src/Shaders/pbr.fragment.fx index d28c5e43547..5f2efc02382 100644 --- a/packages/dev/core/src/Shaders/pbr.fragment.fx +++ b/packages/dev/core/src/Shaders/pbr.fragment.fx @@ -90,7 +90,7 @@ void main(void) { vec4 albedoTexture = texture2D(albedoSampler, vAlbedoUV + uvOffset); #endif -#ifdef BASEWEIGHT +#ifdef BASE_WEIGHT vec4 baseWeightTexture = texture2D(baseWeightSampler, vBaseWeightUV + uvOffset); #endif @@ -109,7 +109,7 @@ void main(void) { , vAlbedoInfos #endif , baseWeight - #ifdef BASEWEIGHT + #ifdef BASE_WEIGHT , baseWeightTexture , vBaseWeightInfos #endif @@ -199,11 +199,20 @@ void main(void) { #endif #endif +#ifdef BASE_DIFFUSE_ROUGHNESS + float baseDiffuseRoughnessTexture = texture2D(baseDiffuseRoughnessSampler, vBaseDiffuseRoughnessUV + uvOffset).r; +#endif + reflectivityOut = reflectivityBlock( vReflectivityColor #ifdef METALLICWORKFLOW , surfaceAlbedo , metallicReflectanceFactors + #endif + , baseDiffuseRoughness + #ifdef BASE_DIFFUSE_ROUGHNESS + , baseDiffuseRoughnessTexture + , vBaseDiffuseRoughnessInfos #endif #ifdef REFLECTIVITY , vReflectivityInfos @@ -223,6 +232,7 @@ void main(void) { float microSurface = reflectivityOut.microSurface; float roughness = reflectivityOut.roughness; + float diffuseRoughness = reflectivityOut.diffuseRoughness; #ifdef METALLICWORKFLOW surfaceAlbedo = reflectivityOut.surfaceAlbedo; @@ -300,6 +310,9 @@ void main(void) { #endif #ifdef USEIRRADIANCEMAP , irradianceSampler + #ifdef USE_IRRADIANCE_DOMINANT_DIRECTION + , vReflectionDominantDirection + #endif #endif #ifndef LODBASEDMICROSFURACE , reflectionSamplerLow @@ -311,6 +324,9 @@ void main(void) { , icdfSampler #endif #endif + , viewDirectionW + , diffuseRoughness + , baseColor ); #else #define CUSTOM_REFLECTION diff --git a/packages/dev/core/src/Shaders/pbr.vertex.fx b/packages/dev/core/src/Shaders/pbr.vertex.fx index 71ce434d3e2..21141bd90a4 100644 --- a/packages/dev/core/src/Shaders/pbr.vertex.fx +++ b/packages/dev/core/src/Shaders/pbr.vertex.fx @@ -31,7 +31,8 @@ attribute vec4 color; #include #include(_DEFINENAME_,ALBEDO,_VARYINGNAME_,Albedo) -#include(_DEFINENAME_,BASEWEIGHT,_VARYINGNAME_,BaseWeight) +#include(_DEFINENAME_,BASE_WEIGHT,_VARYINGNAME_,BaseWeight) +#include(_DEFINENAME_,BASE_DIFFUSE_ROUGHNESS,_VARYINGNAME_,BaseDiffuseRoughness) #include(_DEFINENAME_,DETAIL,_VARYINGNAME_,Detail) #include(_DEFINENAME_,AMBIENT,_VARYINGNAME_,Ambient) #include(_DEFINENAME_,OPACITY,_VARYINGNAME_,Opacity) @@ -175,7 +176,15 @@ void main(void) { #endif #if defined(USESPHERICALFROMREFLECTIONMAP) && defined(USESPHERICALINVERTEX) - vec3 reflectionVector = vec3(reflectionMatrix * vec4(vNormalW, 0)).xyz; + #if BASE_DIFFUSE_MODEL != BRDF_DIFFUSE_MODEL_LAMBERT + // Bend the normal towards the viewer based on the diffuse roughness + vec3 viewDirectionW = normalize(vEyePosition.xyz - vPositionW); + float NdotV = max(dot(vNormalW, viewDirectionW), 0.0); + vec3 roughNormal = mix(vNormalW, viewDirectionW, (0.5 * (1.0 - NdotV)) * baseDiffuseRoughness); + vec3 reflectionVector = vec3(reflectionMatrix * vec4(roughNormal, 0)).xyz; + #else + vec3 reflectionVector = vec3(reflectionMatrix * vec4(vNormalW, 0)).xyz; + #endif #ifdef REFLECTIONMAP_OPPOSITEZ reflectionVector.z *= -1.0; #endif @@ -220,7 +229,8 @@ void main(void) { #include[3..7] #include(_DEFINENAME_,ALBEDO,_VARYINGNAME_,Albedo,_MATRIXNAME_,albedo,_INFONAME_,AlbedoInfos.x) - #include(_DEFINENAME_,BASEWEIGHT,_VARYINGNAME_,BaseWeight,_MATRIXNAME_,baseWeight,_INFONAME_,BaseWeightInfos.x) + #include(_DEFINENAME_,BASE_WEIGHT,_VARYINGNAME_,BaseWeight,_MATRIXNAME_,baseWeight,_INFONAME_,BaseWeightInfos.x) + #include(_DEFINENAME_,BASE_DIFFUSE_ROUGHNESS,_VARYINGNAME_,BaseDiffuseRoughness,_MATRIXNAME_,baseDiffuseRoughness,_INFONAME_,BaseDiffuseRoughnessInfos.x) #include(_DEFINENAME_,DETAIL,_VARYINGNAME_,Detail,_MATRIXNAME_,detail,_INFONAME_,DetailInfos.x) #include(_DEFINENAME_,AMBIENT,_VARYINGNAME_,Ambient,_MATRIXNAME_,ambient,_INFONAME_,AmbientInfos.x) #include(_DEFINENAME_,OPACITY,_VARYINGNAME_,Opacity,_MATRIXNAME_,opacity,_INFONAME_,OpacityInfos.x) diff --git a/packages/dev/core/src/ShadersWGSL/ShadersInclude/bonesDeclaration.fx b/packages/dev/core/src/ShadersWGSL/ShadersInclude/bonesDeclaration.fx index b43fcc7d4da..49431960a6c 100644 --- a/packages/dev/core/src/ShadersWGSL/ShadersInclude/bonesDeclaration.fx +++ b/packages/dev/core/src/ShadersWGSL/ShadersInclude/bonesDeclaration.fx @@ -11,14 +11,14 @@ var boneSampler : texture_2d; uniform boneTextureWidth : f32; #else - uniform mBones : array; + uniform mBones : array; #ifdef BONES_VELOCITY_ENABLED - uniform mPreviousBones : array; + uniform mPreviousBones : array; #endif #endif #ifdef BONETEXTURE - fn readMatrixFromRawSampler(smp : texture_2d, index : f32) -> mat4x4 + fn readMatrixFromRawSampler(smp : texture_2d, index : f32) -> mat4x4f { let offset = i32(index) * 4; @@ -27,7 +27,7 @@ let m2 = textureLoad(smp, vec2(offset + 2, 0), 0); let m3 = textureLoad(smp, vec2(offset + 3, 0), 0); - return mat4x4(m0, m1, m2, m3); + return mat4x4f(m0, m1, m2, m3); } #endif #endif diff --git a/packages/dev/core/src/ShadersWGSL/ShadersInclude/bonesVertex.fx b/packages/dev/core/src/ShadersWGSL/ShadersInclude/bonesVertex.fx index c9c61d4feab..1a5b56796bc 100644 --- a/packages/dev/core/src/ShadersWGSL/ShadersInclude/bonesVertex.fx +++ b/packages/dev/core/src/ShadersWGSL/ShadersInclude/bonesVertex.fx @@ -28,29 +28,29 @@ influence = influence + readMatrixFromRawSampler(boneSampler, vertexInputs.matricesIndicesExtra[3]) * vertexInputs.matricesWeightsExtra[3]; #endif #else - influence = uniforms.mBones[int(vertexInputs.matricesIndices[0])] * vertexInputs.matricesWeights[0]; + influence = uniforms.mBones[i32(vertexInputs.matricesIndices[0])] * vertexInputs.matricesWeights[0]; #if NUM_BONE_INFLUENCERS > 1 - influence = influence + uniforms.mBones[int(vertexInputs.matricesIndices[1])] * vertexInputs.matricesWeights[1]; + influence = influence + uniforms.mBones[i32(vertexInputs.matricesIndices[1])] * vertexInputs.matricesWeights[1]; #endif #if NUM_BONE_INFLUENCERS > 2 - influence = influence + uniforms.mBones[int(vertexInputs.matricesIndices[2])] * vertexInputs.matricesWeights[2]; + influence = influence + uniforms.mBones[i32(vertexInputs.matricesIndices[2])] * vertexInputs.matricesWeights[2]; #endif #if NUM_BONE_INFLUENCERS > 3 - influence = influence + uniforms.mBones[int(vertexInputs.matricesIndices[3])] * vertexInputs.matricesWeights[3]; + influence = influence + uniforms.mBones[i32(vertexInputs.matricesIndices[3])] * vertexInputs.matricesWeights[3]; #endif #if NUM_BONE_INFLUENCERS > 4 - influence = influence + uniforms.mBones[int(vertexInputs.matricesIndicesExtra[0])] * vertexInputs.matricesWeightsExtra[0]; + influence = influence + uniforms.mBones[i32(vertexInputs.matricesIndicesExtra[0])] * vertexInputs.matricesWeightsExtra[0]; #endif #if NUM_BONE_INFLUENCERS > 5 - influence = influence + uniforms.mBones[int(vertexInputs.matricesIndicesExtra[1])] * vertexInputs.matricesWeightsExtra[1]; + influence = influence + uniforms.mBones[i32(vertexInputs.matricesIndicesExtra[1])] * vertexInputs.matricesWeightsExtra[1]; #endif #if NUM_BONE_INFLUENCERS > 6 - influence = influence + uniforms.mBones[int(vertexInputs.matricesIndicesExtra[2])] * vertexInputs.matricesWeightsExtra[2]; + influence = influence + uniforms.mBones[i32(vertexInputs.matricesIndicesExtra[2])] * vertexInputs.matricesWeightsExtra[2]; #endif #if NUM_BONE_INFLUENCERS > 7 - influence = influence + uniforms.mBones[int(vertexInputs.matricesIndicesExtra[3])] * vertexInputs.matricesWeightsExtra[3]; + influence = influence + uniforms.mBones[i32(vertexInputs.matricesIndicesExtra[3])] * vertexInputs.matricesWeightsExtra[3]; #endif #endif diff --git a/packages/dev/core/src/ShadersWGSL/ShadersInclude/hdrFilteringFunctions.fx b/packages/dev/core/src/ShadersWGSL/ShadersInclude/hdrFilteringFunctions.fx index 66cc98f6fef..d750a717350 100644 --- a/packages/dev/core/src/ShadersWGSL/ShadersInclude/hdrFilteringFunctions.fx +++ b/packages/dev/core/src/ShadersWGSL/ShadersInclude/hdrFilteringFunctions.fx @@ -157,7 +157,7 @@ // // - fn irradiance(inputTexture: texture_cube, inputSampler: sampler, inputN: vec3f, filteringInfo: vec2f + fn irradiance(inputTexture: texture_cube, inputSampler: sampler, inputN: vec3f, filteringInfo: vec2f, diffuseRoughness: f32, surfaceAlbedo: vec3f, inputV: vec3f #ifdef IBL_CDF_FILTERING , icdfSampler: texture_2d, icdfSamplerSampler: sampler #endif @@ -171,12 +171,13 @@ tangent = normalize(cross(tangent, n)); var bitangent: vec3f = cross(n, tangent); var tbn: mat3x3f = mat3x3f(tangent, bitangent, n); + var tbnInverse: mat3x3f = transpose(tbn); #endif var maxLevel: f32 = filteringInfo.y; var dim0: f32 = filteringInfo.x; var omegaP: f32 = (4. * PI) / (6. * dim0 * dim0); - + var clampedAlbedo: vec3f = clamp(surfaceAlbedo, vec3f(0.1), vec3f(1.0)); for(var i: u32 = 0u; i < NUM_SAMPLES; i++) { var Xi: vec2f = hammersley(i, NUM_SAMPLES); @@ -187,11 +188,26 @@ T.y = textureSampleLevel(icdfSampler, icdfSamplerSampler, vec2(T.x, Xi.y), 0.0).y; var Ls: vec3f = uv_to_normal(vec2f(1.0 - fract(T.x + 0.25), T.y)); var NoL: f32 = dot(n, Ls); + var NoV: f32 = dot(n, inputV); + #if BASE_DIFFUSE_MODEL == BRDF_DIFFUSE_MODEL_EON + var LoV: f32 = dot(Ls, inputV); + #elif BASE_DIFFUSE_MODEL == BRDF_DIFFUSE_MODEL_BURLEY + var H: vec3f = (inputV + Ls) * 0.5; + var VoH: f32 = dot(inputV, H); + #endif #else var Ls: vec3f = hemisphereCosSample(Xi); Ls = normalize(Ls); var Ns: vec3f = vec3f(0., 0., 1.); var NoL: f32 = dot(Ns, Ls); + var V: vec3f = tbnInverse * inputV; + var NoV: f32 = dot(Ns, V); + #if BASE_DIFFUSE_MODEL == BRDF_DIFFUSE_MODEL_EON + var LoV: f32 = dot(Ls, V); + #elif BASE_DIFFUSE_MODEL == BRDF_DIFFUSE_MODEL_BURLEY + var H: vec3f = (V + Ls) * 0.5; + var VoH: f32 = dot(V, H); + #endif #endif if (NoL > 0.) { @@ -211,20 +227,31 @@ c = toLinearSpaceVec3(c); #endif + var diffuseRoughnessTerm: vec3f = vec3f(1.0); + #if BASE_DIFFUSE_MODEL == BRDF_DIFFUSE_MODEL_EON + diffuseRoughnessTerm = diffuseBRDF_EON(clampedAlbedo, diffuseRoughness, NoL, NoV, LoV) * PI; + #elif BASE_DIFFUSE_MODEL == BRDF_DIFFUSE_MODEL_BURLEY + diffuseRoughnessTerm = vec3f(diffuseBRDF_Burley(NoL, NoV, VoH, diffuseRoughness) * PI); + #endif + #ifdef IBL_CDF_FILTERING var light: vec3f = vec3f(0.0); if (pdf > 1e-6) { light = vec3f(1.0) / vec3f(pdf) * c; } - result += NoL * light; + result += NoL * diffuseRoughnessTerm * light; #else - result += c; + result += c * diffuseRoughnessTerm; #endif } } result = result * NUM_SAMPLES_FLOAT_INVERSED; + #if BASE_DIFFUSE_MODEL == BRDF_DIFFUSE_MODEL_EON + result = result / clampedAlbedo; + #endif + return result; } diff --git a/packages/dev/core/src/ShadersWGSL/ShadersInclude/lightFragment.fx b/packages/dev/core/src/ShadersWGSL/ShadersInclude/lightFragment.fx index ad18fd129e2..c9dcaba77aa 100644 --- a/packages/dev/core/src/ShadersWGSL/ShadersInclude/lightFragment.fx +++ b/packages/dev/core/src/ShadersWGSL/ShadersInclude/lightFragment.fx @@ -51,8 +51,8 @@ preInfo.attenuation *= computeDirectionalLightFalloff_IES(light{X}.vLightDirection.xyz, preInfo.L, iesLightTexture{X}, iesLightTexture{X}Sampler); #else preInfo.attenuation *= computeDirectionalLightFalloff(light{X}.vLightDirection.xyz, preInfo.L, light{X}.vLightDirection.w, light{X}.vLightData.w, light{X}.vLightFalloff.z, light{X}.vLightFalloff.w); - #endif - #endif + #endif + #endif #elif defined(POINTLIGHT{X}) #ifdef LIGHT_FALLOFF_GLTF{X} preInfo.attenuation = computeDistanceLightFalloff_GLTF(preInfo.lightDistanceSquared, light{X}.vLightFalloff.y); @@ -74,6 +74,8 @@ #else preInfo.roughness = adjustRoughnessFromLightProperties(roughness, light{X}.vLightSpecular.a, preInfo.lightDistance); #endif + preInfo.diffuseRoughness = diffuseRoughness; + preInfo.surfaceAlbedo = surfaceAlbedo; #ifdef IRIDESCENCE preInfo.iridescenceIntensity = iridescenceIntensity; @@ -135,7 +137,7 @@ #endif info.clearCoat = computeClearCoatLighting(preInfo, clearcoatOut.clearCoatNormalW, clearcoatOut.clearCoatAARoughnessFactors.x, clearcoatOut.clearCoatIntensity, diffuse{X}.rgb); - + #ifdef CLEARCOAT_TINT // Absorption absorption = computeClearCoatLightingAbsorption(clearcoatOut.clearCoatNdotVRefract, preInfo.L, clearcoatOut.clearCoatNormalW, clearcoatOut.clearCoatColor, clearcoatOut.clearCoatThickness, clearcoatOut.clearCoatIntensity); @@ -167,7 +169,7 @@ info = computeIESSpotLighting(viewDirectionW, normalW, light{X}.vLightData, light{X}.vLightDirection, diffuse{X}.rgb, light{X}.vLightSpecular.rgb, diffuse{X}.a, glossiness, iesLightTexture{X}, iesLightTexture{X}Sampler); #else info = computeSpotLighting(viewDirectionW, normalW, light{X}.vLightData, light{X}.vLightDirection, diffuse{X}.rgb, light{X}.vLightSpecular.rgb, diffuse{X}.a, glossiness); - #endif + #endif #elif defined(HEMILIGHT{X}) info = computeHemisphericLighting(viewDirectionW, normalW, light{X}.vLightData, diffuse{X}.rgb, light{X}.vLightSpecular.rgb, light{X}.vLightGround, glossiness); #elif defined(POINTLIGHT{X}) || defined(DIRLIGHT{X}) @@ -200,18 +202,18 @@ #endif var diff{X}: f32 = 0.; - + vPositionFromLight{X}[0] = fragmentInputs.vPositionFromLight{X}_0; vPositionFromLight{X}[1] = fragmentInputs.vPositionFromLight{X}_1; vPositionFromLight{X}[2] = fragmentInputs.vPositionFromLight{X}_2; vPositionFromLight{X}[3] = fragmentInputs.vPositionFromLight{X}_3; - + vDepthMetric{X}[0] = fragmentInputs.vDepthMetric{X}_0; vDepthMetric{X}[1] = fragmentInputs.vDepthMetric{X}_1; vDepthMetric{X}[2] = fragmentInputs.vDepthMetric{X}_2; vDepthMetric{X}[3] = fragmentInputs.vDepthMetric{X}_3; - - for (var i:i32 = 0; i < SHADOWCSMNUM_CASCADES{X}; i++) + + for (var i:i32 = 0; i < SHADOWCSMNUM_CASCADES{X}; i++) { #ifdef SHADOWCSM_RIGHTHANDED{X} diff{X} = uniforms.viewFrustumZ{X}[i] + fragmentInputs.vPositionFromCamera{X}.z; @@ -367,7 +369,7 @@ #else #ifdef SHADOWCSMDEBUG{X} diffuseBase += info.diffuse * shadowDebug{X}; - #else + #else diffuseBase += info.diffuse * shadow; #endif #ifdef SS_TRANSLUCENCY diff --git a/packages/dev/core/src/ShadersWGSL/ShadersInclude/pbrBRDFFunctions.fx b/packages/dev/core/src/ShadersWGSL/ShadersInclude/pbrBRDFFunctions.fx index 03b32cd1d82..126d33c3725 100644 --- a/packages/dev/core/src/ShadersWGSL/ShadersInclude/pbrBRDFFunctions.fx +++ b/packages/dev/core/src/ShadersWGSL/ShadersInclude/pbrBRDFFunctions.fx @@ -1,5 +1,8 @@ // Constants #define FRESNEL_MAXIMUM_ON_ROUGH 0.25 +#define BRDF_DIFFUSE_MODEL_EON 0 +#define BRDF_DIFFUSE_MODEL_BURLEY 1 +#define BRDF_DIFFUSE_MODEL_LAMBERT 2 // ______________________________________________________________________ // @@ -420,6 +423,42 @@ fn normalDistributionFunction_TrowbridgeReitzGGX(NdotH: f32, alphaG: f32) -> f32 // // DiffuseBRDF // ______________________________________________________________________ +const constant1_FON: f32 = 0.5f - 2.0f / (3.0f * PI); +const constant2_FON: f32 = 2.0f / 3.0f - 28.0f / (15.0f * PI); + +// Fujii Oren-Nayar (FON) directional albedo (approximate). +fn E_FON_approx(mu: f32, roughness: f32) -> f32 +{ + var sigma: f32 = roughness; // FON sigma prime + var mucomp: f32 = 1.0f - mu; + var mucomp2: f32 = mucomp * mucomp; + const Gcoeffs: mat2x2f = mat2x2f(0.0571085289f, -0.332181442f, + 0.491881867f, 0.0714429953f); + var GoverPi: f32 = dot(Gcoeffs * vec2f(mucomp, mucomp2), vec2f(1.0f, mucomp2)); + return (1.0f + sigma * GoverPi) / (1.0f + constant1_FON * sigma); +} + +fn diffuseBRDF_EON(albedo: vec3f, roughness: f32, NdotL: f32, NdotV: f32, LdotV: f32) -> vec3f +{ + var rho: vec3f = albedo; + var sigma: f32 = roughness; // FON sigma prime + var mu_i: f32 = NdotL; // input angle cos + var mu_o: f32 = NdotV; // output angle cos + var s: f32 = LdotV - mu_i * mu_o; // QON s term + var sovertF: f32 = select(s, s / max(mu_i, mu_o), s > 0.0f); // FON s/t + var AF: f32 = 1.0f / (1.0f + constant1_FON * sigma); // FON A coeff. + var f_ss: vec3f = (rho * RECIPROCAL_PI) * AF * (1.0f + sigma * sovertF); // single-scatter + var EFo: f32 = E_FON_approx(mu_o, sigma); // FON wo albedo (approx) + var EFi: f32 = E_FON_approx(mu_i, sigma); // FON wi albedo (approx) + var avgEF: f32 = AF * (1.0f + constant2_FON * sigma); // avg. albedo + var rho_ms: vec3f = (rho * rho) * avgEF / (vec3f(1.0f) - rho * (1.0f - avgEF)); + const eps: f32 = 1.0e-7f; + var f_ms: vec3f = (rho_ms * RECIPROCAL_PI) * max(eps, 1.0f - EFo) // multi-scatter lobe + * max(eps, 1.0f - EFi) + / max(eps, 1.0f - avgEF); + return (f_ss + f_ms); +} + // Disney diffuse term // https://blog.selfshadow.com/publications/s2012-shading-course/burley/s2012_pbs_disney_brdf_notes_v3.pdf diff --git a/packages/dev/core/src/ShadersWGSL/ShadersInclude/pbrBlockAlbedoOpacity.fx b/packages/dev/core/src/ShadersWGSL/ShadersInclude/pbrBlockAlbedoOpacity.fx index 6a3ac9520a4..7321d2cd691 100644 --- a/packages/dev/core/src/ShadersWGSL/ShadersInclude/pbrBlockAlbedoOpacity.fx +++ b/packages/dev/core/src/ShadersWGSL/ShadersInclude/pbrBlockAlbedoOpacity.fx @@ -12,7 +12,7 @@ fn albedoOpacityBlock( ,albedoInfos: vec2f #endif , baseWeight: f32 -#ifdef BASEWEIGHT +#ifdef BASE_WEIGHT , baseWeightTexture: vec4f , vBaseWeightInfos: vec2f #endif @@ -75,7 +75,7 @@ fn albedoOpacityBlock( // applied in computeDiffuseLighting), but with the diffuse model *currently* used // in Babylon.js, factoring it into the surfaceAlbedo is equivalent. surfaceAlbedo *= baseWeight; - #ifdef BASEWEIGHT + #ifdef BASE_WEIGHT surfaceAlbedo *= baseWeightTexture.r; #endif diff --git a/packages/dev/core/src/ShadersWGSL/ShadersInclude/pbrBlockReflection.fx b/packages/dev/core/src/ShadersWGSL/ShadersInclude/pbrBlockReflection.fx index fda627b0d05..c9529b227e8 100644 --- a/packages/dev/core/src/ShadersWGSL/ShadersInclude/pbrBlockReflection.fx +++ b/packages/dev/core/src/ShadersWGSL/ShadersInclude/pbrBlockReflection.fx @@ -212,6 +212,9 @@ , irradianceSampler: texture_2d , irradianceSamplerSampler: sampler #endif + #ifdef USE_IRRADIANCE_DOMINANT_DIRECTION + , reflectionDominantDirection: vec3f + #endif #endif #ifndef LODBASEDMICROSFURACE #ifdef REFLECTIONMAP_3D @@ -233,6 +236,9 @@ , icdfSamplerSampler: sampler #endif #endif + , viewDirectionW: vec3f + , diffuseRoughness: f32 + , surfaceAlbedo: vec3f ) -> reflectionOutParams { var outParams: reflectionOutParams; @@ -293,6 +299,14 @@ #else var irradianceVector: vec3f = (reflectionMatrix * vec4f(normalW, 0)).xyz; #endif + var irradianceView: vec3f = (reflectionMatrix * vec4f(viewDirectionW, 0)).xyz; + #if !defined(USE_IRRADIANCE_DOMINANT_DIRECTION) && !defined(REALTIME_FILTERING) + // Approximate diffuse roughness by bending the surface normal away from the view. + #if BASE_DIFFUSE_MODEL != BRDF_DIFFUSE_MODEL_LAMBERT + var NdotV: f32 = max(dot(normalW, viewDirectionW), 0.0); + irradianceVector = mix(irradianceVector, irradianceView, (0.5 * (1.0 - NdotV)) * diffuseRoughness); + #endif + #endif #ifdef REFLECTIONMAP_OPPOSITEZ irradianceVector.z *= -1.0; @@ -307,7 +321,7 @@ environmentIrradiance = vEnvironmentIrradiance; #else #if defined(REALTIME_FILTERING) - environmentIrradiance = irradiance(reflectionSampler, reflectionSamplerSampler, irradianceVector, vReflectionFilteringInfo + environmentIrradiance = irradiance(reflectionSampler, reflectionSamplerSampler, irradianceVector, vReflectionFilteringInfo, diffuseRoughness, surfaceAlbedo, irradianceView #ifdef IBL_CDF_FILTERING , icdfSampler , icdfSamplerSampler @@ -327,7 +341,32 @@ #else var environmentIrradiance4: vec4f = textureSample(irradianceSampler, irradianceSamplerSampler, reflectionCoords); #endif - environmentIrradiance = environmentIrradiance4.rgb; + + // If we have a predominant light direction, use it to compute the diffuse roughness term.abort + // Otherwise, bend the irradiance vector to simulate retro-reflectivity of diffuse roughness. + #ifdef USE_IRRADIANCE_DOMINANT_DIRECTION + var Ls: vec3f = normalize(reflectionDominantDirection); + var NoL: f32 = dot(irradianceVector, Ls); + var NoV: f32 = dot(irradianceVector, irradianceView); + + var diffuseRoughnessTerm: vec3f = vec3f(1.0); + #if BASE_DIFFUSE_MODEL == BRDF_DIFFUSE_MODEL_EON + var LoV: f32 = dot(Ls, irradianceView); + var mag: f32 = length(reflectionDominantDirection) * 2.0f; + var clampedAlbedo: vec3f = clamp(surfaceAlbedo, vec3f(0.1), vec3f(1.0)); + diffuseRoughnessTerm = diffuseBRDF_EON(clampedAlbedo, diffuseRoughness, NoL, NoV, LoV) * PI; + diffuseRoughnessTerm = diffuseRoughnessTerm / clampedAlbedo; + diffuseRoughnessTerm = mix(vec3f(1.0), diffuseRoughnessTerm, sqrt(clamp(mag * NoV, 0.0, 1.0f))); + #elif BASE_DIFFUSE_MODEL == BRDF_DIFFUSE_MODEL_BURLEY + var H: vec3f = (irradianceView + Ls) * 0.5f; + var VoH: f32 = dot(irradianceView, H); + diffuseRoughnessTerm = vec3f(diffuseBRDF_Burley(NoL, NoV, VoH, diffuseRoughness) * PI); + #endif + environmentIrradiance = environmentIrradiance4.rgb * diffuseRoughnessTerm; + #else + environmentIrradiance = environmentIrradiance4.rgb; + #endif + #ifdef RGBDREFLECTION environmentIrradiance = fromRGBD(environmentIrradiance4); #endif diff --git a/packages/dev/core/src/ShadersWGSL/ShadersInclude/pbrBlockReflectivity.fx b/packages/dev/core/src/ShadersWGSL/ShadersInclude/pbrBlockReflectivity.fx index 906729b3bcd..3caf1283206 100644 --- a/packages/dev/core/src/ShadersWGSL/ShadersInclude/pbrBlockReflectivity.fx +++ b/packages/dev/core/src/ShadersWGSL/ShadersInclude/pbrBlockReflectivity.fx @@ -2,6 +2,7 @@ struct reflectivityOutParams { microSurface: f32, roughness: f32, + diffuseRoughness: f32, surfaceReflectivityColor: vec3f, #ifdef METALLICWORKFLOW surfaceAlbedo: vec3f, @@ -32,6 +33,11 @@ fn reflectivityBlock( #ifdef METALLICWORKFLOW , surfaceAlbedo: vec3f , metallicReflectanceFactors: vec4f +#endif + , baseDiffuseRoughness: f32 +#ifdef BASE_DIFFUSE_ROUGHNESS + , baseDiffuseRoughnessTexture: f32 + , baseDiffuseRoughnessInfos: vec2f #endif #ifdef REFLECTIVITY , reflectivityInfos: vec3f @@ -97,7 +103,7 @@ fn reflectivityBlock( #endif #define CUSTOM_FRAGMENT_UPDATE_METALLICROUGHNESS - + // Compute microsurface from roughness. microSurface = 1.0 - metallicRoughness.g; @@ -148,9 +154,9 @@ fn reflectivityBlock( #ifdef MICROSURFACEMAP microSurface *= microSurfaceTexel.r; #endif - + #define CUSTOM_FRAGMENT_UPDATE_MICROSURFACE - + #endif #endif #endif @@ -160,8 +166,14 @@ fn reflectivityBlock( // Compute roughness. var roughness: f32 = 1. - microSurface; + var diffuseRoughness: f32 = baseDiffuseRoughness; +#ifdef BASE_DIFFUSE_ROUGHNESS + diffuseRoughness *= baseDiffuseRoughnessTexture * baseDiffuseRoughnessInfos.y; +#endif + outParams.microSurface = microSurface; outParams.roughness = roughness; + outParams.diffuseRoughness = diffuseRoughness; outParams.surfaceReflectivityColor = surfaceReflectivityColor; return outParams; diff --git a/packages/dev/core/src/ShadersWGSL/ShadersInclude/pbrBlockSubSurface.fx b/packages/dev/core/src/ShadersWGSL/ShadersInclude/pbrBlockSubSurface.fx index f2194020f35..77f93cc8998 100644 --- a/packages/dev/core/src/ShadersWGSL/ShadersInclude/pbrBlockSubSurface.fx +++ b/packages/dev/core/src/ShadersWGSL/ShadersInclude/pbrBlockSubSurface.fx @@ -517,7 +517,7 @@ struct subSurfaceOutParams #if defined(USESPHERICALFROMREFLECTIONMAP) #if defined(REALTIME_FILTERING) - var refractionIrradiance: vec3f = irradiance(reflectionSampler, reflectionSamplerSampler, -irradianceVector, vReflectionFilteringInfo + var refractionIrradiance: vec3f = irradiance(reflectionSampler, reflectionSamplerSampler, -irradianceVector, vReflectionFilteringInfo, 0.0, surfaceAlbedo, irradianceVector #ifdef IBL_CDF_FILTERING , icdfSampler , icdfSamplerSampler diff --git a/packages/dev/core/src/ShadersWGSL/ShadersInclude/pbrDirectLightingFunctions.fx b/packages/dev/core/src/ShadersWGSL/ShadersInclude/pbrDirectLightingFunctions.fx index 1950285e06c..9d6a94a4853 100644 --- a/packages/dev/core/src/ShadersWGSL/ShadersInclude/pbrDirectLightingFunctions.fx +++ b/packages/dev/core/src/ShadersWGSL/ShadersInclude/pbrDirectLightingFunctions.fx @@ -23,7 +23,7 @@ struct lightingInfo // Simulate area (small) lights by increasing roughness fn adjustRoughnessFromLightProperties(roughness: f32, lightRadius: f32, lightDistance: f32) -> f32 { #if defined(USEPHYSICALLIGHTFALLOFF) || defined(USEGLTFLIGHTFALLOFF) - // At small angle this approximation works. + // At small angle this approximation works. var lightRoughness: f32 = lightRadius / lightDistance; // Distribution can sum. var totalRoughness: f32 = saturate(lightRoughness + roughness); @@ -44,7 +44,14 @@ fn computeHemisphericDiffuseLighting(info: preLightingInfo, lightColor: vec3f, g #endif fn computeDiffuseLighting(info: preLightingInfo, lightColor: vec3f) -> vec3f { - var diffuseTerm: f32 = diffuseBRDF_Burley(info.NdotL, info.NdotV, info.VdotH, info.roughness); + var diffuseTerm: vec3f = vec3f(1.0 / PI); + #if BASE_DIFFUSE_MODEL == BRDF_DIFFUSE_MODEL_BURLEY + diffuseTerm = vec3f(diffuseBRDF_Burley(info.NdotL, info.NdotV, info.VdotH, info.diffuseRoughness)); + #elif BASE_DIFFUSE_MODEL == BRDF_DIFFUSE_MODEL_EON + var clampedAlbedo: vec3f = clamp(info.surfaceAlbedo, vec3f(0.1), vec3f(1.0)); + diffuseTerm = diffuseBRDF_EON(clampedAlbedo, info.diffuseRoughness, info.NdotL, info.NdotV, info.LdotV); + diffuseTerm /= clampedAlbedo; + #endif return diffuseTerm * info.attenuation * info.NdotL * lightColor; } @@ -70,12 +77,21 @@ fn computeProjectionTextureDiffuseLighting(projectionLightTexture: texture_2d pr result.NdotLUnclamped = dot(N, result.L); result.NdotL = saturateEps(result.NdotLUnclamped); - + result.LdotV = dot(result.L, V); return result; } @@ -90,6 +94,11 @@ fn computeHemisphericPreLightingInfo(lightData: vec4f, V: vec3f, N: vec3f) -> pr #if defined(AREALIGHTUSED) && defined(AREALIGHTSUPPORTED) #include +var areaLightsLTC1SamplerSampler: sampler; +var areaLightsLTC1Sampler: texture_2d; +var areaLightsLTC2SamplerSampler: sampler; +var areaLightsLTC2Sampler: texture_2d; + fn computeAreaPreLightingInfo(ltc1: texture_2d, ltc1Sampler:sampler, ltc2:texture_2d, ltc2Sampler:sampler, viewDirectionW: vec3f, vNormal:vec3f, vPosition:vec3f, lightCenter:vec3f, halfWidth:vec3f, halfHeight:vec3f, roughness:f32) -> preLightingInfo { var result: preLightingInfo; var data: areaLightData = computeAreaLightSpecularDiffuseFresnel(ltc1, ltc1Sampler, ltc2, ltc2Sampler, viewDirectionW, vNormal, vPosition, lightCenter, halfWidth, halfHeight, roughness); diff --git a/packages/dev/core/src/ShadersWGSL/ShadersInclude/pbrFragmentSamplersDeclaration.fx b/packages/dev/core/src/ShadersWGSL/ShadersInclude/pbrFragmentSamplersDeclaration.fx index 8b6df840f7e..bcd07d2564b 100644 --- a/packages/dev/core/src/ShadersWGSL/ShadersInclude/pbrFragmentSamplersDeclaration.fx +++ b/packages/dev/core/src/ShadersWGSL/ShadersInclude/pbrFragmentSamplersDeclaration.fx @@ -1,5 +1,6 @@ #include(_DEFINENAME_,ALBEDO,_VARYINGNAME_,Albedo,_SAMPLERNAME_,albedo) -#include(_DEFINENAME_,BASEWEIGHT,_VARYINGNAME_,BaseWeight,_SAMPLERNAME_,baseWeight) +#include(_DEFINENAME_,BASE_WEIGHT,_VARYINGNAME_,BaseWeight,_SAMPLERNAME_,baseWeight) +#include(_DEFINENAME_,BASE_DIFFUSE_ROUGHNESS,_VARYINGNAME_,BaseDiffuseRoughness,_SAMPLERNAME_,baseDiffuseRoughness) #include(_DEFINENAME_,AMBIENT,_VARYINGNAME_,Ambient,_SAMPLERNAME_,ambient) #include(_DEFINENAME_,OPACITY,_VARYINGNAME_,Opacity,_SAMPLERNAME_,opacity) #include(_DEFINENAME_,EMISSIVE,_VARYINGNAME_,Emissive,_SAMPLERNAME_,emissive) @@ -90,13 +91,6 @@ var environmentBrdfSampler: texture_2d; #endif -#if defined(AREALIGHTUSED) && defined(AREALIGHTSUPPORTED) - var areaLightsLTC1SamplerSampler: sampler; - var areaLightsLTC1Sampler: texture_2d; - var areaLightsLTC2SamplerSampler: sampler; - var areaLightsLTC2Sampler: texture_2d; -#endif - // SUBSURFACE #ifdef SUBSURFACE diff --git a/packages/dev/core/src/ShadersWGSL/ShadersInclude/pbrUboDeclaration.fx b/packages/dev/core/src/ShadersWGSL/ShadersInclude/pbrUboDeclaration.fx index b730d6beddf..3cb5d43a6cf 100644 --- a/packages/dev/core/src/ShadersWGSL/ShadersInclude/pbrUboDeclaration.fx +++ b/packages/dev/core/src/ShadersWGSL/ShadersInclude/pbrUboDeclaration.fx @@ -1,5 +1,6 @@ uniform vAlbedoInfos: vec2f; uniform vBaseWeightInfos: vec2f; +uniform vBaseDiffuseRoughnessInfos: vec2f; uniform vAmbientInfos: vec4f; uniform vOpacityInfos: vec2f; uniform vEmissiveInfos: vec2f; @@ -13,6 +14,7 @@ uniform vReflectionSize: vec3f; uniform vBumpInfos: vec3f; uniform albedoMatrix: mat4x4f; uniform baseWeightMatrix: mat4x4f; +uniform baseDiffuseRoughnessMatrix: mat4x4f; uniform ambientMatrix: mat4x4f; uniform opacityMatrix: mat4x4f; uniform emissiveMatrix: mat4x4f; @@ -25,8 +27,10 @@ uniform reflectionMatrix: mat4x4f; uniform vReflectionColor: vec3f; uniform vAlbedoColor: vec4f; uniform baseWeight: f32; +uniform baseDiffuseRoughness: f32; uniform vLightingIntensity: vec4f; uniform vReflectionMicrosurfaceInfos: vec3f; +uniform vReflectionDominantDirection: vec3f; uniform pointSize: f32; uniform vReflectivityColor: vec4f; uniform vEmissiveColor: vec3f; diff --git a/packages/dev/core/src/ShadersWGSL/ShadersInclude/prePassVertex.fx b/packages/dev/core/src/ShadersWGSL/ShadersInclude/prePassVertex.fx index 7f877fdb6aa..506777a20dc 100644 --- a/packages/dev/core/src/ShadersWGSL/ShadersInclude/prePassVertex.fx +++ b/packages/dev/core/src/ShadersWGSL/ShadersInclude/prePassVertex.fx @@ -11,27 +11,27 @@ #if NUM_BONE_INFLUENCERS > 0 var previousInfluence: mat4x4f; - previousInfluence = mPreviousBones[ i32(matricesIndices[0])] * matricesWeights[0]; + previousInfluence = uniforms.mPreviousBones[ i32(vertexInputs.matricesIndices[0])] * vertexInputs.matricesWeights[0]; #if NUM_BONE_INFLUENCERS > 1 - previousInfluence += mPreviousBones[ i32(matricesIndices[1])] * matricesWeights[1]; + previousInfluence += uniforms.mPreviousBones[ i32(vertexInputs.matricesIndices[1])] * vertexInputs.matricesWeights[1]; #endif #if NUM_BONE_INFLUENCERS > 2 - previousInfluence += mPreviousBones[ i32(matricesIndices[2])] * matricesWeights[2]; + previousInfluence += uniforms.mPreviousBones[ i32(vertexInputs.matricesIndices[2])] * vertexInputs.matricesWeights[2]; #endif #if NUM_BONE_INFLUENCERS > 3 - previousInfluence += mPreviousBones[ i32(matricesIndices[3])] * matricesWeights[3]; + previousInfluence += uniforms.mPreviousBones[ i32(vertexInputs.matricesIndices[3])] * vertexInputs.matricesWeights[3]; #endif #if NUM_BONE_INFLUENCERS > 4 - previousInfluence += mPreviousBones[ i32(matricesIndicesExtra[0])] * matricesWeightsExtra[0]; + previousInfluence += uniforms.mPreviousBones[ i32(vertexInputs.matricesIndicesExtra[0])] * vertexInputs.matricesWeightsExtra[0]; #endif #if NUM_BONE_INFLUENCERS > 5 - previousInfluence += mPreviousBones[ i32(matricesIndicesExtra[1])] * matricesWeightsExtra[1]; + previousInfluence += uniforms.mPreviousBones[ i32(vertexInputs.matricesIndicesExtra[1])] * vertexInputs.matricesWeightsExtra[1]; #endif #if NUM_BONE_INFLUENCERS > 6 - previousInfluence += mPreviousBones[ i32(matricesIndicesExtra[2])] * matricesWeightsExtra[2]; + previousInfluence += uniforms.mPreviousBones[ i32(vertexInputs.matricesIndicesExtra[2])] * vertexInputs.matricesWeightsExtra[2]; #endif #if NUM_BONE_INFLUENCERS > 7 - previousInfluence += mPreviousBones[ i32(matricesIndicesExtra[3])] * matricesWeightsExtra[3]; + previousInfluence += uniforms.mPreviousBones[ i32(vertexInputs.matricesIndicesExtra[3])] * vertexInputs.matricesWeightsExtra[3]; #endif vertexOutputs.vPreviousPosition = uniforms.previousViewProjection * finalPreviousWorld * previousInfluence * vec4f(positionUpdated, 1.0); diff --git a/packages/dev/core/src/ShadersWGSL/ShadersInclude/screenSpaceRayTrace.fx b/packages/dev/core/src/ShadersWGSL/ShadersInclude/screenSpaceRayTrace.fx index 8db299857ec..c0cc16d0551 100644 --- a/packages/dev/core/src/ShadersWGSL/ShadersInclude/screenSpaceRayTrace.fx +++ b/packages/dev/core/src/ShadersWGSL/ShadersInclude/screenSpaceRayTrace.fx @@ -229,6 +229,7 @@ fn traceScreenSpaceRay1( #ifdef SSRAYTRACE_SCREENSPACE_DEPTH sceneZMax = linearizeDepth(sceneZMax, nearPlaneZ, farPlaneZ); #endif + if (sceneZMax == 0.0) { sceneZMax = 1e8; } #ifdef SSRAYTRACE_RIGHT_HANDED_SCENE #ifdef SSRAYTRACE_USE_BACK_DEPTHBUFFER @@ -236,6 +237,7 @@ fn traceScreenSpaceRay1( #ifdef SSRAYTRACE_SCREENSPACE_DEPTH sceneBackZ = linearizeDepth(sceneBackZ, nearPlaneZ, farPlaneZ); #endif + if (sceneBackZ == 0.0) { sceneBackZ = -1e8; } hit = (rayZMax >= sceneBackZ - csZThickness) && (rayZMin <= sceneZMax); #else hit = (rayZMax >= sceneZMax - csZThickness) && (rayZMin <= sceneZMax); @@ -246,6 +248,7 @@ fn traceScreenSpaceRay1( #ifdef SSRAYTRACE_SCREENSPACE_DEPTH sceneBackZ = linearizeDepth(sceneBackZ, nearPlaneZ, farPlaneZ); #endif + if (sceneBackZ == 0.0) { sceneBackZ = 1e8; } hit = (rayZMin <= sceneBackZ + csZThickness) && (rayZMax >= sceneZMax) && (sceneZMax != 0.0); #else hit = (rayZMin <= sceneZMax + csZThickness) && (rayZMax >= sceneZMax); diff --git a/packages/dev/core/src/ShadersWGSL/geometry.vertex.fx b/packages/dev/core/src/ShadersWGSL/geometry.vertex.fx index e324a16677f..b79e692be67 100644 --- a/packages/dev/core/src/ShadersWGSL/geometry.vertex.fx +++ b/packages/dev/core/src/ShadersWGSL/geometry.vertex.fx @@ -117,28 +117,28 @@ fn main(input : VertexInputs) -> FragmentInputs { #if NUM_BONE_INFLUENCERS > 0 var previousInfluence: mat4x4f; - previousInfluence = mPreviousBones[ i32(matricesIndices[0])] * matricesWeights[0]; + previousInfluence = uniforms.mPreviousBones[ i32(vertexInputs.matricesIndices[0])] * vertexInputs.matricesWeights[0]; #if NUM_BONE_INFLUENCERS > 1 - previousInfluence += mPreviousBones[ i32(matricesIndices[1])] * matricesWeights[1]; + previousInfluence += uniforms.mPreviousBones[ i32(vertexInputs.matricesIndices[1])] * vertexInputs.matricesWeights[1]; #endif #if NUM_BONE_INFLUENCERS > 2 - previousInfluence += mPreviousBones[ i32(matricesIndices[2])] * matricesWeights[2]; + previousInfluence += uniforms.mPreviousBones[ i32(vertexInputs.matricesIndices[2])] * vertexInputs.matricesWeights[2]; #endif #if NUM_BONE_INFLUENCERS > 3 - previousInfluence += mPreviousBones[ i32(matricesIndices[3])] * matricesWeights[3]; + previousInfluence += uniforms.mPreviousBones[ i32(vertexInputs.matricesIndices[3])] * vertexInputs.matricesWeights[3]; #endif #if NUM_BONE_INFLUENCERS > 4 - previousInfluence += mPreviousBones[ i32(matricesIndicesExtra[0])] * matricesWeightsExtra[0]; + previousInfluence += uniforms.mPreviousBones[ i32(vertexInputs.matricesIndicesExtra[0])] * vertexInputs.matricesWeightsExtra[0]; #endif #if NUM_BONE_INFLUENCERS > 5 - previousInfluence += mPreviousBones[ i32(matricesIndicesExtra[1])] * matricesWeightsExtra[1]; + previousInfluence += uniforms.mPreviousBones[ i32(vertexInputs.matricesIndicesExtra[1])] * vertexInputs.matricesWeightsExtra[1]; #endif #if NUM_BONE_INFLUENCERS > 6 - previousInfluence += mPreviousBones[ i32(matricesIndicesExtra[2])] * matricesWeightsExtra[2]; + previousInfluence += uniforms.mPreviousBones[ i32(vertexInputs.matricesIndicesExtra[2])] * vertexInputs.matricesWeightsExtra[2]; #endif #if NUM_BONE_INFLUENCERS > 7 - previousInfluence += mPreviousBones[ i32(matricesIndicesExtra[3])] * matricesWeightsExtra[3]; + previousInfluence += uniforms.mPreviousBones[ i32(vertexInputs.matricesIndicesExtra[3])] * vertexInputs.matricesWeightsExtra[3]; #endif vertexOutputs.vPreviousPosition = uniforms.previousViewProjection * finalPreviousWorld * previousInfluence * vec4f(positionUpdated, 1.0); diff --git a/packages/dev/core/src/ShadersWGSL/greasedLine.vertex.fx b/packages/dev/core/src/ShadersWGSL/greasedLine.vertex.fx index c6370660a0d..fd2e017ad10 100644 --- a/packages/dev/core/src/ShadersWGSL/greasedLine.vertex.fx +++ b/packages/dev/core/src/ShadersWGSL/greasedLine.vertex.fx @@ -49,6 +49,20 @@ fn main(input : VertexInputs) -> FragmentInputs { let grlNext: vec3f = input.grl_nextAndCounters.xyz; vertexOutputs.grlCounters = input.grl_nextAndCounters.w; + + #ifdef GREASED_LINE_USE_OFFSETS + var grlPositionOffset: vec3f = input.grl_offsets; + #else + var grlPositionOffset = vec3f(0.); + #endif + let grlFinalPosition: vec4f = grlMatrix * vec4f(vertexInputs.position + grlPositionOffset , 1.0); + let grlPrevPos: vec4f = grlMatrix * vec4f(grlPrevious + grlPositionOffset, 1.0); + let grlNextPos: vec4f = grlMatrix * vec4f(grlNext + grlPositionOffset, 1.0); + + let grlCurrentP: vec2f = grlFix(grlFinalPosition, uniforms.grlAspect); + let grlPrevP: vec2f = grlFix(grlPrevPos, uniforms.grlAspect); + let grlNextP: vec2f= grlFix(grlNextPos, uniforms.grlAspect); + let grlWidth:f32 = grlBaseWidth * input.grl_widths; #ifdef GREASED_LINE_USE_OFFSETS diff --git a/packages/dev/core/src/ShadersWGSL/hdrIrradianceFiltering.fragment.fx b/packages/dev/core/src/ShadersWGSL/hdrIrradianceFiltering.fragment.fx index 6a1ba090fca..cea8e9ed4c5 100644 --- a/packages/dev/core/src/ShadersWGSL/hdrIrradianceFiltering.fragment.fx +++ b/packages/dev/core/src/ShadersWGSL/hdrIrradianceFiltering.fragment.fx @@ -16,7 +16,7 @@ varying direction: vec3f; @fragment fn main(input: FragmentInputs) -> FragmentOutputs { - var color: vec3f = irradiance(inputTexture, inputTextureSampler, input.direction, uniforms.vFilteringInfo + var color: vec3f = irradiance(inputTexture, inputTextureSampler, input.direction, uniforms.vFilteringInfo, 0.0, vec3f(1.0), input.direction #ifdef IBL_CDF_FILTERING , icdfTexture, icdfTextureSampler #endif diff --git a/packages/dev/core/src/ShadersWGSL/iblDominantDirection.fragment.fx b/packages/dev/core/src/ShadersWGSL/iblDominantDirection.fragment.fx new file mode 100644 index 00000000000..1d04e7bda0c --- /dev/null +++ b/packages/dev/core/src/ShadersWGSL/iblDominantDirection.fragment.fx @@ -0,0 +1,23 @@ +#include +#include +#include +#include + +var icdfSamplerSampler: sampler; +var icdfSampler: texture_2d; + +@fragment +fn main(input: FragmentInputs) -> FragmentOutputs { + var lightDir: vec3f = vec3f(0.0, 0.0, 0.0); + for(var i: u32 = 0u; i < NUM_SAMPLES; i++) + { + var Xi: vec2f = hammersley(i, NUM_SAMPLES); + var T: vec2f; + T.x = textureSampleLevel(icdfSampler, icdfSamplerSampler, vec2(Xi.x, 0.0), 0.0).x; + T.y = textureSampleLevel(icdfSampler, icdfSamplerSampler, vec2(T.x, Xi.y), 0.0).y; + var Ls: vec3f = uv_to_normal(vec2f(1.0 - fract(T.x + 0.25), T.y)); + lightDir += Ls; + } + lightDir /= vec3f(f32(NUM_SAMPLES)); + fragmentOutputs.color = vec4f(lightDir, 1.0); +} \ No newline at end of file diff --git a/packages/dev/core/src/ShadersWGSL/motionBlur.fragment.fx b/packages/dev/core/src/ShadersWGSL/motionBlur.fragment.fx index d03389a14f3..8a5d1689508 100644 --- a/packages/dev/core/src/ShadersWGSL/motionBlur.fragment.fx +++ b/packages/dev/core/src/ShadersWGSL/motionBlur.fragment.fx @@ -28,7 +28,7 @@ fn main(input: FragmentInputs) -> FragmentOutputs { #ifdef GEOMETRY_SUPPORTED #ifdef OBJECT_BASED var texelSize: vec2f = 1.0 / uniforms.screenSize; - var velocityColor: vec4f = textureSample(velocitySampler, velocitySamplerSampler, input.vUV); + var velocityColor: vec4f = textureSampleLevel(velocitySampler, velocitySamplerSampler, input.vUV, 0.0); velocityColor = vec4f(velocityColor.rg * 2.0 - vec2f(1.0), velocityColor.b, velocityColor.a); let signs = sign(velocityColor.rg); var velocity = pow(abs(velocityColor.rg), vec2f(3.0)) * signs * velocityColor.a; @@ -39,7 +39,7 @@ fn main(input: FragmentInputs) -> FragmentOutputs { velocity = normalize(velocity) * texelSize; var hlim: f32 = f32(-samplesCount) * 0.5 + 0.5; - var result: vec4f = textureSample(textureSampler, textureSamplerSampler, input.vUV); + var result: vec4f = textureSampleLevel(textureSampler, textureSamplerSampler, input.vUV, 0.0); for (var i: i32 = 1; i < i32(SAMPLES); i++) { @@ -48,17 +48,20 @@ fn main(input: FragmentInputs) -> FragmentOutputs { } var offset: vec2f = input.vUV + velocity * (hlim + f32(i)); - #if defined(WEBGPU) - result += textureSampleLevel(textureSampler, textureSamplerSampler, offset, 0.0); - #else - result += textureSample(textureSampler, textureSamplerSampler, offset); - #endif + result += textureSampleLevel(textureSampler, textureSamplerSampler, offset, 0.0); } fragmentOutputs.color = vec4f(result.rgb / f32(samplesCount), 1.0); #else + var result: vec4f = textureSampleLevel(textureSampler, textureSamplerSampler, input.vUV, 0.0); + var texelSize: vec2f = 1.0 / uniforms.screenSize; - var depth: f32 = textureSample(depthSampler, depthSamplerSampler, input.vUV).r; + var depth: f32 = textureSampleLevel(depthSampler, depthSamplerSampler, input.vUV, 0.0).r; + if (depth == 0.0) { + fragmentOutputs.color = result; + return fragmentOutputs; + } + depth = uniforms.projection[2].z + uniforms.projection[3].z / depth; // convert from view linear z to NDC z var cpos: vec4f = vec4f(input.vUV * 2.0 - 1.0, depth, 1.0); @@ -67,25 +70,19 @@ fn main(input: FragmentInputs) -> FragmentOutputs { var ppos: vec4f = uniforms.prevViewProjection * cpos; ppos /= ppos.w; - ppos.xy = ppos.xy * 0.5 + 0.5; + ppos = vec4f(ppos.xy * 0.5 + 0.5, ppos.zw); var velocity: vec2f = (ppos.xy - input.vUV) * uniforms.motionScale * uniforms.motionStrength; var speed: f32 = length(velocity / texelSize); var nSamples: i32 = i32(clamp(speed, 1.0, SAMPLES)); - var result: vec4f = textureSample(textureSampler, textureSamplerSampler, input.vUV); - for (var i: i32 = 1; i < i32(SAMPLES); i++) { if (i >= nSamples) { break; } var offset1: vec2f = input.vUV + velocity * ( f32(i) / f32(nSamples - 1) - 0.5); - #if defined(WEBGPU) - result += textureSampleLevel(textureSampler, textureSamplerSampler, offset1, 0.0); - #else - result += textureSample(textureSampler, textureSamplerSampler, offset1); - #endif + result += textureSampleLevel(textureSampler, textureSamplerSampler, offset1, 0.0); } fragmentOutputs.color = result / f32(nSamples); diff --git a/packages/dev/core/src/ShadersWGSL/pbr.fragment.fx b/packages/dev/core/src/ShadersWGSL/pbr.fragment.fx index d4f01ea3152..b7aa702a2ec 100644 --- a/packages/dev/core/src/ShadersWGSL/pbr.fragment.fx +++ b/packages/dev/core/src/ShadersWGSL/pbr.fragment.fx @@ -75,7 +75,7 @@ fn main(input: FragmentInputs) -> FragmentOutputs { var albedoTexture: vec4f = textureSample(albedoSampler, albedoSamplerSampler, fragmentInputs.vAlbedoUV + uvOffset); #endif -#ifdef BASEWEIGHT +#ifdef BASE_WEIGHT var baseWeightTexture: vec4f = textureSample(baseWeightSampler, baseWeightSamplerSampler, fragmentInputs.vBaseWeightUV + uvOffset); #endif @@ -94,7 +94,7 @@ fn main(input: FragmentInputs) -> FragmentOutputs { , uniforms.vAlbedoInfos #endif , uniforms.baseWeight - #ifdef BASEWEIGHT + #ifdef BASE_WEIGHT , baseWeightTexture , uniforms.vBaseWeightInfos #endif @@ -161,6 +161,10 @@ fn main(input: FragmentInputs) -> FragmentOutputs { var microSurfaceTexel: vec4f = textureSample(microSurfaceSampler, microSurfaceSamplerSampler, fragmentInputs.vMicroSurfaceSamplerUV + uvOffset) * uniforms.vMicroSurfaceSamplerInfos.y; #endif +#ifdef BASE_DIFFUSE_ROUGHNESS + var baseDiffuseRoughnessTexture: f32 = textureSample(baseDiffuseRoughnessSampler, baseDiffuseRoughnessSamplerSampler, fragmentInputs.vBaseDiffuseRoughnessUV + uvOffset).x; +#endif + #ifdef METALLICWORKFLOW var metallicReflectanceFactors: vec4f = uniforms.vMetallicReflectanceFactors; #ifdef REFLECTANCE @@ -189,6 +193,11 @@ fn main(input: FragmentInputs) -> FragmentOutputs { #ifdef METALLICWORKFLOW , surfaceAlbedo , metallicReflectanceFactors + #endif + , uniforms.baseDiffuseRoughness + #ifdef BASE_DIFFUSE_ROUGHNESS + , baseDiffuseRoughnessTexture + , uniforms.vBaseDiffuseRoughnessInfos #endif #ifdef REFLECTIVITY , uniforms.vReflectivityInfos @@ -208,6 +217,7 @@ fn main(input: FragmentInputs) -> FragmentOutputs { var microSurface: f32 = reflectivityOut.microSurface; var roughness: f32 = reflectivityOut.roughness; + var diffuseRoughness: f32 = reflectivityOut.diffuseRoughness; #ifdef METALLICWORKFLOW surfaceAlbedo = reflectivityOut.surfaceAlbedo; @@ -287,6 +297,9 @@ fn main(input: FragmentInputs) -> FragmentOutputs { #ifdef USEIRRADIANCEMAP , irradianceSampler , irradianceSamplerSampler + #ifdef USE_IRRADIANCE_DOMINANT_DIRECTION + , uniforms.vReflectionDominantDirection + #endif #endif #ifndef LODBASEDMICROSFURACE , reflectionLowSampler @@ -301,6 +314,9 @@ fn main(input: FragmentInputs) -> FragmentOutputs { , icdfSamplerSampler #endif #endif + , viewDirectionW + , diffuseRoughness + , surfaceAlbedo ); #else #define CUSTOM_REFLECTION @@ -360,7 +376,7 @@ fn main(input: FragmentInputs) -> FragmentOutputs { , reflectionHighSamplerSampler #endif #ifdef REALTIME_FILTERING - , vReflectionFilteringInfo + , uniforms.vReflectionFilteringInfo #endif #if !defined(REFLECTIONMAP_SKYBOX) && defined(RADIANCEOCCLUSION) , seo @@ -545,7 +561,7 @@ fn main(input: FragmentInputs) -> FragmentOutputs { #if defined(REALTIME_FILTERING) , reflectionSampler , reflectionSamplerSampler - , vReflectionFilteringInfo + , uniforms.vReflectionFilteringInfo #ifdef IBL_CDF_FILTERING , icdfSampler , icdfSamplerSampler diff --git a/packages/dev/core/src/ShadersWGSL/pbr.vertex.fx b/packages/dev/core/src/ShadersWGSL/pbr.vertex.fx index 93beef2fcb7..840335bf237 100644 --- a/packages/dev/core/src/ShadersWGSL/pbr.vertex.fx +++ b/packages/dev/core/src/ShadersWGSL/pbr.vertex.fx @@ -27,7 +27,8 @@ attribute color: vec4f; #include #include(_DEFINENAME_,ALBEDO,_VARYINGNAME_,Albedo) -#include(_DEFINENAME_,BASEWEIGHT,_VARYINGNAME_,BaseWeight) +#include(_DEFINENAME_,BASE_WEIGHT,_VARYINGNAME_,BaseWeight) +#include(_DEFINENAME_,BASE_DIFFUSE_ROUGHNESS,_VARYINGNAME_,BaseDiffuseRoughness) #include(_DEFINENAME_,DETAIL,_VARYINGNAME_,Detail) #include(_DEFINENAME_,AMBIENT,_VARYINGNAME_,Ambient) #include(_DEFINENAME_,OPACITY,_VARYINGNAME_,Opacity) @@ -171,10 +172,19 @@ fn main(input : VertexInputs) -> FragmentInputs { #endif #if defined(USESPHERICALFROMREFLECTIONMAP) && defined(USESPHERICALINVERTEX) - var reflectionVector: vec3f = (uniforms.reflectionMatrix * vec4f(vertexOutputs.vNormalW, 0)).xyz; + #if BASE_DIFFUSE_MODEL != BRDF_DIFFUSE_MODEL_LAMBERT + // Bend the normal towards the viewer based on the diffuse roughness + var viewDirectionW: vec3f = normalize(scene.vEyePosition.xyz - vertexOutputs.vPositionW); + var NdotV: f32 = max(dot(vertexOutputs.vNormalW, viewDirectionW), 0.0); + var roughNormal: vec3f = mix(vertexOutputs.vNormalW, viewDirectionW, (0.5 * (1.0 - NdotV)) * uniforms.baseDiffuseRoughness); + var reflectionVector: vec3f = (uniforms.reflectionMatrix * vec4f(roughNormal, 0)).xyz; + #else + var reflectionVector: vec3f = (uniforms.reflectionMatrix * vec4f(vertexOutputs.vNormalW, 0)).xyz; + #endif #ifdef REFLECTIONMAP_OPPOSITEZ reflectionVector.z *= -1.0; #endif + vertexOutputs.vEnvironmentIrradiance = computeEnvironmentIrradiance(reflectionVector); #endif #endif @@ -216,7 +226,8 @@ fn main(input : VertexInputs) -> FragmentInputs { #include[3..7] #include(_DEFINENAME_,ALBEDO,_VARYINGNAME_,Albedo,_MATRIXNAME_,albedo,_INFONAME_,AlbedoInfos.x) - #include(_DEFINENAME_,BASEWEIGHT,_VARYINGNAME_,BaseWeight,_MATRIXNAME_,baseWeight,_INFONAME_,BaseWeightInfos.x) + #include(_DEFINENAME_,BASE_WEIGHT,_VARYINGNAME_,BaseWeight,_MATRIXNAME_,baseWeight,_INFONAME_,BaseWeightInfos.x) + #include(_DEFINENAME_,BASE_DIFFUSE_ROUGHNESS,_VARYINGNAME_,BaseDiffuseRoughness,_MATRIXNAME_,baseDiffuseRoughness,_INFONAME_,BaseDiffuseRoughnessInfos.x) #include(_DEFINENAME_,DETAIL,_VARYINGNAME_,Detail,_MATRIXNAME_,detail,_INFONAME_,DetailInfos.x) #include(_DEFINENAME_,AMBIENT,_VARYINGNAME_,Ambient,_MATRIXNAME_,ambient,_INFONAME_,AmbientInfos.x) #include(_DEFINENAME_,OPACITY,_VARYINGNAME_,Opacity,_MATRIXNAME_,opacity,_INFONAME_,OpacityInfos.x) diff --git a/packages/dev/core/src/Sprites/spriteManager.ts b/packages/dev/core/src/Sprites/spriteManager.ts index 31e2e1aaee0..cb15a7a5265 100644 --- a/packages/dev/core/src/Sprites/spriteManager.ts +++ b/packages/dev/core/src/Sprites/spriteManager.ts @@ -428,6 +428,7 @@ export class SpriteManager implements ISpriteManager { const textureSize = this.texture.getSize(); if (!this._textureContent) { this._textureContent = new Uint8Array(textureSize.width * textureSize.height * 4); + // eslint-disable-next-line @typescript-eslint/no-floating-promises this.texture.readPixels(0, 0, this._textureContent); } @@ -775,7 +776,7 @@ export class SpriteManager implements ISpriteManager { * @returns a promise that will resolve to the new sprite manager */ public static async ParseFromFileAsync(name: Nullable, url: string, scene: Scene, rootUrl: string = ""): Promise { - return new Promise((resolve, reject) => { + return await new Promise((resolve, reject) => { const request = new WebRequest(); request.addEventListener("readystatechange", () => { if (request.readyState == 4) { @@ -789,6 +790,7 @@ export class SpriteManager implements ISpriteManager { resolve(output); } else { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject("Unable to load the sprite manager"); } } @@ -806,6 +808,7 @@ export class SpriteManager implements ISpriteManager { * @param rootUrl defines the root URL to use to load textures and relative dependencies * @returns a promise that will resolve to the new sprite manager */ + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax public static ParseFromSnippetAsync(snippetId: string, scene: Scene, rootUrl: string = ""): Promise { if (snippetId === "_BLANK") { return Promise.resolve(new SpriteManager("Default sprite manager", "//playground.babylonjs.com/textures/player.png", 500, 64, scene)); @@ -824,6 +827,7 @@ export class SpriteManager implements ISpriteManager { resolve(output); } else { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject("Unable to load the snippet " + snippetId); } } diff --git a/packages/dev/core/src/Sprites/spriteRenderer.ts b/packages/dev/core/src/Sprites/spriteRenderer.ts index 8c64ee560de..8468f9f3621 100644 --- a/packages/dev/core/src/Sprites/spriteRenderer.ts +++ b/packages/dev/core/src/Sprites/spriteRenderer.ts @@ -234,6 +234,7 @@ export class SpriteRenderer { this._vertexBuffers["cellInfo"] = cellInfo; this._vertexBuffers[VertexBuffer.ColorKind] = colors; + // eslint-disable-next-line @typescript-eslint/no-floating-promises this._initShaderSourceAsync(); } diff --git a/packages/dev/core/src/XR/features/WebXRAnchorSystem.ts b/packages/dev/core/src/XR/features/WebXRAnchorSystem.ts index d96f28ff16e..54f2f080e6b 100644 --- a/packages/dev/core/src/XR/features/WebXRAnchorSystem.ts +++ b/packages/dev/core/src/XR/features/WebXRAnchorSystem.ts @@ -205,7 +205,7 @@ export class WebXRAnchorSystem extends WebXRAbstractFeature { } else { try { const nativeAnchor = await hitTestResult.xrHitResult.createAnchor(m); - return new Promise((resolve, reject) => { + return await new Promise((resolve, reject) => { this._futureAnchors.push({ nativeAnchor, resolved: false, @@ -250,7 +250,7 @@ export class WebXRAnchorSystem extends WebXRAbstractFeature { ? await this._createAnchorAtTransformationAsync(xrTransformation, this._xrSessionManager.currentFrame) : undefined; // add the transformation to the future anchors list - return new Promise((resolve, reject) => { + return await new Promise((resolve, reject) => { this._futureAnchors.push({ nativeAnchor: xrAnchor, resolved: false, @@ -367,6 +367,7 @@ export class WebXRAnchorSystem extends WebXRAbstractFeature { // process future anchors for (const futureAnchor of this._futureAnchors) { if (!futureAnchor.resolved && !futureAnchor.submitted) { + // eslint-disable-next-line github/no-then this._createAnchorAtTransformationAsync(futureAnchor.xrTransformation, frame).then( (nativeAnchor) => { futureAnchor.nativeAnchor = nativeAnchor; @@ -418,7 +419,7 @@ export class WebXRAnchorSystem extends WebXRAbstractFeature { private async _createAnchorAtTransformationAsync(xrTransformation: XRRigidTransform, xrFrame: XRFrame) { if (xrFrame.createAnchor) { try { - return xrFrame.createAnchor(xrTransformation, this._referenceSpaceForFrameAnchors ?? this._xrSessionManager.referenceSpace); + return await xrFrame.createAnchor(xrTransformation, this._referenceSpaceForFrameAnchors ?? this._xrSessionManager.referenceSpace); } catch (error) { throw new Error(error); } diff --git a/packages/dev/core/src/XR/features/WebXRDepthSensing.ts b/packages/dev/core/src/XR/features/WebXRDepthSensing.ts index bfccd0d6e67..1b6099fee84 100644 --- a/packages/dev/core/src/XR/features/WebXRDepthSensing.ts +++ b/packages/dev/core/src/XR/features/WebXRDepthSensing.ts @@ -635,7 +635,7 @@ export class WebXRDepthSensing extends WebXRAbstractFeature { const isDepthUsageDeclared = this.options.usagePreference != null && this.options.usagePreference.length !== 0; const isDataFormatDeclared = this.options.dataFormatPreference != null && this.options.dataFormatPreference.length !== 0; - return new Promise((resolve) => { + return await new Promise((resolve) => { if (isDepthUsageDeclared && isDataFormatDeclared) { const usages: XRDepthUsage[] = this.options.usagePreference.map((usage) => { switch (usage) { diff --git a/packages/dev/core/src/XR/features/WebXRHandTracking.ts b/packages/dev/core/src/XR/features/WebXRHandTracking.ts index f889b90cb3a..a849f30bc30 100644 --- a/packages/dev/core/src/XR/features/WebXRHandTracking.ts +++ b/packages/dev/core/src/XR/features/WebXRHandTracking.ts @@ -591,7 +591,7 @@ export class WebXRHandTracking extends WebXRAbstractFeature { options?: IWebXRHandTrackingOptions ): Promise<{ left: AbstractMesh; right: AbstractMesh }> { // eslint-disable-next-line no-async-promise-executor, @typescript-eslint/no-misused-promises - return new Promise(async (resolve) => { + return await new Promise(async (resolve) => { const riggedMeshes: { [handedness: string]: AbstractMesh } = {}; // check the cache, defensive if (WebXRHandTracking._RightHandGLB?.meshes[1]?.isDisposed()) { @@ -608,7 +608,9 @@ export class WebXRHandTracking extends WebXRAbstractFeature { WebXRHandTracking._RightHandGLB || SceneLoader.ImportMeshAsync("", defaulrHandGLBUrl, WebXRHandTracking.DEFAULT_HAND_MODEL_RIGHT_FILENAME, scene), WebXRHandTracking._LeftHandGLB || SceneLoader.ImportMeshAsync("", defaulrHandGLBUrl, WebXRHandTracking.DEFAULT_HAND_MODEL_LEFT_FILENAME, scene), ]); + // eslint-disable-next-line require-atomic-updates WebXRHandTracking._RightHandGLB = handGLBs[0]; + // eslint-disable-next-line require-atomic-updates WebXRHandTracking._LeftHandGLB = handGLBs[1]; const shaderUrl = Tools.GetAssetUrl(WebXRHandTracking.DEFAULT_HAND_MODEL_SHADER_URL); const handShader = await NodeMaterial.ParseFromFileAsync("handShader", shaderUrl, scene, undefined, true); @@ -839,6 +841,7 @@ export class WebXRHandTracking extends WebXRAbstractFeature { this._handResources.rigMappings = this.options.handMeshes?.customRigMappings || null; // If they didn't supply custom meshes and are not disabling the default meshes... if (!this.options.handMeshes?.customMeshes && !this.options.handMeshes?.disableDefaultMeshes) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then WebXRHandTracking._GenerateDefaultHandMeshesAsync(EngineStore.LastCreatedScene!, this._xrSessionManager, this.options).then((defaultHandMeshes) => { this._handResources.handMeshes = defaultHandMeshes; this._handResources.rigMappings = { diff --git a/packages/dev/core/src/XR/features/WebXRHitTest.ts b/packages/dev/core/src/XR/features/WebXRHitTest.ts index fb02c0be0be..f3aab0ddbfe 100644 --- a/packages/dev/core/src/XR/features/WebXRHitTest.ts +++ b/packages/dev/core/src/XR/features/WebXRHitTest.ts @@ -100,6 +100,7 @@ export class WebXRHitTest extends WebXRAbstractFeature implements IWebXRHitTestF Tools.Warn("waiting for viewer reference space to initialize"); return; } + // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then this._xrSessionManager.session.requestHitTestSource!(hitTestOptions).then((hitTestSource) => { if (this._xrHitTestSource) { this._xrHitTestSource.cancel(); @@ -176,10 +177,12 @@ export class WebXRHitTest extends WebXRAbstractFeature implements IWebXRHitTestF } if (this.options.enableTransientHitTest) { const offsetRay = new XRRay(this.options.transientOffsetRay || {}); + // eslint-disable-next-line @typescript-eslint/no-floating-promises this._xrSessionManager.session.requestHitTestSourceForTransientInput!({ profile: this.options.transientHitTestProfile || "generic-touchscreen", offsetRay, entityTypes: this.options.entityTypes, + // eslint-disable-next-line github/no-then }).then((hitSource) => { this._transientXrHitTestSource = hitSource; }); @@ -242,7 +245,7 @@ export class WebXRHitTest extends WebXRAbstractFeature implements IWebXRHitTestF for (const hitTestResult of hitTestResults) { const pose = hitTestResult.getPose(this._xrSessionManager.referenceSpace); if (!pose) { - return; + continue; } const pos = pose.transform.position; const quat = pose.transform.orientation; diff --git a/packages/dev/core/src/XR/features/WebXRHitTestLegacy.ts b/packages/dev/core/src/XR/features/WebXRHitTestLegacy.ts index 30b503c0d17..05dd7df03ef 100644 --- a/packages/dev/core/src/XR/features/WebXRHitTestLegacy.ts +++ b/packages/dev/core/src/XR/features/WebXRHitTestLegacy.ts @@ -106,10 +106,9 @@ export class WebXRHitTestLegacy extends WebXRAbstractFeature implements IWebXRHi * @returns a promise that resolves with an array of native XR hit result in xr coordinates system */ public static async XRHitTestWithRay(xrSession: XRSession, xrRay: XRRay, referenceSpace: XRReferenceSpace, filter?: (result: XRHitResult) => boolean): Promise { - return xrSession.requestHitTest!(xrRay, referenceSpace).then((results) => { - const filterFunction = filter || ((result) => !!result.hitMatrix); - return results.filter(filterFunction); - }); + const results = await xrSession.requestHitTest!(xrRay, referenceSpace); + const filterFunction = filter || ((result) => !!result.hitMatrix); + return results.filter(filterFunction); } /** @@ -125,7 +124,7 @@ export class WebXRHitTestLegacy extends WebXRAbstractFeature implements IWebXRHi } const targetRay = new XRRay(targetRayPose.transform); - return this.XRHitTestWithRay(event.frame.session, targetRay, referenceSpace); + return await this.XRHitTestWithRay(event.frame.session, targetRay, referenceSpace); } /** @@ -187,6 +186,7 @@ export class WebXRHitTestLegacy extends WebXRAbstractFeature implements IWebXRHi { x: this._origin.x, y: this._origin.y, z: this._origin.z, w: 0 }, { x: this._direction.x, y: this._direction.y, z: this._direction.z, w: 0 } ); + // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then WebXRHitTestLegacy.XRHitTestWithRay(this._xrSessionManager.session, ray, this._xrSessionManager.referenceSpace).then(this._onHitTestResults); } @@ -215,6 +215,7 @@ export class WebXRHitTestLegacy extends WebXRAbstractFeature implements IWebXRHi if (!this._onSelectEnabled) { return; } + // eslint-disable-next-line @typescript-eslint/no-floating-promises WebXRHitTestLegacy.XRHitTestWithSelectEvent(event, this._xrSessionManager.referenceSpace); }; } diff --git a/packages/dev/core/src/XR/features/WebXRImageTracking.ts b/packages/dev/core/src/XR/features/WebXRImageTracking.ts index c13f65fb96a..2a29cb5e30d 100644 --- a/packages/dev/core/src/XR/features/WebXRImageTracking.ts +++ b/packages/dev/core/src/XR/features/WebXRImageTracking.ts @@ -177,7 +177,7 @@ export class WebXRImageTracking extends WebXRAbstractFeature { } const promises = this.options.images.map(async (image) => { if (typeof image.src === "string") { - return (this._xrSessionManager.scene.getEngine() as Engine)._createImageBitmapFromSource(image.src); + return await (this._xrSessionManager.scene.getEngine() as Engine)._createImageBitmapFromSource(image.src); } else { return image.src; } @@ -210,6 +210,7 @@ export class WebXRImageTracking extends WebXRAbstractFeature { // Image tracking scores may be generated a few frames after the XR Session initializes. // If we haven't received scores yet, then kick off the task to check scores and return immediately. if (this._trackableScoreStatus === ImageTrackingScoreStatus.NotReceived) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises this._checkScoresAsync(); return; } diff --git a/packages/dev/core/src/XR/features/WebXRLightEstimation.ts b/packages/dev/core/src/XR/features/WebXRLightEstimation.ts index d859e8da4a9..13aab34f37a 100644 --- a/packages/dev/core/src/XR/features/WebXRLightEstimation.ts +++ b/packages/dev/core/src/XR/features/WebXRLightEstimation.ts @@ -244,6 +244,7 @@ export class WebXRLightEstimation extends WebXRAbstractFeature { this._reflectionCubeMap._texture.isReady = true; if (!this.options.disablePreFiltering) { this._xrLightProbe.removeEventListener("reflectionchange", this._updateReflectionCubeMap); + // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then this._hdrFilter.prefilter(this._reflectionCubeMap).then(() => { this._xrSessionManager.scene.markAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag); this.onReflectionCubeMapUpdatedObservable.notifyObservers(this._reflectionCubeMap!); @@ -270,10 +271,12 @@ export class WebXRLightEstimation extends WebXRAbstractFeature { const reflectionFormat = this.options.reflectionFormat ?? (this._xrSessionManager.session.preferredReflectionFormat || "srgba8"); this.options.reflectionFormat = reflectionFormat; + // eslint-disable-next-line @typescript-eslint/no-floating-promises this._xrSessionManager.session .requestLightProbe({ reflectionFormat, }) + // eslint-disable-next-line github/no-then .then((xrLightProbe: XRLightProbe) => { this._xrLightProbe = xrLightProbe; if (!this.options.disableCubeMapReflection) { diff --git a/packages/dev/core/src/XR/features/WebXRNearInteraction.ts b/packages/dev/core/src/XR/features/WebXRNearInteraction.ts index 36f1dfc1cba..087f07962c7 100644 --- a/packages/dev/core/src/XR/features/WebXRNearInteraction.ts +++ b/packages/dev/core/src/XR/features/WebXRNearInteraction.ts @@ -869,9 +869,11 @@ export class WebXRNearInteraction extends WebXRAbstractFeature { parsePromise = NodeMaterial.ParseFromSnippetAsync("8RUNKL#3", meshCreationScene); } parsePromise + // eslint-disable-next-line github/no-then .then((mat) => { touchCollisionMesh.material = mat; }) + // eslint-disable-next-line github/no-then .catch((err) => { Logger.Warn(`Error creating touch material in WebXRNearInteraction: ${err}`); }); diff --git a/packages/dev/core/src/XR/features/WebXRPlaneDetector.ts b/packages/dev/core/src/XR/features/WebXRPlaneDetector.ts index 2760bf45c99..d5a50141796 100644 --- a/packages/dev/core/src/XR/features/WebXRPlaneDetector.ts +++ b/packages/dev/core/src/XR/features/WebXRPlaneDetector.ts @@ -160,9 +160,9 @@ export class WebXRPlaneDetector extends WebXRAbstractFeature { // eslint-disable-next-line @typescript-eslint/naming-convention public async initiateRoomCapture(): Promise { if (this._xrSessionManager.session.initiateRoomCapture) { - return this._xrSessionManager.session.initiateRoomCapture(); + return await this._xrSessionManager.session.initiateRoomCapture(); } - return Promise.reject("initiateRoomCapture is not supported on this session"); + throw "initiateRoomCapture is not supported on this session"; } protected _onXRFrame(frame: XRFrame) { diff --git a/packages/dev/core/src/XR/motionController/webXRAbstractMotionController.ts b/packages/dev/core/src/XR/motionController/webXRAbstractMotionController.ts index e4d9e547175..9a899f8cc4f 100644 --- a/packages/dev/core/src/XR/motionController/webXRAbstractMotionController.ts +++ b/packages/dev/core/src/XR/motionController/webXRAbstractMotionController.ts @@ -393,7 +393,7 @@ export abstract class WebXRAbstractMotionController implements IDisposable { } else { loadingParams = this._getFilenameAndPath(); } - return new Promise((resolve, reject) => { + return await new Promise((resolve, reject) => { const meshesLoaded = (meshes: AbstractMesh[]) => { if (useGeneric) { this._getGenericParentMesh(meshes); @@ -437,6 +437,7 @@ export abstract class WebXRAbstractMotionController implements IDisposable { (_scene: Scene, message: string) => { Logger.Log(message); Logger.Warn(`Failed to retrieve controller model of type ${this.profileId} from the remote server: ${loadingParams.path}${loadingParams.filename}`); + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject(message); } ); @@ -474,7 +475,7 @@ export abstract class WebXRAbstractMotionController implements IDisposable { // eslint-disable-next-line @typescript-eslint/naming-convention public async pulse(value: number, duration: number, hapticActuatorIndex: number = 0): Promise { if (this.gamepadObject.hapticActuators && this.gamepadObject.hapticActuators[hapticActuatorIndex]) { - return this.gamepadObject.hapticActuators[hapticActuatorIndex].pulse(value, duration); + return await this.gamepadObject.hapticActuators[hapticActuatorIndex].pulse(value, duration); } else { return false; } diff --git a/packages/dev/core/src/XR/motionController/webXRMicrosoftMixedRealityController.ts b/packages/dev/core/src/XR/motionController/webXRMicrosoftMixedRealityController.ts index d8259c1d573..9455d700038 100644 --- a/packages/dev/core/src/XR/motionController/webXRMicrosoftMixedRealityController.ts +++ b/packages/dev/core/src/XR/motionController/webXRMicrosoftMixedRealityController.ts @@ -121,20 +121,20 @@ export class WebXRMicrosoftMixedRealityController extends WebXRAbstractMotionCon for (let i = 0; i < ids.length; i++) { const id = ids[i]; if (this.disableAnimation) { - return; + continue; } if (id && this.rootMesh) { const buttonMap = (this._mapping.buttons)[id]; const buttonMeshName = buttonMap.rootNodeName; if (!buttonMeshName) { Logger.Log("Skipping unknown button at index: " + i + " with mapped name: " + id); - return; + continue; } const buttonMesh = this._getChildByName(this.rootMesh, buttonMeshName); if (!buttonMesh) { Logger.Warn("Missing button mesh with name: " + buttonMeshName); - return; + continue; } buttonMap.valueMesh = this._getImmediateChildByName(buttonMesh, this._mapping.defaultButton.valueNodeName); @@ -163,21 +163,21 @@ export class WebXRMicrosoftMixedRealityController extends WebXRAbstractMotionCon for (const id of ids) { const comp = this.getComponent(id); if (!comp.isAxes()) { - return; + continue; } const axisArray = ["x-axis", "y-axis"]; for (const axis of axisArray) { if (!this.rootMesh) { - return; + continue; } const axisMap = (this._mapping.axes)[id][axis]; const axisMesh = this._getChildByName(this.rootMesh, axisMap.rootNodeName); if (!axisMesh) { Logger.Warn("Missing axis mesh with name: " + axisMap.rootNodeName); - return; + continue; } axisMap.valueMesh = this._getImmediateChildByName(axisMesh, this._mapping.defaultAxis.valueNodeName); diff --git a/packages/dev/core/src/XR/motionController/webXRMotionControllerManager.ts b/packages/dev/core/src/XR/motionController/webXRMotionControllerManager.ts index 20786842e3e..7f528e0ba12 100644 --- a/packages/dev/core/src/XR/motionController/webXRMotionControllerManager.ts +++ b/packages/dev/core/src/XR/motionController/webXRMotionControllerManager.ts @@ -147,12 +147,13 @@ export class WebXRMotionControllerManager { const firstFunction = this.PrioritizeOnlineRepository ? this._LoadProfileFromRepositoryAsync : this._LoadProfilesFromAvailableControllersAsync; const secondFunction = this.PrioritizeOnlineRepository ? this._LoadProfilesFromAvailableControllersAsync : this._LoadProfileFromRepositoryAsync; + // eslint-disable-next-line github/no-then return firstFunction.call(this, profileArray, xrInput, scene).catch(() => { return secondFunction.call(this, profileArray, xrInput, scene); }); } else { // use only available functions - return this._LoadProfilesFromAvailableControllersAsync(profileArray, xrInput, scene); + return await this._LoadProfilesFromAvailableControllersAsync(profileArray, xrInput, scene); } } @@ -186,11 +187,12 @@ export class WebXRMotionControllerManager { * @returns a promise that resolves to a map of profiles available online */ // eslint-disable-next-line @typescript-eslint/naming-convention - public static async UpdateProfilesList() { - this._ProfilesList = Tools.LoadFileAsync(this.BaseRepositoryUrl + "/profiles/profilesList.json", false).then((data) => { - return JSON.parse(data); - }); - return this._ProfilesList; + public static async UpdateProfilesList(): Promise<{ + [profile: string]: string; + }> { + const data = await Tools.LoadFileAsync(this.BaseRepositoryUrl + "/profiles/profilesList.json", false); + this._ProfilesList = JSON.parse(data); + return await this._ProfilesList!; } /** @@ -206,14 +208,16 @@ export class WebXRMotionControllerManager { } private static async _LoadProfileFromRepositoryAsync(profileArray: string[], xrInput: XRInputSource, scene: Scene): Promise { - return Promise.resolve() + return await Promise.resolve() + // eslint-disable-next-line github/no-then .then(async () => { if (!this._ProfilesList) { - return this.UpdateProfilesList(); + return await this.UpdateProfilesList(); } else { - return this._ProfilesList; + return await this._ProfilesList; } }) + // eslint-disable-next-line github/no-then .then((profilesList: { [profile: string]: string }) => { // load the right profile for (let i = 0; i < profileArray.length; ++i) { @@ -228,15 +232,19 @@ export class WebXRMotionControllerManager { throw new Error(`neither controller ${profileArray[0]} nor all fallbacks were found in the repository,`); }) + // eslint-disable-next-line github/no-then .then(async (profileToLoad: string) => { // load the profile + // eslint-disable-next-line @typescript-eslint/no-misused-promises if (!this._ProfileLoadingPromises[profileToLoad]) { + // eslint-disable-next-line github/no-then this._ProfileLoadingPromises[profileToLoad] = Tools.LoadFileAsync(`${this.BaseRepositoryUrl}/profiles/${profileToLoad}/profile.json`, false).then( (data) => JSON.parse(data) ); } - return this._ProfileLoadingPromises[profileToLoad]; + return await this._ProfileLoadingPromises[profileToLoad]; }) + // eslint-disable-next-line github/no-then .then((profile: IMotionControllerProfile) => { return new WebXRProfiledMotionController(scene, xrInput, profile, this.BaseRepositoryUrl, this.DisableControllerCache ? undefined : ControllerCache); }); diff --git a/packages/dev/core/src/XR/motionController/webXRProfiledMotionController.ts b/packages/dev/core/src/XR/motionController/webXRProfiledMotionController.ts index bd95dfde184..4df6d3e5ccd 100644 --- a/packages/dev/core/src/XR/motionController/webXRProfiledMotionController.ts +++ b/packages/dev/core/src/XR/motionController/webXRProfiledMotionController.ts @@ -152,7 +152,7 @@ export class WebXRProfiledMotionController extends WebXRAbstractMotionController for (const id of ids) { const component = this.getComponent(id); if (!component.hasChanges) { - return; + continue; } const meshes = this._buttonMeshMapping[id]; const componentInLayout = this.layout.components[id]; diff --git a/packages/dev/core/src/XR/native/nativeXRFrame.ts b/packages/dev/core/src/XR/native/nativeXRFrame.ts index a7dfe3c6a09..3b48a7d7547 100644 --- a/packages/dev/core/src/XR/native/nativeXRFrame.ts +++ b/packages/dev/core/src/XR/native/nativeXRFrame.ts @@ -87,4 +87,5 @@ export class NativeXRFrame implements XRFrame { } } +// eslint-disable-next-line @typescript-eslint/no-floating-promises RegisterNativeTypeAsync("NativeXRFrame", NativeXRFrame); diff --git a/packages/dev/core/src/XR/webXRDefaultExperience.ts b/packages/dev/core/src/XR/webXRDefaultExperience.ts index 1bc148739be..b0a80422d38 100644 --- a/packages/dev/core/src/XR/webXRDefaultExperience.ts +++ b/packages/dev/core/src/XR/webXRDefaultExperience.ts @@ -162,103 +162,101 @@ export class WebXRDefaultExperience { result.enterExitUI = new WebXREnterExitUI(scene, uiOptions); } - // Create base experience - return WebXRExperienceHelper.CreateAsync(scene) - .then(async (xrHelper) => { - result.baseExperience = xrHelper; + try { + // Create base experience + const xrHelper = await WebXRExperienceHelper.CreateAsync(scene); + // eslint-disable-next-line require-atomic-updates + result.baseExperience = xrHelper; - if (options.ignoreNativeCameraTransformation) { - result.baseExperience.camera.compensateOnFirstFrame = false; - } - - // Add controller support - result.input = new WebXRInput(xrHelper.sessionManager, xrHelper.camera, { - controllerOptions: { - renderingGroupId: options.renderingGroupId, - }, - ...(options.inputOptions || {}), - }); + if (options.ignoreNativeCameraTransformation) { + // eslint-disable-next-line require-atomic-updates + result.baseExperience.camera.compensateOnFirstFrame = false; + } - if (!options.disablePointerSelection) { - // Add default pointer selection - const pointerSelectionOptions = { - ...options.pointerSelectionOptions, - xrInput: result.input, - renderingGroupId: options.renderingGroupId, - }; + // Add controller support + // eslint-disable-next-line require-atomic-updates + result.input = new WebXRInput(xrHelper.sessionManager, xrHelper.camera, { + controllerOptions: { + renderingGroupId: options.renderingGroupId, + }, + ...(options.inputOptions || {}), + }); - result.pointerSelection = ( - result.baseExperience.featuresManager.enableFeature( - WebXRControllerPointerSelection.Name, - options.useStablePlugins ? "stable" : "latest", - pointerSelectionOptions - ) - ); + if (!options.disablePointerSelection) { + // Add default pointer selection + const pointerSelectionOptions = { + ...options.pointerSelectionOptions, + xrInput: result.input, + renderingGroupId: options.renderingGroupId, + }; - if (!options.disableTeleportation) { - // Add default teleportation, including rotation - result.teleportation = result.baseExperience.featuresManager.enableFeature( - WebXRMotionControllerTeleportation.Name, - options.useStablePlugins ? "stable" : "latest", - { - floorMeshes: options.floorMeshes, - xrInput: result.input, - renderingGroupId: options.renderingGroupId, - ...options.teleportationOptions, - } - ); - result.teleportation.setSelectionFeature(result.pointerSelection); - } - } + result.pointerSelection = ( + result.baseExperience.featuresManager.enableFeature( + WebXRControllerPointerSelection.Name, + options.useStablePlugins ? "stable" : "latest", + pointerSelectionOptions + ) + ); - if (!options.disableNearInteraction) { - // Add default pointer selection - result.nearInteraction = result.baseExperience.featuresManager.enableFeature( - WebXRNearInteraction.Name, + if (!options.disableTeleportation) { + // Add default teleportation, including rotation + result.teleportation = result.baseExperience.featuresManager.enableFeature( + WebXRMotionControllerTeleportation.Name, options.useStablePlugins ? "stable" : "latest", - { + { + floorMeshes: options.floorMeshes, xrInput: result.input, - farInteractionFeature: result.pointerSelection, renderingGroupId: options.renderingGroupId, - useUtilityLayer: true, - enableNearInteractionOnAllControllers: true, - ...options.nearInteractionOptions, + ...options.teleportationOptions, } ); + result.teleportation.setSelectionFeature(result.pointerSelection); } + } - if (!options.disableHandTracking) { - // Add default hand tracking - result.baseExperience.featuresManager.enableFeature( - WebXRHandTracking.Name, - options.useStablePlugins ? "stable" : "latest", - { - xrInput: result.input, - ...options.handSupportOptions, - }, - undefined, - false - ); - } + if (!options.disableNearInteraction) { + // Add default pointer selection + result.nearInteraction = result.baseExperience.featuresManager.enableFeature( + WebXRNearInteraction.Name, + options.useStablePlugins ? "stable" : "latest", + { + xrInput: result.input, + farInteractionFeature: result.pointerSelection, + renderingGroupId: options.renderingGroupId, + useUtilityLayer: true, + enableNearInteractionOnAllControllers: true, + ...options.nearInteractionOptions, + } + ); + } + + if (!options.disableHandTracking) { + // Add default hand tracking + result.baseExperience.featuresManager.enableFeature( + WebXRHandTracking.Name, + options.useStablePlugins ? "stable" : "latest", + { + xrInput: result.input, + ...options.handSupportOptions, + }, + undefined, + false + ); + } - // Create the WebXR output target - result.renderTarget = result.baseExperience.sessionManager.getWebXRRenderTarget(options.outputCanvasOptions); + // Create the WebXR output target + result.renderTarget = result.baseExperience.sessionManager.getWebXRRenderTarget(options.outputCanvasOptions); - if (!options.disableDefaultUI) { - // Create ui for entering/exiting xr - return result.enterExitUI.setHelperAsync(result.baseExperience, result.renderTarget); - } else { - return; - } - }) - .then(() => { - return result; - }) - .catch((error) => { - Logger.Error("Error initializing XR"); - Logger.Error(error); - return result; - }); + if (!options.disableDefaultUI) { + // Create ui for entering/exiting xr + await result.enterExitUI.setHelperAsync(result.baseExperience, result.renderTarget); + } + return result; + } catch (error) { + Logger.Error("Error initializing XR"); + Logger.Error(error); + return result; + } } /** diff --git a/packages/dev/core/src/XR/webXREnterExitUI.ts b/packages/dev/core/src/XR/webXREnterExitUI.ts index ffe9b3da445..131a7674f01 100644 --- a/packages/dev/core/src/XR/webXREnterExitUI.ts +++ b/packages/dev/core/src/XR/webXREnterExitUI.ts @@ -178,7 +178,7 @@ export class WebXREnterExitUI implements IDisposable { this._helper = helper; this._renderTarget = renderTarget; const supportedPromises = this._buttons.map(async (btn) => { - return helper.sessionManager.isSessionSupportedAsync(btn.sessionMode); + return await helper.sessionManager.isSessionSupportedAsync(btn.sessionMode); }); helper.onStateChangedObservable.add((state) => { if (state == WebXRState.NOT_IN_XR) { @@ -265,6 +265,7 @@ export class WebXREnterExitUI implements IDisposable { // } else if (this._helper) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises this._enterXRWithButtonIndexAsync(0); } }; diff --git a/packages/dev/core/src/XR/webXRExperienceHelper.ts b/packages/dev/core/src/XR/webXRExperienceHelper.ts index 9041eb0a76b..83a449038f6 100644 --- a/packages/dev/core/src/XR/webXRExperienceHelper.ts +++ b/packages/dev/core/src/XR/webXRExperienceHelper.ts @@ -87,12 +87,14 @@ export class WebXRExperienceHelper implements IDisposable { */ public static async CreateAsync(scene: Scene): Promise { const helper = new WebXRExperienceHelper(scene); - return helper.sessionManager + return await helper.sessionManager .initializeAsync() + // eslint-disable-next-line github/no-then .then(() => { helper._supported = true; return helper; }) + // eslint-disable-next-line github/no-then .catch((e) => { helper._setState(WebXRState.NOT_IN_XR); helper.dispose(); @@ -104,6 +106,7 @@ export class WebXRExperienceHelper implements IDisposable { * Disposes of the experience helper */ public dispose() { + // eslint-disable-next-line @typescript-eslint/no-floating-promises this.exitXRAsync(); this.camera.dispose(); this.onStateChangedObservable.clear(); @@ -236,7 +239,7 @@ export class WebXRExperienceHelper implements IDisposable { return; } this._setState(WebXRState.EXITING_XR); - return this.sessionManager.exitXRAsync(); + return await this.sessionManager.exitXRAsync(); } /** diff --git a/packages/dev/core/src/XR/webXRFeaturesManager.ts b/packages/dev/core/src/XR/webXRFeaturesManager.ts index e32fb799e4f..5278946900c 100644 --- a/packages/dev/core/src/XR/webXRFeaturesManager.ts +++ b/packages/dev/core/src/XR/webXRFeaturesManager.ts @@ -501,6 +501,7 @@ export class WebXRFeaturesManager implements IDisposable { } } if (feature.featureImplementation.getXRSessionInitExtension) { + // eslint-disable-next-line no-await-in-loop const extended = await feature.featureImplementation.getXRSessionInitExtension(); xrSessionInit = { ...xrSessionInit, diff --git a/packages/dev/core/src/XR/webXRInput.ts b/packages/dev/core/src/XR/webXRInput.ts index f0416015d09..6abf8840fde 100644 --- a/packages/dev/core/src/XR/webXRInput.ts +++ b/packages/dev/core/src/XR/webXRInput.ts @@ -112,6 +112,7 @@ export class WebXRInput implements IDisposable { if (WebXRMotionControllerManager.UseOnlineRepository) { // pre-load the profiles list to load the controllers quicker afterwards try { + // eslint-disable-next-line github/no-then WebXRMotionControllerManager.UpdateProfilesList().catch(() => { WebXRMotionControllerManager.UseOnlineRepository = false; }); diff --git a/packages/dev/core/src/XR/webXRInputSource.ts b/packages/dev/core/src/XR/webXRInputSource.ts index 91ed7997dba..793caa4a27f 100644 --- a/packages/dev/core/src/XR/webXRInputSource.ts +++ b/packages/dev/core/src/XR/webXRInputSource.ts @@ -109,12 +109,14 @@ export class WebXRInputSource { // for now only load motion controllers if gamepad object available if (this.inputSource.gamepad && this.inputSource.targetRayMode === "tracked-pointer") { + // eslint-disable-next-line github/no-then WebXRMotionControllerManager.GetMotionControllerWithXRInput(inputSource, _scene, this._options.forceControllerProfile).then( (motionController) => { this.motionController = motionController; this.onMotionControllerInitObservable.notifyObservers(motionController); // should the model be loaded? if (!this._options.doNotLoadControllerMesh && !this.motionController._doNotLoadControllerMesh) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then this.motionController.loadModel().then((success) => { if (success && this.motionController && this.motionController.rootMesh) { if (this._options.renderingGroupId) { diff --git a/packages/dev/core/src/XR/webXRManagedOutputCanvas.ts b/packages/dev/core/src/XR/webXRManagedOutputCanvas.ts index 7588e318c0f..4150c54b709 100644 --- a/packages/dev/core/src/XR/webXRManagedOutputCanvas.ts +++ b/packages/dev/core/src/XR/webXRManagedOutputCanvas.ts @@ -122,6 +122,7 @@ export class WebXRManagedOutputCanvas implements WebXRRenderTarget { // stay safe - make sure the context has the function try { if (this.canvasContext && (this.canvasContext as any).makeXRCompatible) { + // eslint-disable-next-line github/no-then this.canvasContext.makeXRCompatible().then( () => { resolve(); @@ -137,6 +138,7 @@ export class WebXRManagedOutputCanvas implements WebXRRenderTarget { } } catch (e) { // if this fails - the exception will be caught and the promise will be rejected + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject(e); } }); @@ -155,12 +157,14 @@ export class WebXRManagedOutputCanvas implements WebXRRenderTarget { return this.xrLayer; }; - return this._canvasCompatiblePromise + return await this._canvasCompatiblePromise + // eslint-disable-next-line github/no-then .then( // catch any error and continue. When using the emulator is throws this error for no apparent reason. () => {}, () => {} ) + // eslint-disable-next-line github/no-then .then(() => { return createLayer(); }); diff --git a/packages/dev/core/src/XR/webXRSessionManager.ts b/packages/dev/core/src/XR/webXRSessionManager.ts index 34305eddbea..0ea437f19c6 100644 --- a/packages/dev/core/src/XR/webXRSessionManager.ts +++ b/packages/dev/core/src/XR/webXRSessionManager.ts @@ -160,6 +160,7 @@ export class WebXRSessionManager implements IDisposable, IWebXRRenderTargetTextu public dispose() { // disposing without leaving XR? Exit XR first if (this.inXRSession) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises this.exitXRAsync(); } this.onXRReady.clear(); @@ -252,46 +253,46 @@ export class WebXRSessionManager implements IDisposable, IWebXRRenderTargetTextu * @returns a promise which will resolve once the session has been initialized */ public async initializeSessionAsync(xrSessionMode: XRSessionMode = "immersive-vr", xrSessionInit: XRSessionInit = {}): Promise { - return this._xrNavigator.xr.requestSession(xrSessionMode, xrSessionInit).then((session: XRSession) => { - this.session = session; - this._sessionMode = xrSessionMode; - this.inXRSession = true; - this.onXRSessionInit.notifyObservers(session); - - // handle when the session is ended (By calling session.end or device ends its own session eg. pressing home button on phone) - this.session.addEventListener( - "end", - () => { - this.inXRSession = false; - - // Notify frame observers - this.onXRSessionEnded.notifyObservers(null); - - if (this._engine) { - // make sure dimensions object is restored - this._engine.framebufferDimensionsObject = null; - - // Restore frame buffer to avoid clear on xr framebuffer after session end - this._engine.restoreDefaultFramebuffer(); - - // Need to restart render loop as after the session is ended the last request for new frame will never call callback - this._engine.customAnimationFrameRequester = null; - this._engine._renderLoop(); - } + const session = await this._xrNavigator.xr.requestSession(xrSessionMode, xrSessionInit); - // Dispose render target textures. - // Only dispose on native because we can't destroy opaque textures on browser. - if (this.isNative) { - this._baseLayerRTTProvider?.dispose(); - } - this._baseLayerRTTProvider = null; - this._baseLayerWrapper = null; - }, - { once: true } - ); + this.session = session; + this._sessionMode = xrSessionMode; + this.inXRSession = true; + this.onXRSessionInit.notifyObservers(session); - return this.session; - }); + // handle when the session is ended (By calling session.end or device ends its own session eg. pressing home button on phone) + this.session.addEventListener( + "end", + () => { + this.inXRSession = false; + + // Notify frame observers + this.onXRSessionEnded.notifyObservers(null); + + if (this._engine) { + // make sure dimensions object is restored + this._engine.framebufferDimensionsObject = null; + + // Restore frame buffer to avoid clear on xr framebuffer after session end + this._engine.restoreDefaultFramebuffer(); + + // Need to restart render loop as after the session is ended the last request for new frame will never call callback + this._engine.customAnimationFrameRequester = null; + this._engine._renderLoop(); + } + + // Dispose render target textures. + // Only dispose on native because we can't destroy opaque textures on browser. + if (this.isNative) { + this._baseLayerRTTProvider?.dispose(); + } + this._baseLayerRTTProvider = null; + this._baseLayerWrapper = null; + }, + { once: true } + ); + + return this.session; } /** @@ -300,7 +301,7 @@ export class WebXRSessionManager implements IDisposable, IWebXRRenderTargetTextu * @returns A Promise that resolves to true if supported and false if not */ public async isSessionSupportedAsync(sessionMode: XRSessionMode): Promise { - return WebXRSessionManager.IsSessionSupportedAsync(sessionMode); + return await WebXRSessionManager.IsSessionSupportedAsync(sessionMode); } /** @@ -361,43 +362,31 @@ export class WebXRSessionManager implements IDisposable, IWebXRRenderTargetTextu * @returns a promise that will resolve once the reference space has been set */ public async setReferenceSpaceTypeAsync(referenceSpaceType: XRReferenceSpaceType = "local-floor"): Promise { - return this.session - .requestReferenceSpace(referenceSpaceType) - .then( - (referenceSpace) => { - return referenceSpace as XRReferenceSpace; - }, - async (rejectionReason) => { - Logger.Error("XR.requestReferenceSpace failed for the following reason: "); - Logger.Error(rejectionReason); - Logger.Log('Defaulting to universally-supported "viewer" reference space type.'); - - return this.session.requestReferenceSpace("viewer").then( - (referenceSpace) => { - const heightCompensation = new XRRigidTransform({ x: 0, y: -this.defaultHeightCompensation, z: 0 }); - return (referenceSpace as XRReferenceSpace).getOffsetReferenceSpace(heightCompensation); - }, - (rejectionReason) => { - Logger.Error(rejectionReason); - // eslint-disable-next-line no-throw-literal - throw 'XR initialization failed: required "viewer" reference space type not supported.'; - } - ); - } - ) - .then(async (referenceSpace) => { - // create viewer reference space before setting the first reference space - return this.session.requestReferenceSpace("viewer").then((viewerReferenceSpace) => { - this.viewerReferenceSpace = viewerReferenceSpace as XRReferenceSpace; - return referenceSpace; - }); - }) - .then((referenceSpace) => { - // initialize the base and offset (currently the same) - this.referenceSpace = this.baseReferenceSpace = referenceSpace; - this.onXRReferenceSpaceInitialized.notifyObservers(referenceSpace); - return this.referenceSpace; - }); + let referenceSpace: XRReferenceSpace; + try { + referenceSpace = await this.session.requestReferenceSpace(referenceSpaceType); + } catch (rejectionReason) { + Logger.Error("XR.requestReferenceSpace failed for the following reason: "); + Logger.Error(rejectionReason); + Logger.Log('Defaulting to universally-supported "viewer" reference space type.'); + + try { + const referenceSpace = await this.session.requestReferenceSpace("viewer"); + const heightCompensation = new XRRigidTransform({ x: 0, y: -this.defaultHeightCompensation, z: 0 }); + return (referenceSpace as XRReferenceSpace).getOffsetReferenceSpace(heightCompensation); + } catch (rejectionReason) { + Logger.Error(rejectionReason); + // eslint-disable-next-line no-throw-literal + throw 'XR initialization failed: required "viewer" reference space type not supported.'; + } + } + // create viewer reference space before setting the first reference space + const viewerReferenceSpace = await this.session.requestReferenceSpace("viewer"); + this.viewerReferenceSpace = viewerReferenceSpace as XRReferenceSpace; + // initialize the base and offset (currently the same) + this.referenceSpace = this.baseReferenceSpace = referenceSpace; + this.onXRReferenceSpaceInitialized.notifyObservers(referenceSpace); + return this.referenceSpace; } /** @@ -408,7 +397,7 @@ export class WebXRSessionManager implements IDisposable, IWebXRRenderTargetTextu * @deprecated Use updateRenderState() instead. */ public async updateRenderStateAsync(state: XRRenderState): Promise { - return this.session.updateRenderState(state); + return await this.session.updateRenderState(state); } /** @@ -438,6 +427,7 @@ export class WebXRSessionManager implements IDisposable, IWebXRRenderTargetTextu this._setBaseLayerWrapper(this.isNative ? new NativeXRLayerWrapper(state.baseLayer) : new WebXRWebGLLayerWrapper(state.baseLayer)); } + // eslint-disable-next-line @typescript-eslint/no-floating-promises this.session.updateRenderState(state); } @@ -455,16 +445,14 @@ export class WebXRSessionManager implements IDisposable, IWebXRRenderTargetTextu if (!functionToUse) { return false; } else { - return functionToUse - .call((navigator as any).xr, sessionMode) - .then(async (result: boolean) => { - const returnValue = typeof result === "undefined" ? true : result; - return returnValue; - }) - .catch(async (e: any) => { - Logger.Warn(e); - return false; - }); + try { + const result = functionToUse.call((navigator as any).xr, sessionMode); + const returnValue = typeof result === "undefined" ? true : result; + return returnValue; + } catch (e: any) { + Logger.Warn(e); + return false; + } } } @@ -496,7 +484,7 @@ export class WebXRSessionManager implements IDisposable, IWebXRRenderTargetTextu */ // eslint-disable-next-line @typescript-eslint/naming-convention public async updateTargetFrameRate(rate: number): Promise { - return this.session.updateTargetFrameRate(rate); + return await this.session.updateTargetFrameRate(rate); } /** diff --git a/packages/dev/core/src/assetContainer.ts b/packages/dev/core/src/assetContainer.ts index 4bdfddd47af..b1ed8207a6e 100644 --- a/packages/dev/core/src/assetContainer.ts +++ b/packages/dev/core/src/assetContainer.ts @@ -729,89 +729,89 @@ export class AssetContainer extends AbstractAssetContainer { const addedNodes: Node[] = []; for (const o of this.cameras) { if (predicate && !predicate(o)) { - return; + continue; } this.scene.addCamera(o); addedNodes.push(o); } for (const o of this.lights) { if (predicate && !predicate(o)) { - return; + continue; } this.scene.addLight(o); addedNodes.push(o); } for (const o of this.meshes) { if (predicate && !predicate(o)) { - return; + continue; } this.scene.addMesh(o); addedNodes.push(o); } for (const o of this.skeletons) { if (predicate && !predicate(o)) { - return; + continue; } this.scene.addSkeleton(o); } for (const o of this.animations) { if (predicate && !predicate(o)) { - return; + continue; } this.scene.addAnimation(o); } for (const o of this.animationGroups) { if (predicate && !predicate(o)) { - return; + continue; } this.scene.addAnimationGroup(o); } for (const o of this.multiMaterials) { if (predicate && !predicate(o)) { - return; + continue; } this.scene.addMultiMaterial(o); } for (const o of this.materials) { if (predicate && !predicate(o)) { - return; + continue; } this.scene.addMaterial(o); } for (const o of this.morphTargetManagers) { if (predicate && !predicate(o)) { - return; + continue; } this.scene.addMorphTargetManager(o); } for (const o of this.geometries) { if (predicate && !predicate(o)) { - return; + continue; } this.scene.addGeometry(o); } for (const o of this.transformNodes) { if (predicate && !predicate(o)) { - return; + continue; } this.scene.addTransformNode(o); addedNodes.push(o); } for (const o of this.actionManagers) { if (predicate && !predicate(o)) { - return; + continue; } this.scene.addActionManager(o); } for (const o of this.textures) { if (predicate && !predicate(o)) { - return; + continue; } this.scene.addTexture(o); } for (const o of this.reflectionProbes) { if (predicate && !predicate(o)) { - return; + continue; } this.scene.addReflectionProbe(o); } @@ -857,85 +857,85 @@ export class AssetContainer extends AbstractAssetContainer { public removeFromScene(predicate: Nullable<(entity: any) => boolean> = null) { for (const o of this.cameras) { if (predicate && !predicate(o)) { - return; + continue; } this.scene.removeCamera(o); } for (const o of this.lights) { if (predicate && !predicate(o)) { - return; + continue; } this.scene.removeLight(o); } for (const o of this.meshes) { if (predicate && !predicate(o)) { - return; + continue; } this.scene.removeMesh(o, true); } for (const o of this.skeletons) { if (predicate && !predicate(o)) { - return; + continue; } this.scene.removeSkeleton(o); } for (const o of this.animations) { if (predicate && !predicate(o)) { - return; + continue; } this.scene.removeAnimation(o); } for (const o of this.animationGroups) { if (predicate && !predicate(o)) { - return; + continue; } this.scene.removeAnimationGroup(o); } for (const o of this.multiMaterials) { if (predicate && !predicate(o)) { - return; + continue; } this.scene.removeMultiMaterial(o); } for (const o of this.materials) { if (predicate && !predicate(o)) { - return; + continue; } this.scene.removeMaterial(o); } for (const o of this.morphTargetManagers) { if (predicate && !predicate(o)) { - return; + continue; } this.scene.removeMorphTargetManager(o); } for (const o of this.geometries) { if (predicate && !predicate(o)) { - return; + continue; } this.scene.removeGeometry(o); } for (const o of this.transformNodes) { if (predicate && !predicate(o)) { - return; + continue; } this.scene.removeTransformNode(o); } for (const o of this.actionManagers) { if (predicate && !predicate(o)) { - return; + continue; } this.scene.removeActionManager(o); } for (const o of this.textures) { if (predicate && !predicate(o)) { - return; + continue; } this.scene.removeTexture(o); } for (const o of this.reflectionProbes) { if (predicate && !predicate(o)) { - return; + continue; } this.scene.removeReflectionProbe(o); } @@ -1265,6 +1265,8 @@ export class AssetContainer extends AbstractAssetContainer { this.geometries.push(nodeToVisit.geometry); } this.meshes.push(nodeToVisit); + } else if (nodeToVisit instanceof InstancedMesh) { + this.meshes.push(nodeToVisit); } else if (nodeToVisit instanceof TransformNode) { this.transformNodes.push(nodeToVisit); } else if (nodeToVisit instanceof Light) { diff --git a/packages/dev/core/src/scene.ts b/packages/dev/core/src/scene.ts index 9f7f21b57fc..e30f90a2230 100644 --- a/packages/dev/core/src/scene.ts +++ b/packages/dev/core/src/scene.ts @@ -2522,7 +2522,7 @@ export class Scene implements IAnimatable, IClipPlanesHolder, IAssetContainer { * @returns A promise that resolves when the scene is ready */ public async whenReadyAsync(checkRenderTargets = false): Promise { - return new Promise((resolve) => { + return await new Promise((resolve) => { this.executeWhenReady(() => { resolve(); }, checkRenderTargets); @@ -5845,7 +5845,7 @@ export class Scene implements IAnimatable, IClipPlanesHolder, IAssetContainer { useArrayBuffer?: boolean, onOpened?: (request: WebRequest) => void ): Promise { - return new Promise((resolve, reject) => { + return await new Promise((resolve, reject) => { this._loadFile( fileOrUrl, (data) => { @@ -5855,6 +5855,7 @@ export class Scene implements IAnimatable, IClipPlanesHolder, IAssetContainer { useOfflineSupport, useArrayBuffer, (request, exception) => { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject(exception); }, onOpened @@ -5892,7 +5893,7 @@ export class Scene implements IAnimatable, IClipPlanesHolder, IAssetContainer { useArrayBuffer?: boolean, onOpened?: (request: WebRequest) => void ): Promise { - return new Promise((resolve, reject) => { + return await new Promise((resolve, reject) => { this._requestFile( url, (data) => { @@ -5931,7 +5932,7 @@ export class Scene implements IAnimatable, IClipPlanesHolder, IAssetContainer { * @internal */ public async _readFileAsync(file: File, onProgress?: (ev: ProgressEvent) => any, useArrayBuffer?: boolean): Promise { - return new Promise((resolve, reject) => { + return await new Promise((resolve, reject) => { this._readFile( file, (data) => { diff --git a/packages/dev/gui/src/2D/advancedDynamicTexture.ts b/packages/dev/gui/src/2D/advancedDynamicTexture.ts index 753896e705f..48c48658ca0 100644 --- a/packages/dev/gui/src/2D/advancedDynamicTexture.ts +++ b/packages/dev/gui/src/2D/advancedDynamicTexture.ts @@ -1499,7 +1499,7 @@ export class AdvancedDynamicTexture extends DynamicTexture { * @returns a promise that will resolve on success */ public async parseFromSnippetAsync(snippetId: string, scaleToSize?: boolean, urlRewriter?: (url: string) => string): Promise { - return AdvancedDynamicTexture.ParseFromSnippetAsync(snippetId, scaleToSize, this, urlRewriter); + return await AdvancedDynamicTexture.ParseFromSnippetAsync(snippetId, scaleToSize, this, urlRewriter); } /** @@ -1530,7 +1530,7 @@ export class AdvancedDynamicTexture extends DynamicTexture { * @returns a promise that will resolve on success */ public async parseFromURLAsync(url: string, scaleToSize?: boolean, urlRewriter?: (url: string) => string): Promise { - return AdvancedDynamicTexture.ParseFromFileAsync(url, scaleToSize, this, urlRewriter); + return await AdvancedDynamicTexture.ParseFromFileAsync(url, scaleToSize, this, urlRewriter); } private static async _LoadURLContentAsync(url: string, snippet: boolean = false): Promise { @@ -1538,7 +1538,7 @@ export class AdvancedDynamicTexture extends DynamicTexture { throw new Error("No URL provided"); } - return new Promise((resolve, reject) => { + return await new Promise((resolve, reject) => { const request = new WebRequest(); request.addEventListener("readystatechange", () => { if (request.readyState == 4) { @@ -1553,6 +1553,7 @@ export class AdvancedDynamicTexture extends DynamicTexture { const serializationObject = JSON.parse(gui); resolve(serializationObject); } else { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject("Unable to load"); } } diff --git a/packages/dev/gui/src/2D/controls/button.ts b/packages/dev/gui/src/2D/controls/button.ts index 6132a61a044..652d7e48f6b 100644 --- a/packages/dev/gui/src/2D/controls/button.ts +++ b/packages/dev/gui/src/2D/controls/button.ts @@ -182,9 +182,10 @@ export class Button extends Rectangle { * Serializes the current button * @param serializationObject defines the JSON serialized object * @param force force serialization even if isSerializable === false + * @param allowCanvas defines if the control is allowed to use a Canvas2D object to serialize */ - public override serialize(serializationObject: any, force: boolean) { - super.serialize(serializationObject, force); + public override serialize(serializationObject: any, force: boolean, allowCanvas: boolean) { + super.serialize(serializationObject, force, allowCanvas); if (!this.isSerializable && !force) { return; } diff --git a/packages/dev/gui/src/2D/controls/colorpicker.ts b/packages/dev/gui/src/2D/controls/colorpicker.ts index 0df39df8c13..e97e7abe7eb 100644 --- a/packages/dev/gui/src/2D/controls/colorpicker.ts +++ b/packages/dev/gui/src/2D/controls/colorpicker.ts @@ -489,7 +489,7 @@ export class ColorPicker extends Control { savedColors?: string[]; pickedColor: string; }> { - return new Promise((resolve) => { + return await new Promise((resolve) => { // Default options options.pickerWidth = options.pickerWidth || "640px"; options.pickerHeight = options.pickerHeight || "400px"; diff --git a/packages/dev/gui/src/2D/controls/grid.ts b/packages/dev/gui/src/2D/controls/grid.ts index a18edef5a6d..4c129fbab51 100644 --- a/packages/dev/gui/src/2D/controls/grid.ts +++ b/packages/dev/gui/src/2D/controls/grid.ts @@ -554,9 +554,10 @@ export class Grid extends Container { * Serializes the current control * @param serializationObject defined the JSON serialized object * @param force force serialization even if isSerializable === false + * @param allowCanvas defines if the control is allowed to use a Canvas2D object to serialize */ - public override serialize(serializationObject: any, force: boolean) { - super.serialize(serializationObject, force); + public override serialize(serializationObject: any, force: boolean, allowCanvas: boolean) { + super.serialize(serializationObject, force, allowCanvas); if (!this.isSerializable && !force) { return; } diff --git a/packages/dev/gui/src/2D/controls/multiLine.ts b/packages/dev/gui/src/2D/controls/multiLine.ts index f156b3a8540..a53726fa20e 100644 --- a/packages/dev/gui/src/2D/controls/multiLine.ts +++ b/packages/dev/gui/src/2D/controls/multiLine.ts @@ -200,7 +200,7 @@ export class MultiLine extends Control { for (const point of this._points) { if (!point) { - return; + continue; } if (first) { @@ -230,7 +230,7 @@ export class MultiLine extends Control { for (const point of this._points) { if (!point) { - return; + continue; } point.translate(); diff --git a/packages/dev/gui/src/2D/controls/stackPanel.ts b/packages/dev/gui/src/2D/controls/stackPanel.ts index 8c2d8beed59..b568ef9670f 100644 --- a/packages/dev/gui/src/2D/controls/stackPanel.ts +++ b/packages/dev/gui/src/2D/controls/stackPanel.ts @@ -250,9 +250,10 @@ export class StackPanel extends Container { * Serializes the current control * @param serializationObject defined the JSON serialized object * @param force force serialization even if isSerializable === false + * @param allowCanvas defines if the control is allowed to use a Canvas2D object to serialize */ - public override serialize(serializationObject: any, force: boolean) { - super.serialize(serializationObject, force); + public override serialize(serializationObject: any, force: boolean, allowCanvas: boolean) { + super.serialize(serializationObject, force, allowCanvas); if (!this.isSerializable && !force) { return; } diff --git a/packages/dev/gui/src/2D/xmlLoader.ts b/packages/dev/gui/src/2D/xmlLoader.ts index 6f68a2d0ed2..b8d22984655 100644 --- a/packages/dev/gui/src/2D/xmlLoader.ts +++ b/packages/dev/gui/src/2D/xmlLoader.ts @@ -379,7 +379,7 @@ export class XmlLoader { * @returns Promise */ public async loadLayoutAsync(xmlFile: any, rootNode: any): Promise { - return new Promise((resolve: any, reject: any) => { + return await new Promise((resolve: any, reject: any) => { this.loadLayout(xmlFile, rootNode, resolve, reject); }); } diff --git a/packages/dev/gui/src/3D/controls/MRTK3/touchHolographicButton.ts b/packages/dev/gui/src/3D/controls/MRTK3/touchHolographicButton.ts index bbeaab18308..de5a215a8a7 100644 --- a/packages/dev/gui/src/3D/controls/MRTK3/touchHolographicButton.ts +++ b/packages/dev/gui/src/3D/controls/MRTK3/touchHolographicButton.ts @@ -616,6 +616,7 @@ export class TouchHolographicButton extends TouchButton3D { backPlateMesh.visibility = 0; backPlateMesh.scaling.z = 0.2; const baseUrl = Tools.GetAssetUrl(TouchHolographicButton.MRTK_ASSET_BASE_URL); + // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then SceneLoader.ImportMeshAsync(undefined, baseUrl, TouchHolographicButton.BACKPLATE_MODEL_FILENAME, scene).then((result) => { const backPlateModel = result.meshes[1]; backPlateModel.visibility = 0; @@ -654,6 +655,7 @@ export class TouchHolographicButton extends TouchButton3D { collisionMesh.visibility = 0; collisionMesh.position = Vector3.Forward(scene.useRightHandedSystem).scale((this.backPlateDepth - this.frontPlateDepth) / 2); const baseUrl = Tools.GetAssetUrl(TouchHolographicButton.MRTK_ASSET_BASE_URL); + // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then SceneLoader.ImportMeshAsync(undefined, baseUrl, TouchHolographicButton.FRONTPLATE_MODEL_FILENAME, scene).then((result) => { const collisionPlate = CreateBox( `${this.name}_collisionPlate`, @@ -701,6 +703,7 @@ export class TouchHolographicButton extends TouchButton3D { innerQuadMesh.position.z += this.backPlateDepth / 2 - this.flatPlaneDepth; const baseUrl = Tools.GetAssetUrl(TouchHolographicButton.MRTK_ASSET_BASE_URL); + // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then SceneLoader.ImportMeshAsync(undefined, baseUrl, TouchHolographicButton.INNERQUAD_MODEL_FILENAME, scene).then((result) => { const innerQuadModel = result.meshes[1]; innerQuadModel.name = `${this.name}_innerQuad`; @@ -731,6 +734,7 @@ export class TouchHolographicButton extends TouchButton3D { backGlowMesh.position.z += this.backPlateDepth / 2 - this.flatPlaneDepth * 2; const baseUrl = Tools.GetAssetUrl(TouchHolographicButton.MRTK_ASSET_BASE_URL); + // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then SceneLoader.ImportMeshAsync(undefined, baseUrl, TouchHolographicButton.BACKGLOW_MODEL_FILENAME, scene).then((result) => { const backGlowModel = result.meshes[1]; backGlowModel.name = `${this.name}_backGlow`; diff --git a/packages/dev/gui/src/3D/controls/holographicBackplate.ts b/packages/dev/gui/src/3D/controls/holographicBackplate.ts index 67143efa03f..9621ec5b84d 100644 --- a/packages/dev/gui/src/3D/controls/holographicBackplate.ts +++ b/packages/dev/gui/src/3D/controls/holographicBackplate.ts @@ -79,6 +79,7 @@ export class HolographicBackplate extends Control3D { collisionMesh.isPickable = true; collisionMesh.visibility = 0; const baseUrl = Tools.GetAssetUrl(HolographicBackplate.MODEL_BASE_URL); + // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then SceneLoader.ImportMeshAsync(undefined, baseUrl, HolographicBackplate.MODEL_FILENAME, scene).then((result) => { const importedModel = result.meshes[1]; importedModel.name = `${this.name}_frontPlate`; diff --git a/packages/dev/gui/src/3D/controls/slider3D.ts b/packages/dev/gui/src/3D/controls/slider3D.ts index 70fc9e86cdd..54a85520e05 100644 --- a/packages/dev/gui/src/3D/controls/slider3D.ts +++ b/packages/dev/gui/src/3D/controls/slider3D.ts @@ -221,6 +221,7 @@ export class Slider3D extends Control3D { sliderBackplate.visibility = 0; sliderBackplate.scaling = new Vector3(1, 0.5, 0.8); const baseUrl = Tools.GetAssetUrl(Slider3D.MODEL_BASE_URL); + // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then SceneLoader.ImportMeshAsync(undefined, baseUrl, Slider3D.MODEL_FILENAME, scene).then((result) => { // make all meshes not pickable. Required meshes' pickable state will be set later. for (const m of result.meshes) { diff --git a/packages/dev/gui/src/3D/controls/touchHolographicButton.ts b/packages/dev/gui/src/3D/controls/touchHolographicButton.ts index 19cfcc1407a..d335ccd5ca7 100644 --- a/packages/dev/gui/src/3D/controls/touchHolographicButton.ts +++ b/packages/dev/gui/src/3D/controls/touchHolographicButton.ts @@ -339,6 +339,7 @@ export class TouchHolographicButton extends TouchButton3D { collisionMesh.visibility = 0; collisionMesh.position = Vector3.Forward(scene.useRightHandedSystem).scale(-this._frontPlateDepth / 2); const baseUrl = Tools.GetAssetUrl(TouchHolographicButton.MODEL_BASE_URL); + // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then SceneLoader.ImportMeshAsync(undefined, baseUrl, TouchHolographicButton.MODEL_FILENAME, scene).then((result) => { const alphaMesh = CreateBox( "${this.name}_alphaMesh", diff --git a/packages/dev/inspector/src/components/actionTabs/lines/textureLineComponent.tsx b/packages/dev/inspector/src/components/actionTabs/lines/textureLineComponent.tsx index 1c68d4902e1..ea929f71e42 100644 --- a/packages/dev/inspector/src/components/actionTabs/lines/textureLineComponent.tsx +++ b/packages/dev/inspector/src/components/actionTabs/lines/textureLineComponent.tsx @@ -43,10 +43,12 @@ export class TextureLineComponent extends React.Component { + // eslint-disable-next-line @typescript-eslint/no-floating-promises this.updatePreview(); }} /> diff --git a/packages/dev/inspector/src/components/actionTabs/tabs/propertyGrids/animations/curveEditor/sideBar/loadAnimationComponent.tsx b/packages/dev/inspector/src/components/actionTabs/tabs/propertyGrids/animations/curveEditor/sideBar/loadAnimationComponent.tsx index 08ecfdce96e..9d74ef955b2 100644 --- a/packages/dev/inspector/src/components/actionTabs/tabs/propertyGrids/animations/curveEditor/sideBar/loadAnimationComponent.tsx +++ b/packages/dev/inspector/src/components/actionTabs/tabs/propertyGrids/animations/curveEditor/sideBar/loadAnimationComponent.tsx @@ -65,6 +65,7 @@ export class LoadAnimationComponent extends React.Component { context.snippetId = snippetId; @@ -82,6 +83,7 @@ export class LoadAnimationComponent extends React.Component { this._root.current?.ownerDocument.defaultView!.alert("Unable to load your animations: " + err); }); diff --git a/packages/dev/inspector/src/components/actionTabs/tabs/propertyGrids/lights/commonShadowLightPropertyGridComponent.tsx b/packages/dev/inspector/src/components/actionTabs/tabs/propertyGrids/lights/commonShadowLightPropertyGridComponent.tsx index d5936dc8d65..fe7813a6272 100644 --- a/packages/dev/inspector/src/components/actionTabs/tabs/propertyGrids/lights/commonShadowLightPropertyGridComponent.tsx +++ b/packages/dev/inspector/src/components/actionTabs/tabs/propertyGrids/lights/commonShadowLightPropertyGridComponent.tsx @@ -41,7 +41,7 @@ export class CommonShadowLightPropertyGridComponent extends React.Component + + + { if (this.props.texture instanceof AdvancedDynamicTexture) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises EditAdvancedDynamicTexture(this.props.texture); } else { this.openTextureEditor(); diff --git a/packages/dev/inspector/src/components/actionTabs/tabs/propertyGrids/materials/textures/defaultTools/floodfill.ts b/packages/dev/inspector/src/components/actionTabs/tabs/propertyGrids/materials/textures/defaultTools/floodfill.ts index 9a4517a41a9..9f8f248c6a0 100644 --- a/packages/dev/inspector/src/components/actionTabs/tabs/propertyGrids/materials/textures/defaultTools/floodfill.ts +++ b/packages/dev/inspector/src/components/actionTabs/tabs/propertyGrids/materials/textures/defaultTools/floodfill.ts @@ -33,6 +33,7 @@ export const Floodfill: IToolData = { this.getParameters().interactionEnabled() && pointerInfo.pickInfo?.hit ) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises this.fill(); } }); diff --git a/packages/dev/inspector/src/components/actionTabs/tabs/propertyGrids/materials/textures/defaultTools/paintbrush.tsx b/packages/dev/inspector/src/components/actionTabs/tabs/propertyGrids/materials/textures/defaultTools/paintbrush.tsx index 9438c5ae25a..8662fedf60d 100644 --- a/packages/dev/inspector/src/components/actionTabs/tabs/propertyGrids/materials/textures/defaultTools/paintbrush.tsx +++ b/packages/dev/inspector/src/components/actionTabs/tabs/propertyGrids/materials/textures/defaultTools/paintbrush.tsx @@ -61,6 +61,7 @@ class PaintbrushTool implements IToolType { setup() { const { scene } = this.getParameters(); + // eslint-disable-next-line @typescript-eslint/no-misused-promises this.pointerObserver = scene.onPointerObservable.add(async (pointerInfo) => { const { startPainting, stopPainting, metadata } = this.getParameters(); if (!this.isPainting) { diff --git a/packages/dev/inspector/src/components/actionTabs/tabs/propertyGrids/materials/textures/textureCanvasManager.ts b/packages/dev/inspector/src/components/actionTabs/tabs/propertyGrids/materials/textures/textureCanvasManager.ts index e5a49c6f3dd..980541a515e 100644 --- a/packages/dev/inspector/src/components/actionTabs/tabs/propertyGrids/materials/textures/textureCanvasManager.ts +++ b/packages/dev/inspector/src/components/actionTabs/tabs/propertyGrids/materials/textures/textureCanvasManager.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-floating-promises */ /* eslint-disable @typescript-eslint/naming-convention */ import { Engine } from "core/Engines/engine"; import { Scene } from "core/scene"; @@ -668,9 +669,11 @@ export class TextureCanvasManager { const base64data = reader.result as string; if (extension === ".dds" || extension === ".env") { - (this._originalTexture as CubeTexture).updateURL(base64data, extension, async () => this.grabOriginalTexture()); + // eslint-disable-next-line @typescript-eslint/no-misused-promises + (this._originalTexture as CubeTexture).updateURL(base64data, extension, async () => await this.grabOriginalTexture()); } else { const texture = new Texture(base64data, this._scene, this._originalTexture.noMipmap, false, Texture.NEAREST_SAMPLINGMODE, () => { + // eslint-disable-next-line github/no-then TextureHelper.GetTextureDataAsync(texture, texture.getSize().width, texture.getSize().height, 0, { R: true, G: true, B: true, A: true }).then( async (pixels) => { if (this._tool && this._tool.instance.onReset) { diff --git a/packages/dev/inspector/src/components/actionTabs/tabs/propertyGrids/materials/textures/textureEditorComponent.tsx b/packages/dev/inspector/src/components/actionTabs/tabs/propertyGrids/materials/textures/textureEditorComponent.tsx index cbef1a4b701..d9dd697c41c 100644 --- a/packages/dev/inspector/src/components/actionTabs/tabs/propertyGrids/materials/textures/textureEditorComponent.tsx +++ b/packages/dev/inspector/src/components/actionTabs/tabs/propertyGrids/materials/textures/textureEditorComponent.tsx @@ -233,9 +233,9 @@ export class TextureEditorComponent extends React.Component this._textureCanvasManager.updateTexture(), - // eslint-disable-next-line @typescript-eslint/naming-convention + // eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/promise-function-async startPainting: () => this._textureCanvasManager.startPainting(), stopPainting: () => this._textureCanvasManager.stopPainting(), updatePainting: () => this._textureCanvasManager.updatePainting(), @@ -283,6 +283,7 @@ export class TextureEditorComponent extends React.Component { this.props.globalState.onSelectionChangedObservable.notifyObservers(newSystem); }) + // eslint-disable-next-line github/no-then .catch((err) => { alert("Unable to load your particle system: " + err); }); @@ -269,6 +271,7 @@ export class ParticleSystemPropertyGridComponent extends React.Component { system.addEmitRateGradient(0, 50, 50); }} + onRemoveRequired={(step) => { + system.removeEmitRateGradient(step.gradient); + }} mode={GradientGridMode.Factor} host={system} codeRecorderPropertyName="getEmitRateGradients()" @@ -597,6 +603,9 @@ export class ParticleSystemPropertyGridComponent extends React.Component { system.addVelocityGradient(0, 0.1, 0.1); }} + onRemoveRequired={(step) => { + system.removeVelocityGradient(step.gradient); + }} mode={GradientGridMode.Factor} host={system} codeRecorderPropertyName="getVelocityGradients()" @@ -610,11 +619,23 @@ export class ParticleSystemPropertyGridComponent extends React.Component { system.addLimitVelocityGradient(0, 0.1, 0.1); }} + onRemoveRequired={(step) => { + system.removeLimitVelocityGradient(step.gradient); + }} mode={GradientGridMode.Factor} host={system} codeRecorderPropertyName="getLimitVelocityGradients()" lockObject={this.props.lockObject} /> + {system.getLimitVelocityGradients() && system.getLimitVelocityGradients()!.length > 0 && ( + + )} { system.addDragGradient(0, 0.1, 0.1); }} + onRemoveRequired={(step) => { + system.removeDragGradient(step.gradient); + }} host={system} codeRecorderPropertyName="getDragGradients()" mode={GradientGridMode.Factor} @@ -685,6 +709,9 @@ export class ParticleSystemPropertyGridComponent extends React.Component { system.addStartSizeGradient(0, 1, 1); }} + onRemoveRequired={(step) => { + system.removeStartSizeGradient(step.gradient); + }} host={system} codeRecorderPropertyName="getStartSizeGradients()" mode={GradientGridMode.Factor} @@ -699,6 +726,9 @@ export class ParticleSystemPropertyGridComponent extends React.Component { system.addSizeGradient(0, 1, 1); }} + onRemoveRequired={(step) => { + system.removeSizeGradient(step.gradient); + }} host={system} codeRecorderPropertyName="getSizeGradients()" mode={GradientGridMode.Factor} @@ -736,6 +766,9 @@ export class ParticleSystemPropertyGridComponent extends React.Component { system.addLifeTimeGradient(0, 1, 1); }} + onRemoveRequired={(step) => { + system.removeLifeTimeGradient(step.gradient); + }} host={system} codeRecorderPropertyName="getLifeTimeGradients()" mode={GradientGridMode.Factor} @@ -778,6 +811,9 @@ export class ParticleSystemPropertyGridComponent extends React.Component { + system.removeColorGradient(step.gradient); + }} host={system} codeRecorderPropertyName="getColorGradients()" mode={GradientGridMode.Color4} @@ -797,6 +833,9 @@ export class ParticleSystemPropertyGridComponent extends React.Component { + system.removeRampGradient(step.gradient); + }} mode={GradientGridMode.Color3} host={system} codeRecorderPropertyName="getRampGradients()" @@ -811,6 +850,9 @@ export class ParticleSystemPropertyGridComponent extends React.Component { system.addColorRemapGradient(0, 1, 1); }} + onRemoveRequired={(step) => { + system.removeColorRemapGradient(step.gradient); + }} host={system} codeRecorderPropertyName="getColorRemapGradients()" mode={GradientGridMode.Factor} @@ -824,6 +866,9 @@ export class ParticleSystemPropertyGridComponent extends React.Component { system.addAlphaRemapGradient(0, 1, 1); }} + onRemoveRequired={(step) => { + system.removeAlphaRemapGradient(step.gradient); + }} host={system} codeRecorderPropertyName="getAlphaRemapGradients()" mode={GradientGridMode.Factor} @@ -871,6 +916,9 @@ export class ParticleSystemPropertyGridComponent extends React.Component { system.addAngularSpeedGradient(0, 0.1, 0.1); }} + onRemoveRequired={(step) => { + system.removeAngularSpeedGradient(step.gradient); + }} host={system} codeRecorderPropertyName="getAngularSpeedGradients()" mode={GradientGridMode.Factor} diff --git a/packages/dev/inspector/src/components/actionTabs/tabs/propertyGrids/particleSystems/valueGradientGridComponent.tsx b/packages/dev/inspector/src/components/actionTabs/tabs/propertyGrids/particleSystems/valueGradientGridComponent.tsx index a46b0ba5147..23ff1630e70 100644 --- a/packages/dev/inspector/src/components/actionTabs/tabs/propertyGrids/particleSystems/valueGradientGridComponent.tsx +++ b/packages/dev/inspector/src/components/actionTabs/tabs/propertyGrids/particleSystems/valueGradientGridComponent.tsx @@ -28,6 +28,7 @@ interface IValueGradientGridComponent { host: IParticleSystem; codeRecorderPropertyName: string; onCreateRequired: () => void; + onRemoveRequired: (step: IValueGradient) => void; } export class ValueGradientGridComponent extends React.Component { @@ -41,7 +42,7 @@ export class ValueGradientGridComponent extends React.Component -1) { - gradients.splice(index, 1); + this.props.onRemoveRequired(step); this.updateAndSync(); } } @@ -107,7 +108,9 @@ export class ValueGradientGridComponent extends React.Component { - gradients.length = 0; + for (let i = 0; i < gradients.length; i++) { + this.props.onRemoveRequired(gradients[i]); + } this.updateAndSync(); }} buttonLabel="Add new step" diff --git a/packages/dev/inspector/src/components/actionTabs/tabs/propertyGrids/postProcesses/postProcessPropertyGridComponent.tsx b/packages/dev/inspector/src/components/actionTabs/tabs/propertyGrids/postProcesses/postProcessPropertyGridComponent.tsx index 35ad76ed0fc..273adbf6e1a 100644 --- a/packages/dev/inspector/src/components/actionTabs/tabs/propertyGrids/postProcesses/postProcessPropertyGridComponent.tsx +++ b/packages/dev/inspector/src/components/actionTabs/tabs/propertyGrids/postProcesses/postProcessPropertyGridComponent.tsx @@ -24,6 +24,7 @@ export class PostProcessPropertyGridComponent extends React.Component { this.props.globalState.onSelectionChangedObservable.notifyObservers(newManager); }) + // eslint-disable-next-line github/no-then .catch((err) => { alert("Unable to load your sprite manager: " + err); }); @@ -117,6 +119,7 @@ export class SpriteManagerPropertyGridComponent extends React.Component { this._imageData = data; this.forceUpdate(); diff --git a/packages/dev/inspector/src/components/actionTabs/tabs/tools/gltfComponent.tsx b/packages/dev/inspector/src/components/actionTabs/tabs/tools/gltfComponent.tsx index 2c2dd257fa8..1c189655c81 100644 --- a/packages/dev/inspector/src/components/actionTabs/tabs/tools/gltfComponent.tsx +++ b/packages/dev/inspector/src/components/actionTabs/tabs/tools/gltfComponent.tsx @@ -274,6 +274,11 @@ export class GLTFComponent extends React.Component extensionStates["KHR_materials_dispersion"].enabled} onSelect={(value) => (extensionStates["KHR_materials_dispersion"].enabled = value)} /> + extensionStates["EXT_materials_diffuse_roughness"].enabled} + onSelect={(value) => (extensionStates["EXT_materials_diffuse_roughness"].enabled = value)} + /> extensionStates["KHR_mesh_quantization"].enabled} diff --git a/packages/dev/inspector/src/components/actionTabs/tabs/toolsTabComponent.tsx b/packages/dev/inspector/src/components/actionTabs/tabs/toolsTabComponent.tsx index 35b94f141f2..4c0961d0ba1 100644 --- a/packages/dev/inspector/src/components/actionTabs/tabs/toolsTabComponent.tsx +++ b/packages/dev/inspector/src/components/actionTabs/tabs/toolsTabComponent.tsx @@ -121,6 +121,7 @@ export class ToolsTabComponent extends PaneComponent { captureEquirectangular() { const scene = this.props.scene; if (scene.activeCamera) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises captureEquirectangularFromScene(scene, { size: 1024, filename: "equirectangular_capture.png" }); } } @@ -153,6 +154,7 @@ export class ToolsTabComponent extends PaneComponent { this._videoRecorder = new VideoRecorder(scene.getEngine()); } + // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then this._videoRecorder.startRecording().then(() => { this.setState({ tag: "Record video" }); }); @@ -207,6 +209,7 @@ export class ToolsTabComponent extends PaneComponent { return; } + // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then Tools.LoadFileAsync("https://cdn.jsdelivr.net/gh//terikon/gif.js.optimized@0.1.6/dist/gif.worker.js").then((value) => { this._gifWorkerBlob = new Blob([value], { type: "application/javascript", @@ -230,6 +233,7 @@ export class ToolsTabComponent extends PaneComponent { currentGroup.play(true); } }; + // eslint-disable-next-line @typescript-eslint/no-floating-promises SceneLoader.ImportAnimationsAsync("file:", sceneFile, scene, overwriteAnimations, animationGroupLoadingMode, null, onSuccess); } }; @@ -288,11 +292,13 @@ export class ToolsTabComponent extends PaneComponent { }; GLTF2Export.GLBAsync(scene, "scene", { shouldExportNode: (node) => shouldExport(node) }) + // eslint-disable-next-line github/no-then .then((glb: GLTFData) => { this._isExportingGltf = false; this.forceUpdate(); glb.downloadFiles(); }) + // eslint-disable-next-line github/no-then .catch((reason) => { Logger.Error(`Failed to export GLB: ${reason}`); this._isExportingGltf = false; @@ -320,10 +326,12 @@ export class ToolsTabComponent extends PaneComponent { imageQuality: this._envOptions.imageQuality, disableIrradianceTexture: !this._envOptions.iblDiffuse, }) + // eslint-disable-next-line github/no-then .then((buffer: ArrayBuffer) => { const blob = new Blob([buffer], { type: "octet/stream" }); Tools.Download(blob, "environment.env"); }) + // eslint-disable-next-line github/no-then .catch((error: any) => { Logger.Error(error); alert(error); diff --git a/packages/dev/inspector/src/components/globalState.ts b/packages/dev/inspector/src/components/globalState.ts index b54737f85e1..ca9019e5211 100644 --- a/packages/dev/inspector/src/components/globalState.ts +++ b/packages/dev/inspector/src/components/globalState.ts @@ -64,6 +64,7 @@ export class GlobalState { EXT_mesh_gpu_instancing: { enabled: true }, EXT_texture_webp: { enabled: true }, EXT_texture_avif: { enabled: true }, + EXT_materials_diffuse_roughness: { enabled: true }, }; public glTFLoaderOverrideConfig = false; diff --git a/packages/dev/inspector/src/components/graph/canvasGraphService.ts b/packages/dev/inspector/src/components/graph/canvasGraphService.ts index 5fcc2a87abc..88bfebbc758 100644 --- a/packages/dev/inspector/src/components/graph/canvasGraphService.ts +++ b/packages/dev/inspector/src/components/graph/canvasGraphService.ts @@ -441,7 +441,7 @@ export class CanvasGraphService { for (let idOffset = 0; idOffset < this.datasets.ids.length; idOffset++) { const id = this.datasets.ids[idOffset]; if (this.metadata.get(id)?.hidden) { - return; + continue; } const valueMinMax = this._getMinMax(bounds, idOffset); @@ -883,13 +883,13 @@ export class CanvasGraphService { for (let idOffset = 0; idOffset < this.datasets.ids.length; idOffset++) { const id = this.datasets.ids[idOffset]; if (this.metadata.get(id)?.hidden) { - return; + continue; } const numPoints = this.datasets.data.at(this.datasets.startingIndices.at(closestIndex) + PerformanceViewerCollector.NumberOfPointsOffset); if (idOffset >= numPoints) { - return; + continue; } const valueAtClosestPointIndex = this.datasets.startingIndices.at(closestIndex) + PerformanceViewerCollector.SliceDataOffset + idOffset; @@ -905,7 +905,7 @@ export class CanvasGraphService { } if (!valueMinMax) { - return; + continue; } actualTimestamp = this.datasets.data.at(this.datasets.startingIndices.at(closestIndex)); @@ -923,7 +923,7 @@ export class CanvasGraphService { numberOfTooltipItems++; // don't process rest if we aren't panned. if (!this._position) { - return; + continue; } // initially distance between closest data point and mouse point. diff --git a/packages/dev/inspector/src/components/sceneExplorer/entities/frameGraphTreeItemComponent.tsx b/packages/dev/inspector/src/components/sceneExplorer/entities/frameGraphTreeItemComponent.tsx index 5b2c2e665d1..b8cf3741f31 100644 --- a/packages/dev/inspector/src/components/sceneExplorer/entities/frameGraphTreeItemComponent.tsx +++ b/packages/dev/inspector/src/components/sceneExplorer/entities/frameGraphTreeItemComponent.tsx @@ -23,6 +23,7 @@ export class FrameGraphTreeItemComponent extends React.Component { + // eslint-disable-next-line @typescript-eslint/no-floating-promises this.props.frameGraph.getLinkedNodeRenderGraph()!.edit({ nodeRenderGraphEditorConfig: { hostScene: this.props.frameGraph.scene } }); }} title="Node Render Graph Editor" diff --git a/packages/dev/inspector/src/components/sceneExplorer/entities/gui/advancedDynamicTextureTreeItemComponent.tsx b/packages/dev/inspector/src/components/sceneExplorer/entities/gui/advancedDynamicTextureTreeItemComponent.tsx index 1343acee5cb..30fff444a33 100644 --- a/packages/dev/inspector/src/components/sceneExplorer/entities/gui/advancedDynamicTextureTreeItemComponent.tsx +++ b/packages/dev/inspector/src/components/sceneExplorer/entities/gui/advancedDynamicTextureTreeItemComponent.tsx @@ -1,3 +1,5 @@ +/* eslint-disable @typescript-eslint/promise-function-async */ +/* eslint-disable @typescript-eslint/no-misused-promises */ import type { Nullable } from "core/types"; import type { Observer, Observable } from "core/Misc/observable"; import type { IExplorerExtensibilityGroup } from "core/Debug/debugLayer"; diff --git a/packages/dev/inspector/src/components/sceneExplorer/entities/gui/guiTools.ts b/packages/dev/inspector/src/components/sceneExplorer/entities/gui/guiTools.ts index 0d42fccf846..1c13dabdee6 100644 --- a/packages/dev/inspector/src/components/sceneExplorer/entities/gui/guiTools.ts +++ b/packages/dev/inspector/src/components/sceneExplorer/entities/gui/guiTools.ts @@ -72,5 +72,6 @@ export async function EditAdvancedDynamicTexture(adt: AdvancedDynamicTexture, em throw `Tried to call EditAdvancedDynamicTexture without first injecting the GUI editor. You need to call InjectGUIEditor() with a reference to @babylonjs/gui-editor. It can be imported at runtime using await import("@babylonjs/gui-editor").`; } } + // eslint-disable-next-line @typescript-eslint/no-floating-promises guiEditorContainer.GUIEditor.Show({ liveGuiTexture: adt }, embed); } diff --git a/packages/dev/inspector/src/components/sceneExplorer/entities/materialTreeItemComponent.tsx b/packages/dev/inspector/src/components/sceneExplorer/entities/materialTreeItemComponent.tsx index 5c1ef165760..875451989c6 100644 --- a/packages/dev/inspector/src/components/sceneExplorer/entities/materialTreeItemComponent.tsx +++ b/packages/dev/inspector/src/components/sceneExplorer/entities/materialTreeItemComponent.tsx @@ -24,6 +24,7 @@ export class MaterialTreeItemComponent extends React.Component { + // eslint-disable-next-line @typescript-eslint/no-floating-promises (this.props.material as NodeMaterial).edit({ nodeEditorConfig: { backgroundColor: this.props.material.getScene().clearColor } }); }} title="Node Material Editor" diff --git a/packages/dev/loaders/src/BVH/bvhFileLoader.ts b/packages/dev/loaders/src/BVH/bvhFileLoader.ts index 47d67efbc8c..566ecdb0d4a 100644 --- a/packages/dev/loaders/src/BVH/bvhFileLoader.ts +++ b/packages/dev/loaders/src/BVH/bvhFileLoader.ts @@ -67,12 +67,14 @@ export class BVHFileLoader implements ISceneLoaderPluginAsync, ISceneLoaderPlugi * @param data the bvh data to load * @returns a promise containing the loaded skeletons and animations */ + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax public importMeshAsync(_meshesNames: string | readonly string[] | null | undefined, scene: Scene, data: unknown): Promise { if (typeof data !== "string") { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors return Promise.reject("BVH loader expects string data."); } try { - const skeleton = ReadBvh(data, scene, this._loadingOptions); + const skeleton = ReadBvh(data, scene, null, this._loadingOptions); return Promise.resolve({ meshes: [], particleSystems: [], @@ -82,8 +84,9 @@ export class BVHFileLoader implements ISceneLoaderPluginAsync, ISceneLoaderPlugi geometries: [], lights: [], spriteManagers: [], - }); + } as ISceneLoaderAsyncResult); } catch (e) { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors return Promise.reject(e); } } @@ -94,11 +97,14 @@ export class BVHFileLoader implements ISceneLoaderPluginAsync, ISceneLoaderPlugi * @param data the bvh data to load * @returns a promise which completes when objects have been loaded to the scene */ + // eslint-disable-next-line no-restricted-syntax, @typescript-eslint/promise-function-async public loadAsync(scene: Scene, data: unknown): Promise { if (typeof data !== "string") { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors return Promise.reject("BVH loader expects string data."); } + // eslint-disable-next-line github/no-then return this.importMeshAsync(null, scene, data).then(() => { // return void }); @@ -110,16 +116,19 @@ export class BVHFileLoader implements ISceneLoaderPluginAsync, ISceneLoaderPlugi * @param data The data to import * @returns The loaded asset container */ + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax public loadAssetContainerAsync(scene: Scene, data: unknown): Promise { if (typeof data !== "string") { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors return Promise.reject("BVH loader expects string data."); } const assetContainer = new AssetContainer(scene); try { - const skeleton = ReadBvh(data, scene, this._loadingOptions); + const skeleton = ReadBvh(data, scene, assetContainer, this._loadingOptions); assetContainer.skeletons.push(skeleton); return Promise.resolve(assetContainer); } catch (e) { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors return Promise.reject(e); } } diff --git a/packages/dev/loaders/src/BVH/bvhLoader.ts b/packages/dev/loaders/src/BVH/bvhLoader.ts index 9bf76151d46..beb92b7cda6 100644 --- a/packages/dev/loaders/src/BVH/bvhLoader.ts +++ b/packages/dev/loaders/src/BVH/bvhLoader.ts @@ -2,12 +2,12 @@ import type { IAnimationKey } from "core/Animations"; import { Animation } from "core/Animations/animation"; import { Bone } from "core/Bones/bone"; import { Skeleton } from "core/Bones/skeleton"; -import { Axis } from "core/Maths/math.axis"; import { Matrix, Quaternion, Vector3 } from "core/Maths/math.vector"; import type { Scene } from "core/scene"; import type { Nullable } from "core/types"; import type { BVHLoadingOptions } from "./bvhLoadingOptions"; import { Tools } from "core/Misc/tools"; +import type { AssetContainer } from "core/assetContainer"; const _XPosition = "Xposition"; const _YPosition = "Yposition"; @@ -43,7 +43,7 @@ interface IBVHNode { } interface IBVHKeyFrame { - time: number; + frame: number; position: Vector3; rotation: Quaternion; } @@ -62,7 +62,7 @@ function CreateBVHNode(): IBVHNode { function CreateBVHKeyFrame(): IBVHKeyFrame { return { - time: 0, + frame: 0, position: new Vector3(), rotation: new Quaternion(), }; @@ -76,8 +76,7 @@ function CreateBVHKeyFrame(): IBVHKeyFrame { function BoneOffset(node: IBVHNode): Matrix { const x = node.offset.x; const y = node.offset.y; - // Flip Z axis to convert handedness. - const z = -node.offset.z; + const z = node.offset.z; return Matrix.Translation(x, y, z); } @@ -87,12 +86,12 @@ function BoneOffset(node: IBVHNode): Matrix { * @param context - The loader context * @returns The created animations */ -function CreateAnimations(node: IBVHNode, context: LoaderContext): Animation | null { +function CreateAnimations(node: IBVHNode, context: LoaderContext): Animation[] { if (node.frames.length === 0) { - return null; + return []; } - const keyFrames: IAnimationKey[] = []; + const animations: Animation[] = []; // Create position animation if there are position channels const hasPosition = node.channels.some((c) => c === _XPosition || c === _YPosition || c === _ZPosition); @@ -100,40 +99,42 @@ function CreateAnimations(node: IBVHNode, context: LoaderContext): Animation | n // Create rotation animation if there are rotation channels const hasRotation = node.channels.some((c) => c === _XRotation || c === _YRotation || c === _ZRotation); - for (let i = 0; i < node.frames.length; i++) { - const frame = node.frames[i]; - const time = i * context.frameRate * 1000; // Convert to milliseconds + const posAnim = new Animation(`${node.name}_pos`, "position", context.frameRate, Animation.ANIMATIONTYPE_VECTOR3, context.loopMode); - if (hasPosition || hasRotation) { - let matrix = Matrix.Identity(); + const rotAnim = new Animation(`${node.name}_rot`, "rotationQuaternion", context.frameRate, Animation.ANIMATIONTYPE_QUATERNION, context.loopMode); - if (hasRotation) { - const rotationMatrix = new Matrix(); - frame.rotation.toRotationMatrix(rotationMatrix); - matrix = rotationMatrix; - } + const posKeys: IAnimationKey[] = []; + const rotKeys: IAnimationKey[] = []; - if (hasPosition) { - const position = frame.position; - matrix.setTranslation(new Vector3(position.x, position.y, position.z)); - } + for (let i = 0; i < node.frames.length; i++) { + const frame = node.frames[i]; - keyFrames.push({ - frame: time, - value: matrix, + if (hasPosition && frame.position) { + posKeys.push({ + frame: frame.frame, + value: frame.position.clone(), + }); + } + + if (hasRotation) { + rotKeys.push({ + frame: frame.frame, + value: frame.rotation.clone(), }); } } - if (keyFrames.length === 0) { - return null; + if (posKeys.length > 0) { + posAnim.setKeys(posKeys); + animations.push(posAnim); } - const fps = 60 / context.frameRate; - const animation = new Animation(node.name + "_anim", "_matrix", fps, Animation.ANIMATIONTYPE_MATRIX, context.loopMode); - animation.setKeys(keyFrames); + if (rotKeys.length > 0) { + rotAnim.setKeys(rotKeys); + animations.push(rotAnim); + } - return animation; + return animations; } /** @@ -147,21 +148,11 @@ function ConvertNode(node: IBVHNode, parent: Nullable, context: LoaderCont const bone = new Bone(node.name, context.skeleton, parent, matrix); // Create animation for this bone - const animation = CreateAnimations(node, context); - if (animation) { - // Apply rotation correction to the root bone's animation keys - if (!parent) { - // Check if it's the root node - const correctionMatrix = Matrix.RotationAxis(Axis.X, Math.PI / 2); // -90 degrees on X-axis - const correctedKeys = animation.getKeys().map((key: IAnimationKey) => { - const originalMatrix = key.value as Matrix; - // Apply correction: We want to rotate the final orientation, so post-multiply - const correctedMatrix = originalMatrix.multiply(correctionMatrix); - return { frame: key.frame, value: correctedMatrix }; - }); - animation.setKeys(correctedKeys); + const animations = CreateAnimations(node, context); + for (const animation of animations) { + if (animation.getKeys() && animation.getKeys().length > 0) { + bone.animations.push(animation); } - bone.animations.push(animation); } for (const child of node.children) { @@ -174,10 +165,11 @@ function ConvertNode(node: IBVHNode, parent: Nullable, context: LoaderCont * The bone hierarchy has to be structured in the same order as the BVH file. * keyframe data is stored in bone.frames. * @param data - splitted string array (frame values), values are shift()ed - * @param frameTime - playback time for this keyframe + * @param frameNumber - playback time for this keyframe * @param bone - the bone to read frame data from + * @param tokenIndex - the index of the token to read */ -function ReadFrameData(data: string[], frameTime: number, bone: IBVHNode) { +function ReadFrameData(data: string[], frameNumber: number, bone: IBVHNode, tokenIndex: { i: number }) { if (bone.type === "ENDSITE") { // end sites have no motion data return; @@ -185,57 +177,57 @@ function ReadFrameData(data: string[], frameTime: number, bone: IBVHNode) { // add keyframe const keyframe = CreateBVHKeyFrame(); - keyframe.time = frameTime; + keyframe.frame = frameNumber; keyframe.position = new Vector3(); keyframe.rotation = new Quaternion(); bone.frames.push(keyframe); - let pitch = 0, - yaw = 0, - roll = 0; + let combinedRotation = Matrix.Identity(); // parse values for each channel in node for (let i = 0; i < bone.channels.length; ++i) { - const value = data.shift(); + const channel = bone.channels[i]; + const value = data[tokenIndex.i++]; if (!value) { continue; } - - switch (bone.channels[i]) { - case _XPosition: - keyframe.position.x = parseFloat(value.trim()); - break; - case _YPosition: - keyframe.position.y = parseFloat(value.trim()); - break; - case _ZPosition: - keyframe.position.z = -parseFloat(value.trim()); // Flip Z axis to convert handedness. - break; - case _XRotation: - pitch = Tools.ToRadians(+value); - break; - case _YRotation: - yaw = Tools.ToRadians(+value); - break; - case _ZRotation: - roll = Tools.ToRadians(+value); - break; - default: - throw new Error("invalid channel type"); + const parsedValue = parseFloat(value.trim()); + if (channel.endsWith("position")) { + switch (channel) { + case _XPosition: + keyframe.position.x = parsedValue; + break; + case _YPosition: + keyframe.position.y = parsedValue; + break; + case _ZPosition: + keyframe.position.z = parsedValue; + break; + } + } else if (channel.endsWith("rotation")) { + const angle = Tools.ToRadians(parsedValue); + let rotationMatrix: Matrix; + switch (channel) { + case _XRotation: + rotationMatrix = Matrix.RotationX(angle); + break; + case _YRotation: + rotationMatrix = Matrix.RotationY(angle); + break; + case _ZRotation: + rotationMatrix = Matrix.RotationZ(angle); + break; + } + combinedRotation = rotationMatrix!.multiply(combinedRotation); } } - if (yaw !== 0 || pitch !== 0 || roll !== 0) { - // Create rotation matrix in proper order - const rotationMatrix = Matrix.Identity(); - Matrix.RotationYawPitchRollToRef(yaw, pitch, roll, rotationMatrix); - keyframe.rotation.fromRotationMatrix(rotationMatrix); - } + Quaternion.FromRotationMatrixToRef(combinedRotation, keyframe.rotation); // parse child nodes - for (let i = 0; i < bone.children.length; ++i) { - ReadFrameData(data, frameTime, bone.children[i]); + for (const child of bone.children) { + ReadFrameData(data, frameNumber, child, tokenIndex); } } @@ -274,7 +266,6 @@ function ReadNode(lines: string[], firstLine: string, parent: Nullable throw new Error("Unexpected end of file: missing OFFSET"); } tokens = tokensSplit; - // check for OFFSET if (tokens[0].toUpperCase() != "OFFSET") { throw new Error("Expected OFFSET, but got: " + tokens[0]); @@ -327,15 +318,19 @@ function ReadNode(lines: string[], firstLine: string, parent: Nullable * Reads a BVH file, returns a skeleton * @param text - The BVH file content * @param scene - The scene to add the skeleton to + * @param assetContainer - The asset container to add the skeleton to * @param loadingOptions - The loading options * @returns The skeleton */ -export function ReadBvh(text: string, scene: Scene, loadingOptions: BVHLoadingOptions): Skeleton { +export function ReadBvh(text: string, scene: Scene, assetContainer: Nullable, loadingOptions: BVHLoadingOptions): Skeleton { const lines = text.split("\n"); const { loopMode } = loadingOptions; + scene._blockEntityCollection = !!assetContainer; const skeleton = new Skeleton("", "", scene); + skeleton._parentContainer = assetContainer; + scene._blockEntityCollection = false; const context = new LoaderContext(skeleton); context.loopMode = loopMode; @@ -396,8 +391,8 @@ export function ReadBvh(text: string, scene: Scene, loadingOptions: BVHLoadingOp if (!frameLine) { continue; } - const tokens = frameLine.trim().split(/[\s]+/); - ReadFrameData(tokens, i * frameTime, root); + const tokens = frameLine.trim().split(/[\s]+/) || []; + ReadFrameData(tokens, i, root, { i: 0 }); } context.root = root; diff --git a/packages/dev/loaders/src/OBJ/objFileLoader.ts b/packages/dev/loaders/src/OBJ/objFileLoader.ts index ef0977fe526..15f92c2e5c0 100644 --- a/packages/dev/loaders/src/OBJ/objFileLoader.ts +++ b/packages/dev/loaders/src/OBJ/objFileLoader.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/promise-function-async */ import type { Nullable } from "core/types"; import { Vector2 } from "core/Maths/math.vector"; import { Tools } from "core/Misc/tools"; @@ -167,8 +168,10 @@ export class OBJFileLoader implements ISceneLoaderPluginAsync, ISceneLoaderPlugi * @param rootUrl root url to load from * @returns a promise containing the loaded meshes, particles, skeletons and animations */ + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax public importMeshAsync(meshesNames: any, scene: Scene, data: any, rootUrl: string): Promise { //get the meshes from OBJ file + // eslint-disable-next-line github/no-then return this._parseSolidAsync(meshesNames, scene, data, rootUrl).then((meshes) => { return { meshes: meshes, @@ -190,8 +193,10 @@ export class OBJFileLoader implements ISceneLoaderPluginAsync, ISceneLoaderPlugi * @param rootUrl root url to load from * @returns a promise which completes when objects have been loaded to the scene */ + // eslint-disable-next-line no-restricted-syntax public loadAsync(scene: Scene, data: string, rootUrl: string): Promise { //Get the 3D model + // eslint-disable-next-line github/no-then return this.importMeshAsync(null, scene, data, rootUrl).then(() => { // return void }); @@ -204,37 +209,42 @@ export class OBJFileLoader implements ISceneLoaderPluginAsync, ISceneLoaderPlugi * @param rootUrl The root url for scene and resources * @returns The loaded asset container */ + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax public loadAssetContainerAsync(scene: Scene, data: string, rootUrl: string): Promise { const container = new AssetContainer(scene); this._assetContainer = container; - return this.importMeshAsync(null, scene, data, rootUrl) - .then((result) => { - result.meshes.forEach((mesh) => container.meshes.push(mesh)); - result.meshes.forEach((mesh) => { - const material = mesh.material; - if (material) { - // Materials - if (container.materials.indexOf(material) == -1) { - container.materials.push(material); + return ( + this.importMeshAsync(null, scene, data, rootUrl) + // eslint-disable-next-line github/no-then + .then((result) => { + result.meshes.forEach((mesh) => container.meshes.push(mesh)); + result.meshes.forEach((mesh) => { + const material = mesh.material; + if (material) { + // Materials + if (container.materials.indexOf(material) == -1) { + container.materials.push(material); - // Textures - const textures = material.getActiveTextures(); - textures.forEach((t) => { - if (container.textures.indexOf(t) == -1) { - container.textures.push(t); - } - }); + // Textures + const textures = material.getActiveTextures(); + textures.forEach((t) => { + if (container.textures.indexOf(t) == -1) { + container.textures.push(t); + } + }); + } } - } - }); - this._assetContainer = null; - return container; - }) - .catch((ex) => { - this._assetContainer = null; - throw ex; - }); + }); + this._assetContainer = null; + return container; + }) + // eslint-disable-next-line github/no-then + .catch((ex) => { + this._assetContainer = null; + throw ex; + }) + ); } /** @@ -247,6 +257,7 @@ export class OBJFileLoader implements ISceneLoaderPluginAsync, ISceneLoaderPlugi * @param rootUrl defines the path to the folder * @returns the list of loaded meshes */ + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax private _parseSolidAsync(meshesNames: any, scene: Scene, data: string, rootUrl: string): Promise> { let fileToLoad: string = ""; //The name of the mtlFile to load const materialsFromMTLFile: MTLFileLoader = new MTLFileLoader(); @@ -315,6 +326,7 @@ export class OBJFileLoader implements ISceneLoaderPluginAsync, ISceneLoaderPlugi if (this._loadingOptions.materialLoadingFailsSilently) { resolve(); } else { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject(e); } } @@ -324,6 +336,7 @@ export class OBJFileLoader implements ISceneLoaderPluginAsync, ISceneLoaderPlugi if (this._loadingOptions.materialLoadingFailsSilently) { resolve(); } else { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject(exception); } } @@ -332,6 +345,7 @@ export class OBJFileLoader implements ISceneLoaderPluginAsync, ISceneLoaderPlugi ); } //Return an array with all Mesh + // eslint-disable-next-line github/no-then return Promise.all(mtlPromises).then(() => { const isLine = (mesh: AbstractMesh) => Boolean(mesh._internalMetadata?.["_isLine"] ?? false); diff --git a/packages/dev/loaders/src/SPLAT/splatFileLoader.ts b/packages/dev/loaders/src/SPLAT/splatFileLoader.ts index 738ce7e7fae..b1aa716f587 100644 --- a/packages/dev/loaders/src/SPLAT/splatFileLoader.ts +++ b/packages/dev/loaders/src/SPLAT/splatFileLoader.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/promise-function-async */ import type { ISceneLoaderPluginAsync, ISceneLoaderPluginFactory, ISceneLoaderAsyncResult, ISceneLoaderProgressEvent, SceneLoaderPluginOptions } from "core/Loading/sceneLoader"; import { RegisterSceneLoaderPlugin } from "core/Loading/sceneLoader"; import { SPLATFileLoaderMetadata } from "./splatFileLoader.metadata"; @@ -14,6 +15,7 @@ import { Color4 } from "core/Maths/math.color"; import { VertexData } from "core/Meshes/mesh.vertexData"; import type { SPLATLoadingOptions } from "./splatLoadingOptions"; import { Scalar } from "core/Maths/math.scalar"; +import type { GaussianSplattingMaterial } from "core/Materials/GaussianSplatting/gaussianSplattingMaterial"; declare module "core/Loading/sceneLoader" { // eslint-disable-next-line jsdoc/require-jsdoc, @typescript-eslint/naming-convention @@ -44,6 +46,7 @@ interface IParsedPLY { faces?: number[]; hasVertexColors?: boolean; sh?: Uint8Array[]; + trainedWithAntialiasing?: boolean; } /** @@ -90,8 +93,8 @@ export class SPLATFileLoader implements ISceneLoaderPluginAsync, ISceneLoaderPlu * @param scene the scene the meshes should be added to * @param data the gaussian splatting data to load * @param rootUrl root url to load from - * @param onProgress callback called while file is loading - * @param fileName Defines the name of the file to load + * @param _onProgress callback called while file is loading + * @param _fileName Defines the name of the file to load * @returns a promise containing the loaded meshes, particles, skeletons and animations */ public async importMeshAsync( @@ -99,10 +102,11 @@ export class SPLATFileLoader implements ISceneLoaderPluginAsync, ISceneLoaderPlu scene: Scene, data: any, rootUrl: string, - onProgress?: (event: ISceneLoaderProgressEvent) => void, - fileName?: string + _onProgress?: (event: ISceneLoaderProgressEvent) => void, + _fileName?: string ): Promise { - return this._parseAsync(meshesNames, scene, data, rootUrl).then((meshes) => { + // eslint-disable-next-line github/no-then + return await this._parseAsync(meshesNames, scene, data, rootUrl).then((meshes) => { return { meshes: meshes, particleSystems: [], @@ -183,6 +187,7 @@ export class SPLATFileLoader implements ISceneLoaderPluginAsync, ISceneLoaderPlu return mesh; } + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax private _parseSPZAsync(data: ArrayBuffer, scene: Scene): Promise { const ubuf = new Uint8Array(data); const ubufu32 = new Uint32Array(data.slice(0, 12)); // Only need ubufu32[0] to [2] @@ -191,7 +196,7 @@ export class SPLATFileLoader implements ISceneLoaderPluginAsync, ISceneLoaderPlu const shDegree = ubuf[12]; const fractionalBits = ubuf[13]; - //const flags = ubuf[14]; + const flags = ubuf[14]; const reserved = ubuf[15]; // check magic and version @@ -317,15 +322,16 @@ export class SPLATFileLoader implements ISceneLoaderPluginAsync, ISceneLoaderPlu } return new Promise((resolve) => { - resolve({ mode: Mode.Splat, data: buffer, hasVertexColors: false, sh: sh }); + resolve({ mode: Mode.Splat, data: buffer, hasVertexColors: false, sh: sh, trainedWithAntialiasing: !!flags }); }); } return new Promise((resolve) => { - resolve({ mode: Mode.Splat, data: buffer, hasVertexColors: false }); + resolve({ mode: Mode.Splat, data: buffer, hasVertexColors: false, trainedWithAntialiasing: !!flags }); }); } + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax private _parseAsync(meshesNames: any, scene: Scene, data: any, _rootUrl: string): Promise> { const babylonMeshesArray: Array = []; //The mesh for babylon @@ -343,10 +349,17 @@ export class SPLATFileLoader implements ISceneLoaderPluginAsync, ISceneLoaderPlu return new Promise((resolve) => { new Response(decompressedStream) .arrayBuffer() + // eslint-disable-next-line github/no-then .then((buffer) => { + // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then this._parseSPZAsync(buffer, scene).then((parsedSPZ) => { scene._blockEntityCollection = !!this._assetContainer; const gaussianSplatting = new GaussianSplattingMesh("GaussianSplatting", null, scene, this._loadingOptions.keepInRam); + if (parsedSPZ.trainedWithAntialiasing) { + const gsMaterial = gaussianSplatting.material as GaussianSplattingMaterial; + gsMaterial.kernelSize = 0.1; + gsMaterial.compensation = true; + } gaussianSplatting._parentContainer = this._assetContainer; babylonMeshesArray.push(gaussianSplatting); gaussianSplatting.updateData(parsedSPZ.data, parsedSPZ.sh); @@ -354,8 +367,10 @@ export class SPLATFileLoader implements ISceneLoaderPluginAsync, ISceneLoaderPlu resolve(babylonMeshesArray); }); }) + // eslint-disable-next-line github/no-then .catch(() => { // Catch any decompression errors + // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then SPLATFileLoader._ConvertPLYToSplat(data as ArrayBuffer).then(async (parsedPLY) => { scene._blockEntityCollection = !!this._assetContainer; switch (parsedPLY.mode) { @@ -371,6 +386,7 @@ export class SPLATFileLoader implements ISceneLoaderPluginAsync, ISceneLoaderPlu { const pointcloud = new PointsCloudSystem("PointCloud", 1, scene); if (SPLATFileLoader._BuildPointCloud(pointcloud, parsedPLY.data)) { + // eslint-disable-next-line github/no-then await pointcloud.buildMeshAsync().then((mesh) => { babylonMeshesArray.push(mesh); }); @@ -405,23 +421,28 @@ export class SPLATFileLoader implements ISceneLoaderPluginAsync, ISceneLoaderPlu * @param rootUrl The root url for scene and resources * @returns The loaded asset container */ + // eslint-disable-next-line no-restricted-syntax public loadAssetContainerAsync(scene: Scene, data: string, rootUrl: string): Promise { const container = new AssetContainer(scene); this._assetContainer = container; - return this.importMeshAsync(null, scene, data, rootUrl) - .then((result) => { - for (const mesh of result.meshes) { - container.meshes.push(mesh); - } - // mesh material will be null before 1st rendered frame. - this._assetContainer = null; - return container; - }) - .catch((ex) => { - this._assetContainer = null; - throw ex; - }); + return ( + this.importMeshAsync(null, scene, data, rootUrl) + // eslint-disable-next-line github/no-then + .then((result) => { + for (const mesh of result.meshes) { + container.meshes.push(mesh); + } + // mesh material will be null before 1st rendered frame. + this._assetContainer = null; + return container; + }) + // eslint-disable-next-line github/no-then + .catch((ex) => { + this._assetContainer = null; + throw ex; + }) + ); } /** @@ -431,8 +452,10 @@ export class SPLATFileLoader implements ISceneLoaderPluginAsync, ISceneLoaderPlu * @param rootUrl root url to load from * @returns a promise which completes when objects have been loaded to the scene */ + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax public loadAsync(scene: Scene, data: string, rootUrl: string): Promise { //Get the 3D model + // eslint-disable-next-line github/no-then return this.importMeshAsync(null, scene, data, rootUrl).then(() => { // return void }); @@ -529,6 +552,7 @@ export class SPLATFileLoader implements ISceneLoaderPluginAsync, ISceneLoaderPlu const rowVertexLength = rowVertexOffset; const rowChunkLength = rowChunkOffset; + // eslint-disable-next-line github/no-then return (GaussianSplattingMesh.ConvertPLYWithSHToSplatAsync(data) as any).then(async (splatsData: any) => { const dataView = new DataView(data, headerEndIndex + headerEnd.length); let offset = rowChunkLength * chunkCount + rowVertexLength * vertexCount; @@ -552,7 +576,7 @@ export class SPLATFileLoader implements ISceneLoaderPluginAsync, ISceneLoaderPlu // early exit for chunked/quantized ply if (chunkCount) { - return new Promise((resolve) => { + return await new Promise((resolve) => { resolve({ mode: Mode.Splat, data: splatsData.buffer, sh: splatsData.sh, faces: faces, hasVertexColors: false }); }); } @@ -574,7 +598,7 @@ export class SPLATFileLoader implements ISceneLoaderPluginAsync, ISceneLoaderPlu const hasMandatoryProperties = propertyCount == splatProperties.length && propertyColorCount == 3; const currentMode = faceCount ? Mode.Mesh : hasMandatoryProperties ? Mode.Splat : Mode.PointCloud; // parsed ready ready to be used as a splat - return new Promise((resolve) => { + return await new Promise((resolve) => { resolve({ mode: currentMode, data: splatsData.buffer, sh: splatsData.sh, faces: faces, hasVertexColors: !!propertyColorCount }); }); }); diff --git a/packages/dev/loaders/src/glTF/1.0/glTFBinaryExtension.ts b/packages/dev/loaders/src/glTF/1.0/glTFBinaryExtension.ts index c394610bcfc..96947202a28 100644 --- a/packages/dev/loaders/src/glTF/1.0/glTFBinaryExtension.ts +++ b/packages/dev/loaders/src/glTF/1.0/glTFBinaryExtension.ts @@ -53,6 +53,7 @@ export class GLTFBinaryExtension extends GLTFLoaderExtension { return false; } + // eslint-disable-next-line github/no-then this._bin.readAsync(0, this._bin.byteLength).then(onSuccess, (error) => onError(error.message)); return true; } diff --git a/packages/dev/loaders/src/glTF/1.0/glTFLoader.ts b/packages/dev/loaders/src/glTF/1.0/glTFLoader.ts index 6702828c849..3037c6c0f50 100644 --- a/packages/dev/loaders/src/glTF/1.0/glTFLoader.ts +++ b/packages/dev/loaders/src/glTF/1.0/glTFLoader.ts @@ -1867,6 +1867,7 @@ export class GLTFLoader implements IGLTFLoader { * @param onProgress event that fires when loading progress has occured * @returns a promise containg the loaded meshes, particles, skeletons and animations */ + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax public importMeshAsync( meshesNames: any, scene: Scene, @@ -1956,8 +1957,8 @@ export class GLTFLoader implements IGLTFLoader { * @param onProgress event that fires when loading progress has occured * @returns a promise which completes when objects have been loaded to the scene */ - public loadAsync(scene: Scene, data: IGLTFLoaderData, rootUrl: string, onProgress?: (event: ISceneLoaderProgressEvent) => void): Promise { - return new Promise((resolve, reject) => { + public async loadAsync(scene: Scene, data: IGLTFLoaderData, rootUrl: string, onProgress?: (event: ISceneLoaderProgressEvent) => void): Promise { + return await new Promise((resolve, reject) => { this._loadAsync( scene, data, diff --git a/packages/dev/loaders/src/glTF/2.0/Extensions/EXT_lights_image_based.ts b/packages/dev/loaders/src/glTF/2.0/Extensions/EXT_lights_image_based.ts index fa1325bbf46..8ce46393e5f 100644 --- a/packages/dev/loaders/src/glTF/2.0/Extensions/EXT_lights_image_based.ts +++ b/packages/dev/loaders/src/glTF/2.0/Extensions/EXT_lights_image_based.ts @@ -78,7 +78,7 @@ export class EXT_lights_image_based implements IGLTFLoaderExtension { */ // eslint-disable-next-line no-restricted-syntax public loadSceneAsync(context: string, scene: IScene): Nullable> { - return GLTFLoader.LoadExtensionAsync(context, scene, this.name, (extensionContext, extension) => { + return GLTFLoader.LoadExtensionAsync(context, scene, this.name, async (extensionContext, extension) => { this._loader._allMaterialsDirtyRequired = true; const promises = new Array>(); @@ -89,6 +89,7 @@ export class EXT_lights_image_based implements IGLTFLoaderExtension { const light = ArrayItem.Get(`${extensionContext}/light`, this._lights, extension.light); promises.push( + // eslint-disable-next-line github/no-then this._loadLightAsync(`/extensions/${this.name}/lights/${extension.light}`, light).then((texture) => { this._loader.babylonScene.environmentTexture = texture; }) @@ -96,10 +97,12 @@ export class EXT_lights_image_based implements IGLTFLoaderExtension { this._loader.logClose(); - return Promise.all(promises).then(() => {}); + // eslint-disable-next-line github/no-then + return await Promise.all(promises).then(() => {}); }); } + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax private _loadLightAsync(context: string, light: IEXTLightsImageBased_LightImageBased): Promise { if (!light._loaded) { const promises = new Array>(); @@ -117,6 +120,7 @@ export class EXT_lights_image_based implements IGLTFLoaderExtension { const index = faces[face]; const image = ArrayItem.Get(specularImageContext, this._loader.gltf.images, index); promises.push( + // eslint-disable-next-line github/no-then this._loader.loadImageAsync(`/images/${index}`, image).then((data) => { imageData[mipmap][face] = data; }) @@ -128,7 +132,8 @@ export class EXT_lights_image_based implements IGLTFLoaderExtension { this._loader.logClose(); - light._loaded = Promise.all(promises).then(() => { + // eslint-disable-next-line github/no-then + light._loaded = Promise.all(promises).then(async () => { const babylonTexture = new RawCubeTexture(this._loader.babylonScene, null, light.specularImageSize); babylonTexture.name = light.name || "environment"; light._babylonTexture = babylonTexture; @@ -160,10 +165,11 @@ export class EXT_lights_image_based implements IGLTFLoaderExtension { // Compute the lod generation scale to fit exactly to the number of levels available. const lodGenerationScale = (imageData.length - 1) / Math.log2(light.specularImageSize); - return babylonTexture.updateRGBDAsync(imageData, sphericalPolynomial, lodGenerationScale); + return await babylonTexture.updateRGBDAsync(imageData, sphericalPolynomial, lodGenerationScale); }); } + // eslint-disable-next-line github/no-then return light._loaded.then(() => { return light._babylonTexture!; }); diff --git a/packages/dev/loaders/src/glTF/2.0/Extensions/EXT_materials_diffuse_roughness.ts b/packages/dev/loaders/src/glTF/2.0/Extensions/EXT_materials_diffuse_roughness.ts new file mode 100644 index 00000000000..df9be34b08b --- /dev/null +++ b/packages/dev/loaders/src/glTF/2.0/Extensions/EXT_materials_diffuse_roughness.ts @@ -0,0 +1,106 @@ +import type { Nullable } from "core/types"; +import { PBRMaterial } from "core/Materials/PBR/pbrMaterial"; +import type { Material } from "core/Materials/material"; + +import type { IMaterial } from "../glTFLoaderInterfaces"; +import type { IGLTFLoaderExtension } from "../glTFLoaderExtension"; +import { GLTFLoader } from "../glTFLoader"; +import type { IEXTMaterialsDiffuseRoughness } from "babylonjs-gltf2interface"; +import { registerGLTFExtension, unregisterGLTFExtension } from "../glTFLoaderExtensionRegistry"; +import { Constants } from "core/Engines/constants"; + +const NAME = "EXT_materials_diffuse_roughness"; + +declare module "../../glTFFileLoader" { + // eslint-disable-next-line @typescript-eslint/naming-convention + export interface GLTFLoaderExtensionOptions { + /** + * Defines options for the EXT_materials_diffuse_roughness extension. + */ + // NOTE: Don't use NAME here as it will break the UMD type declarations. + ["EXT_materials_diffuse_roughness"]: {}; + } +} + +/** + * [Specification](https://github.com/KhronosGroup/glTF/blob/fdee35425ae560ea378092e38977216d63a094ec/extensions/2.0/Khronos/EXT_materials_diffuse_roughness/README.md) + * @experimental + */ +// eslint-disable-next-line @typescript-eslint/naming-convention +export class EXT_materials_diffuse_roughness implements IGLTFLoaderExtension { + /** + * The name of this extension. + */ + public readonly name = NAME; + + /** + * Defines whether this extension is enabled. + */ + public enabled: boolean; + + /** + * Defines a number that determines the order the extensions are applied. + */ + public order = 190; + + private _loader: GLTFLoader; + + /** + * @internal + */ + constructor(loader: GLTFLoader) { + this._loader = loader; + this.enabled = this._loader.isExtensionUsed(NAME); + } + + /** @internal */ + public dispose() { + (this._loader as any) = null; + } + + /** + * @internal + */ + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax + public loadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Nullable> { + return GLTFLoader.LoadExtensionAsync(context, material, this.name, async (extensionContext, extension) => { + const promises = new Array>(); + promises.push(this._loader.loadMaterialPropertiesAsync(context, material, babylonMaterial)); + promises.push(this._loadDiffuseRoughnessPropertiesAsync(extensionContext, extension, babylonMaterial)); + // eslint-disable-next-line github/no-then + return await Promise.all(promises).then(() => {}); + }); + } + + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax + private _loadDiffuseRoughnessPropertiesAsync(context: string, properties: IEXTMaterialsDiffuseRoughness, babylonMaterial: Material): Promise { + if (!(babylonMaterial instanceof PBRMaterial)) { + throw new Error(`${context}: Material type not supported`); + } + + const promises = new Array>(); + + babylonMaterial.baseDiffuseModel = Constants.MATERIAL_DIFFUSE_MODEL_E_OREN_NAYAR; + + if (properties.diffuseRoughnessFactor != undefined) { + babylonMaterial.baseDiffuseRoughness = properties.diffuseRoughnessFactor; + } else { + babylonMaterial.baseDiffuseRoughness = 0; + } + + if (properties.diffuseRoughnessTexture) { + promises.push( + this._loader.loadTextureInfoAsync(`${context}/diffuseRoughnessTexture`, properties.diffuseRoughnessTexture, (texture) => { + texture.name = `${babylonMaterial.name} (Diffuse Roughness)`; + babylonMaterial.baseDiffuseRoughnessTexture = texture; + }) + ); + } + + // eslint-disable-next-line github/no-then + return Promise.all(promises).then(() => {}); + } +} + +unregisterGLTFExtension(NAME); +registerGLTFExtension(NAME, true, (loader) => new EXT_materials_diffuse_roughness(loader)); diff --git a/packages/dev/loaders/src/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.ts b/packages/dev/loaders/src/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.ts index 062bce008f1..d0d5460fa7f 100644 --- a/packages/dev/loaders/src/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.ts +++ b/packages/dev/loaders/src/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.ts @@ -59,7 +59,7 @@ export class EXT_mesh_gpu_instancing implements IGLTFLoaderExtension { */ // eslint-disable-next-line no-restricted-syntax public loadNodeAsync(context: string, node: INode, assign: (babylonTransformNode: TransformNode) => void): Nullable> { - return GLTFLoader.LoadExtensionAsync(context, node, this.name, (extensionContext, extension) => { + return GLTFLoader.LoadExtensionAsync(context, node, this.name, async (extensionContext, extension) => { this._loader._disableInstancedMesh++; const promise = this._loader.loadNodeAsync(`/nodes/${node.index}`, node, assign); @@ -67,7 +67,7 @@ export class EXT_mesh_gpu_instancing implements IGLTFLoaderExtension { this._loader._disableInstancedMesh--; if (!node._primitiveBabylonMeshes) { - return promise; + return await promise; } const promises = new Array>>(); @@ -93,30 +93,26 @@ export class EXT_mesh_gpu_instancing implements IGLTFLoaderExtension { loadAttribute("ROTATION"); loadAttribute("SCALE"); - return promise.then((babylonTransformNode) => { - return Promise.all(promises).then(([translationBuffer, rotationBuffer, scaleBuffer]) => { - const matrices = new Float32Array(instanceCount * 16); - - TmpVectors.Vector3[0].copyFromFloats(0, 0, 0); // translation - TmpVectors.Quaternion[0].copyFromFloats(0, 0, 0, 1); // rotation - TmpVectors.Vector3[1].copyFromFloats(1, 1, 1); // scale - - for (let i = 0; i < instanceCount; ++i) { - translationBuffer && Vector3.FromArrayToRef(translationBuffer, i * 3, TmpVectors.Vector3[0]); - rotationBuffer && Quaternion.FromArrayToRef(rotationBuffer, i * 4, TmpVectors.Quaternion[0]); - scaleBuffer && Vector3.FromArrayToRef(scaleBuffer, i * 3, TmpVectors.Vector3[1]); - - Matrix.ComposeToRef(TmpVectors.Vector3[1], TmpVectors.Quaternion[0], TmpVectors.Vector3[0], TmpVectors.Matrix[0]); - - TmpVectors.Matrix[0].copyToArray(matrices, i * 16); - } - - for (const babylonMesh of node._primitiveBabylonMeshes!) { - (babylonMesh as Mesh).thinInstanceSetBuffer("matrix", matrices, 16, true); - } - - return babylonTransformNode; - }); + // eslint-disable-next-line github/no-then + return await promise.then(async (babylonTransformNode) => { + const [translationBuffer, rotationBuffer, scaleBuffer] = await Promise.all(promises); + const matrices = new Float32Array(instanceCount * 16); + TmpVectors.Vector3[0].copyFromFloats(0, 0, 0); // translation + TmpVectors.Quaternion[0].copyFromFloats(0, 0, 0, 1); // rotation + TmpVectors.Vector3[1].copyFromFloats(1, 1, 1); // scale + for (let i = 0; i < instanceCount; ++i) { + translationBuffer && Vector3.FromArrayToRef(translationBuffer, i * 3, TmpVectors.Vector3[0]); + rotationBuffer && Quaternion.FromArrayToRef(rotationBuffer, i * 4, TmpVectors.Quaternion[0]); + scaleBuffer && Vector3.FromArrayToRef(scaleBuffer, i * 3, TmpVectors.Vector3[1]); + + Matrix.ComposeToRef(TmpVectors.Vector3[1], TmpVectors.Quaternion[0], TmpVectors.Vector3[0], TmpVectors.Matrix[0]); + + TmpVectors.Matrix[0].copyToArray(matrices, i * 16); + } + for (const babylonMesh of node._primitiveBabylonMeshes!) { + (babylonMesh as Mesh).thinInstanceSetBuffer("matrix", matrices, 16, true); + } + return babylonTransformNode; }); }); } diff --git a/packages/dev/loaders/src/glTF/2.0/Extensions/EXT_meshopt_compression.ts b/packages/dev/loaders/src/glTF/2.0/Extensions/EXT_meshopt_compression.ts index c9b95a16b8d..d695b02037f 100644 --- a/packages/dev/loaders/src/glTF/2.0/Extensions/EXT_meshopt_compression.ts +++ b/packages/dev/loaders/src/glTF/2.0/Extensions/EXT_meshopt_compression.ts @@ -61,18 +61,21 @@ export class EXT_meshopt_compression implements IGLTFLoaderExtension { */ // eslint-disable-next-line no-restricted-syntax public loadBufferViewAsync(context: string, bufferView: IBufferView): Nullable> { - return GLTFLoader.LoadExtensionAsync(context, bufferView, this.name, (extensionContext, extension) => { + return GLTFLoader.LoadExtensionAsync(context, bufferView, this.name, async (extensionContext, extension) => { const bufferViewMeshopt = bufferView as IBufferViewMeshopt; if (bufferViewMeshopt._meshOptData) { - return bufferViewMeshopt._meshOptData; + return await bufferViewMeshopt._meshOptData; } const buffer = ArrayItem.Get(`${context}/buffer`, this._loader.gltf.buffers, extension.buffer); - bufferViewMeshopt._meshOptData = this._loader.loadBufferAsync(`/buffers/${buffer.index}`, buffer, extension.byteOffset || 0, extension.byteLength).then((buffer) => { - return MeshoptCompression.Default.decodeGltfBufferAsync(buffer as Uint8Array, extension.count, extension.byteStride, extension.mode, extension.filter); - }); + bufferViewMeshopt._meshOptData = this._loader + .loadBufferAsync(`/buffers/${buffer.index}`, buffer, extension.byteOffset || 0, extension.byteLength) + // eslint-disable-next-line github/no-then + .then(async (buffer) => { + return await MeshoptCompression.Default.decodeGltfBufferAsync(buffer as Uint8Array, extension.count, extension.byteStride, extension.mode, extension.filter); + }); - return bufferViewMeshopt._meshOptData; + return await bufferViewMeshopt._meshOptData; }); } } diff --git a/packages/dev/loaders/src/glTF/2.0/Extensions/EXT_texture_avif.ts b/packages/dev/loaders/src/glTF/2.0/Extensions/EXT_texture_avif.ts index 8dc642fdbb7..b7d9c55cc70 100644 --- a/packages/dev/loaders/src/glTF/2.0/Extensions/EXT_texture_avif.ts +++ b/packages/dev/loaders/src/glTF/2.0/Extensions/EXT_texture_avif.ts @@ -51,10 +51,10 @@ export class EXT_texture_avif implements IGLTFLoaderExtension { */ // eslint-disable-next-line no-restricted-syntax public _loadTextureAsync(context: string, texture: ITexture, assign: (babylonTexture: BaseTexture) => void): Nullable> { - return GLTFLoader.LoadExtensionAsync(context, texture, this.name, (extensionContext, extension) => { + return GLTFLoader.LoadExtensionAsync(context, texture, this.name, async (extensionContext, extension) => { const sampler = texture.sampler == undefined ? GLTFLoader.DefaultSampler : ArrayItem.Get(`${context}/sampler`, this._loader.gltf.samplers, texture.sampler); const image = ArrayItem.Get(`${extensionContext}/source`, this._loader.gltf.images, extension.source); - return this._loader._createTextureAsync( + return await this._loader._createTextureAsync( context, sampler, image, diff --git a/packages/dev/loaders/src/glTF/2.0/Extensions/EXT_texture_webp.ts b/packages/dev/loaders/src/glTF/2.0/Extensions/EXT_texture_webp.ts index 17ccacfddbe..572ed5c4129 100644 --- a/packages/dev/loaders/src/glTF/2.0/Extensions/EXT_texture_webp.ts +++ b/packages/dev/loaders/src/glTF/2.0/Extensions/EXT_texture_webp.ts @@ -53,7 +53,7 @@ export class EXT_texture_webp implements IGLTFLoaderExtension { return GLTFLoader.LoadExtensionAsync(context, texture, this.name, async (extensionContext, extension) => { const sampler = texture.sampler == undefined ? GLTFLoader.DefaultSampler : ArrayItem.Get(`${context}/sampler`, this._loader.gltf.samplers, texture.sampler); const image = ArrayItem.Get(`${extensionContext}/source`, this._loader.gltf.images, extension.source); - return this._loader._createTextureAsync( + return await this._loader._createTextureAsync( context, sampler, image, diff --git a/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_draco_mesh_compression.ts b/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_draco_mesh_compression.ts index 02dfffd2d74..22e7d843fb4 100644 --- a/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_draco_mesh_compression.ts +++ b/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_draco_mesh_compression.ts @@ -1,3 +1,4 @@ +/* eslint-disable github/no-then */ import { DracoDecoder } from "core/Meshes/Compression/dracoDecoder"; import type { Nullable } from "core/types"; import { VertexBuffer } from "core/Buffers/buffer"; @@ -74,7 +75,7 @@ export class KHR_draco_mesh_compression implements IGLTFLoaderExtension { */ // eslint-disable-next-line no-restricted-syntax public _loadVertexDataAsync(context: string, primitive: IMeshPrimitive, babylonMesh: Mesh): Nullable> { - return GLTFLoader.LoadExtensionAsync(context, primitive, this.name, (extensionContext, extension) => { + return GLTFLoader.LoadExtensionAsync(context, primitive, this.name, async (extensionContext, extension) => { if (primitive.mode != undefined) { if (primitive.mode !== MeshPrimitiveMode.TRIANGLES && primitive.mode !== MeshPrimitiveMode.TRIANGLE_STRIP) { throw new Error(`${context}: Unsupported mode ${primitive.mode}`); @@ -119,12 +120,12 @@ export class KHR_draco_mesh_compression implements IGLTFLoaderExtension { const bufferView = ArrayItem.Get(extensionContext, this._loader.gltf.bufferViews, extension.bufferView) as IBufferViewDraco; if (!bufferView._dracoBabylonGeometry) { - bufferView._dracoBabylonGeometry = this._loader.loadBufferViewAsync(`/bufferViews/${bufferView.index}`, bufferView).then((data) => { + bufferView._dracoBabylonGeometry = this._loader.loadBufferViewAsync(`/bufferViews/${bufferView.index}`, bufferView).then(async (data) => { const dracoDecoder = this.dracoDecoder || DracoDecoder.Default; const positionAccessor = ArrayItem.TryGet(this._loader.gltf.accessors, primitive.attributes["POSITION"]); const babylonBoundingInfo = !this._loader.parent.alwaysComputeBoundingBox && !babylonMesh.skeleton && positionAccessor ? LoadBoundingInfoFromPositionAccessor(positionAccessor) : null; - return dracoDecoder + return await dracoDecoder ._decodeMeshToGeometryForGltfAsync(babylonMesh.name, this._loader.babylonScene, data, attributes, normalized, babylonBoundingInfo) .catch((error) => { throw new Error(`${context}: ${error.message}`); @@ -132,7 +133,7 @@ export class KHR_draco_mesh_compression implements IGLTFLoaderExtension { }); } - return bufferView._dracoBabylonGeometry; + return await bufferView._dracoBabylonGeometry; }); } } diff --git a/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_interactivity.ts b/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_interactivity.ts index 9ea1d677513..e71c63cd16e 100644 --- a/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_interactivity.ts +++ b/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_interactivity.ts @@ -64,7 +64,7 @@ export class KHR_interactivity implements IGLTFLoaderExtension { delete this._pathConverter; } - // eslint-disable-next-line no-restricted-syntax + // eslint-disable-next-line no-restricted-syntax, @typescript-eslint/no-misused-promises public async onReady(): Promise { if (!this._loader.babylonScene || !this._pathConverter) { return; @@ -83,7 +83,7 @@ export class KHR_interactivity implements IGLTFLoaderExtension { return parser.serializeToFlowGraph(); }); // parse each graph async - await Promise.all(graphs.map((graph) => ParseFlowGraphAsync(graph, { coordinator, pathConverter: this._pathConverter }))); + await Promise.all(graphs.map(async (graph) => await ParseFlowGraphAsync(graph, { coordinator, pathConverter: this._pathConverter }))); coordinator.start(); } diff --git a/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_interactivity/declarationMapper.ts b/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_interactivity/declarationMapper.ts index 2f2b6e25ccb..207dda340d6 100644 --- a/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_interactivity/declarationMapper.ts +++ b/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_interactivity/declarationMapper.ts @@ -936,9 +936,10 @@ const gltfToFlowGraphMapping: { [key: string]: IGLTFToFlowGraphMapping } = { const cases = gltfBlock.configuration.cases.value; const onlyIntegers = cases.every((caseValue) => { // case value should be an integer. Since Number.isInteger(1.0) is true, we need to check if toString has only digits. - return typeof caseValue === "number" && /^\d+$/.test(caseValue.toString()); + return typeof caseValue === "number" && /^-?\d+$/.test(caseValue.toString()); }); if (!onlyIntegers) { + Logger.Warn("Switch cases should be integers. Using empty array instead."); gltfBlock.configuration.cases.value = [] as number[]; return { valid: true }; } @@ -989,6 +990,12 @@ const gltfToFlowGraphMapping: { [key: string]: IGLTFToFlowGraphMapping } = { loopBody: { name: "executionFlow" }, }, }, + extraProcessor(_gltfBlock, _declaration, _mapping, _arrays, serializedObjects) { + const serializedObject = serializedObjects[0]; + serializedObject.config ||= {}; + serializedObject.config.incrementIndexWhenLoopDone = true; + return serializedObjects; + }, }, "flow/doN": { blocks: [FlowGraphBlockNames.DoN], @@ -1030,6 +1037,7 @@ const gltfToFlowGraphMapping: { [key: string]: IGLTFToFlowGraphMapping } = { }, inputs: { flows: { + reset: { name: "reset" }, "[segment]": { name: "in_$1" }, }, }, diff --git a/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_interactivity/interactivityGraphParser.ts b/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_interactivity/interactivityGraphParser.ts index 82246846567..db066c3ed5e 100644 --- a/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_interactivity/interactivityGraphParser.ts +++ b/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_interactivity/interactivityGraphParser.ts @@ -269,7 +269,7 @@ export class InteractivityGraphToFlowGraphParser { configuration[configKey] = { value: configMapping.defaultValue, }; - } else if (value.value.length >= 1) { + } else if (value.value.length >= 0) { // supporting int[] and int/boolean/string configuration[configKey] = { value: value.value.length === 1 ? value.value[0] : value.value, diff --git a/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_lights_punctual.ts b/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_lights_punctual.ts index bacde5786fd..27d1101c7f1 100644 --- a/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_lights_punctual.ts +++ b/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_lights_punctual.ts @@ -76,10 +76,10 @@ export class KHR_lights implements IGLTFLoaderExtension { */ // eslint-disable-next-line no-restricted-syntax public loadNodeAsync(context: string, node: INode, assign: (babylonTransformNode: TransformNode) => void): Nullable> { - return GLTFLoader.LoadExtensionAsync(context, node, this.name, (extensionContext, extension) => { + return GLTFLoader.LoadExtensionAsync(context, node, this.name, async (extensionContext, extension) => { this._loader._allMaterialsDirtyRequired = true; - return this._loader.loadNodeAsync(context, node, (babylonMesh) => { + return await this._loader.loadNodeAsync(context, node, (babylonMesh) => { let babylonLight: Light; const light = ArrayItem.Get(extensionContext, this._lights, extension.light); diff --git a/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_anisotropy.ts b/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_anisotropy.ts index a64f9800d65..c425c295da5 100644 --- a/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_anisotropy.ts +++ b/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_anisotropy.ts @@ -61,15 +61,15 @@ export class KHR_materials_anisotropy implements IGLTFLoaderExtension { */ // eslint-disable-next-line no-restricted-syntax public loadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Nullable> { - return GLTFLoader.LoadExtensionAsync(context, material, this.name, (extensionContext, extension) => { + return GLTFLoader.LoadExtensionAsync(context, material, this.name, async (extensionContext, extension) => { const promises = new Array>(); promises.push(this._loader.loadMaterialPropertiesAsync(context, material, babylonMaterial)); promises.push(this._loadIridescencePropertiesAsync(extensionContext, extension, babylonMaterial)); - return Promise.all(promises).then(() => {}); + await Promise.all(promises); }); } - private _loadIridescencePropertiesAsync(context: string, properties: IKHRMaterialsAnisotropy, babylonMaterial: Material): Promise { + private async _loadIridescencePropertiesAsync(context: string, properties: IKHRMaterialsAnisotropy, babylonMaterial: Material): Promise { if (!(babylonMaterial instanceof PBRMaterial)) { throw new Error(`${context}: Material type not supported`); } @@ -91,7 +91,7 @@ export class KHR_materials_anisotropy implements IGLTFLoaderExtension { ); } - return Promise.all(promises).then(() => {}); + await Promise.all(promises); } } diff --git a/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_clearcoat.ts b/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_clearcoat.ts index 0af96916d1b..bc394cd1040 100644 --- a/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_clearcoat.ts +++ b/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_clearcoat.ts @@ -62,14 +62,15 @@ export class KHR_materials_clearcoat implements IGLTFLoaderExtension { */ // eslint-disable-next-line no-restricted-syntax public loadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Nullable> { - return GLTFLoader.LoadExtensionAsync(context, material, this.name, (extensionContext, extension) => { + return GLTFLoader.LoadExtensionAsync(context, material, this.name, async (extensionContext, extension) => { const promises = new Array>(); promises.push(this._loader.loadMaterialPropertiesAsync(context, material, babylonMaterial)); promises.push(this._loadClearCoatPropertiesAsync(extensionContext, extension, babylonMaterial)); - return Promise.all(promises).then(() => {}); + await Promise.all(promises); }); } + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax private _loadClearCoatPropertiesAsync(context: string, properties: IKHRMaterialsClearcoat, babylonMaterial: Material): Promise { if (!(babylonMaterial instanceof PBRMaterial)) { throw new Error(`${context}: Material type not supported`); @@ -128,6 +129,7 @@ export class KHR_materials_clearcoat implements IGLTFLoaderExtension { } } + // eslint-disable-next-line github/no-then return Promise.all(promises).then(() => {}); } } diff --git a/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_diffuse_transmission.ts b/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_diffuse_transmission.ts index ee24d999350..5507ebfb1ab 100644 --- a/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_diffuse_transmission.ts +++ b/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_diffuse_transmission.ts @@ -1,3 +1,4 @@ +/* eslint-disable github/no-then */ import type { Nullable } from "core/types"; import { PBRMaterial } from "core/Materials/PBR/pbrMaterial"; import type { Material } from "core/Materials/material"; @@ -66,14 +67,15 @@ export class KHR_materials_diffuse_transmission implements IGLTFLoaderExtension */ // eslint-disable-next-line no-restricted-syntax public loadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Nullable> { - return GLTFLoader.LoadExtensionAsync(context, material, this.name, (extensionContext, extension) => { + return GLTFLoader.LoadExtensionAsync(context, material, this.name, async (extensionContext, extension) => { const promises = new Array>(); promises.push(this._loader.loadMaterialPropertiesAsync(context, material, babylonMaterial)); promises.push(this._loadTranslucentPropertiesAsync(extensionContext, material, babylonMaterial, extension)); - return Promise.all(promises).then(() => {}); + return await Promise.all(promises).then(() => {}); }); } + // eslint-disable-next-line no-restricted-syntax, @typescript-eslint/promise-function-async private _loadTranslucentPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material, extension: IKHRMaterialsDiffuseTransmission): Promise { if (!(babylonMaterial instanceof PBRMaterial)) { throw new Error(`${context}: Material type not supported`); diff --git a/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_dispersion.ts b/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_dispersion.ts index 5ceefdc284c..1a99485b358 100644 --- a/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_dispersion.ts +++ b/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_dispersion.ts @@ -62,14 +62,16 @@ export class KHR_materials_dispersion implements IGLTFLoaderExtension { */ // eslint-disable-next-line no-restricted-syntax public loadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Nullable> { - return GLTFLoader.LoadExtensionAsync(context, material, this.name, (extensionContext, extension) => { + return GLTFLoader.LoadExtensionAsync(context, material, this.name, async (extensionContext, extension) => { const promises = new Array>(); promises.push(this._loader.loadMaterialPropertiesAsync(context, material, babylonMaterial)); promises.push(this._loadDispersionPropertiesAsync(extensionContext, material, babylonMaterial, extension)); - return Promise.all(promises).then(() => {}); + // eslint-disable-next-line github/no-then + return await Promise.all(promises).then(() => {}); }); } + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax private _loadDispersionPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material, extension: IKHRMaterialsDispersion): Promise { if (!(babylonMaterial instanceof PBRMaterial)) { throw new Error(`${context}: Material type not supported`); diff --git a/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_emissive_strength.ts b/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_emissive_strength.ts index 293aca02697..b2c0e1a0e41 100644 --- a/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_emissive_strength.ts +++ b/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_emissive_strength.ts @@ -61,8 +61,9 @@ export class KHR_materials_emissive_strength implements IGLTFLoaderExtension { */ // eslint-disable-next-line no-restricted-syntax public loadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Nullable> { - return GLTFLoader.LoadExtensionAsync(context, material, this.name, (extensionContext, extension) => { - return this._loader.loadMaterialPropertiesAsync(context, material, babylonMaterial).then(() => { + return GLTFLoader.LoadExtensionAsync(context, material, this.name, async (extensionContext, extension) => { + // eslint-disable-next-line github/no-then + return await this._loader.loadMaterialPropertiesAsync(context, material, babylonMaterial).then(() => { this._loadEmissiveProperties(extensionContext, extension, babylonMaterial); }); }); diff --git a/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_ior.ts b/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_ior.ts index 43ebc00105c..ad70f99ba58 100644 --- a/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_ior.ts +++ b/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_ior.ts @@ -66,14 +66,16 @@ export class KHR_materials_ior implements IGLTFLoaderExtension { */ // eslint-disable-next-line no-restricted-syntax public loadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Nullable> { - return GLTFLoader.LoadExtensionAsync(context, material, this.name, (extensionContext, extension) => { + return GLTFLoader.LoadExtensionAsync(context, material, this.name, async (extensionContext, extension) => { const promises = new Array>(); promises.push(this._loader.loadMaterialPropertiesAsync(context, material, babylonMaterial)); promises.push(this._loadIorPropertiesAsync(extensionContext, extension, babylonMaterial)); - return Promise.all(promises).then(() => {}); + // eslint-disable-next-line github/no-then + return await Promise.all(promises).then(() => {}); }); } + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax private _loadIorPropertiesAsync(context: string, properties: IKHRMaterialsIor, babylonMaterial: Material): Promise { if (!(babylonMaterial instanceof PBRMaterial)) { throw new Error(`${context}: Material type not supported`); diff --git a/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_iridescence.ts b/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_iridescence.ts index 6289950a374..11168af02da 100644 --- a/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_iridescence.ts +++ b/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_iridescence.ts @@ -61,14 +61,16 @@ export class KHR_materials_iridescence implements IGLTFLoaderExtension { */ // eslint-disable-next-line no-restricted-syntax public loadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Nullable> { - return GLTFLoader.LoadExtensionAsync(context, material, this.name, (extensionContext, extension) => { + return GLTFLoader.LoadExtensionAsync(context, material, this.name, async (extensionContext, extension) => { const promises = new Array>(); promises.push(this._loader.loadMaterialPropertiesAsync(context, material, babylonMaterial)); promises.push(this._loadIridescencePropertiesAsync(extensionContext, extension, babylonMaterial)); - return Promise.all(promises).then(() => {}); + // eslint-disable-next-line github/no-then + return await Promise.all(promises).then(() => {}); }); } + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax private _loadIridescencePropertiesAsync(context: string, properties: IKHRMaterialsIridescence, babylonMaterial: Material): Promise { if (!(babylonMaterial instanceof PBRMaterial)) { throw new Error(`${context}: Material type not supported`); @@ -101,6 +103,7 @@ export class KHR_materials_iridescence implements IGLTFLoaderExtension { ); } + // eslint-disable-next-line github/no-then return Promise.all(promises).then(() => {}); } } diff --git a/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_pbrSpecularGlossiness.ts b/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_pbrSpecularGlossiness.ts index 4398727ded9..4f228ad3d07 100644 --- a/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_pbrSpecularGlossiness.ts +++ b/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_pbrSpecularGlossiness.ts @@ -62,15 +62,17 @@ export class KHR_materials_pbrSpecularGlossiness implements IGLTFLoaderExtension */ // eslint-disable-next-line no-restricted-syntax public loadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Nullable> { - return GLTFLoader.LoadExtensionAsync(context, material, this.name, (extensionContext, extension) => { + return GLTFLoader.LoadExtensionAsync(context, material, this.name, async (extensionContext, extension) => { const promises = new Array>(); promises.push(this._loader.loadMaterialBasePropertiesAsync(context, material, babylonMaterial)); promises.push(this._loadSpecularGlossinessPropertiesAsync(extensionContext, extension, babylonMaterial)); this._loader.loadMaterialAlphaProperties(context, material, babylonMaterial); - return Promise.all(promises).then(() => {}); + // eslint-disable-next-line github/no-then + return await Promise.all(promises).then(() => {}); }); } + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax private _loadSpecularGlossinessPropertiesAsync(context: string, properties: IKHRMaterialsPbrSpecularGlossiness, babylonMaterial: Material): Promise { if (!(babylonMaterial instanceof PBRMaterial)) { throw new Error(`${context}: Material type not supported`); @@ -112,6 +114,7 @@ export class KHR_materials_pbrSpecularGlossiness implements IGLTFLoaderExtension babylonMaterial.useMicroSurfaceFromReflectivityMapAlpha = true; } + // eslint-disable-next-line github/no-then return Promise.all(promises).then(() => {}); } } diff --git a/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_sheen.ts b/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_sheen.ts index 2d517a339bd..4816792a5e3 100644 --- a/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_sheen.ts +++ b/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_sheen.ts @@ -63,14 +63,16 @@ export class KHR_materials_sheen implements IGLTFLoaderExtension { */ // eslint-disable-next-line no-restricted-syntax public loadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Nullable> { - return GLTFLoader.LoadExtensionAsync(context, material, this.name, (extensionContext, extension) => { + return GLTFLoader.LoadExtensionAsync(context, material, this.name, async (extensionContext, extension) => { const promises = new Array>(); promises.push(this._loader.loadMaterialPropertiesAsync(context, material, babylonMaterial)); promises.push(this._loadSheenPropertiesAsync(extensionContext, extension, babylonMaterial)); - return Promise.all(promises).then(() => {}); + // eslint-disable-next-line github/no-then + return await Promise.all(promises).then(() => {}); }); } + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax private _loadSheenPropertiesAsync(context: string, properties: IKHRMaterialsSheen, babylonMaterial: Material): Promise { if (!(babylonMaterial instanceof PBRMaterial)) { throw new Error(`${context}: Material type not supported`); @@ -115,6 +117,7 @@ export class KHR_materials_sheen implements IGLTFLoaderExtension { babylonMaterial.sheen.albedoScaling = true; babylonMaterial.sheen.useRoughnessFromMainTexture = false; + // eslint-disable-next-line github/no-then return Promise.all(promises).then(() => {}); } } diff --git a/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_specular.ts b/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_specular.ts index 540809fbe66..91ade46b6f2 100644 --- a/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_specular.ts +++ b/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_specular.ts @@ -62,14 +62,16 @@ export class KHR_materials_specular implements IGLTFLoaderExtension { */ // eslint-disable-next-line no-restricted-syntax public loadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Nullable> { - return GLTFLoader.LoadExtensionAsync(context, material, this.name, (extensionContext, extension) => { + return GLTFLoader.LoadExtensionAsync(context, material, this.name, async (extensionContext, extension) => { const promises = new Array>(); promises.push(this._loader.loadMaterialPropertiesAsync(context, material, babylonMaterial)); promises.push(this._loadSpecularPropertiesAsync(extensionContext, extension, babylonMaterial)); - return Promise.all(promises).then(() => {}); + // eslint-disable-next-line github/no-then + return await Promise.all(promises).then(() => {}); }); } + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax private _loadSpecularPropertiesAsync(context: string, properties: IKHRMaterialsSpecular, babylonMaterial: Material): Promise { if (!(babylonMaterial instanceof PBRMaterial)) { throw new Error(`${context}: Material type not supported`); @@ -105,6 +107,7 @@ export class KHR_materials_specular implements IGLTFLoaderExtension { ); } + // eslint-disable-next-line github/no-then return Promise.all(promises).then(() => {}); } } diff --git a/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_transmission.ts b/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_transmission.ts index ac3f7e382f8..5f91a41d555 100644 --- a/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_transmission.ts +++ b/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_transmission.ts @@ -367,14 +367,16 @@ export class KHR_materials_transmission implements IGLTFLoaderExtension { */ // eslint-disable-next-line no-restricted-syntax public loadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Nullable> { - return GLTFLoader.LoadExtensionAsync(context, material, this.name, (extensionContext, extension) => { + return GLTFLoader.LoadExtensionAsync(context, material, this.name, async (extensionContext, extension) => { const promises = new Array>(); promises.push(this._loader.loadMaterialPropertiesAsync(context, material, babylonMaterial)); promises.push(this._loadTransparentPropertiesAsync(extensionContext, material, babylonMaterial, extension)); - return Promise.all(promises).then(() => {}); + // eslint-disable-next-line github/no-then + return await Promise.all(promises).then(() => {}); }); } + // eslint-disable-next-line no-restricted-syntax, @typescript-eslint/promise-function-async private _loadTransparentPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material, extension: IKHRMaterialsTransmission): Promise { if (!(babylonMaterial instanceof PBRMaterial)) { throw new Error(`${context}: Material type not supported`); @@ -409,6 +411,7 @@ export class KHR_materials_transmission implements IGLTFLoaderExtension { pbrMaterial.subSurface.maximumThickness = 0.0; if (extension.transmissionTexture) { (extension.transmissionTexture as ITextureInfo).nonColorData = true; + // eslint-disable-next-line github/no-then return this._loader.loadTextureInfoAsync(`${context}/transmissionTexture`, extension.transmissionTexture, undefined).then((texture: BaseTexture) => { texture.name = `${babylonMaterial.name} (Transmission)`; pbrMaterial.subSurface.refractionIntensityTexture = texture; diff --git a/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_unlit.ts b/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_unlit.ts index 4777073c256..1a9609ac33c 100644 --- a/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_unlit.ts +++ b/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_unlit.ts @@ -61,11 +61,12 @@ export class KHR_materials_unlit implements IGLTFLoaderExtension { */ // eslint-disable-next-line no-restricted-syntax public loadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Nullable> { - return GLTFLoader.LoadExtensionAsync(context, material, this.name, () => { - return this._loadUnlitPropertiesAsync(context, material, babylonMaterial); + return GLTFLoader.LoadExtensionAsync(context, material, this.name, async () => { + return await this._loadUnlitPropertiesAsync(context, material, babylonMaterial); }); } + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax private _loadUnlitPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Promise { if (!(babylonMaterial instanceof PBRMaterial)) { throw new Error(`${context}: Material type not supported`); @@ -100,6 +101,7 @@ export class KHR_materials_unlit implements IGLTFLoaderExtension { this._loader.loadMaterialAlphaProperties(context, material, babylonMaterial); + // eslint-disable-next-line github/no-then return Promise.all(promises).then(() => {}); } } diff --git a/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_variants.ts b/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_variants.ts index 4d6f8c9dc35..a18f3d9594b 100644 --- a/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_variants.ts +++ b/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_variants.ts @@ -261,7 +261,7 @@ export class KHR_materials_variants implements IGLTFLoaderExtension { primitive: IMeshPrimitive, assign: (babylonMesh: AbstractMesh) => void ): Nullable> { - return GLTFLoader.LoadExtensionAsync(context, primitive, this.name, (extensionContext, extension) => { + return GLTFLoader.LoadExtensionAsync(context, primitive, this.name, async (extensionContext, extension) => { const promises = new Array>(); promises.push( this._loader._loadMeshPrimitiveAsync(context, name, node, mesh, primitive, (babylonMesh) => { @@ -364,7 +364,8 @@ export class KHR_materials_variants implements IGLTFLoaderExtension { } }) ); - return Promise.all(promises).then(([babylonMesh]) => { + // eslint-disable-next-line github/no-then + return await Promise.all(promises).then(([babylonMesh]) => { return babylonMesh; }); }); diff --git a/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_volume.ts b/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_volume.ts index faaadcc3cec..349cbd67c10 100644 --- a/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_volume.ts +++ b/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_materials_volume.ts @@ -70,14 +70,16 @@ export class KHR_materials_volume implements IGLTFLoaderExtension { */ // eslint-disable-next-line no-restricted-syntax public loadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Nullable> { - return GLTFLoader.LoadExtensionAsync(context, material, this.name, (extensionContext, extension) => { + return GLTFLoader.LoadExtensionAsync(context, material, this.name, async (extensionContext, extension) => { const promises = new Array>(); promises.push(this._loader.loadMaterialPropertiesAsync(context, material, babylonMaterial)); promises.push(this._loadVolumePropertiesAsync(extensionContext, material, babylonMaterial, extension)); - return Promise.all(promises).then(() => {}); + // eslint-disable-next-line github/no-then + return await Promise.all(promises).then(() => {}); }); } + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax private _loadVolumePropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material, extension: IKHRMaterialsVolume): Promise { if (!(babylonMaterial instanceof PBRMaterial)) { throw new Error(`${context}: Material type not supported`); @@ -102,6 +104,7 @@ export class KHR_materials_volume implements IGLTFLoaderExtension { babylonMaterial.subSurface.useThicknessAsDepth = true; if (extension.thicknessTexture) { (extension.thicknessTexture as ITextureInfo).nonColorData = true; + // eslint-disable-next-line github/no-then return this._loader.loadTextureInfoAsync(`${context}/thicknessTexture`, extension.thicknessTexture).then((texture: BaseTexture) => { texture.name = `${babylonMaterial.name} (Thickness)`; babylonMaterial.subSurface.thicknessTexture = texture; diff --git a/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_node_hoverability.ts b/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_node_hoverability.ts index 7ba813c37bf..0e5ef9c3af4 100644 --- a/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_node_hoverability.ts +++ b/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_node_hoverability.ts @@ -199,7 +199,7 @@ export class KHR_node_hoverability implements IGLTFLoaderExtension { this.enabled = loader.isExtensionUsed(NAME); } - // eslint-disable-next-line @typescript-eslint/naming-convention + // eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/no-misused-promises public async onReady(): Promise { this._loader.gltf.nodes?.forEach((node) => { // default is true, so only apply if false diff --git a/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_node_selectability.ts b/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_node_selectability.ts index 3e661db3a2c..80caea0758b 100644 --- a/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_node_selectability.ts +++ b/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_node_selectability.ts @@ -132,7 +132,7 @@ export class KHR_node_selectability implements IGLTFLoaderExtension { this.enabled = loader.isExtensionUsed(NAME); } - // eslint-disable-next-line @typescript-eslint/naming-convention + // eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/no-misused-promises public async onReady(): Promise { this._loader.gltf.nodes?.forEach((node) => { if (node.extensions?.KHR_node_selectability && node.extensions?.KHR_node_selectability.selectable === false) { diff --git a/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_node_visibility.ts b/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_node_visibility.ts index 596a7371ee8..fc57756d63d 100644 --- a/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_node_visibility.ts +++ b/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_node_visibility.ts @@ -67,7 +67,7 @@ export class KHR_node_visibility implements IGLTFLoaderExtension { this.enabled = loader.isExtensionUsed(NAME); } - // eslint-disable-next-line @typescript-eslint/naming-convention + // eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/no-misused-promises public async onReady(): Promise { this._loader.gltf.nodes?.forEach((node) => { node._primitiveBabylonMeshes?.forEach((mesh) => { diff --git a/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_texture_basisu.ts b/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_texture_basisu.ts index ff4a030ccad..2a56378c2fa 100644 --- a/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_texture_basisu.ts +++ b/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_texture_basisu.ts @@ -50,10 +50,10 @@ export class KHR_texture_basisu implements IGLTFLoaderExtension { */ // eslint-disable-next-line no-restricted-syntax public _loadTextureAsync(context: string, texture: ITexture, assign: (babylonTexture: BaseTexture) => void): Nullable> { - return GLTFLoader.LoadExtensionAsync(context, texture, this.name, (extensionContext, extension) => { + return GLTFLoader.LoadExtensionAsync(context, texture, this.name, async (extensionContext, extension) => { const sampler = texture.sampler == undefined ? GLTFLoader.DefaultSampler : ArrayItem.Get(`${context}/sampler`, this._loader.gltf.samplers, texture.sampler); const image = ArrayItem.Get(`${extensionContext}/source`, this._loader.gltf.images, extension.source); - return this._loader._createTextureAsync( + return await this._loader._createTextureAsync( context, sampler, image, diff --git a/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_texture_transform.ts b/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_texture_transform.ts index de93d1ae77f..b48cd9239aa 100644 --- a/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_texture_transform.ts +++ b/packages/dev/loaders/src/glTF/2.0/Extensions/KHR_texture_transform.ts @@ -56,8 +56,8 @@ export class KHR_texture_transform implements IGLTFLoaderExtension { */ // eslint-disable-next-line no-restricted-syntax public loadTextureInfoAsync(context: string, textureInfo: ITextureInfo, assign: (babylonTexture: BaseTexture) => void): Nullable> { - return GLTFLoader.LoadExtensionAsync(context, textureInfo, this.name, (extensionContext, extension) => { - return this._loader.loadTextureInfoAsync(context, textureInfo, (babylonTexture) => { + return GLTFLoader.LoadExtensionAsync(context, textureInfo, this.name, async (extensionContext, extension) => { + return await this._loader.loadTextureInfoAsync(context, textureInfo, (babylonTexture) => { if (!(babylonTexture instanceof Texture)) { throw new Error(`${extensionContext}: Texture type not supported`); } diff --git a/packages/dev/loaders/src/glTF/2.0/Extensions/MSFT_audio_emitter.ts b/packages/dev/loaders/src/glTF/2.0/Extensions/MSFT_audio_emitter.ts index 4c6898bf675..07cdcea3946 100644 --- a/packages/dev/loaders/src/glTF/2.0/Extensions/MSFT_audio_emitter.ts +++ b/packages/dev/loaders/src/glTF/2.0/Extensions/MSFT_audio_emitter.ts @@ -106,7 +106,7 @@ export class MSFT_audio_emitter implements IGLTFLoaderExtension { */ // eslint-disable-next-line no-restricted-syntax public loadSceneAsync(context: string, scene: IScene): Nullable> { - return GLTFLoader.LoadExtensionAsync(context, scene, this.name, (extensionContext, extension) => { + return GLTFLoader.LoadExtensionAsync(context, scene, this.name, async (extensionContext, extension) => { const promises = new Array>(); promises.push(this._loader.loadSceneAsync(context, scene)); @@ -127,7 +127,7 @@ export class MSFT_audio_emitter implements IGLTFLoaderExtension { promises.push(this._loadEmitterAsync(`${extensionContext}/emitters/${emitter.index}`, emitter)); } - return Promise.all(promises).then(() => {}); + await Promise.all(promises); }); } @@ -136,37 +136,34 @@ export class MSFT_audio_emitter implements IGLTFLoaderExtension { */ // eslint-disable-next-line no-restricted-syntax public loadNodeAsync(context: string, node: INode, assign: (babylonTransformNode: TransformNode) => void): Nullable> { - return GLTFLoader.LoadExtensionAsync(context, node, this.name, (extensionContext, extension) => { + return GLTFLoader.LoadExtensionAsync(context, node, this.name, async (extensionContext, extension) => { const promises = new Array>(); - return this._loader - .loadNodeAsync(extensionContext, node, (babylonMesh) => { - for (const emitterIndex of extension.emitters) { - const emitter = ArrayItem.Get(`${extensionContext}/emitters`, this._emitters, emitterIndex); - promises.push( - this._loadEmitterAsync(`${extensionContext}/emitters/${emitter.index}`, emitter).then(() => { - for (const sound of emitter._babylonSounds) { - sound.attachToMesh(babylonMesh); - if (emitter.innerAngle != undefined || emitter.outerAngle != undefined) { - sound.setLocalDirectionToMesh(Vector3.Forward()); - sound.setDirectionalCone( - 2 * Tools.ToDegrees(emitter.innerAngle == undefined ? Math.PI : emitter.innerAngle), - 2 * Tools.ToDegrees(emitter.outerAngle == undefined ? Math.PI : emitter.outerAngle), - 0 - ); - } + const babylonMesh = await this._loader.loadNodeAsync(extensionContext, node, (babylonMesh) => { + for (const emitterIndex of extension.emitters) { + const emitter = ArrayItem.Get(`${extensionContext}/emitters`, this._emitters, emitterIndex); + promises.push( + // eslint-disable-next-line github/no-then + this._loadEmitterAsync(`${extensionContext}/emitters/${emitter.index}`, emitter).then(() => { + for (const sound of emitter._babylonSounds) { + sound.attachToMesh(babylonMesh); + if (emitter.innerAngle != undefined || emitter.outerAngle != undefined) { + sound.setLocalDirectionToMesh(Vector3.Forward()); + sound.setDirectionalCone( + 2 * Tools.ToDegrees(emitter.innerAngle == undefined ? Math.PI : emitter.innerAngle), + 2 * Tools.ToDegrees(emitter.outerAngle == undefined ? Math.PI : emitter.outerAngle), + 0 + ); } - }) - ); - } - - assign(babylonMesh); - }) - .then((babylonMesh) => { - return Promise.all(promises).then(() => { - return babylonMesh; - }); - }); + } + }) + ); + } + + assign(babylonMesh); + }); + await Promise.all(promises); + return babylonMesh; }); } @@ -175,22 +172,19 @@ export class MSFT_audio_emitter implements IGLTFLoaderExtension { */ // eslint-disable-next-line no-restricted-syntax public loadAnimationAsync(context: string, animation: IAnimation): Nullable> { - return GLTFLoader.LoadExtensionAsync(context, animation, this.name, (extensionContext, extension) => { - return this._loader.loadAnimationAsync(context, animation).then((babylonAnimationGroup) => { - const promises = new Array>(); - - ArrayItem.Assign(extension.events); - for (const event of extension.events) { - promises.push(this._loadAnimationEventAsync(`${extensionContext}/events/${event.index}`, context, animation, event, babylonAnimationGroup)); - } - - return Promise.all(promises).then(() => { - return babylonAnimationGroup; - }); - }); + return GLTFLoader.LoadExtensionAsync(context, animation, this.name, async (extensionContext, extension) => { + const babylonAnimationGroup = await this._loader.loadAnimationAsync(context, animation); + const promises = new Array>(); + ArrayItem.Assign(extension.events); + for (const event of extension.events) { + promises.push(this._loadAnimationEventAsync(`${extensionContext}/events/${event.index}`, context, animation, event, babylonAnimationGroup)); + } + await Promise.all(promises); + return babylonAnimationGroup; }); } + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax private _loadClipAsync(context: string, clip: ILoaderClip): Promise { if (clip._objectURL) { return clip._objectURL; @@ -204,6 +198,7 @@ export class MSFT_audio_emitter implements IGLTFLoaderExtension { promise = this._loader.loadBufferViewAsync(`/bufferViews/${bufferView.index}`, bufferView); } + // eslint-disable-next-line github/no-then clip._objectURL = promise.then((data) => { return URL.createObjectURL(new Blob([data], { type: clip.mimeType })); }); @@ -211,6 +206,7 @@ export class MSFT_audio_emitter implements IGLTFLoaderExtension { return clip._objectURL; } + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax private _loadEmitterAsync(context: string, emitter: ILoaderEmitter): Promise { emitter._babylonSounds = emitter._babylonSounds || []; if (!emitter._babylonData) { @@ -226,6 +222,7 @@ export class MSFT_audio_emitter implements IGLTFLoaderExtension { const clipContext = `/extensions/${this.name}/clips`; const clip = ArrayItem.Get(clipContext, this._clips, emitter.clips[i].clip); clipPromises.push( + // eslint-disable-next-line github/no-then this._loadClipAsync(`${clipContext}/${emitter.clips[i].clip}`, clip).then((objectURL: string) => { const sound = (emitter._babylonSounds[i] = new Sound(name, objectURL, this._loader.babylonScene, null, options)); sound.refDistance = emitter.refDistance || 1; @@ -236,6 +233,7 @@ export class MSFT_audio_emitter implements IGLTFLoaderExtension { ); } + // eslint-disable-next-line github/no-then const promise = Promise.all(clipPromises).then(() => { const weights = emitter.clips.map((clip) => { return clip.weight || 1; @@ -291,6 +289,7 @@ export class MSFT_audio_emitter implements IGLTFLoaderExtension { } } + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax private _loadAnimationEventAsync( context: string, animationContext: string, @@ -304,6 +303,7 @@ export class MSFT_audio_emitter implements IGLTFLoaderExtension { const babylonAnimation = babylonAnimationGroup.targetedAnimations[0]; const emitterIndex = event.emitter; const emitter = ArrayItem.Get(`/extensions/${this.name}/emitters`, this._emitters, emitterIndex); + // eslint-disable-next-line github/no-then return this._loadEmitterAsync(context, emitter).then(() => { const sound = emitter._babylonData!.sound; if (sound) { diff --git a/packages/dev/loaders/src/glTF/2.0/Extensions/MSFT_lod.ts b/packages/dev/loaders/src/glTF/2.0/Extensions/MSFT_lod.ts index e429898afa2..86ce4c1beb0 100644 --- a/packages/dev/loaders/src/glTF/2.0/Extensions/MSFT_lod.ts +++ b/packages/dev/loaders/src/glTF/2.0/Extensions/MSFT_lod.ts @@ -1,3 +1,4 @@ +/* eslint-disable github/no-then */ import type { Nullable } from "core/types"; import { Observable } from "core/Misc/observable"; import { Deferred } from "core/Misc/deferred"; @@ -177,7 +178,7 @@ export class MSFT_lod implements IGLTFLoaderExtension { */ // eslint-disable-next-line no-restricted-syntax public loadNodeAsync(context: string, node: INode, assign: (babylonTransformNode: TransformNode) => void): Nullable> { - return GLTFLoader.LoadExtensionAsync(context, node, this.name, (extensionContext, extension) => { + return GLTFLoader.LoadExtensionAsync(context, node, this.name, async (extensionContext, extension) => { let firstPromise: Promise; const nodeLODs = this._getLODs(extensionContext, node, this._loader.gltf.nodes, extension.ids); @@ -221,7 +222,7 @@ export class MSFT_lod implements IGLTFLoaderExtension { } this._loader.logClose(); - return firstPromise!; + return await firstPromise!; }); } @@ -241,7 +242,7 @@ export class MSFT_lod implements IGLTFLoaderExtension { return null; } - return GLTFLoader.LoadExtensionAsync(context, material, this.name, (extensionContext, extension) => { + return GLTFLoader.LoadExtensionAsync(context, material, this.name, async (extensionContext, extension) => { let firstPromise: Promise; const materialLODs = this._getLODs(extensionContext, material, this._loader.gltf.materials, extension.ids); @@ -286,7 +287,7 @@ export class MSFT_lod implements IGLTFLoaderExtension { } this._loader.logClose(); - return firstPromise!; + return await firstPromise!; }); } @@ -300,15 +301,15 @@ export class MSFT_lod implements IGLTFLoaderExtension { this._loader.log(`deferred`); const previousIndexLOD = this._nodeIndexLOD - 1; this._nodeSignalLODs[previousIndexLOD] = this._nodeSignalLODs[previousIndexLOD] || new Deferred(); - return this._nodeSignalLODs[this._nodeIndexLOD - 1].promise.then(() => { - return this._loader.loadUriAsync(context, property, uri); + return this._nodeSignalLODs[this._nodeIndexLOD - 1].promise.then(async () => { + return await this._loader.loadUriAsync(context, property, uri); }); } else if (this._materialIndexLOD !== null) { this._loader.log(`deferred`); const previousIndexLOD = this._materialIndexLOD - 1; this._materialSignalLODs[previousIndexLOD] = this._materialSignalLODs[previousIndexLOD] || new Deferred(); - return this._materialSignalLODs[previousIndexLOD].promise.then(() => { - return this._loader.loadUriAsync(context, property, uri); + return this._materialSignalLODs[previousIndexLOD].promise.then(async () => { + return await this._loader.loadUriAsync(context, property, uri); }); } @@ -325,7 +326,7 @@ export class MSFT_lod implements IGLTFLoaderExtension { throw new Error(`${context}: Uri is missing or the binary glTF is missing its binary chunk`); } - const loadAsync = (bufferLODs: Array, indexLOD: number) => { + const loadAsync = async (bufferLODs: Array, indexLOD: number) => { const start = byteOffset; const end = start + byteLength - 1; let bufferLOD = bufferLODs[indexLOD]; @@ -337,7 +338,7 @@ export class MSFT_lod implements IGLTFLoaderExtension { bufferLODs[indexLOD] = bufferLOD; } - return bufferLOD.loaded.promise.then((data) => { + return await bufferLOD.loaded.promise.then((data) => { return new Uint8Array(data.buffer, data.byteOffset + byteOffset - bufferLOD.start, byteLength); }); }; diff --git a/packages/dev/loaders/src/glTF/2.0/Extensions/MSFT_minecraftMesh.ts b/packages/dev/loaders/src/glTF/2.0/Extensions/MSFT_minecraftMesh.ts index 81c3bd1c005..84055b9c49b 100644 --- a/packages/dev/loaders/src/glTF/2.0/Extensions/MSFT_minecraftMesh.ts +++ b/packages/dev/loaders/src/glTF/2.0/Extensions/MSFT_minecraftMesh.ts @@ -45,7 +45,7 @@ export class MSFT_minecraftMesh implements IGLTFLoaderExtension { /** @internal */ // eslint-disable-next-line no-restricted-syntax public loadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Nullable> { - return GLTFLoader.LoadExtraAsync(context, material, this.name, (extraContext, extra) => { + return GLTFLoader.LoadExtraAsync(context, material, this.name, async (extraContext, extra) => { if (extra) { if (!(babylonMaterial instanceof PBRMaterial)) { throw new Error(`${extraContext}: Material type not supported`); @@ -61,10 +61,8 @@ export class MSFT_minecraftMesh implements IGLTFLoaderExtension { babylonMaterial.backFaceCulling = babylonMaterial.forceDepthWrite; babylonMaterial.twoSidedLighting = true; - return promise; + return await promise; } - - return null; }); } } diff --git a/packages/dev/loaders/src/glTF/2.0/Extensions/MSFT_sRGBFactors.ts b/packages/dev/loaders/src/glTF/2.0/Extensions/MSFT_sRGBFactors.ts index cc3186a2814..ab98d23ed09 100644 --- a/packages/dev/loaders/src/glTF/2.0/Extensions/MSFT_sRGBFactors.ts +++ b/packages/dev/loaders/src/glTF/2.0/Extensions/MSFT_sRGBFactors.ts @@ -45,7 +45,7 @@ export class MSFT_sRGBFactors implements IGLTFLoaderExtension { /** @internal*/ // eslint-disable-next-line no-restricted-syntax public loadMaterialPropertiesAsync(context: string, material: IMaterial, babylonMaterial: Material): Nullable> { - return GLTFLoader.LoadExtraAsync(context, material, this.name, (extraContext, extra) => { + return GLTFLoader.LoadExtraAsync(context, material, this.name, async (extraContext, extra) => { if (extra) { if (!(babylonMaterial instanceof PBRMaterial)) { throw new Error(`${extraContext}: Material type not supported`); @@ -62,10 +62,8 @@ export class MSFT_sRGBFactors implements IGLTFLoaderExtension { babylonMaterial.reflectivityColor.toLinearSpaceToRef(babylonMaterial.reflectivityColor, useExactSrgbConversions); } - return promise; + return await promise; } - - return null; }); } } diff --git a/packages/dev/loaders/src/glTF/2.0/Extensions/dynamic.ts b/packages/dev/loaders/src/glTF/2.0/Extensions/dynamic.ts index f222d9cc1de..b10a6fde5b2 100644 --- a/packages/dev/loaders/src/glTF/2.0/Extensions/dynamic.ts +++ b/packages/dev/loaders/src/glTF/2.0/Extensions/dynamic.ts @@ -71,6 +71,11 @@ export function registerBuiltInGLTFExtensions() { return new KHR_materials_clearcoat(loader); }); + registerGLTFExtension("EXT_materials_diffuse_roughness", true, async (loader) => { + const { EXT_materials_diffuse_roughness } = await import("./EXT_materials_diffuse_roughness"); + return new EXT_materials_diffuse_roughness(loader); + }); + registerGLTFExtension("KHR_materials_diffuse_transmission", true, async (loader) => { const { KHR_materials_diffuse_transmission } = await import("./KHR_materials_diffuse_transmission"); return new KHR_materials_diffuse_transmission(loader); diff --git a/packages/dev/loaders/src/glTF/2.0/Extensions/index.ts b/packages/dev/loaders/src/glTF/2.0/Extensions/index.ts index f4b098f37db..fdf17731d54 100644 --- a/packages/dev/loaders/src/glTF/2.0/Extensions/index.ts +++ b/packages/dev/loaders/src/glTF/2.0/Extensions/index.ts @@ -21,6 +21,7 @@ export * from "./KHR_materials_transmission"; export * from "./KHR_materials_diffuse_transmission"; export * from "./KHR_materials_volume"; export * from "./KHR_materials_dispersion"; +export * from "./EXT_materials_diffuse_roughness"; export * from "./KHR_mesh_quantization"; export * from "./KHR_texture_basisu"; export * from "./KHR_texture_transform"; diff --git a/packages/dev/loaders/src/glTF/2.0/glTFLoader.ts b/packages/dev/loaders/src/glTF/2.0/glTFLoader.ts index 7721f605a99..282deda9b03 100644 --- a/packages/dev/loaders/src/glTF/2.0/glTFLoader.ts +++ b/packages/dev/loaders/src/glTF/2.0/glTFLoader.ts @@ -1,3 +1,6 @@ +/* eslint-disable @typescript-eslint/promise-function-async */ +/* eslint-disable no-restricted-syntax */ +/* eslint-disable github/no-then */ import type { IndicesArray, Nullable, TypedArray, TypedArrayConstructor } from "core/types"; import { Deferred } from "core/Misc/deferred"; import { Quaternion, Vector3, Matrix, TmpVectors } from "core/Maths/math.vector"; @@ -324,7 +327,7 @@ export class GLTFLoader implements IGLTFLoader { /** * @internal */ - public importMeshAsync( + public async importMeshAsync( meshesNames: string | readonly string[] | null | undefined, scene: Scene, container: Nullable, @@ -333,7 +336,8 @@ export class GLTFLoader implements IGLTFLoader { onProgress?: (event: ISceneLoaderProgressEvent) => void, fileName = "" ): Promise { - return Promise.resolve().then(() => { + // eslint-disable-next-line github/no-then + return await Promise.resolve().then(async () => { this._babylonScene = scene; this._assetContainer = container; this._loadData(data); @@ -361,7 +365,7 @@ export class GLTFLoader implements IGLTFLoader { }); } - return this._loadAsync(rootUrl, fileName, nodes, () => { + return await this._loadAsync(rootUrl, fileName, nodes, () => { return { meshes: this._getMeshes(), particleSystems: [], @@ -379,16 +383,14 @@ export class GLTFLoader implements IGLTFLoader { /** * @internal */ - public loadAsync(scene: Scene, data: IGLTFLoaderData, rootUrl: string, onProgress?: (event: ISceneLoaderProgressEvent) => void, fileName = ""): Promise { - return Promise.resolve().then(() => { - this._babylonScene = scene; - this._loadData(data); - return this._loadAsync(rootUrl, fileName, null, () => undefined); - }); + public async loadAsync(scene: Scene, data: IGLTFLoaderData, rootUrl: string, onProgress?: (event: ISceneLoaderProgressEvent) => void, fileName = ""): Promise { + this._babylonScene = scene; + this._loadData(data); + return await this._loadAsync(rootUrl, fileName, null, () => undefined); } - private _loadAsync(rootUrl: string, fileName: string, nodes: Nullable>, resultFunc: () => T): Promise { - return Promise.resolve() + private async _loadAsync(rootUrl: string, fileName: string, nodes: Nullable>, resultFunc: () => T): Promise { + return await Promise.resolve() .then(async () => { this._rootUrl = rootUrl; this._uniqueRootUrl = !rootUrl.startsWith("file:") && fileName ? rootUrl : `${rootUrl}${Date.now()}/`; @@ -473,7 +475,7 @@ export class GLTFLoader implements IGLTFLoader { return resultFunc(); }); - return resultPromise.then((result) => { + return await resultPromise.then((result) => { this._parent._endPerformanceCounter(loadingToReadyCounterName); Tools.SetImmediate(() => { @@ -661,6 +663,7 @@ export class GLTFLoader implements IGLTFLoader { * @param scene The glTF scene property * @returns A promise that resolves when the load is complete */ + // eslint-disable-next-line no-restricted-syntax, @typescript-eslint/promise-function-async public loadSceneAsync(context: string, scene: IScene): Promise { const extensionPromise = this._extensionsLoadSceneAsync(context, scene); if (extensionPromise) { @@ -821,6 +824,7 @@ export class GLTFLoader implements IGLTFLoader { * @param assign A function called synchronously after parsing the glTF properties * @returns A promise that resolves with the loaded Babylon mesh when the load is complete */ + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax public loadNodeAsync(context: string, node: INode, assign: (babylonTransformNode: TransformNode) => void = () => {}): Promise { const extensionPromise = this._extensionsLoadNodeAsync(context, node, assign); if (extensionPromise) { @@ -944,6 +948,7 @@ export class GLTFLoader implements IGLTFLoader { }); } + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax private _loadMeshAsync(context: string, node: INode, mesh: IMesh, assign: (babylonTransformNode: TransformNode) => void): Promise { const primitives = mesh.primitives; if (!primitives || !primitives.length) { @@ -1003,6 +1008,7 @@ export class GLTFLoader implements IGLTFLoader { * @param assign A function called synchronously after parsing the glTF properties * @returns A promise that resolves with the loaded mesh when the load is complete or null if not handled */ + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax public _loadMeshPrimitiveAsync( context: string, name: string, @@ -1040,8 +1046,8 @@ export class GLTFLoader implements IGLTFLoader { this._createMorphTargets(context, node, mesh, primitive, babylonMesh); promises.push( - this._loadVertexDataAsync(context, primitive, babylonMesh).then((babylonGeometry) => { - return this._loadMorphTargetsAsync(context, primitive, babylonMesh, babylonGeometry).then(() => { + this._loadVertexDataAsync(context, primitive, babylonMesh).then(async (babylonGeometry) => { + return await this._loadMorphTargetsAsync(context, primitive, babylonMesh, babylonGeometry).then(() => { if (this._disposed) { return; } @@ -1095,6 +1101,7 @@ export class GLTFLoader implements IGLTFLoader { }); } + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax private _loadVertexDataAsync(context: string, primitive: IMeshPrimitive, babylonMesh: Mesh): Promise { const extensionPromise = this._extensionsLoadVertexDataAsync(context, primitive, babylonMesh); if (extensionPromise) { @@ -1206,6 +1213,7 @@ export class GLTFLoader implements IGLTFLoader { } } + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax private _loadMorphTargetsAsync(context: string, primitive: IMeshPrimitive, babylonMesh: Mesh, babylonGeometry: Geometry): Promise { if (!primitive.targets || !this._parent.loadMorphTargets) { return Promise.resolve(); @@ -1325,7 +1333,7 @@ export class GLTFLoader implements IGLTFLoader { babylonMorphTarget.setColors(colors); }); - return Promise.all(promises).then(() => {}); + return await Promise.all(promises).then(() => {}); } private static _LoadTransform(node: INode, babylonNode: TransformNode): void { @@ -1359,6 +1367,7 @@ export class GLTFLoader implements IGLTFLoader { babylonNode.scaling = scaling; } + // eslint-disable-next-line @typescript-eslint/promise-function-async, no-restricted-syntax private _loadSkinAsync(context: string, node: INode, skin: ISkin, assign: (babylonSkeleton: Skeleton) => void): Promise { if (!this._parent.loadSkins) { return Promise.resolve(); @@ -1687,11 +1696,11 @@ export class GLTFLoader implements IGLTFLoader { ): Promise { const promise = this._extensionsLoadAnimationChannelAsync(context, animationContext, animation, channel, onLoad); if (promise) { - return promise; + return await promise; } if (channel.target.node == undefined) { - return Promise.resolve(); + return await Promise.resolve(); } const targetNode = ArrayItem.Get(`${context}/target/node`, this._gltf.nodes, channel.target.node); @@ -1700,12 +1709,12 @@ export class GLTFLoader implements IGLTFLoader { // Ignore animations that have no animation targets. if ((pathIsWeights && !targetNode._numMorphTargets) || (!pathIsWeights && !targetNode._babylonTransformNode)) { - return Promise.resolve(); + return await Promise.resolve(); } // Don't load node animations if disabled. if (!this._parent.loadNodeAnimations && !pathIsWeights && !targetNode._isJoint) { - return Promise.resolve(); + return await Promise.resolve(); } // async-load the animation sampler to provide the interpolation of the channelTargetPath await import("./glTFLoaderAnimation"); @@ -1742,7 +1751,7 @@ export class GLTFLoader implements IGLTFLoader { info: properties, }; - return this._loadAnimationChannelFromTargetInfoAsync(context, animationContext, animation, channel, targetInfo, onLoad); + return await this._loadAnimationChannelFromTargetInfoAsync(context, animationContext, animation, channel, targetInfo, onLoad); } /** diff --git a/packages/dev/loaders/src/glTF/glTFFileLoader.ts b/packages/dev/loaders/src/glTF/glTFFileLoader.ts index d576a2f5667..4da0f4a44c3 100644 --- a/packages/dev/loaders/src/glTF/glTFFileLoader.ts +++ b/packages/dev/loaders/src/glTF/glTFFileLoader.ts @@ -1,3 +1,8 @@ +/* eslint-disable github/no-then */ +/* eslint-disable @typescript-eslint/no-floating-promises */ +/* eslint-disable @typescript-eslint/prefer-promise-reject-errors */ +/* eslint-disable no-restricted-syntax */ +/* eslint-disable @typescript-eslint/promise-function-async */ /* eslint-disable @typescript-eslint/no-unused-vars */ /* eslint-disable @typescript-eslint/naming-convention */ import type * as GLTF2 from "babylonjs-gltf2interface"; diff --git a/packages/dev/loaders/src/glTF/glTFValidation.ts b/packages/dev/loaders/src/glTF/glTFValidation.ts index d1c910cb013..3c0d1f95359 100644 --- a/packages/dev/loaders/src/glTF/glTFValidation.ts +++ b/packages/dev/loaders/src/glTF/glTFValidation.ts @@ -1,3 +1,6 @@ +/* eslint-disable github/no-then */ +/* eslint-disable no-restricted-syntax */ +/* eslint-disable @typescript-eslint/promise-function-async */ import type * as GLTF2 from "babylonjs-gltf2interface"; import { Tools } from "core/Misc/tools"; @@ -119,6 +122,7 @@ export class GLTFValidation { const onError = (error: ErrorEvent) => { worker.removeEventListener("error", onError); worker.removeEventListener("message", onMessage); + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject(error); }; @@ -146,6 +150,7 @@ export class GLTFValidation { case "validate.reject": { worker.removeEventListener("error", onError); worker.removeEventListener("message", onMessage); + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject(data.reason); worker.terminate(); } diff --git a/packages/dev/loaders/test/integration/babylon.sceneLoader.test.ts b/packages/dev/loaders/test/integration/babylon.sceneLoader.test.ts index 2dae89ca78e..86fa81d0119 100644 --- a/packages/dev/loaders/test/integration/babylon.sceneLoader.test.ts +++ b/packages/dev/loaders/test/integration/babylon.sceneLoader.test.ts @@ -1,8 +1,7 @@ import { evaluateDisposeEngine, evaluateCreateScene, evaluateInitEngine, getGlobalConfig, logPageErrors } from "@tools/test-tools"; import type { GLTFFileLoader } from "loaders/glTF"; -import { glbBase64, gltfBase64, gltfRaw, objBase64, objRaw, stlAsciiBase64, stlAsciiRaw, stlBinaryBase64, bvhBasicRaw, bvhSimpleRaw } from "./testData"; +import { glbBase64, gltfBase64, gltfRaw, objBase64, objRaw, stlAsciiBase64, stlAsciiRaw, stlBinaryBase64, bvhBasicRaw, bvhSimpleRaw, bvhThreeBonesRaw } from "./testData"; import { ImportMeshAsync } from "core/Loading/sceneLoader"; -import { BVHLoadingOptions } from "loaders/BVH/bvhLoadingOptions"; declare const BABYLON: typeof import("core/index") & typeof import("loaders/index"); @@ -855,15 +854,22 @@ describe("Babylon Scene Loader", function () { const scene = window.scene!; return ImportMeshAsync("data:" + content, scene).then(() => { const skeleton = scene.skeletons[0]; + const rootBone = skeleton.bones[0]; + const childBone = skeleton.bones[1]; return { numSkeletons: scene.skeletons.length, numBones: skeleton.bones.length, - rootBoneName: skeleton.bones[0].name, - childBoneName: skeleton.bones[1].name, - numAnimationRanges: skeleton.bones[0].animations[0].getKeys().length, - animationName: skeleton.bones[0].animations[0].name, - animationTargetProperty: skeleton.bones[0].animations[0].targetProperty, - animationFrameRate: skeleton.bones[0].animations[0].framePerSecond, + rootBoneName: rootBone.name, + childBoneName: childBone.name, + rootAnimations: rootBone.animations.length, + rootAnimationTypes: rootBone.animations.map((anim) => ({ + targetProperty: anim.targetProperty, + frameRate: anim.framePerSecond, + loopMode: anim.loopMode, + type: anim.dataType, + })), + rootPosition: rootBone.position.asArray(), + childPosition: childBone.position.asArray(), }; }); }, bvhBasicRaw); @@ -872,14 +878,28 @@ describe("Babylon Scene Loader", function () { expect(assertionData.numBones).toBe(2); expect(assertionData.rootBoneName).toBe("Hips"); expect(assertionData.childBoneName).toBe("Chest"); - expect(assertionData.numAnimationRanges).toBe(2); - expect(assertionData.animationName).toBe("Hips_anim"); - expect(assertionData.animationTargetProperty).toBe("_matrix"); - expect(assertionData.animationFrameRate).toBe(30); + expect(assertionData.rootAnimations).toBe(2); // Position and rotation animations + expect(assertionData.rootAnimationTypes).toEqual([ + { + targetProperty: "position", + frameRate: 30, + loopMode: BABYLON.Animation.ANIMATIONLOOPMODE_CYCLE, + type: BABYLON.Animation.ANIMATIONTYPE_VECTOR3, + }, + { + targetProperty: "rotationQuaternion", + frameRate: 30, + loopMode: BABYLON.Animation.ANIMATIONLOOPMODE_CYCLE, + type: BABYLON.Animation.ANIMATIONTYPE_QUATERNION, + }, + ]); + // Verify bone positions are properly set from offsets + expect(assertionData.rootPosition).toEqual([0, 0, 0]); // Root typically at origin + expect(assertionData.childPosition).not.toEqual([0, 0, 0]); // Child should have offset }); it("should handle BVH file with custom loading options", async () => { - const loadingOptions: BVHLoadingOptions = { + const loadingOptions = { loopMode: BABYLON.Animation.ANIMATIONLOOPMODE_RELATIVE, }; @@ -888,13 +908,19 @@ describe("Babylon Scene Loader", function () { const scene = window.scene!; return ImportMeshAsync("data:" + content, scene, options).then(() => { const skeleton = scene.skeletons[0]; - const animation = skeleton.bones[0].animations[0]; + const rootBone = skeleton.bones[0]; return { - skeletonId: skeleton.id, - skeletonName: skeleton.name, - animationName: animation.name, - loopMode: animation.loopMode, - numFrames: animation.getKeys().length, + skeletonBones: skeleton.bones.length, + rootAnimations: rootBone.animations.map((anim) => ({ + name: anim.name, + loopMode: anim.loopMode, + numFrames: anim.getKeys().length, + targetProperty: anim.targetProperty, + })), + boneHierarchy: skeleton.bones.map((bone) => ({ + name: bone.name, + parentName: bone.getParent()?.name || null, + })), }; }); }, @@ -902,11 +928,91 @@ describe("Babylon Scene Loader", function () { loadingOptions ); - expect(assertionData.skeletonId).toBe("test_skeleton"); - expect(assertionData.skeletonName).toBe("test_skeleton_name"); - expect(assertionData.animationName).toBe("test_animation"); - expect(assertionData.loopMode).toBe(BABYLON.Animation.ANIMATIONLOOPMODE_RELATIVE); - expect(assertionData.numFrames).toBe(2); + expect(assertionData.skeletonBones).toBeGreaterThan(0); + // Verify all animations use the custom loop mode + assertionData.rootAnimations.forEach((anim) => { + expect(anim.loopMode).toBe(BABYLON.Animation.ANIMATIONLOOPMODE_RELATIVE); + }); + // Verify bone hierarchy is properly constructed + expect(assertionData.boneHierarchy[0].parentName).toBeNull(); // Root bone + expect(assertionData.boneHierarchy[1].parentName).toBe(assertionData.boneHierarchy[0].name); // First child + }); + + it("should handle end sites in BVH hierarchy", async () => { + const assertionData = await page.evaluate((content) => { + const scene = window.scene!; + return ImportMeshAsync("data:" + content, scene).then(() => { + const skeleton = scene.skeletons[0]; + // Find bones that represent end sites (typically have no children) + const endSites = skeleton.bones.filter((bone) => { + return !skeleton.bones.some((otherBone) => otherBone.getParent() === bone); + }); + return { + totalBones: skeleton.bones.length, + endSiteBones: endSites.length, + endSiteAnimations: endSites.reduce((count, bone) => count + bone.animations.length, 0), + }; + }); + }, bvhBasicRaw); + + expect(assertionData.totalBones).toBeGreaterThan(0); + expect(assertionData.endSiteBones).toBeGreaterThan(0); + expect(assertionData.endSiteAnimations).toBe(0); // End sites should have no animations + }); + + it("should handle BVH file with three bones and rotation", async () => { + const assertionData = await page.evaluate((content) => { + const scene = window.scene!; + return BABYLON.SceneLoader.LoadAssetContainerAsync("", "data:" + content, scene, undefined, ".bvh").then((container) => { + const skeleton = container.skeletons[0]; + const bones = skeleton.bones; + return { + numBones: bones.length, + boneNames: bones.map((bone) => bone.name), + boneHierarchy: bones.map((bone) => ({ + name: bone.name, + parentName: bone.getParent()?.name || null, + })), + animations: bones.map((bone) => ({ + name: bone.name, + numAnimations: bone.animations.length, + animationTypes: bone.animations.map((anim) => anim.targetProperty), + numFrames: bone.animations.length > 0 ? bone.animations[0].getKeys().length : 0, + })), + }; + }); + }, bvhThreeBonesRaw); + + // Verify basic structure + expect(assertionData.numBones).toBe(4); // Root, Middle, End, and End Site + expect(assertionData.boneNames).toEqual(["Root", "Middle", "End", "ENDSITE"]); + + // Verify hierarchy + expect(assertionData.boneHierarchy).toEqual([ + { name: "Root", parentName: null }, + { name: "Middle", parentName: "Root" }, + { name: "End", parentName: "Middle" }, + { name: "ENDSITE", parentName: "End" }, + ]); + + // Verify animations + assertionData.animations.forEach((boneAnim, index) => { + if (index === 0) { + // Root bone should have position and rotation animations + expect(boneAnim.numAnimations).toBe(2); + expect(boneAnim.animationTypes).toContain("position"); + expect(boneAnim.animationTypes).toContain("rotationQuaternion"); + expect(boneAnim.numFrames).toBe(1); + } else if (index === 1) { + // Middle bone should have only rotation animation + expect(boneAnim.numAnimations).toBe(1); + expect(boneAnim.animationTypes).toContain("rotationQuaternion"); + expect(boneAnim.numFrames).toBe(1); + } else { + // End and End Site bones should have no animations + expect(boneAnim.numAnimations).toBe(0); + } + }); }); }); diff --git a/packages/dev/loaders/test/integration/testData.ts b/packages/dev/loaders/test/integration/testData.ts index 220a9582cf3..ffc04953fdf 100644 --- a/packages/dev/loaders/test/integration/testData.ts +++ b/packages/dev/loaders/test/integration/testData.ts @@ -147,3 +147,27 @@ Frames: 2 Frame Time: 0.033333 0.00 0.00 0.00 0.00 0.00 0.00 1.00 2.00 3.00 30.00 45.00 60.00`; + +export const bvhThreeBonesRaw = `HIERARCHY +ROOT Root +{ + OFFSET 0.00 0.00 0.00 + CHANNELS 6 Xposition Yposition Zposition Zrotation Yrotation Xrotation + JOINT Middle + { + OFFSET 0.00 1.00 0.00 + CHANNELS 3 Zrotation Yrotation Xrotation + JOINT End + { + OFFSET 0.00 1.00 0.00 + End Site + { + OFFSET 0.00 0.50 0.00 + } + } + } +} +MOTION +Frames: 1 +Frame Time: 0.033333 +0.00 0.00 0.00 45.00 0.00 0.00 30.00 0.00 0.00`; diff --git a/packages/dev/loaders/test/unit/Interactivity/flow nodes.test.ts b/packages/dev/loaders/test/unit/Interactivity/flow nodes.test.ts index 165f40ca49e..4fe219f0f50 100644 --- a/packages/dev/loaders/test/unit/Interactivity/flow nodes.test.ts +++ b/packages/dev/loaders/test/unit/Interactivity/flow nodes.test.ts @@ -1550,7 +1550,7 @@ describe("Flow Nodes", () => { // wait for 1 second await new Promise((resolve) => setTimeout(resolve, 1000 + 100)); - const values = log.mock.calls.map((c) => c[0]); + const values = log.mock.calls.map((c) => c[0].value); // expect log to be called 3 times - after the first was triggered (2 remaining), then after the second (1 remaining), and then after the last one (0 remaining - completed.) expect(log).toHaveBeenCalledTimes(3); // last remaining inputs test, also testing out and completed flows diff --git a/packages/dev/materials/src/water/readme.md b/packages/dev/materials/src/water/readme.md index 8cff808bb96..98ba0fed5a9 100644 --- a/packages/dev/materials/src/water/readme.md +++ b/packages/dev/materials/src/water/readme.md @@ -45,5 +45,5 @@ waterMaterial.bumpHeight = 0.3; // According to the bump map, represents the per waterMaterial.windDirection = new BABYLON.Vector2(1.0, 1.0); // The wind direction on the water surface (on width and height) waterMaterial.waterColor = new BABYLON.Color3(0.1, 0.1, 0.6); // Represents the water color mixed with the reflected and refracted world waterMaterial.colorBlendFactor = 2.0; // Factor to determine how the water color is blended with the reflected and refracted world -waterMaterial.waveLength = 0.1; // The lenght of waves. With smaller values, more waves are generated +waterMaterial.waveLength = 0.1; // The length of waves. With smaller values, more waves are generated ``` diff --git a/packages/dev/serializers/src/USDZ/usdzExporter.ts b/packages/dev/serializers/src/USDZ/usdzExporter.ts index 8569846a01a..7e2747a07fd 100644 --- a/packages/dev/serializers/src/USDZ/usdzExporter.ts +++ b/packages/dev/serializers/src/USDZ/usdzExporter.ts @@ -165,7 +165,7 @@ function BuildAdditionalAttributes(geometry: Geometry, options: IUSDZExportOptio for (let i = 0; i < 4; i++) { const id = i > 0 ? i : ""; - const uvAttribute = geometry.getVerticesData(VertexBuffer.UVKind + (id ? id : "")); + const uvAttribute = geometry.getVerticesData(VertexBuffer.UVKind + (id ? id + 1 : "")); // UV names go like "uv", "uv2", "uv3", etc. if (uvAttribute) { string += ` @@ -192,7 +192,7 @@ function BuildAdditionalAttributes(geometry: Geometry, options: IUSDZExportOptio function BuildMesh(geometry: Geometry, options: IUSDZExportOptions) { const name = "Geometry"; const position = geometry.getVerticesData(VertexBuffer.PositionKind); - const normal = geometry.getVerticesData(VertexBuffer.PositionKind); + const normal = geometry.getVerticesData(VertexBuffer.NormalKind); if (!position || !normal) { return; @@ -244,7 +244,7 @@ function BuildXform(mesh: Mesh) { const matrix = mesh.getWorldMatrix().clone(); if (matrix.determinant() < 0) { - matrix.multiplyToRef(Matrix.Scaling(-1, 1, 1), matrix); + Tools.Warn(`Exporting mesh ${mesh.name} with negative scale. Result may look incorrect in destination engine.`); } const transform = BuildMatrix(matrix); @@ -387,6 +387,10 @@ function ExtractTextureInformations(material: Material) { aoMapIntensity: 0, alphaMap: (material as StandardMaterial).opacityTexture, ior: 1, + clearCoat: 0, + clearCoatMap: null, + clearCoatRoughness: 0, + clearCoatRoughnessMap: null, }; case "PBRMaterial": return { @@ -407,6 +411,12 @@ function ExtractTextureInformations(material: Material) { aoMapIntensity: (material as PBRMaterial).ambientTextureStrength, alphaMap: (material as PBRMaterial).opacityTexture, ior: (material as PBRMaterial).indexOfRefraction, + clearCoat: (material as PBRMaterial).clearCoat.intensity, + clearCoatMap: (material as PBRMaterial).clearCoat.texture, + clearCoatRoughness: (material as PBRMaterial).clearCoat.roughness, + clearCoatRoughnessMap: (material as PBRMaterial).clearCoat.useRoughnessFromMainTexture + ? (material as PBRMaterial).clearCoat.texture + : (material as PBRMaterial).clearCoat.textureRoughness, }; case "PBRMetallicRoughnessMaterial": return { @@ -427,6 +437,12 @@ function ExtractTextureInformations(material: Material) { aoMapIntensity: (material as PBRMaterial).ambientTextureStrength, alphaMap: (material as PBRMaterial).opacityTexture, ior: (material as PBRMaterial).indexOfRefraction, + clearCoat: (material as PBRMetallicRoughnessMaterial).clearCoat.intensity, + clearCoatMap: (material as PBRMetallicRoughnessMaterial).clearCoat.texture, + clearCoatRoughness: (material as PBRMetallicRoughnessMaterial).clearCoat.roughness, + clearCoatRoughnessMap: (material as PBRMetallicRoughnessMaterial).clearCoat.useRoughnessFromMainTexture + ? (material as PBRMetallicRoughnessMaterial).clearCoat.texture + : (material as PBRMetallicRoughnessMaterial).clearCoat.textureRoughness, }; default: return { @@ -444,6 +460,10 @@ function ExtractTextureInformations(material: Material) { aoMapIntensity: 0, alphaMap: null, ior: 1, + clearCoat: 0, + clearCoatMap: null, + clearCoatRoughness: 0, + clearCoatRoughnessMap: null, }; } } @@ -473,6 +493,10 @@ function BuildMaterial(material: Material, textureToExports: { [key: string]: Ba aoMapIntensity, alphaMap, ior, + clearCoat, + clearCoatMap, + clearCoatRoughness, + clearCoatRoughnessMap, } = ExtractTextureInformations(material); if (diffuseMap !== null) { @@ -535,6 +559,31 @@ function BuildMaterial(material: Material, textureToExports: { [key: string]: Ba inputs.push(`${pad}float inputs:opacity = ${material.alpha}`); } + if (clearCoatMap !== null) { + inputs.push(`${pad}float inputs:clearcoat.connect = `); + samplers.push(BuildTexture(clearCoatMap as Texture, material, "clearcoat", new Color3(clearCoat, clearCoat, clearCoat), textureToExports, options)); + } else { + inputs.push(`${pad}float inputs:clearcoat = ${clearCoat}`); + } + + if (clearCoatRoughnessMap !== null) { + inputs.push( + `${pad}float inputs:clearcoatRoughness.connect = ` + ); + samplers.push( + BuildTexture( + clearCoatRoughnessMap as Texture, + material, + "clearcoatRoughness", + new Color3(clearCoatRoughness, clearCoatRoughness, clearCoatRoughness), + textureToExports, + options + ) + ); + } else { + inputs.push(`${pad}float inputs:clearcoatRoughness = ${clearCoatRoughness}`); + } + inputs.push(`${pad}float inputs:ior = ${ior}`); return ` @@ -687,12 +736,14 @@ export async function USDZExportAsync(scene: Scene, options: Partial { + return new Promise((resolve) => { + if (babylonMaterial instanceof PBRBaseMaterial) { + if (!babylonMaterial._baseDiffuseRoughness) { + resolve(node); + return; + } + + this._wasUsed = true; + + node.extensions = node.extensions || {}; + + const diffuseRoughnessTextureInfo = this._exporter._materialExporter.getTextureInfo(babylonMaterial._baseDiffuseRoughnessTexture); + + const diffuseRoughnessInfo: IEXTMaterialsDiffuseRoughness = { + diffuseRoughnessFactor: babylonMaterial._baseDiffuseRoughness, + diffuseRoughnessTexture: diffuseRoughnessTextureInfo ?? undefined, + }; + + if (diffuseRoughnessInfo.diffuseRoughnessTexture !== null) { + this._exporter._materialNeedsUVsSet.add(babylonMaterial); + } + + node.extensions[NAME] = diffuseRoughnessInfo; + } + resolve(node); + }); + } +} + +GLTFExporter.RegisterExtension(NAME, (exporter) => new EXT_materials_diffuse_roughness(exporter)); diff --git a/packages/dev/serializers/src/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.ts b/packages/dev/serializers/src/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.ts index 99a9f57bf22..ebec77fdd9b 100644 --- a/packages/dev/serializers/src/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.ts +++ b/packages/dev/serializers/src/glTF/2.0/Extensions/EXT_mesh_gpu_instancing.ts @@ -51,7 +51,7 @@ export class EXT_mesh_gpu_instancing implements IGLTFExporterExtensionV2 { * @param bufferManager buffer manager * @returns nullable promise, resolves with the node */ - public postExportNodeAsync( + public async postExportNodeAsync( context: string, node: Nullable, babylonNode: Node, @@ -59,7 +59,7 @@ export class EXT_mesh_gpu_instancing implements IGLTFExporterExtensionV2 { convertToRightHanded: boolean, bufferManager: BufferManager ): Promise> { - return new Promise((resolve) => { + return await new Promise((resolve) => { if (node && babylonNode instanceof Mesh) { if (babylonNode.hasThinInstances && this._exporter) { this._wasUsed = true; diff --git a/packages/dev/serializers/src/glTF/2.0/Extensions/KHR_draco_mesh_compression.ts b/packages/dev/serializers/src/glTF/2.0/Extensions/KHR_draco_mesh_compression.ts index f41862da914..c7e7739aa8b 100644 --- a/packages/dev/serializers/src/glTF/2.0/Extensions/KHR_draco_mesh_compression.ts +++ b/packages/dev/serializers/src/glTF/2.0/Extensions/KHR_draco_mesh_compression.ts @@ -120,6 +120,7 @@ export class KHR_draco_mesh_compression implements IGLTFExporterExtensionV2 { }; const promise = DracoEncoder.Default._encodeAsync(attributes, indices, options) + // eslint-disable-next-line github/no-then .then((encodedData) => { if (!encodedData) { Logger.Error("Draco encoding failed for primitive."); @@ -143,6 +144,7 @@ export class KHR_draco_mesh_compression implements IGLTFExporterExtensionV2 { primitive.extensions ||= {}; primitive.extensions[NAME] = dracoInfo; }) + // eslint-disable-next-line github/no-then .catch((error) => { Logger.Error("Draco encoding failed for primitive: " + error); }); diff --git a/packages/dev/serializers/src/glTF/2.0/Extensions/KHR_lights_punctual.ts b/packages/dev/serializers/src/glTF/2.0/Extensions/KHR_lights_punctual.ts index b3208208216..0b7645e2c57 100644 --- a/packages/dev/serializers/src/glTF/2.0/Extensions/KHR_lights_punctual.ts +++ b/packages/dev/serializers/src/glTF/2.0/Extensions/KHR_lights_punctual.ts @@ -73,8 +73,8 @@ export class KHR_lights_punctual implements IGLTFExporterExtensionV2 { * @param convertToRightHanded Flag to convert the values to right-handed * @returns nullable INode promise */ - public postExportNodeAsync(context: string, node: INode, babylonNode: Node, nodeMap: Map, convertToRightHanded: boolean): Promise> { - return new Promise((resolve) => { + public async postExportNodeAsync(context: string, node: INode, babylonNode: Node, nodeMap: Map, convertToRightHanded: boolean): Promise> { + return await new Promise((resolve) => { if (!(babylonNode instanceof ShadowLight)) { resolve(node); return; diff --git a/packages/dev/serializers/src/glTF/2.0/Extensions/KHR_materials_emissive_strength.ts b/packages/dev/serializers/src/glTF/2.0/Extensions/KHR_materials_emissive_strength.ts index 0443db6d6ce..89e3644b128 100644 --- a/packages/dev/serializers/src/glTF/2.0/Extensions/KHR_materials_emissive_strength.ts +++ b/packages/dev/serializers/src/glTF/2.0/Extensions/KHR_materials_emissive_strength.ts @@ -37,8 +37,8 @@ export class KHR_materials_emissive_strength implements IGLTFExporterExtensionV2 * @param babylonMaterial corresponding babylon material * @returns promise, resolves with the material */ - public postExportMaterialAsync(context: string, node: IMaterial, babylonMaterial: Material): Promise { - return new Promise((resolve) => { + public async postExportMaterialAsync(context: string, node: IMaterial, babylonMaterial: Material): Promise { + return await new Promise((resolve) => { if (!(babylonMaterial instanceof PBRMaterial)) { return resolve(node); } diff --git a/packages/dev/serializers/src/glTF/2.0/Extensions/KHR_materials_sheen.ts b/packages/dev/serializers/src/glTF/2.0/Extensions/KHR_materials_sheen.ts index 3a1e682ba30..8e13b4113eb 100644 --- a/packages/dev/serializers/src/glTF/2.0/Extensions/KHR_materials_sheen.ts +++ b/packages/dev/serializers/src/glTF/2.0/Extensions/KHR_materials_sheen.ts @@ -46,8 +46,8 @@ export class KHR_materials_sheen implements IGLTFExporterExtensionV2 { return []; } - public postExportMaterialAsync(context: string, node: IMaterial, babylonMaterial: Material): Promise { - return new Promise((resolve) => { + public async postExportMaterialAsync(context: string, node: IMaterial, babylonMaterial: Material): Promise { + return await new Promise((resolve) => { if (babylonMaterial instanceof PBRMaterial) { if (!babylonMaterial.sheen.isEnabled) { resolve(node); diff --git a/packages/dev/serializers/src/glTF/2.0/Extensions/index.ts b/packages/dev/serializers/src/glTF/2.0/Extensions/index.ts index b6faee955af..d2b5adfee31 100644 --- a/packages/dev/serializers/src/glTF/2.0/Extensions/index.ts +++ b/packages/dev/serializers/src/glTF/2.0/Extensions/index.ts @@ -13,4 +13,5 @@ export * from "./KHR_materials_specular"; export * from "./KHR_materials_transmission"; export * from "./KHR_materials_unlit"; export * from "./KHR_materials_volume"; +export * from "./EXT_materials_diffuse_roughness"; export * from "./KHR_texture_transform"; diff --git a/packages/dev/serializers/src/glTF/2.0/glTFExporter.ts b/packages/dev/serializers/src/glTF/2.0/glTFExporter.ts index 18c514bdb01..e7e1770c75d 100644 --- a/packages/dev/serializers/src/glTF/2.0/glTFExporter.ts +++ b/packages/dev/serializers/src/glTF/2.0/glTFExporter.ts @@ -270,7 +270,7 @@ export class GLTFExporter { private static readonly _ExtensionNames = new Array(); private static readonly _ExtensionFactories: { [name: string]: (exporter: GLTFExporter) => IGLTFExporterExtensionV2 } = {}; - // eslint-disable-next-line @typescript-eslint/naming-convention + // eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/promise-function-async private _ApplyExtension( node: T, extensions: IGLTFExporterExtensionV2[], @@ -287,10 +287,11 @@ export class GLTFExporter { return this._ApplyExtension(node, extensions, index + 1, actionAsync); } - return currentPromise.then((newNode) => (newNode ? this._ApplyExtension(newNode, extensions, index + 1, actionAsync) : null)); + // eslint-disable-next-line github/no-then + return currentPromise.then(async (newNode) => (newNode ? await this._ApplyExtension(newNode, extensions, index + 1, actionAsync) : null)); } - // eslint-disable-next-line @typescript-eslint/naming-convention + // eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/promise-function-async private _ApplyExtensions(node: T, actionAsync: (extension: IGLTFExporterExtensionV2, node: T) => Promise> | undefined): Promise> { const extensions: IGLTFExporterExtensionV2[] = []; for (const name of GLTFExporter._ExtensionNames) { @@ -300,11 +301,13 @@ export class GLTFExporter { return this._ApplyExtension(node, extensions, 0, actionAsync); } + // eslint-disable-next-line no-restricted-syntax, @typescript-eslint/promise-function-async public _extensionsPreExportTextureAsync(context: string, babylonTexture: Texture, mimeType: ImageMimeType): Promise> { // eslint-disable-next-line @typescript-eslint/promise-function-async return this._ApplyExtensions(babylonTexture, (extension, node) => extension.preExportTextureAsync && extension.preExportTextureAsync(context, node, mimeType)); } + // eslint-disable-next-line no-restricted-syntax, @typescript-eslint/promise-function-async public _extensionsPostExportNodeAsync(context: string, node: INode, babylonNode: Node, nodeMap: Map, convertToRightHanded: boolean): Promise> { return this._ApplyExtensions( node, @@ -313,6 +316,7 @@ export class GLTFExporter { ); } + // eslint-disable-next-line no-restricted-syntax, @typescript-eslint/promise-function-async public _extensionsPostExportMaterialAsync(context: string, material: IMaterial, babylonMaterial: Material): Promise> { // eslint-disable-next-line @typescript-eslint/promise-function-async return this._ApplyExtensions(material, (extension, node) => extension.postExportMaterialAsync && extension.postExportMaterialAsync(context, node, babylonMaterial)); @@ -357,6 +361,7 @@ export class GLTFExporter { const extension = this._extensions[name]; if (extension.preGenerateBinaryAsync) { + // eslint-disable-next-line no-await-in-loop await extension.preGenerateBinaryAsync(this._bufferManager); } } @@ -892,6 +897,7 @@ export class GLTFExporter { this._exportBuffers(babylonRootNodes, state); for (const babylonNode of babylonRootNodes) { + // eslint-disable-next-line no-await-in-loop await this._exportNodeAsync(babylonNode, nodes, state); } @@ -1196,6 +1202,7 @@ export class GLTFExporter { // Begin processing child nodes once parent has been added to the node list const children = node ? [] : parentNodeChildren; for (const babylonChildNode of babylonNode.getChildren()) { + // eslint-disable-next-line no-await-in-loop await this._exportNodeAsync(babylonChildNode, children, state); } @@ -1487,6 +1494,7 @@ export class GLTFExporter { primitive.material = this._materials.length - 1; } else { // Material + // eslint-disable-next-line no-await-in-loop await this._exportMaterialAsync(babylonMaterial, vertexBuffers, subMesh, primitive); } diff --git a/packages/dev/serializers/src/glTF/2.0/glTFMaterialExporter.ts b/packages/dev/serializers/src/glTF/2.0/glTFMaterialExporter.ts index 6a03d8941f5..3eec4f982c5 100644 --- a/packages/dev/serializers/src/glTF/2.0/glTFMaterialExporter.ts +++ b/packages/dev/serializers/src/glTF/2.0/glTFMaterialExporter.ts @@ -1,3 +1,5 @@ +/* eslint-disable @typescript-eslint/prefer-promise-reject-errors */ +/* eslint-disable github/no-then */ /* eslint-disable babylonjs/available */ import type { ITextureInfo, IMaterial, IMaterialPbrMetallicRoughness, IMaterialOcclusionTextureInfo, ISampler, IImage } from "babylonjs-gltf2interface"; @@ -372,7 +374,7 @@ export class GLTFMaterialExporter { ): Promise { const promises = new Array>(); if (!(diffuseTexture || specularGlossinessTexture)) { - return Promise.reject("diffuse and specular glossiness textures are not defined!"); + return await Promise.reject("diffuse and specular glossiness textures are not defined!"); } const scene: Nullable = diffuseTexture ? diffuseTexture.getScene() : specularGlossinessTexture ? specularGlossinessTexture.getScene() : null; @@ -393,12 +395,12 @@ export class GLTFMaterialExporter { if (diffusePixels) { diffuseBuffer = ConvertPixelArrayToFloat32(diffusePixels); } else { - return Promise.reject("Failed to retrieve pixels from diffuse texture!"); + return await Promise.reject("Failed to retrieve pixels from diffuse texture!"); } if (specularPixels) { specularGlossinessBuffer = ConvertPixelArrayToFloat32(specularPixels); } else { - return Promise.reject("Failed to retrieve pixels from specular glossiness texture!"); + return await Promise.reject("Failed to retrieve pixels from specular glossiness texture!"); } const byteLength = specularGlossinessBuffer.byteLength; @@ -506,11 +508,11 @@ export class GLTFMaterialExporter { ); } - return Promise.all(promises).then(() => { + return await Promise.all(promises).then(() => { return metallicRoughnessFactors; }); } else { - return Promise.reject("_ConvertSpecularGlossinessTexturesToMetallicRoughness: Scene from textures is missing!"); + return await Promise.reject("_ConvertSpecularGlossinessTexturesToMetallicRoughness: Scene from textures is missing!"); } } @@ -739,7 +741,7 @@ export class GLTFMaterialExporter { const reflectivityTexture = babylonPBRMaterial._reflectivityTexture; const useMicrosurfaceFromReflectivityMapAlpha = babylonPBRMaterial._useMicroSurfaceFromReflectivityMapAlpha; if (reflectivityTexture && !useMicrosurfaceFromReflectivityMapAlpha) { - return Promise.reject("_ConvertPBRMaterial: Glossiness values not included in the reflectivity texture are currently not supported"); + return await Promise.reject("_ConvertPBRMaterial: Glossiness values not included in the reflectivity texture are currently not supported"); } if ((albedoTexture || reflectivityTexture) && hasUVs) { @@ -891,6 +893,7 @@ export class GLTFMaterialExporter { * @param babylonTexture * @returns an array buffer promise containing the pixel data */ + // eslint-disable-next-line no-restricted-syntax, @typescript-eslint/promise-function-async private _getPixelsFromTextureAsync(babylonTexture: BaseTexture): Promise> { // If the internal texture format is compressed, we cannot read the pixels directly. if (IsCompressedTextureFormat(babylonTexture.textureFormat)) { @@ -905,14 +908,14 @@ export class GLTFMaterialExporter { public async exportTextureAsync(babylonTexture: BaseTexture, mimeType: ImageMimeType): Promise> { const extensionPromise = this._exporter._extensionsPreExportTextureAsync("exporter", babylonTexture as Texture, mimeType); if (!extensionPromise) { - return this._exportTextureInfoAsync(babylonTexture, mimeType); + return await this._exportTextureInfoAsync(babylonTexture, mimeType); } - return extensionPromise.then((texture) => { + return await extensionPromise.then(async (texture) => { if (!texture) { - return this._exportTextureInfoAsync(babylonTexture, mimeType); + return await this._exportTextureInfoAsync(babylonTexture, mimeType); } - return this._exportTextureInfoAsync(texture, mimeType); + return await this._exportTextureInfoAsync(texture, mimeType); }); } diff --git a/packages/dev/sharedUiComponents/src/colorPicker/colorPicker.scss b/packages/dev/sharedUiComponents/src/colorPicker/colorPicker.scss index e6d729a5c6e..a15e56fc49c 100644 --- a/packages/dev/sharedUiComponents/src/colorPicker/colorPicker.scss +++ b/packages/dev/sharedUiComponents/src/colorPicker/colorPicker.scss @@ -150,12 +150,18 @@ opacity: 0.5; } } + .color-picker-hex-row { + display: flex; /* Use flexbox to align items in a row */ + flex-direction: row; + gap: 16px; /* Add spacing between the two hex pickers */ + align-items: center; /* Align items vertically in the center */ + } .color-picker-hex { grid-row: 4; grid-column: 1; display: grid; - grid-template-columns: 20% 80%; + grid-template-columns: 30% 70%; grid-template-rows: 100%; .color-picker-hex-label { diff --git a/packages/dev/sharedUiComponents/src/colorPicker/colorPicker.tsx b/packages/dev/sharedUiComponents/src/colorPicker/colorPicker.tsx index 562eab0f4ec..2ccc364ba9d 100644 --- a/packages/dev/sharedUiComponents/src/colorPicker/colorPicker.tsx +++ b/packages/dev/sharedUiComponents/src/colorPicker/colorPicker.tsx @@ -197,7 +197,6 @@ export class ColorPicker extends React.Component -
-
-
Hex
-
- { - if (hasAlpha) { - const color4 = Color4.FromHexString(value); - this.setState({ color: new Color3(color4.r, color4.g, color4.b), alpha: color4.a }); - } else { - this.setState({ color: Color3.FromHexString(value) }); - } - }} - /> +
+
+
Gamma Hex
+
+ { + if (hasAlpha) { + const color4 = Color4.FromHexString(value); + this.setState({ color: new Color3(color4.r, color4.g, color4.b), alpha: color4.a }); + } else { + this.setState({ color: Color3.FromHexString(value) }); + } + }} + /> +
+ {this.props.linearhint && ( +
+
Linear Hex
+
+ { + if (hasAlpha) { + const color4 = Color4.FromHexString(value).toGammaSpace(); + this.setState({ color: new Color3(color4.r, color4.g, color4.b), alpha: color4.a }); + } else { + this.setState({ color: Color3.FromHexString(value).toGammaSpace() }); + } + }} + /> +
+
+ )}
+ {this.props.linearhint && (
- (Note: color is stored in linear mode and was converted to gamma to be displayed here (toGammaSpace() / toLinearSpace())) + (Note: This color is stored in linear but converted to gamma to be displayed here. To set color in code, use the linear hex above or use + gamma.toLinearSpace()
)}
diff --git a/packages/dev/sharedUiComponents/src/lines/inputArrowsComponent.tsx b/packages/dev/sharedUiComponents/src/lines/inputArrowsComponent.tsx index 2b98b11d22c..b7ba6205867 100644 --- a/packages/dev/sharedUiComponents/src/lines/inputArrowsComponent.tsx +++ b/packages/dev/sharedUiComponents/src/lines/inputArrowsComponent.tsx @@ -36,6 +36,7 @@ export class InputArrowsComponent extends React.Component evt.preventDefault()} diff --git a/packages/dev/sharedUiComponents/src/tabs/propertyGrids/gui/linePropertyGridComponent.tsx b/packages/dev/sharedUiComponents/src/tabs/propertyGrids/gui/linePropertyGridComponent.tsx index 0532c750c31..3b4b86ef4bc 100644 --- a/packages/dev/sharedUiComponents/src/tabs/propertyGrids/gui/linePropertyGridComponent.tsx +++ b/packages/dev/sharedUiComponents/src/tabs/propertyGrids/gui/linePropertyGridComponent.tsx @@ -28,7 +28,7 @@ export class LinePropertyGridComponent extends React.Component=16.0.9" }, "devDependencies": { - "@babylonjs/core": "^8.6.1", - "@babylonjs/gui": "^8.6.1", + "@babylonjs/core": "^8.8.0", + "@babylonjs/gui": "^8.8.0", "react": "^18.2.0", "react-dom": "^18.2.0" }, diff --git a/packages/public/@babylonjs/addons/package.json b/packages/public/@babylonjs/addons/package.json index 5e31a01853c..1dd5df7e37f 100644 --- a/packages/public/@babylonjs/addons/package.json +++ b/packages/public/@babylonjs/addons/package.json @@ -1,6 +1,6 @@ { "name": "@babylonjs/addons", - "version": "8.6.1", + "version": "8.8.0", "main": "index.js", "module": "index.js", "types": "index.d.ts", @@ -18,7 +18,7 @@ "postcompile": "build-tools -c add-js-to-es6" }, "devDependencies": { - "@babylonjs/core": "^8.6.1", + "@babylonjs/core": "^8.8.0", "@dev/addons": "^1.0.0", "@dev/build-tools": "^1.0.0" }, diff --git a/packages/public/@babylonjs/core/package.json b/packages/public/@babylonjs/core/package.json index 7e6aa4a2f9d..1ef9a7321a0 100644 --- a/packages/public/@babylonjs/core/package.json +++ b/packages/public/@babylonjs/core/package.json @@ -1,6 +1,6 @@ { "name": "@babylonjs/core", - "version": "8.6.1", + "version": "8.8.0", "main": "index.js", "module": "index.js", "types": "index.d.ts", @@ -34,7 +34,10 @@ "license": "Apache-2.0", "esnext": "index.js", "type": "module", - "sideEffects": true, + "sideEffects": [ + "**/*", + "!src/Maths/ThinMaths/**" + ], "homepage": "https://www.babylonjs.com", "repository": { "type": "git", diff --git a/packages/public/@babylonjs/gui-editor/package.json b/packages/public/@babylonjs/gui-editor/package.json index fe1672e5d03..7d2e0f26119 100644 --- a/packages/public/@babylonjs/gui-editor/package.json +++ b/packages/public/@babylonjs/gui-editor/package.json @@ -1,6 +1,6 @@ { "name": "@babylonjs/gui-editor", - "version": "8.6.1", + "version": "8.8.0", "main": "dist/babylon.guiEditor.max.js", "module": "dist/babylon.guiEditor.max.js", "esnext": "dist/babylon.guiEditor.max.js", @@ -24,8 +24,8 @@ "@types/react-dom": ">=16.0.9" }, "devDependencies": { - "@babylonjs/core": "^8.6.1", - "@babylonjs/gui": "^8.6.1", + "@babylonjs/core": "^8.8.0", + "@babylonjs/gui": "^8.8.0", "react": "^18.2.0", "react-dom": "^18.2.0" }, diff --git a/packages/public/@babylonjs/gui/package.json b/packages/public/@babylonjs/gui/package.json index 9fed49fedbf..bbd1cdd4aeb 100644 --- a/packages/public/@babylonjs/gui/package.json +++ b/packages/public/@babylonjs/gui/package.json @@ -1,6 +1,6 @@ { "name": "@babylonjs/gui", - "version": "8.6.1", + "version": "8.8.0", "main": "index.js", "module": "index.js", "types": "index.d.ts", @@ -18,7 +18,7 @@ "postcompile": "build-tools -c add-js-to-es6" }, "devDependencies": { - "@babylonjs/core": "^8.6.1", + "@babylonjs/core": "^8.8.0", "@dev/build-tools": "^1.0.0", "@lts/gui": "1.0.0" }, diff --git a/packages/public/@babylonjs/inspector/package.json b/packages/public/@babylonjs/inspector/package.json index 3474d32d523..1b953e9f555 100644 --- a/packages/public/@babylonjs/inspector/package.json +++ b/packages/public/@babylonjs/inspector/package.json @@ -1,6 +1,6 @@ { "name": "@babylonjs/inspector", - "version": "8.6.1", + "version": "8.8.0", "module": "dist/babylon.inspector.bundle.max.js", "main": "dist/babylon.inspector.bundle.max.js", "typings": "dist/babylon.inspector.module.d.ts", @@ -32,12 +32,12 @@ "@types/react-dom": ">=16.0.9" }, "devDependencies": { - "@babylonjs/core": "^8.6.1", - "@babylonjs/gui": "^8.6.1", - "@babylonjs/gui-editor": "^8.6.1", - "@babylonjs/loaders": "^8.6.1", - "@babylonjs/materials": "^8.6.1", - "@babylonjs/serializers": "^8.6.1", + "@babylonjs/core": "^8.8.0", + "@babylonjs/gui": "^8.8.0", + "@babylonjs/gui-editor": "^8.8.0", + "@babylonjs/loaders": "^8.8.0", + "@babylonjs/materials": "^8.8.0", + "@babylonjs/serializers": "^8.8.0", "@lts/gui": "1.0.0", "react": "^18.2.0", "react-dom": "^18.2.0" diff --git a/packages/public/@babylonjs/ktx2decoder/package.json b/packages/public/@babylonjs/ktx2decoder/package.json index 5108272064e..a63d5bb86e3 100644 --- a/packages/public/@babylonjs/ktx2decoder/package.json +++ b/packages/public/@babylonjs/ktx2decoder/package.json @@ -1,6 +1,6 @@ { "name": "@babylonjs/ktx2decoder", - "version": "8.6.1", + "version": "8.8.0", "main": "index.js", "module": "index.js", "types": "index.d.ts", @@ -19,7 +19,7 @@ "postcompile": "build-tools -c add-js-to-es6 && build-tools -c cp -f \"../../../tools/babylonServer/public/ktx2Transcoders/1\" -t ./wasm" }, "devDependencies": { - "@babylonjs/core": "^8.6.1", + "@babylonjs/core": "^8.8.0", "@dev/build-tools": "^1.0.0", "@tools/ktx2decoder": "^1.0.0" }, diff --git a/packages/public/@babylonjs/loaders/package.json b/packages/public/@babylonjs/loaders/package.json index 0c7a057f1cc..4bc200b83a7 100644 --- a/packages/public/@babylonjs/loaders/package.json +++ b/packages/public/@babylonjs/loaders/package.json @@ -1,6 +1,6 @@ { "name": "@babylonjs/loaders", - "version": "8.6.1", + "version": "8.8.0", "main": "index.js", "module": "index.js", "types": "index.d.ts", @@ -18,10 +18,10 @@ "postcompile": "build-tools -c add-js-to-es6" }, "devDependencies": { - "@babylonjs/core": "^8.6.1", + "@babylonjs/core": "^8.8.0", "@dev/build-tools": "^1.0.0", "@lts/loaders": "^1.0.0", - "babylonjs-gltf2interface": "^8.6.1" + "babylonjs-gltf2interface": "^8.8.0" }, "peerDependencies": { "@babylonjs/core": "^8.0.0", diff --git a/packages/public/@babylonjs/materials/package.json b/packages/public/@babylonjs/materials/package.json index 410ec87e996..fbb39786edd 100644 --- a/packages/public/@babylonjs/materials/package.json +++ b/packages/public/@babylonjs/materials/package.json @@ -1,6 +1,6 @@ { "name": "@babylonjs/materials", - "version": "8.6.1", + "version": "8.8.0", "main": "index.js", "module": "index.js", "types": "index.d.ts", @@ -18,7 +18,7 @@ "postcompile": "build-tools -c add-js-to-es6" }, "devDependencies": { - "@babylonjs/core": "^8.6.1", + "@babylonjs/core": "^8.8.0", "@dev/build-tools": "^1.0.0", "@lts/materials": "^1.0.0" }, diff --git a/packages/public/@babylonjs/node-editor/package.json b/packages/public/@babylonjs/node-editor/package.json index 0170177cc62..dff25bd82d8 100644 --- a/packages/public/@babylonjs/node-editor/package.json +++ b/packages/public/@babylonjs/node-editor/package.json @@ -1,6 +1,6 @@ { "name": "@babylonjs/node-editor", - "version": "8.6.1", + "version": "8.8.0", "main": "dist/babylon.nodeEditor.max.js", "module": "dist/babylon.nodeEditor.max.js", "esnext": "dist/babylon.nodeEditor.max.js", @@ -23,7 +23,7 @@ "@types/react-dom": ">=16.0.9" }, "devDependencies": { - "@babylonjs/core": "^8.6.1", + "@babylonjs/core": "^8.8.0", "react": "^18.2.0", "react-dom": "^18.2.0" }, diff --git a/packages/public/@babylonjs/node-geometry-editor/package.json b/packages/public/@babylonjs/node-geometry-editor/package.json index dde21bc9199..b9d91dab7c7 100644 --- a/packages/public/@babylonjs/node-geometry-editor/package.json +++ b/packages/public/@babylonjs/node-geometry-editor/package.json @@ -1,6 +1,6 @@ { "name": "@babylonjs/node-geometry-editor", - "version": "8.6.1", + "version": "8.8.0", "main": "dist/babylon.nodeGeometryEditor.max.js", "module": "dist/babylon.nodeGeometryEditor.max.js", "esnext": "dist/babylon.nodeGeometryEditor.max.js", @@ -23,7 +23,7 @@ "@types/react-dom": ">=16.0.9" }, "devDependencies": { - "@babylonjs/core": "^8.6.1", + "@babylonjs/core": "^8.8.0", "react": "^18.2.0", "react-dom": "^18.2.0" }, diff --git a/packages/public/@babylonjs/node-render-graph-editor/package.json b/packages/public/@babylonjs/node-render-graph-editor/package.json index a01fb6c2813..bd1c237009c 100644 --- a/packages/public/@babylonjs/node-render-graph-editor/package.json +++ b/packages/public/@babylonjs/node-render-graph-editor/package.json @@ -1,6 +1,6 @@ { "name": "@babylonjs/node-render-graph-editor", - "version": "8.6.1", + "version": "8.8.0", "main": "dist/babylon.nodeRenderGraphEditor.max.js", "module": "dist/babylon.nodeRenderGraphEditor.max.js", "esnext": "dist/babylon.nodeRenderGraphEditor.max.js", @@ -23,7 +23,7 @@ "@types/react-dom": ">=16.0.9" }, "devDependencies": { - "@babylonjs/core": "^8.6.1", + "@babylonjs/core": "^8.8.0", "react": "^18.2.0", "react-dom": "^18.2.0" }, diff --git a/packages/public/@babylonjs/post-processes/package.json b/packages/public/@babylonjs/post-processes/package.json index f924c0fa89d..f0466085f44 100644 --- a/packages/public/@babylonjs/post-processes/package.json +++ b/packages/public/@babylonjs/post-processes/package.json @@ -1,6 +1,6 @@ { "name": "@babylonjs/post-processes", - "version": "8.6.1", + "version": "8.8.0", "main": "index.js", "module": "index.js", "types": "index.d.ts", @@ -18,7 +18,7 @@ "postcompile": "build-tools -c add-js-to-es6" }, "devDependencies": { - "@babylonjs/core": "^8.6.1", + "@babylonjs/core": "^8.8.0", "@dev/build-tools": "^1.0.0", "@lts/post-processes": "^1.0.0" }, diff --git a/packages/public/@babylonjs/procedural-textures/package.json b/packages/public/@babylonjs/procedural-textures/package.json index b14183dd50e..78c63578439 100644 --- a/packages/public/@babylonjs/procedural-textures/package.json +++ b/packages/public/@babylonjs/procedural-textures/package.json @@ -1,6 +1,6 @@ { "name": "@babylonjs/procedural-textures", - "version": "8.6.1", + "version": "8.8.0", "main": "index.js", "module": "index.js", "types": "index.d.ts", @@ -18,7 +18,7 @@ "postcompile": "build-tools -c add-js-to-es6" }, "devDependencies": { - "@babylonjs/core": "^8.6.1", + "@babylonjs/core": "^8.8.0", "@dev/build-tools": "^1.0.0", "@lts/procedural-textures": "^1.0.0" }, diff --git a/packages/public/@babylonjs/serializers/package.json b/packages/public/@babylonjs/serializers/package.json index 18e47ff215a..70bec89fc26 100644 --- a/packages/public/@babylonjs/serializers/package.json +++ b/packages/public/@babylonjs/serializers/package.json @@ -1,6 +1,6 @@ { "name": "@babylonjs/serializers", - "version": "8.6.1", + "version": "8.8.0", "main": "index.js", "module": "index.js", "types": "index.d.ts", @@ -18,10 +18,10 @@ "postcompile": "build-tools -c add-js-to-es6" }, "devDependencies": { - "@babylonjs/core": "^8.6.1", + "@babylonjs/core": "^8.8.0", "@dev/build-tools": "^1.0.0", "@lts/serializers": "^1.0.0", - "babylonjs-gltf2interface": "^8.6.1" + "babylonjs-gltf2interface": "^8.8.0" }, "peerDependencies": { "@babylonjs/core": "^8.0.0", diff --git a/packages/public/@babylonjs/shared-ui-components/package.json b/packages/public/@babylonjs/shared-ui-components/package.json index bdef9073f77..3cf369d7c09 100644 --- a/packages/public/@babylonjs/shared-ui-components/package.json +++ b/packages/public/@babylonjs/shared-ui-components/package.json @@ -1,6 +1,6 @@ { "name": "@babylonjs/shared-ui-components", - "version": "8.6.1", + "version": "8.8.0", "main": "index.js", "module": "index.js", "types": "index.d.ts", diff --git a/packages/public/@babylonjs/viewer/package.json b/packages/public/@babylonjs/viewer/package.json index 78a5b4d1c87..73a57d38234 100644 --- a/packages/public/@babylonjs/viewer/package.json +++ b/packages/public/@babylonjs/viewer/package.json @@ -1,6 +1,6 @@ { "name": "@babylonjs/viewer", - "version": "8.6.1", + "version": "8.8.0", "type": "module", "main": "lib/index.js", "module": "lib/index.js", @@ -35,8 +35,8 @@ "@babylonjs/loaders": "^8.0.0" }, "devDependencies": { - "@babylonjs/core": "^8.6.1", - "@babylonjs/loaders": "^8.6.1", + "@babylonjs/core": "^8.8.0", + "@babylonjs/loaders": "^8.8.0", "@dev/build-tools": "^1.0.0", "@rollup/plugin-alias": "^5.1.0", "@rollup/plugin-commonjs": "^26.0.1", diff --git a/packages/public/babylonjs-viewer-assets/package.json b/packages/public/babylonjs-viewer-assets/package.json index cb9f87066f3..65437c06594 100644 --- a/packages/public/babylonjs-viewer-assets/package.json +++ b/packages/public/babylonjs-viewer-assets/package.json @@ -4,7 +4,7 @@ }, "name": "babylonjs-viewer-assets", "description": "Compiled resources for the Babylon viewer.", - "version": "8.6.1", + "version": "8.8.0", "repository": { "type": "git", "url": "https://github.com/BabylonJS/Babylon.js.git" diff --git a/packages/public/glTF2Interface/babylon.glTF2Interface.d.ts b/packages/public/glTF2Interface/babylon.glTF2Interface.d.ts index 9f17d09ce3d..34a0e4ceef9 100644 --- a/packages/public/glTF2Interface/babylon.glTF2Interface.d.ts +++ b/packages/public/glTF2Interface/babylon.glTF2Interface.d.ts @@ -1058,6 +1058,9 @@ declare module BABYLON.GLTF2 { lights: IKHRLightsPunctual_Light[]; } + /** + * Interfaces from the KHR_materials_clearcoat extension + */ /** @internal */ interface IKHRMaterialsClearcoat { clearcoatFactor?: number; @@ -1183,6 +1186,15 @@ declare module BABYLON.GLTF2 { diffuseTransmissionColorTexture?: ITextureInfo; } + /** + * Interfaces from the EXT_materials_diffuse_roughness extension + */ + /** @internal */ + interface IEXTMaterialsDiffuseRoughness { + diffuseRoughnessFactor?: number; + diffuseRoughnessTexture?: ITextureInfo; + } + /** * Interfaces from the KHR_materials_variants extension */ diff --git a/packages/public/glTF2Interface/package.json b/packages/public/glTF2Interface/package.json index fd9e9164009..20b5937fac8 100644 --- a/packages/public/glTF2Interface/package.json +++ b/packages/public/glTF2Interface/package.json @@ -1,7 +1,7 @@ { "name": "babylonjs-gltf2interface", "description": "A typescript declaration of babylon's gltf2 interface.", - "version": "8.6.1", + "version": "8.8.0", "repository": { "type": "git", "url": "https://github.com/BabylonJS/Babylon.js.git" diff --git a/packages/public/umd/babylonjs-accessibility/package.json b/packages/public/umd/babylonjs-accessibility/package.json index 60bd8a50909..45a39f32ca7 100644 --- a/packages/public/umd/babylonjs-accessibility/package.json +++ b/packages/public/umd/babylonjs-accessibility/package.json @@ -1,6 +1,6 @@ { "name": "babylonjs-accessibility", - "version": "8.6.1", + "version": "8.8.0", "main": "babylon.accessibility.max.js", "types": "babylon.accessibility.module.d.ts", "files": [ @@ -14,8 +14,8 @@ "clean": "rimraf dist && rimraf babylon*.* -g" }, "dependencies": { - "babylonjs": "^8.6.1", - "babylonjs-gui": "^8.6.1" + "babylonjs": "^8.8.0", + "babylonjs-gui": "^8.8.0" }, "devDependencies": { "@dev/build-tools": "1.0.0", diff --git a/packages/public/umd/babylonjs-addons/package.json b/packages/public/umd/babylonjs-addons/package.json index b49841179e7..b52f3755a0c 100644 --- a/packages/public/umd/babylonjs-addons/package.json +++ b/packages/public/umd/babylonjs-addons/package.json @@ -1,6 +1,6 @@ { "name": "babylonjs-addons", - "version": "8.6.1", + "version": "8.8.0", "main": "babylonjs.addons.js", "types": "babylonjs.addons.module.d.ts", "files": [ @@ -15,7 +15,7 @@ "test:escheck": "es-check es6 ./babylonjs.addons.js" }, "dependencies": { - "babylonjs": "^8.6.1" + "babylonjs": "^8.8.0" }, "devDependencies": { "@dev/build-tools": "1.0.0", diff --git a/packages/public/umd/babylonjs-gui-editor/package.json b/packages/public/umd/babylonjs-gui-editor/package.json index 08b00f123b6..e32b0f9188b 100644 --- a/packages/public/umd/babylonjs-gui-editor/package.json +++ b/packages/public/umd/babylonjs-gui-editor/package.json @@ -1,6 +1,6 @@ { "name": "babylonjs-gui-editor", - "version": "8.6.1", + "version": "8.8.0", "main": "babylon.guiEditor.max.js", "types": "babylon.guiEditor.module.d.ts", "files": [ @@ -14,8 +14,8 @@ "clean": "rimraf dist && rimraf babylon*.* -g" }, "dependencies": { - "babylonjs": "^8.6.1", - "babylonjs-gui": "^8.6.1" + "babylonjs": "^8.8.0", + "babylonjs-gui": "^8.8.0" }, "devDependencies": { "@dev/build-tools": "1.0.0", diff --git a/packages/public/umd/babylonjs-gui/package.json b/packages/public/umd/babylonjs-gui/package.json index 350ad6795e6..d9571bb3627 100644 --- a/packages/public/umd/babylonjs-gui/package.json +++ b/packages/public/umd/babylonjs-gui/package.json @@ -1,6 +1,6 @@ { "name": "babylonjs-gui", - "version": "8.6.1", + "version": "8.8.0", "main": "babylon.gui.js", "types": "babylon.gui.module.d.ts", "files": [ @@ -15,7 +15,7 @@ "test:escheck": "es-check es6 ./babylon.gui.js" }, "dependencies": { - "babylonjs": "^8.6.1" + "babylonjs": "^8.8.0" }, "devDependencies": { "@dev/build-tools": "1.0.0", diff --git a/packages/public/umd/babylonjs-inspector/package.json b/packages/public/umd/babylonjs-inspector/package.json index caa41148503..bf77ad7e85f 100644 --- a/packages/public/umd/babylonjs-inspector/package.json +++ b/packages/public/umd/babylonjs-inspector/package.json @@ -1,6 +1,6 @@ { "name": "babylonjs-inspector", - "version": "8.6.1", + "version": "8.8.0", "main": "babylon.inspector.bundle.max.js", "types": "babylon.inspector.module.d.ts", "files": [ @@ -14,12 +14,12 @@ "clean": "rimraf dist && rimraf babylon*.* -g" }, "dependencies": { - "babylonjs": "^8.6.1", - "babylonjs-gui": "^8.6.1", - "babylonjs-gui-editor": "^8.6.1", - "babylonjs-loaders": "^8.6.1", - "babylonjs-materials": "^8.6.1", - "babylonjs-serializers": "^8.6.1" + "babylonjs": "^8.8.0", + "babylonjs-gui": "^8.8.0", + "babylonjs-gui-editor": "^8.8.0", + "babylonjs-loaders": "^8.8.0", + "babylonjs-materials": "^8.8.0", + "babylonjs-serializers": "^8.8.0" }, "devDependencies": { "@dev/build-tools": "1.0.0", diff --git a/packages/public/umd/babylonjs-ktx2decoder/package.json b/packages/public/umd/babylonjs-ktx2decoder/package.json index 1ddb6e7dba2..0c9bdd8b58c 100644 --- a/packages/public/umd/babylonjs-ktx2decoder/package.json +++ b/packages/public/umd/babylonjs-ktx2decoder/package.json @@ -1,6 +1,6 @@ { "name": "babylonjs-ktx2decoder", - "version": "8.6.1", + "version": "8.8.0", "main": "babylon.ktx2Decoder.js", "types": "babylon.ktx2Decoder.module.d.ts", "files": [ @@ -14,7 +14,7 @@ "clean": "rimraf dist && rimraf babylon*.* -g" }, "dependencies": { - "babylonjs": "^8.6.1" + "babylonjs": "^8.8.0" }, "devDependencies": { "@dev/build-tools": "1.0.0", diff --git a/packages/public/umd/babylonjs-loaders/package.json b/packages/public/umd/babylonjs-loaders/package.json index 85c1d0fbbd8..05c9a9684c0 100644 --- a/packages/public/umd/babylonjs-loaders/package.json +++ b/packages/public/umd/babylonjs-loaders/package.json @@ -1,6 +1,6 @@ { "name": "babylonjs-loaders", - "version": "8.6.1", + "version": "8.8.0", "main": "babylonjs.loaders.js", "types": "babylonjs.loaders.module.d.ts", "files": [ @@ -15,8 +15,8 @@ "test:escheck": "es-check es6 ./babylonjs.loaders.js" }, "dependencies": { - "babylonjs": "^8.6.1", - "babylonjs-gltf2interface": "^8.6.1" + "babylonjs": "^8.8.0", + "babylonjs-gltf2interface": "^8.8.0" }, "devDependencies": { "@dev/build-tools": "1.0.0", diff --git a/packages/public/umd/babylonjs-materials/package.json b/packages/public/umd/babylonjs-materials/package.json index 4e37ac333c7..6814a20c8f9 100644 --- a/packages/public/umd/babylonjs-materials/package.json +++ b/packages/public/umd/babylonjs-materials/package.json @@ -1,6 +1,6 @@ { "name": "babylonjs-materials", - "version": "8.6.1", + "version": "8.8.0", "main": "babylonjs.materials.js", "types": "babylonjs.materials.module.d.ts", "files": [ @@ -15,7 +15,7 @@ "test:escheck": "es-check es6 ./babylonjs.materials.js" }, "dependencies": { - "babylonjs": "^8.6.1" + "babylonjs": "^8.8.0" }, "devDependencies": { "@dev/build-tools": "1.0.0", diff --git a/packages/public/umd/babylonjs-node-editor/package.json b/packages/public/umd/babylonjs-node-editor/package.json index 248d48ee07e..cf8d76e01b6 100644 --- a/packages/public/umd/babylonjs-node-editor/package.json +++ b/packages/public/umd/babylonjs-node-editor/package.json @@ -1,6 +1,6 @@ { "name": "babylonjs-node-editor", - "version": "8.6.1", + "version": "8.8.0", "main": "babylon.nodeEditor.js", "types": "babylon.nodeEditor.module.d.ts", "files": [ @@ -14,7 +14,7 @@ "clean": "rimraf dist && rimraf babylon*.* -g" }, "dependencies": { - "babylonjs": "^8.6.1" + "babylonjs": "^8.8.0" }, "devDependencies": { "@dev/build-tools": "1.0.0", diff --git a/packages/public/umd/babylonjs-node-geometry-editor/package.json b/packages/public/umd/babylonjs-node-geometry-editor/package.json index 79d130f2047..9b097e1e66e 100644 --- a/packages/public/umd/babylonjs-node-geometry-editor/package.json +++ b/packages/public/umd/babylonjs-node-geometry-editor/package.json @@ -1,6 +1,6 @@ { "name": "babylonjs-node-geometry-editor", - "version": "8.6.1", + "version": "8.8.0", "main": "babylon.nodeGeometryEditor.js", "types": "babylon.nodeGeometryEditor.module.d.ts", "files": [ @@ -14,7 +14,7 @@ "clean": "rimraf dist && rimraf babylon*.* -g" }, "dependencies": { - "babylonjs": "^8.6.1" + "babylonjs": "^8.8.0" }, "devDependencies": { "@dev/build-tools": "1.0.0", diff --git a/packages/public/umd/babylonjs-node-render-graph-editor/package.json b/packages/public/umd/babylonjs-node-render-graph-editor/package.json index c664d3f0fd8..7f91ade9d5f 100644 --- a/packages/public/umd/babylonjs-node-render-graph-editor/package.json +++ b/packages/public/umd/babylonjs-node-render-graph-editor/package.json @@ -1,6 +1,6 @@ { "name": "babylonjs-node-render-graph-editor", - "version": "8.6.1", + "version": "8.8.0", "main": "babylon.nodeRenderGraphEditor.js", "types": "babylon.nodeRenderGraphEditor.module.d.ts", "files": [ @@ -14,7 +14,7 @@ "clean": "rimraf dist && rimraf babylon*.* -g" }, "dependencies": { - "babylonjs": "^8.6.1" + "babylonjs": "^8.8.0" }, "devDependencies": { "@dev/build-tools": "1.0.0", diff --git a/packages/public/umd/babylonjs-post-process/package.json b/packages/public/umd/babylonjs-post-process/package.json index e6f93772c04..fbdda7a5251 100644 --- a/packages/public/umd/babylonjs-post-process/package.json +++ b/packages/public/umd/babylonjs-post-process/package.json @@ -1,6 +1,6 @@ { "name": "babylonjs-post-process", - "version": "8.6.1", + "version": "8.8.0", "main": "babylonjs.postProcess.min.js", "types": "babylonjs.postProcess.module.d.ts", "files": [ @@ -15,7 +15,7 @@ "test:escheck": "es-check es6 ./babylonjs.postProcess.js" }, "dependencies": { - "babylonjs": "^8.6.1" + "babylonjs": "^8.8.0" }, "devDependencies": { "@dev/build-tools": "1.0.0", diff --git a/packages/public/umd/babylonjs-procedural-textures/package.json b/packages/public/umd/babylonjs-procedural-textures/package.json index b262880b45c..753cdbd1884 100644 --- a/packages/public/umd/babylonjs-procedural-textures/package.json +++ b/packages/public/umd/babylonjs-procedural-textures/package.json @@ -1,6 +1,6 @@ { "name": "babylonjs-procedural-textures", - "version": "8.6.1", + "version": "8.8.0", "main": "babylonjs.proceduralTextures.js", "types": "babylonjs.proceduralTextures.module.d.ts", "files": [ @@ -15,7 +15,7 @@ "test:escheck": "es-check es6 ./babylonjs.proceduralTextures.js" }, "dependencies": { - "babylonjs": "^8.6.1" + "babylonjs": "^8.8.0" }, "devDependencies": { "@dev/build-tools": "1.0.0", diff --git a/packages/public/umd/babylonjs-serializers/package.json b/packages/public/umd/babylonjs-serializers/package.json index f39cf745210..404d7340167 100644 --- a/packages/public/umd/babylonjs-serializers/package.json +++ b/packages/public/umd/babylonjs-serializers/package.json @@ -1,6 +1,6 @@ { "name": "babylonjs-serializers", - "version": "8.6.1", + "version": "8.8.0", "main": "babylonjs.serializers.js", "types": "babylonjs.serializers.module.d.ts", "files": [ @@ -15,8 +15,8 @@ "test:escheck": "es-check es6 ./babylonjs.serializers.js" }, "dependencies": { - "babylonjs": "^8.6.1", - "babylonjs-gltf2interface": "^8.6.1" + "babylonjs": "^8.8.0", + "babylonjs-gltf2interface": "^8.8.0" }, "devDependencies": { "@dev/build-tools": "1.0.0", diff --git a/packages/public/umd/babylonjs/package.json b/packages/public/umd/babylonjs/package.json index 2b2fe029a1a..39fc5d0c29a 100644 --- a/packages/public/umd/babylonjs/package.json +++ b/packages/public/umd/babylonjs/package.json @@ -1,6 +1,6 @@ { "name": "babylonjs", - "version": "8.6.1", + "version": "8.8.0", "main": "babylon.js", "types": "babylon.module.d.ts", "files": [ diff --git a/packages/tools/babylonServer/public/audiov2-test.js b/packages/tools/babylonServer/public/audiov2-test.js index a82546bcff4..bfcdfdebf57 100644 --- a/packages/tools/babylonServer/public/audiov2-test.js +++ b/packages/tools/babylonServer/public/audiov2-test.js @@ -110,26 +110,40 @@ class AudioV2Test { } static async CreateAbstractSoundAndOutputNodeAsync(audioNodeType, source, options = {}) { - const sound = - audioNodeType === "StaticSound" || audioNodeType === "StreamingSound" - ? await AudioV2Test.CreateAbstractSoundAsync(audioNodeType, source, options) - : await AudioV2Test.CreateAbstractSoundAsync("StaticSound", source, {}); - + let sound = null; let outputNode = null; - if (audioNodeType === "AudioBus") { - outputNode = await audioEngine.createBusAsync("", options); - sound.outBus = outputNode; - outputNode.outBus = audioEngine.defaultMainBus; - } else if (audioNodeType === "AudioEngineV2") { - outputNode = audioEngine; - } else if (audioNodeType === "MainAudioBus") { - outputNode = await audioEngine.createMainBusAsync("", options); - sound.outBus = outputNode; - } else if (audioNodeType === "StaticSound") { - outputNode = sound; - } else if (audioNodeType === "StreamingSound") { - outputNode = sound; + switch (audioNodeType) { + case "SoundSource": + sound = await AudioV2Test.CreateSoundSourceAsync(source, options); + break; + case "StaticSound": + case "StreamingSound": + sound = await AudioV2Test.CreateAbstractSoundAsync(audioNodeType, source, options); + break; + default: + sound = await AudioV2Test.CreateAbstractSoundAsync("StaticSound", source, {}); + break; + } + + switch (audioNodeType) { + case "AudioBus": + outputNode = await audioEngine.createBusAsync("", options); + sound.outBus = outputNode; + outputNode.outBus = audioEngine.defaultMainBus; + break; + case "AudioEngineV2": + outputNode = audioEngine; + break; + case "MainAudioBus": + outputNode = await audioEngine.createMainBusAsync("", options); + sound.outBus = outputNode; + break; + case "SoundSource": + case "StaticSound": + case "StreamingSound": + outputNode = sound; + break; } return { sound, outputNode }; @@ -142,6 +156,32 @@ class AudioV2Test { return sound; } + static async CreateSoundSourceAsync(source, options = {}) { + const audioBuffer = await audioContext.decodeAudioData(await (await fetch(AudioV2Test.#ExpandSource(source))).arrayBuffer()); + const audioNode = new AudioBufferSourceNode(audioContext, { + buffer: audioBuffer, + }); + + const soundSource = await BABYLON.CreateSoundSourceAsync("", audioNode, options); + + let state = BABYLON.SoundState.Stopped; + Object.defineProperty(soundSource, "state", { + get: () => state, + }); + soundSource.play = () => { + audioNode.start(); + state = BABYLON.SoundState.Playing; + }; + soundSource.stop = () => { + audioNode.stop(); + state = BABYLON.SoundState.Stopped; + }; + + AudioV2Test.#AddSound(soundSource); + + return soundSource; + } + static async CreateStreamingSoundAsync(source, options = {}) { const sound = await BABYLON.CreateStreamingSoundAsync("", AudioV2Test.#ExpandSource(source), options); AudioV2Test.#AddSound(sound); diff --git a/packages/tools/babylonServer/src/playground.ts b/packages/tools/babylonServer/src/playground.ts index 03033245b1e..0174b247944 100644 --- a/packages/tools/babylonServer/src/playground.ts +++ b/packages/tools/babylonServer/src/playground.ts @@ -17,6 +17,7 @@ export const loadPlayground = async (playgroundId: string) => { const loadedScene = eval(`${code};${createSceneFunction}(engine);`); + // eslint-disable-next-line github/no-then if (loadedScene.then) { // Handle if createScene returns a promise return await loadedScene; diff --git a/packages/tools/babylonServer/src/sceneJs.js b/packages/tools/babylonServer/src/sceneJs.js index 8db568374d8..f3ec7b7aef7 100644 --- a/packages/tools/babylonServer/src/sceneJs.js +++ b/packages/tools/babylonServer/src/sceneJs.js @@ -24,7 +24,12 @@ const runScene = async () => { engine.dispose(); engine = undefined; } - engine = createEngine(); // Generate the BABYLON 3D engine + const createdEngine = createEngine(); // Generate the BABYLON 3D engine + if (createdEngine.then) { + engine = await createdEngine; + } else { + engine = createdEngine; + } if (playgroundId) { window.engine = engine; window.canvas = canvas; diff --git a/packages/tools/devHost/src/index.ts b/packages/tools/devHost/src/index.ts index 4a13f99948b..a88cd730faa 100644 --- a/packages/tools/devHost/src/index.ts +++ b/packages/tools/devHost/src/index.ts @@ -11,7 +11,7 @@ let SceneInstance: Scene; // avoid await on main level const CreateSceneResult = CreateScene(); if (CreateSceneResult instanceof Promise) { - // eslint-disable-next-line @typescript-eslint/no-floating-promises + // eslint-disable-next-line @typescript-eslint/no-floating-promises, github/no-then CreateSceneResult.then(function (result) { SceneInstance = result; }); diff --git a/packages/tools/guiEditor/src/components/commandBarComponent.tsx b/packages/tools/guiEditor/src/components/commandBarComponent.tsx index 0215db87903..54f66f42e64 100644 --- a/packages/tools/guiEditor/src/components/commandBarComponent.tsx +++ b/packages/tools/guiEditor/src/components/commandBarComponent.tsx @@ -201,8 +201,9 @@ export class CommandBarComponent extends React.Component { - this.props.globalState.onCopyObservable.notifyObservers(async (content) => - this.props.globalState.hostWindow.navigator.clipboard.writeText(content) + this.props.globalState.onCopyObservable.notifyObservers( + // eslint-disable-next-line @typescript-eslint/no-misused-promises + async (content) => await this.props.globalState.hostWindow.navigator.clipboard.writeText(content) ); this.forceUpdate(); }} @@ -213,6 +214,7 @@ export class CommandBarComponent extends React.Component { this.props.globalState.onPasteObservable.notifyObservers(await this.props.globalState.hostWindow.navigator.clipboard.readText()); }} diff --git a/packages/tools/guiEditor/src/components/propertyTab/propertyGrids/gui/linePropertyGridComponent.tsx b/packages/tools/guiEditor/src/components/propertyTab/propertyGrids/gui/linePropertyGridComponent.tsx index 615b88dd1d8..66e6ded00b6 100644 --- a/packages/tools/guiEditor/src/components/propertyTab/propertyGrids/gui/linePropertyGridComponent.tsx +++ b/packages/tools/guiEditor/src/components/propertyTab/propertyGrids/gui/linePropertyGridComponent.tsx @@ -39,7 +39,7 @@ export class LinePropertyGridComponent extends React.Component { + // eslint-disable-next-line @typescript-eslint/no-misused-promises this.save(this.saveToSnippetServer); }); this.props.globalState.onSnippetLoadObservable.add(() => { @@ -183,7 +184,7 @@ export class PropertyTabComponent extends React.Component => { - return new Promise((resolve, reject) => { + return await new Promise((resolve, reject) => { const xmlHttp = new XMLHttpRequest(); xmlHttp.onreadystatechange = () => { if (xmlHttp.readyState == 4) { @@ -203,6 +204,7 @@ export class PropertyTabComponent extends React.Component { adt.snippetId = snippetId; const alertMessage = `GUI saved with ID: ${adt.snippetId}`; if (this.props.globalState.hostWindow.navigator.clipboard) { this.props.globalState.hostWindow.navigator.clipboard .writeText(adt.snippetId) + // eslint-disable-next-line github/no-then .then(() => { this.props.globalState.hostWindow.alert(`${alertMessage}. The ID was copied to your clipboard.`); }) + // eslint-disable-next-line github/no-then .catch(() => { this.props.globalState.hostWindow.alert(alertMessage); }); @@ -261,6 +266,7 @@ export class PropertyTabComponent extends React.Component { this.props.globalState.hostWindow.alert(err); }); @@ -272,6 +278,7 @@ export class PropertyTabComponent extends React.Component { alert("Unable to load your GUI"); }); diff --git a/packages/tools/guiEditor/src/guiEditor.ts b/packages/tools/guiEditor/src/guiEditor.ts index 020908f676b..182329ef6e1 100644 --- a/packages/tools/guiEditor/src/guiEditor.ts +++ b/packages/tools/guiEditor/src/guiEditor.ts @@ -38,6 +38,7 @@ export class GUIEditor { if (this._CurrentState && hostElement) { if (options.currentSnippetToken) { try { + // eslint-disable-next-line @typescript-eslint/no-floating-promises this._CurrentState.workbench.loadFromSnippet(options.currentSnippetToken); } catch (error) { //swallow and continue diff --git a/packages/tools/guiEditor/src/workbenchEditor.tsx b/packages/tools/guiEditor/src/workbenchEditor.tsx index 3978c75ecde..9c0e157f109 100644 --- a/packages/tools/guiEditor/src/workbenchEditor.tsx +++ b/packages/tools/guiEditor/src/workbenchEditor.tsx @@ -52,6 +52,7 @@ export class WorkbenchEditor extends React.Component { - return WebAssembly.instantiate(wasmBinary, { env: { memory: this._memoryManager.wasmMemory } }).then((moduleWrapper) => { + // eslint-disable-next-line github/no-then + return await WebAssembly.instantiate(wasmBinary, { env: { memory: this._memoryManager.wasmMemory } }).then((moduleWrapper) => { return { module: moduleWrapper.instance.exports }; }); } @@ -24,10 +25,11 @@ export class LiteTranscoder extends Transcoder { protected async _loadModuleAsync(wasmBinary: ArrayBuffer | null = this._wasmBinary): Promise<{ module: any }> { this._modulePromise = this._modulePromise || + // eslint-disable-next-line github/no-then (wasmBinary ? Promise.resolve(wasmBinary) : WASMMemoryManager.LoadWASM(this._modulePath)).then(async (wasmBinary) => { - return this._instantiateWebAssemblyAsync(wasmBinary); + return await this._instantiateWebAssemblyAsync(wasmBinary); }); - return this._modulePromise; + return await this._modulePromise; } // eslint-disable-next-line @typescript-eslint/naming-convention @@ -65,7 +67,8 @@ export class LiteTranscoder extends Transcoder { imageDesc: IKTX2_ImageDesc | null, encodedData: Uint8Array ): Promise { - return this._loadModuleAsync().then((moduleWrapper: any) => { + // eslint-disable-next-line github/no-then + return await this._loadModuleAsync().then((moduleWrapper: any) => { const transcoder: any = moduleWrapper.module; const [textureView, uncompressedTextureView, nBlocks] = this._prepareTranscoding(width, height, uncompressedByteLength, encodedData); diff --git a/packages/tools/ktx2Decoder/src/Transcoders/liteTranscoder_UASTC_R8_UNORM.ts b/packages/tools/ktx2Decoder/src/Transcoders/liteTranscoder_UASTC_R8_UNORM.ts index a30872b77c7..b6e8ee987d9 100644 --- a/packages/tools/ktx2Decoder/src/Transcoders/liteTranscoder_UASTC_R8_UNORM.ts +++ b/packages/tools/ktx2Decoder/src/Transcoders/liteTranscoder_UASTC_R8_UNORM.ts @@ -47,11 +47,10 @@ export class LiteTranscoder_UASTC_R8_UNORM extends LiteTranscoder { imageDesc: IKTX2_ImageDesc | null, encodedData: Uint8Array ): Promise { - return this._loadModuleAsync().then((moduleWrapper: any) => { - const transcoder: any = moduleWrapper.module; - const [, uncompressedTextureView] = this._prepareTranscoding(width, height, uncompressedByteLength, encodedData, 1); + const moduleWrapper = await this._loadModuleAsync(); + const transcoder: any = moduleWrapper.module; + const [, uncompressedTextureView] = this._prepareTranscoding(width, height, uncompressedByteLength, encodedData, 1); - return transcoder.decode(width, height) === 0 ? uncompressedTextureView!.slice() : null; - }); + return transcoder.decode(width, height) === 0 ? uncompressedTextureView!.slice() : null; } } diff --git a/packages/tools/ktx2Decoder/src/Transcoders/liteTranscoder_UASTC_RG8_UNORM.ts b/packages/tools/ktx2Decoder/src/Transcoders/liteTranscoder_UASTC_RG8_UNORM.ts index 83e23d0a75e..1aaa2437b19 100644 --- a/packages/tools/ktx2Decoder/src/Transcoders/liteTranscoder_UASTC_RG8_UNORM.ts +++ b/packages/tools/ktx2Decoder/src/Transcoders/liteTranscoder_UASTC_RG8_UNORM.ts @@ -47,11 +47,10 @@ export class LiteTranscoder_UASTC_RG8_UNORM extends LiteTranscoder { imageDesc: IKTX2_ImageDesc | null, encodedData: Uint8Array ): Promise { - return this._loadModuleAsync().then((moduleWrapper: any) => { - const transcoder: any = moduleWrapper.module; - const [, uncompressedTextureView] = this._prepareTranscoding(width, height, uncompressedByteLength, encodedData, 2); + const moduleWrapper = await this._loadModuleAsync(); + const transcoder: any = moduleWrapper.module; + const [, uncompressedTextureView] = this._prepareTranscoding(width, height, uncompressedByteLength, encodedData, 2); - return transcoder.decode(width, height) === 0 ? uncompressedTextureView!.slice() : null; - }); + return transcoder.decode(width, height) === 0 ? uncompressedTextureView!.slice() : null; } } diff --git a/packages/tools/ktx2Decoder/src/Transcoders/liteTranscoder_UASTC_RGBA_SRGB.ts b/packages/tools/ktx2Decoder/src/Transcoders/liteTranscoder_UASTC_RGBA_SRGB.ts index 0684365d220..d15299a004c 100644 --- a/packages/tools/ktx2Decoder/src/Transcoders/liteTranscoder_UASTC_RGBA_SRGB.ts +++ b/packages/tools/ktx2Decoder/src/Transcoders/liteTranscoder_UASTC_RGBA_SRGB.ts @@ -47,11 +47,10 @@ export class LiteTranscoder_UASTC_RGBA_SRGB extends LiteTranscoder { imageDesc: IKTX2_ImageDesc | null, encodedData: Uint8Array ): Promise { - return this._loadModuleAsync().then((moduleWrapper: any) => { - const transcoder: any = moduleWrapper.module; - const [, uncompressedTextureView] = this._prepareTranscoding(width, height, uncompressedByteLength, encodedData, 4); + const moduleWrapper = await this._loadModuleAsync(); + const transcoder: any = moduleWrapper.module; + const [, uncompressedTextureView] = this._prepareTranscoding(width, height, uncompressedByteLength, encodedData, 4); - return transcoder.decode(width, height) === 0 ? uncompressedTextureView!.slice() : null; - }); + return transcoder.decode(width, height) === 0 ? uncompressedTextureView!.slice() : null; } } diff --git a/packages/tools/ktx2Decoder/src/Transcoders/liteTranscoder_UASTC_RGBA_UNORM.ts b/packages/tools/ktx2Decoder/src/Transcoders/liteTranscoder_UASTC_RGBA_UNORM.ts index 8ceb620768d..e8935ad7ef1 100644 --- a/packages/tools/ktx2Decoder/src/Transcoders/liteTranscoder_UASTC_RGBA_UNORM.ts +++ b/packages/tools/ktx2Decoder/src/Transcoders/liteTranscoder_UASTC_RGBA_UNORM.ts @@ -47,11 +47,10 @@ export class LiteTranscoder_UASTC_RGBA_UNORM extends LiteTranscoder { imageDesc: IKTX2_ImageDesc | null, encodedData: Uint8Array ): Promise { - return this._loadModuleAsync().then((moduleWrapper: any) => { - const transcoder: any = moduleWrapper.module; - const [, uncompressedTextureView] = this._prepareTranscoding(width, height, uncompressedByteLength, encodedData, 4); + const moduleWrapper = await this._loadModuleAsync(); + const transcoder: any = moduleWrapper.module; + const [, uncompressedTextureView] = this._prepareTranscoding(width, height, uncompressedByteLength, encodedData, 4); - return transcoder.decode(width, height) === 0 ? uncompressedTextureView!.slice() : null; - }); + return transcoder.decode(width, height) === 0 ? uncompressedTextureView!.slice() : null; } } diff --git a/packages/tools/ktx2Decoder/src/Transcoders/mscTranscoder.ts b/packages/tools/ktx2Decoder/src/Transcoders/mscTranscoder.ts index 577579c3bf2..9e9f859f764 100644 --- a/packages/tools/ktx2Decoder/src/Transcoders/mscTranscoder.ts +++ b/packages/tools/ktx2Decoder/src/Transcoders/mscTranscoder.ts @@ -47,60 +47,66 @@ export class MSCTranscoder extends Transcoder { private async _getMSCBasisTranscoder(): Promise { if (this._mscBasisTranscoderPromise) { - return this._mscBasisTranscoderPromise; + return await this._mscBasisTranscoderPromise; } this._mscBasisTranscoderPromise = ( MSCTranscoder.WasmBinary ? Promise.resolve(MSCTranscoder.WasmBinary) : WASMMemoryManager.LoadWASM(Transcoder.GetWasmUrl(MSCTranscoder.WasmModuleURL)) - ).then(async (wasmBinary) => { - if (MSCTranscoder.JSModule && typeof MSC_TRANSCODER === "undefined") { - // this must be set on the global scope for the MSC transcoder to work. Mainly due to back-compat with the old way of loading the MSC transcoder. - (globalThis as any).MSC_TRANSCODER = MSCTranscoder.JSModule; - } else { - if (MSCTranscoder.UseFromWorkerThread) { - importScripts(Transcoder.GetWasmUrl(MSCTranscoder.JSModuleURL)); - } - // Worker Number = 0 and MSC_TRANSCODER has not been loaded yet. - else if (typeof MSC_TRANSCODER === "undefined") { - return new Promise((resolve, reject) => { - const head = document.getElementsByTagName("head")[0]; - const script = document.createElement("script"); - script.setAttribute("type", "text/javascript"); - script.setAttribute("src", Transcoder.GetWasmUrl(MSCTranscoder.JSModuleURL)); - - script.onload = () => { - // defensive - if (typeof MSC_TRANSCODER === "undefined") { - reject("MSC_TRANSCODER script loaded but MSC_TRANSCODER is not defined."); - return; - } - - (MSC_TRANSCODER as any)({ wasmBinary }).then((basisModule: any) => { - basisModule.initTranscoders(); - this._mscBasisModule = basisModule; - resolve(); - }); - }; - - script.onerror = () => { - reject("Can not load MSC_TRANSCODER script."); - }; - - head.appendChild(script); - }); + ) + // eslint-disable-next-line github/no-then + .then(async (wasmBinary) => { + if (MSCTranscoder.JSModule && typeof MSC_TRANSCODER === "undefined") { + // this must be set on the global scope for the MSC transcoder to work. Mainly due to back-compat with the old way of loading the MSC transcoder. + (globalThis as any).MSC_TRANSCODER = MSCTranscoder.JSModule; + } else { + if (MSCTranscoder.UseFromWorkerThread) { + importScripts(Transcoder.GetWasmUrl(MSCTranscoder.JSModuleURL)); + } + // Worker Number = 0 and MSC_TRANSCODER has not been loaded yet. + else if (typeof MSC_TRANSCODER === "undefined") { + return await new Promise((resolve, reject) => { + const head = document.getElementsByTagName("head")[0]; + const script = document.createElement("script"); + script.setAttribute("type", "text/javascript"); + script.setAttribute("src", Transcoder.GetWasmUrl(MSCTranscoder.JSModuleURL)); + + script.onload = () => { + // defensive + if (typeof MSC_TRANSCODER === "undefined") { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors + reject("MSC_TRANSCODER script loaded but MSC_TRANSCODER is not defined."); + return; + } + + // eslint-disable-next-line github/no-then + (MSC_TRANSCODER as any)({ wasmBinary }).then((basisModule: any) => { + basisModule.initTranscoders(); + this._mscBasisModule = basisModule; + resolve(); + }); + }; + + script.onerror = () => { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors + reject("Can not load MSC_TRANSCODER script."); + }; + + head.appendChild(script); + }); + } } - } - return new Promise((resolve) => { - MSC_TRANSCODER({ wasmBinary }).then((basisModule: any) => { - basisModule.initTranscoders(); - this._mscBasisModule = basisModule; - resolve(); + return await new Promise((resolve) => { + // eslint-disable-next-line github/no-then + MSC_TRANSCODER({ wasmBinary }).then((basisModule: any) => { + basisModule.initTranscoders(); + this._mscBasisModule = basisModule; + resolve(); + }); }); }); - }); - return this._mscBasisTranscoderPromise; + return await this._mscBasisTranscoderPromise; } // eslint-disable-next-line @typescript-eslint/no-unused-vars @@ -122,7 +128,8 @@ export class MSCTranscoder extends Transcoder { ): Promise { const isVideo = false; - return this._getMSCBasisTranscoder().then(() => { + // eslint-disable-next-line github/no-then + return await this._getMSCBasisTranscoder().then(() => { const basisModule = this._mscBasisModule; let transcoder: any; diff --git a/packages/tools/ktx2Decoder/src/ktx2Decoder.ts b/packages/tools/ktx2Decoder/src/ktx2Decoder.ts index 41c4ac30042..189a6717365 100644 --- a/packages/tools/ktx2Decoder/src/ktx2Decoder.ts +++ b/packages/tools/ktx2Decoder/src/ktx2Decoder.ts @@ -45,27 +45,24 @@ export class KTX2Decoder { public async decode(data: Uint8Array, caps: KTX2.ICompressedFormatCapabilities, options?: KTX2.IKTX2DecoderOptions): Promise { const finalOptions = { ...options, ...KTX2Decoder.DefaultDecoderOptions }; - return Promise.resolve().then(async () => { - const kfr = new KTX2FileReader(data); + const kfr = new KTX2FileReader(data); - if (!kfr.isValid()) { - throw new Error("Invalid KT2 file: wrong signature"); - } - - kfr.parse(); + if (!kfr.isValid()) { + throw new Error("Invalid KT2 file: wrong signature"); + } - if (kfr.needZSTDDecoder) { - if (!this._zstdDecoder) { - this._zstdDecoder = new ZSTDDecoder(); - } + kfr.parse(); - return this._zstdDecoder.init().then(async () => { - return this._decodeDataAsync(kfr, caps, finalOptions); - }); + if (kfr.needZSTDDecoder) { + if (!this._zstdDecoder) { + this._zstdDecoder = new ZSTDDecoder(); } - return this._decodeDataAsync(kfr, caps, finalOptions); - }); + await this._zstdDecoder.init(); + return await this._decodeDataAsync(kfr, caps, finalOptions); + } + + return await this._decodeDataAsync(kfr, caps, finalOptions); } private async _decodeDataAsync(kfr: KTX2FileReader, caps: KTX2.ICompressedFormatCapabilities, options?: KTX2.IKTX2DecoderOptions): Promise { @@ -155,10 +152,12 @@ export class KTX2Decoder { const transcodedData = transcoder .transcode(srcTexFormat, transcodeFormat, level, levelWidth, levelHeight, levelUncompressedByteLength, kfr, imageDesc, encodedData) + // eslint-disable-next-line github/no-then .then((data) => { mipmap.data = data; return data; }) + // eslint-disable-next-line github/no-then .catch((reason) => { decodedData.errors = decodedData.errors ?? ""; decodedData.errors += reason + "\n" + reason.stack + "\n"; @@ -171,9 +170,8 @@ export class KTX2Decoder { } } - return Promise.all(dataPromises).then(() => { - return decodedData; - }); + await Promise.all(dataPromises); + return decodedData; } } diff --git a/packages/tools/ktx2Decoder/src/transcoder.ts b/packages/tools/ktx2Decoder/src/transcoder.ts index bf18a750c06..73681e5e3a3 100644 --- a/packages/tools/ktx2Decoder/src/transcoder.ts +++ b/packages/tools/ktx2Decoder/src/transcoder.ts @@ -47,6 +47,6 @@ export class Transcoder { imageDesc: IKTX2_ImageDesc | null, encodedData: Uint8Array ): Promise { - return Promise.resolve(null); + return null; } } diff --git a/packages/tools/ktx2Decoder/src/wasmMemoryManager.ts b/packages/tools/ktx2Decoder/src/wasmMemoryManager.ts index 3187aff864c..17f7d729ab7 100644 --- a/packages/tools/ktx2Decoder/src/wasmMemoryManager.ts +++ b/packages/tools/ktx2Decoder/src/wasmMemoryManager.ts @@ -12,16 +12,20 @@ export class WASMMemoryManager { public static async LoadWASM(path: string): Promise { if (this.LoadBinariesFromCurrentThread) { - return new Promise((resolve, reject) => { + return await new Promise((resolve, reject) => { fetch(path) + // eslint-disable-next-line github/no-then .then(async (response) => { if (response.ok) { - return response.arrayBuffer(); + return await response.arrayBuffer(); } throw new Error(`Could not fetch the wasm component from "${path}": ${response.status} - ${response.statusText}`); }) + // eslint-disable-next-line github/no-then .then((wasmBinary) => resolve(wasmBinary)) + // eslint-disable-next-line github/no-then .catch((reason) => { + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject(reason); }); }); @@ -29,7 +33,7 @@ export class WASMMemoryManager { const id = this._RequestId++; - return new Promise((resolve) => { + return await new Promise((resolve) => { const wasmLoadedHandler = (msg: any) => { if (msg.data.action === "wasmLoaded" && msg.data.id === id) { self.removeEventListener("message", wasmLoadedHandler); diff --git a/packages/tools/ktx2Decoder/src/zstddec.ts b/packages/tools/ktx2Decoder/src/zstddec.ts index f40b1077d3f..4b982cca7b4 100644 --- a/packages/tools/ktx2Decoder/src/zstddec.ts +++ b/packages/tools/ktx2Decoder/src/zstddec.ts @@ -34,28 +34,32 @@ export class ZSTDDecoder { async init(): Promise { if (init) { - return init; + return await init; } if (typeof fetch !== "undefined") { // Web. init = fetch(Transcoder.GetWasmUrl(ZSTDDecoder.WasmModuleURL)) + // eslint-disable-next-line github/no-then .then(async (response) => { if (response.ok) { - return response.arrayBuffer(); + return await response.arrayBuffer(); } throw new Error(`Could not fetch the wasm component for the Zstandard decompression lib: ${response.status} - ${response.statusText}`); }) - .then(async (arrayBuffer) => WebAssembly.instantiate(arrayBuffer, IMPORT_OBJECT)) + // eslint-disable-next-line github/no-then + .then(async (arrayBuffer) => await WebAssembly.instantiate(arrayBuffer, IMPORT_OBJECT)) + // eslint-disable-next-line github/no-then .then(this._init); } else { // Node.js. + // eslint-disable-next-line github/no-then init = WebAssembly.instantiateStreaming(fetch(ZSTDDecoder.WasmModuleURL), IMPORT_OBJECT).then(this._init); } - return init; + return await init; } _init(result: WebAssembly.WebAssemblyInstantiatedSource): void { diff --git a/packages/tools/nodeEditor/src/components/nodeList/nodeListComponent.tsx b/packages/tools/nodeEditor/src/components/nodeList/nodeListComponent.tsx index a9119518979..a864d749953 100644 --- a/packages/tools/nodeEditor/src/components/nodeList/nodeListComponent.tsx +++ b/packages/tools/nodeEditor/src/components/nodeList/nodeListComponent.tsx @@ -234,6 +234,7 @@ export class NodeListComponent extends React.Component { // get Frame Data from file const decoder = new TextDecoder("utf-8"); @@ -282,6 +283,7 @@ export class NodeListComponent extends React.Component { // get Block Data from file const decoder = new TextDecoder("utf-8"); diff --git a/packages/tools/nodeEditor/src/components/preview/previewAreaComponent.tsx b/packages/tools/nodeEditor/src/components/preview/previewAreaComponent.tsx index 1f1b5a26d5a..424c21944d7 100644 --- a/packages/tools/nodeEditor/src/components/preview/previewAreaComponent.tsx +++ b/packages/tools/nodeEditor/src/components/preview/previewAreaComponent.tsx @@ -16,6 +16,7 @@ import { BlendModeOptions } from "shared-ui-components/constToOptionsMaps"; interface IPreviewAreaComponentProps { globalState: GlobalState; + onMounted?: () => void; } export class PreviewAreaComponent extends React.Component { @@ -28,13 +29,19 @@ export class PreviewAreaComponent extends React.Component this.setState({ isLoading: state })); + this._onIsLoadingChangedObserver = this.props.globalState.onIsLoadingChanged.add((state) => { + this.setState({ isLoading: state }); + }); this._onResetRequiredObserver = this.props.globalState.onResetRequiredObservable.add(() => { this.forceUpdate(); }); } + override componentDidMount() { + this.props.onMounted?.(); + } + override componentWillUnmount() { this.props.globalState.onIsLoadingChanged.remove(this._onIsLoadingChangedObserver); this.props.globalState.onResetRequiredObservable.remove(this._onResetRequiredObserver); @@ -113,7 +120,8 @@ export class PreviewAreaComponent extends React.Component this.onKeyUp(evt)} - onPointerMove={async (evt) => this.processPointerMove(evt)} + // eslint-disable-next-line @typescript-eslint/no-misused-promises + onPointerMove={async (evt) => await this.processPointerMove(evt)} /> {
Please wait, loading...
}
diff --git a/packages/tools/nodeEditor/src/components/preview/previewManager.ts b/packages/tools/nodeEditor/src/components/preview/previewManager.ts index ac19b404ea2..e3f37db3f19 100644 --- a/packages/tools/nodeEditor/src/components/preview/previewManager.ts +++ b/packages/tools/nodeEditor/src/components/preview/previewManager.ts @@ -1,3 +1,5 @@ +/* eslint-disable github/no-then */ +/* eslint-disable @typescript-eslint/no-floating-promises */ import type { GlobalState } from "../../globalState"; import { NodeMaterial } from "core/Materials/Node/nodeMaterial"; import type { Nullable } from "core/types"; @@ -648,7 +650,7 @@ export class PreviewManager { } private async _forceCompilationAsync(material: NodeMaterial, mesh: AbstractMesh): Promise { - return material.forceCompilationAsync(mesh); + return await material.forceCompilationAsync(mesh); } private _updatePreview() { @@ -740,7 +742,7 @@ export class PreviewManager { if (this._meshes && this._meshes.length) { const tasks = this._meshes.map(async (m) => { m.hasVertexAlpha = false; - return this._forceCompilationAsync(tempMaterial, m); + return await this._forceCompilationAsync(tempMaterial, m); }); Promise.all(tasks) diff --git a/packages/tools/nodeEditor/src/components/preview/previewMeshControlComponent.tsx b/packages/tools/nodeEditor/src/components/preview/previewMeshControlComponent.tsx index f1892c0a2da..057e46b3aad 100644 --- a/packages/tools/nodeEditor/src/components/preview/previewMeshControlComponent.tsx +++ b/packages/tools/nodeEditor/src/components/preview/previewMeshControlComponent.tsx @@ -17,6 +17,7 @@ import { OptionsLine } from "shared-ui-components/lines/optionsLineComponent"; interface IPreviewMeshControlComponent { globalState: GlobalState; togglePreviewAreaComponent: () => void; + onMounted?: () => void; } export class PreviewMeshControlComponent extends React.Component { @@ -52,6 +53,10 @@ export class PreviewMeshControlComponent extends React.Component { this.props.globalState.onLogRequiredObservable.notifyObservers(new LogEntry("Material saved successfully", false)); this.setState({ uploadInProgress: false }); }) + // eslint-disable-next-line github/no-then .catch((err) => { this.props.globalState.onLogRequiredObservable.notifyObservers(new LogEntry(err, true)); this.setState({ uploadInProgress: false }); @@ -270,6 +272,7 @@ export class PropertyTabComponent extends React.Component { material.build(); if (!this.changeMode(this.props.globalState.nodeMaterial.mode, true, false)) { @@ -330,6 +334,7 @@ export class PropertyTabComponent extends React.Component { this.props.globalState.hostDocument.defaultView!.alert("Unable to load your node material: " + err); }); diff --git a/packages/tools/nodeEditor/src/graphEditor.tsx b/packages/tools/nodeEditor/src/graphEditor.tsx index adc4864730c..d3baf0dbc0f 100644 --- a/packages/tools/nodeEditor/src/graphEditor.tsx +++ b/packages/tools/nodeEditor/src/graphEditor.tsx @@ -529,13 +529,14 @@ export class GraphEditor extends React.Component { + // eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/no-misused-promises + onWindowCreateCallback: async (w) => { popUpWindow = w; if (popUpWindow) { popUpWindow.addEventListener("beforeunload", this.handleClosingPopUp); const parentControl = popUpWindow.document.getElementById("node-editor-graph-root"); - this.createPreviewMeshControlHost(options, parentControl); - this.createPreviewHost(options, parentControl); + await this.createPreviewMeshControlHostAsync(options, parentControl); + await this.createPreviewHostAsync(options, parentControl); if (parentControl) { this.fixPopUpStyles(parentControl.ownerDocument); this.initiatePreviewArea(parentControl.ownerDocument.getElementById("preview-canvas") as HTMLCanvasElement); @@ -545,54 +546,66 @@ export class GraphEditor extends React.Component) => { + createPreviewMeshControlHostAsync = async (options: IInternalPreviewAreaOptions, parentControl: Nullable) => { // Prepare the preview control host - if (parentControl) { - const host = parentControl.ownerDocument.createElement("div"); - - host.id = "PreviewMeshControl-host"; - host.style.width = options.embedHostWidth || "auto"; - - parentControl.appendChild(host); - const previewMeshControlComponentHost = React.createElement(PreviewMeshControlComponent, { - globalState: this.props.globalState, - togglePreviewAreaComponent: this.handlePopUp, - }); - const root = createRoot(host); - root.render(previewMeshControlComponentHost); - } + return await new Promise((resolve) => { + if (parentControl) { + const host = parentControl.ownerDocument.createElement("div"); + + host.id = "PreviewMeshControl-host"; + host.style.width = options.embedHostWidth || "auto"; + + parentControl.appendChild(host); + const previewMeshControlComponentHost = React.createElement(PreviewMeshControlComponent, { + globalState: this.props.globalState, + togglePreviewAreaComponent: this.handlePopUp, + onMounted: () => { + resolve(true); + }, + }); + const root = createRoot(host); + root.render(previewMeshControlComponentHost); + } + resolve(false); + }); }; - createPreviewHost = (options: IInternalPreviewAreaOptions, parentControl: Nullable) => { - // Prepare the preview host - if (parentControl) { - const host = parentControl.ownerDocument.createElement("div"); + createPreviewHostAsync = async (options: IInternalPreviewAreaOptions, parentControl: Nullable) => { + return await new Promise((resolve) => { + // Prepare the preview host + if (parentControl) { + const host = parentControl.ownerDocument.createElement("div"); - host.id = "PreviewAreaComponent-host"; - host.style.width = options.embedHostWidth || "auto"; - host.style.height = "100%"; - host.style.overflow = "hidden"; - host.style.display = "grid"; - host.style.gridRow = "2"; - host.style.gridTemplateRows = "auto 40px"; - host.style.gridTemplateRows = "calc(100% - 40px) 40px"; + host.id = "PreviewAreaComponent-host"; + host.style.width = options.embedHostWidth || "auto"; + host.style.height = "100%"; + host.style.overflow = "hidden"; + host.style.display = "grid"; + host.style.gridRow = "2"; + host.style.gridTemplateRows = "auto 40px"; + host.style.gridTemplateRows = "calc(100% - 40px) 40px"; - parentControl.appendChild(host); + parentControl.appendChild(host); - this._previewHost = host; + this._previewHost = host; - if (!options.overlay) { - this._previewHost.style.position = "relative"; + if (!options.overlay) { + this._previewHost.style.position = "relative"; + } } - } - if (this._previewHost) { - const previewAreaComponentHost = React.createElement(PreviewAreaComponent, { - globalState: this.props.globalState, - }); - const root = createRoot(this._previewHost); - root.render(previewAreaComponentHost); - } + if (this._previewHost) { + const previewAreaComponentHost = React.createElement(PreviewAreaComponent, { + globalState: this.props.globalState, + onMounted: () => { + resolve(true); + }, + }); + const root = createRoot(this._previewHost); + root.render(previewAreaComponentHost); + } + resolve(false); + }); }; fixPopUpStyles = (document: Document) => { diff --git a/packages/tools/nodeEditor/src/graphSystem/display/imageSourceDisplayManager.ts b/packages/tools/nodeEditor/src/graphSystem/display/imageSourceDisplayManager.ts index b036847b0a1..9fc5a78a846 100644 --- a/packages/tools/nodeEditor/src/graphSystem/display/imageSourceDisplayManager.ts +++ b/packages/tools/nodeEditor/src/graphSystem/display/imageSourceDisplayManager.ts @@ -40,6 +40,7 @@ export class ImageSourceDisplayManager implements IDisplayManager { } if (imageSourceBlock.texture) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises TextureLineComponent.UpdatePreview( this._previewCanvas, imageSourceBlock.texture, diff --git a/packages/tools/nodeEditor/src/graphSystem/display/textureDisplayManager.ts b/packages/tools/nodeEditor/src/graphSystem/display/textureDisplayManager.ts index f0b9d1c36d3..759212b8163 100644 --- a/packages/tools/nodeEditor/src/graphSystem/display/textureDisplayManager.ts +++ b/packages/tools/nodeEditor/src/graphSystem/display/textureDisplayManager.ts @@ -62,6 +62,7 @@ export class TextureDisplayManager implements IDisplayManager { } if (textureBlock.texture) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises TextureLineComponent.UpdatePreview( this._previewCanvas, textureBlock.texture, diff --git a/packages/tools/nodeEditor/src/sharedComponents/textureLineComponent.tsx b/packages/tools/nodeEditor/src/sharedComponents/textureLineComponent.tsx index 62e5fdc2368..15da1c6de10 100644 --- a/packages/tools/nodeEditor/src/sharedComponents/textureLineComponent.tsx +++ b/packages/tools/nodeEditor/src/sharedComponents/textureLineComponent.tsx @@ -53,6 +53,7 @@ export class TextureLineComponent extends React.Component { + // eslint-disable-next-line @typescript-eslint/no-floating-promises TextureLineComponent.UpdatePreview(previewCanvas, texture, width, options, onReady, globalState); }); } diff --git a/packages/tools/nodeGeometryEditor/src/components/preview/previewAreaComponent.tsx b/packages/tools/nodeGeometryEditor/src/components/preview/previewAreaComponent.tsx index ae2ccbe65cb..7f61b1a0cc2 100644 --- a/packages/tools/nodeGeometryEditor/src/components/preview/previewAreaComponent.tsx +++ b/packages/tools/nodeGeometryEditor/src/components/preview/previewAreaComponent.tsx @@ -11,6 +11,7 @@ import { PreviewMode } from "./previewMode"; interface IPreviewAreaComponentProps { globalState: GlobalState; + onMounted?: () => void; } export class PreviewAreaComponent extends React.Component { @@ -21,7 +22,9 @@ export class PreviewAreaComponent extends React.Component this.setState({ isLoading: state })); + this._onIsLoadingChangedObserver = this.props.globalState.onIsLoadingChanged.add((state) => { + this.setState({ isLoading: state }); + }); this._onResetRequiredObserver = this.props.globalState.onResetRequiredObservable.add(() => { this.forceUpdate(); @@ -33,6 +36,10 @@ export class PreviewAreaComponent extends React.Component { this.props.globalState.pointerOverCanvas = true; }; diff --git a/packages/tools/nodeGeometryEditor/src/components/preview/previewManager.ts b/packages/tools/nodeGeometryEditor/src/components/preview/previewManager.ts index 030e14a1dd6..749d422995c 100644 --- a/packages/tools/nodeGeometryEditor/src/components/preview/previewManager.ts +++ b/packages/tools/nodeGeometryEditor/src/components/preview/previewManager.ts @@ -64,10 +64,12 @@ export class PreviewManager { } const currentMat = this._mesh.material; this._mesh.material = this._matStd; + // eslint-disable-next-line @typescript-eslint/no-floating-promises GLTF2Export.GLBAsync(this._scene, "node-geometry-scene", { shouldExportNode: (node) => { return !node.doNotSerialize; }, + // eslint-disable-next-line github/no-then }).then((glb: GLTFData) => { this._mesh!.material = currentMat; glb.downloadFiles(); @@ -309,9 +311,11 @@ export class PreviewManager { } if (this._matNME.snippetId !== nmeID) { NodeMaterial.ParseFromSnippetAsync(nmeID, this._scene, "", this._matNME) + // eslint-disable-next-line github/no-then .then(() => { this._matNME.build(); }) + // eslint-disable-next-line github/no-then .catch((err) => { this._globalState.hostDocument.defaultView!.alert("Unable to load your node material: " + err); }); diff --git a/packages/tools/nodeGeometryEditor/src/components/preview/previewMeshControlComponent.tsx b/packages/tools/nodeGeometryEditor/src/components/preview/previewMeshControlComponent.tsx index 8b45afe0171..84f057fb5e4 100644 --- a/packages/tools/nodeGeometryEditor/src/components/preview/previewMeshControlComponent.tsx +++ b/packages/tools/nodeGeometryEditor/src/components/preview/previewMeshControlComponent.tsx @@ -16,6 +16,7 @@ import offsetIcon from "./svgs/offset.svg"; interface IPreviewMeshControlComponent { globalState: GlobalState; togglePreviewAreaComponent: () => void; + onMounted?: () => void; } interface IPreviewMeshControlComponentState { @@ -47,6 +48,10 @@ export class PreviewMeshControlComponent extends React.Component { + // eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/no-misused-promises + onWindowCreateCallback: async (w) => { popUpWindow = w; if (popUpWindow) { popUpWindow.addEventListener("beforeunload", this.handleClosingPopUp); const parentControl = popUpWindow.document.getElementById("node-geometry-editor-graph-root"); - this.createPreviewMeshControlHost(options, parentControl); - this.createPreviewHost(options, parentControl); + await this.createPreviewMeshControlHostAsync(options, parentControl); + await this.createPreviewHostAsync(options, parentControl); if (parentControl) { this.fixPopUpStyles(parentControl.ownerDocument); this.initiatePreviewArea(parentControl.ownerDocument.getElementById("preview-canvas") as HTMLCanvasElement); @@ -537,54 +538,66 @@ export class GraphEditor extends React.Component) => { + createPreviewMeshControlHostAsync = async (options: IInternalPreviewAreaOptions, parentControl: Nullable) => { // Prepare the preview control host - if (parentControl) { - const host = parentControl.ownerDocument.createElement("div"); - - host.id = "PreviewMeshControl-host"; - host.style.width = options.embedHostWidth || "auto"; - - parentControl.appendChild(host); - const previewMeshControlComponentHost = React.createElement(PreviewMeshControlComponent, { - globalState: this.props.globalState, - togglePreviewAreaComponent: this.handlePopUp, - }); - const reactRoot = createRoot(host); - reactRoot.render(previewMeshControlComponentHost); - } + return await new Promise((resolve) => { + if (parentControl) { + const host = parentControl.ownerDocument.createElement("div"); + + host.id = "PreviewMeshControl-host"; + host.style.width = options.embedHostWidth || "auto"; + + parentControl.appendChild(host); + const previewMeshControlComponentHost = React.createElement(PreviewMeshControlComponent, { + globalState: this.props.globalState, + togglePreviewAreaComponent: this.handlePopUp, + onMounted: () => { + resolve(true); + }, + }); + const root = createRoot(host); + root.render(previewMeshControlComponentHost); + } + resolve(false); + }); }; - createPreviewHost = (options: IInternalPreviewAreaOptions, parentControl: Nullable) => { - // Prepare the preview host - if (parentControl) { - const host = parentControl.ownerDocument.createElement("div"); + createPreviewHostAsync = async (options: IInternalPreviewAreaOptions, parentControl: Nullable) => { + return await new Promise((resolve) => { + // Prepare the preview host + if (parentControl) { + const host = parentControl.ownerDocument.createElement("div"); - host.id = "PreviewAreaComponent-host"; - host.style.width = options.embedHostWidth || "auto"; - host.style.height = "100%"; - host.style.overflow = "hidden"; - host.style.display = "grid"; - host.style.gridRow = "2"; - host.style.gridTemplateRows = "auto 40px"; - host.style.gridTemplateRows = "calc(100% - 40px) 40px"; + host.id = "PreviewAreaComponent-host"; + host.style.width = options.embedHostWidth || "auto"; + host.style.height = "100%"; + host.style.overflow = "hidden"; + host.style.display = "grid"; + host.style.gridRow = "2"; + host.style.gridTemplateRows = "auto 40px"; + host.style.gridTemplateRows = "calc(100% - 40px) 40px"; - parentControl.appendChild(host); + parentControl.appendChild(host); - this._previewHost = host; + this._previewHost = host; - if (!options.overlay) { - this._previewHost.style.position = "relative"; + if (!options.overlay) { + this._previewHost.style.position = "relative"; + } } - } - if (this._previewHost) { - const previewAreaComponentHost = React.createElement(PreviewAreaComponent, { - globalState: this.props.globalState, - }); - const reactRoot = createRoot(this._previewHost); - reactRoot.render(previewAreaComponentHost); - } + if (this._previewHost) { + const previewAreaComponentHost = React.createElement(PreviewAreaComponent, { + globalState: this.props.globalState, + onMounted: () => { + resolve(true); + }, + }); + const root = createRoot(this._previewHost); + root.render(previewAreaComponentHost); + } + resolve(false); + }); }; fixPopUpStyles = (document: Document) => { diff --git a/packages/tools/nodeGeometryEditor/src/graphSystem/properties/meshNodePropertyComponent.tsx b/packages/tools/nodeGeometryEditor/src/graphSystem/properties/meshNodePropertyComponent.tsx index c0e90fbae88..1ddea69d2fb 100644 --- a/packages/tools/nodeGeometryEditor/src/graphSystem/properties/meshNodePropertyComponent.tsx +++ b/packages/tools/nodeGeometryEditor/src/graphSystem/properties/meshNodePropertyComponent.tsx @@ -83,7 +83,7 @@ export class MeshPropertyTabComponent extends React.Component {this.state.isLoading && } - {!this.state.isLoading && this.loadMesh(file)} accept=".glb, .babylon" />} + {!this.state.isLoading && await this.loadMesh(file)} accept=".glb, .babylon" />} {scene && ( - this.loadTextureData(file)} accept=".jpg, .png, .tga, .exr" /> + await this.loadTextureData(file)} accept=".jpg, .png, .tga, .exr" /> {block.textureData && this.removeData()} />} diff --git a/packages/tools/nodeGeometryEditor/src/sharedComponents/textureLineComponent.tsx b/packages/tools/nodeGeometryEditor/src/sharedComponents/textureLineComponent.tsx index 0193ea41b60..d16f1bc9f37 100644 --- a/packages/tools/nodeGeometryEditor/src/sharedComponents/textureLineComponent.tsx +++ b/packages/tools/nodeGeometryEditor/src/sharedComponents/textureLineComponent.tsx @@ -53,6 +53,7 @@ export class TextureLineComponent extends React.Component { + // eslint-disable-next-line @typescript-eslint/no-floating-promises TextureLineComponent.UpdatePreview(previewCanvas, texture, width, options, onReady, globalState); }); } @@ -91,7 +93,7 @@ export class TextureLineComponent extends React.Component TextureLineComponent.UpdatePreview(previewCanvas, texture, width, options, onReady, globalState), 250); + setTimeout(async () => await TextureLineComponent.UpdatePreview(previewCanvas, texture, width, options, onReady, globalState), 250); return; } diff --git a/packages/tools/nodeRenderGraphEditor/src/blockTools.ts b/packages/tools/nodeRenderGraphEditor/src/blockTools.ts index 48d6cb3e740..ccb60ba89c7 100644 --- a/packages/tools/nodeRenderGraphEditor/src/blockTools.ts +++ b/packages/tools/nodeRenderGraphEditor/src/blockTools.ts @@ -34,6 +34,7 @@ import { NodeRenderGraphChromaticAberrationPostProcessBlock } from "core/FrameGr import { NodeRenderGraphImageProcessingPostProcessBlock } from "core/FrameGraph/Node/Blocks/PostProcesses/imageProcessingPostProcessBlock"; import { NodeRenderGraphFXAAPostProcessBlock } from "core/FrameGraph/Node/Blocks/PostProcesses/fxaaPostProcessBlock"; import { NodeRenderGraphGrainPostProcessBlock } from "core/FrameGraph/Node/Blocks/PostProcesses/grainPostProcessBlock"; +import { NodeRenderGraphMotionBlurPostProcessBlock } from "core/FrameGraph/Node/Blocks/PostProcesses/motionBlurPostProcessBlock"; /** * Static class for BlockTools @@ -159,6 +160,9 @@ export class BlockTools { case "GrainBlock": { return new NodeRenderGraphGrainPostProcessBlock("Grain", frameGraph, scene); } + case "MotionBlurBlock": { + return new NodeRenderGraphMotionBlurPostProcessBlock("Motion Blur", frameGraph, scene); + } } return null; diff --git a/packages/tools/nodeRenderGraphEditor/src/components/nodeList/nodeListComponent.tsx b/packages/tools/nodeRenderGraphEditor/src/components/nodeList/nodeListComponent.tsx index 56a2d18df30..aab164e020e 100644 --- a/packages/tools/nodeRenderGraphEditor/src/components/nodeList/nodeListComponent.tsx +++ b/packages/tools/nodeRenderGraphEditor/src/components/nodeList/nodeListComponent.tsx @@ -62,6 +62,7 @@ export class NodeListComponent extends React.Component void; } export class PreviewAreaComponent extends React.Component { @@ -20,7 +21,9 @@ export class PreviewAreaComponent extends React.Component this.setState({ isLoading: state })); + this._onIsLoadingChangedObserver = this.props.globalState.onIsLoadingChanged.add((state) => { + this.setState({ isLoading: state }); + }); this._onResetRequiredObserver = this.props.globalState.onResetRequiredObservable.add(() => { this.forceUpdate(); @@ -32,6 +35,10 @@ export class PreviewAreaComponent extends React.Component { this.props.globalState.pointerOverCanvas = true; }; diff --git a/packages/tools/nodeRenderGraphEditor/src/components/preview/previewManager.ts b/packages/tools/nodeRenderGraphEditor/src/components/preview/previewManager.ts index daf0fa81d96..f49ef707040 100644 --- a/packages/tools/nodeRenderGraphEditor/src/components/preview/previewManager.ts +++ b/packages/tools/nodeRenderGraphEditor/src/components/preview/previewManager.ts @@ -1,3 +1,5 @@ +/* eslint-disable github/no-then */ +/* eslint-disable @typescript-eslint/no-floating-promises */ import type { GlobalState } from "../../globalState"; import type { Nullable } from "core/types"; import type { Observer } from "core/Misc/observable"; @@ -84,6 +86,7 @@ export class PreviewManager { this._createNodeRenderGraph(); }); + // eslint-disable-next-line @typescript-eslint/no-floating-promises this._initAsync(targetCanvas); } @@ -131,7 +134,7 @@ export class PreviewManager { this._dummyExternalTexture = new Texture("https://assets.babylonjs.com/textures/Checker_albedo.png", this._scene, true); this._dummyExternalTexture.name = "Dummy external texture for preview NRGE"; - return new Promise((resolve) => { + return await new Promise((resolve) => { this._dummyExternalTexture.onLoadObservable.add(() => { this._prepareBackgroundHDR(); @@ -254,6 +257,7 @@ export class PreviewManager { debugTextures: DebugTextures, }); + // eslint-disable-next-line @typescript-eslint/no-floating-promises this._buildGraphAsync(); (window as any).nrgPreview = this._nodeRenderGraph; diff --git a/packages/tools/nodeRenderGraphEditor/src/components/preview/previewMeshControlComponent.tsx b/packages/tools/nodeRenderGraphEditor/src/components/preview/previewMeshControlComponent.tsx index 8fbf1b51976..af7bfdfe6d5 100644 --- a/packages/tools/nodeRenderGraphEditor/src/components/preview/previewMeshControlComponent.tsx +++ b/packages/tools/nodeRenderGraphEditor/src/components/preview/previewMeshControlComponent.tsx @@ -13,6 +13,7 @@ import frameIcon from "./svgs/frameIcon.svg"; interface IPreviewMeshControlComponent { globalState: GlobalState; togglePreviewAreaComponent: () => void; + onMounted?: () => void; } export class PreviewMeshControlComponent extends React.Component { @@ -46,6 +47,10 @@ export class PreviewMeshControlComponent extends React.Component { this.props.globalState.onLogRequiredObservable.notifyObservers(new LogEntry("Render graph saved successfully", false)); this.setState({ uploadInProgress: false }); }) + // eslint-disable-next-line github/no-then .catch((err) => { this.props.globalState.onLogRequiredObservable.notifyObservers(new LogEntry(err, true)); this.setState({ uploadInProgress: false }); @@ -145,6 +147,7 @@ export class PropertyTabComponent extends React.Component { renderGraph.build(); this.props.globalState.onFrame.notifyObservers(); this.props.globalState.onClearUndoStack.notifyObservers(); }) + // eslint-disable-next-line github/no-then .catch((err) => { this.props.globalState.hostDocument.defaultView!.alert("Unable to load your node render graph: " + err); }); diff --git a/packages/tools/nodeRenderGraphEditor/src/graphEditor.tsx b/packages/tools/nodeRenderGraphEditor/src/graphEditor.tsx index 7cf6a84afcf..c2816ee7ba7 100644 --- a/packages/tools/nodeRenderGraphEditor/src/graphEditor.tsx +++ b/packages/tools/nodeRenderGraphEditor/src/graphEditor.tsx @@ -589,13 +589,14 @@ export class GraphEditor extends React.Component { + // eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/no-misused-promises + onWindowCreateCallback: async (w) => { popUpWindow = w; if (popUpWindow) { popUpWindow.addEventListener("beforeunload", this.handleClosingPopUp); const parentControl = popUpWindow.document.getElementById("node-render-graph-editor-graph-root"); - this.createPreviewMeshControlHost(options, parentControl); - this.createPreviewHost(options, parentControl); + await this.createPreviewMeshControlHostAsync(options, parentControl); + await this.createPreviewHostAsync(options, parentControl); if (parentControl) { this.fixPopUpStyles(parentControl.ownerDocument); this.initiatePreviewArea(parentControl.ownerDocument.getElementById("preview-canvas") as HTMLCanvasElement); @@ -605,54 +606,66 @@ export class GraphEditor extends React.Component) => { + createPreviewMeshControlHostAsync = async (options: IInternalPreviewAreaOptions, parentControl: Nullable) => { // Prepare the preview control host - if (parentControl) { - const host = parentControl.ownerDocument.createElement("div"); - - host.id = "PreviewMeshControl-host"; - host.style.width = options.embedHostWidth || "auto"; - - parentControl.appendChild(host); - const previewMeshControlComponentHost = React.createElement(PreviewMeshControlComponent, { - globalState: this.props.globalState, - togglePreviewAreaComponent: this.handlePopUp, - }); - const root = createRoot(host); - root.render(previewMeshControlComponentHost); - } + return await new Promise((resolve) => { + if (parentControl) { + const host = parentControl.ownerDocument.createElement("div"); + + host.id = "PreviewMeshControl-host"; + host.style.width = options.embedHostWidth || "auto"; + + parentControl.appendChild(host); + const previewMeshControlComponentHost = React.createElement(PreviewMeshControlComponent, { + globalState: this.props.globalState, + togglePreviewAreaComponent: this.handlePopUp, + onMounted: () => { + resolve(true); + }, + }); + const root = createRoot(host); + root.render(previewMeshControlComponentHost); + } + resolve(false); + }); }; - createPreviewHost = (options: IInternalPreviewAreaOptions, parentControl: Nullable) => { - // Prepare the preview host - if (parentControl) { - const host = parentControl.ownerDocument.createElement("div"); + createPreviewHostAsync = async (options: IInternalPreviewAreaOptions, parentControl: Nullable) => { + return await new Promise((resolve) => { + // Prepare the preview host + if (parentControl) { + const host = parentControl.ownerDocument.createElement("div"); - host.id = "PreviewAreaComponent-host"; - host.style.width = options.embedHostWidth || "auto"; - host.style.height = "100%"; - host.style.overflow = "hidden"; - host.style.display = "grid"; - host.style.gridRow = "2"; - host.style.gridTemplateRows = "auto 40px"; - host.style.gridTemplateRows = "calc(100% - 40px) 40px"; + host.id = "PreviewAreaComponent-host"; + host.style.width = options.embedHostWidth || "auto"; + host.style.height = "100%"; + host.style.overflow = "hidden"; + host.style.display = "grid"; + host.style.gridRow = "2"; + host.style.gridTemplateRows = "auto 40px"; + host.style.gridTemplateRows = "calc(100% - 40px) 40px"; - parentControl.appendChild(host); + parentControl.appendChild(host); - this._previewHost = host; + this._previewHost = host; - if (!options.overlay) { - this._previewHost.style.position = "relative"; + if (!options.overlay) { + this._previewHost.style.position = "relative"; + } } - } - if (this._previewHost) { - const previewAreaComponentHost = React.createElement(PreviewAreaComponent, { - globalState: this.props.globalState, - }); - const root = createRoot(this._previewHost); - root.render(previewAreaComponentHost); - } + if (this._previewHost) { + const previewAreaComponentHost = React.createElement(PreviewAreaComponent, { + globalState: this.props.globalState, + onMounted: () => { + resolve(true); + }, + }); + const root = createRoot(this._previewHost); + root.render(previewAreaComponentHost); + } + resolve(false); + }); }; fixPopUpStyles = (document: Document) => { diff --git a/packages/tools/nodeRenderGraphEditor/src/sharedComponents/textureLineComponent.tsx b/packages/tools/nodeRenderGraphEditor/src/sharedComponents/textureLineComponent.tsx index 0193ea41b60..d16f1bc9f37 100644 --- a/packages/tools/nodeRenderGraphEditor/src/sharedComponents/textureLineComponent.tsx +++ b/packages/tools/nodeRenderGraphEditor/src/sharedComponents/textureLineComponent.tsx @@ -53,6 +53,7 @@ export class TextureLineComponent extends React.Component { + // eslint-disable-next-line @typescript-eslint/no-floating-promises TextureLineComponent.UpdatePreview(previewCanvas, texture, width, options, onReady, globalState); }); } @@ -91,7 +93,7 @@ export class TextureLineComponent extends React.Component TextureLineComponent.UpdatePreview(previewCanvas, texture, width, options, onReady, globalState), 250); + setTimeout(async () => await TextureLineComponent.UpdatePreview(previewCanvas, texture, width, options, onReady, globalState), 250); return; } diff --git a/packages/tools/playground/public/index.html b/packages/tools/playground/public/index.html index 704965a550f..a1d354bb349 100644 --- a/packages/tools/playground/public/index.html +++ b/packages/tools/playground/public/index.html @@ -1,60 +1,82 @@  - - - - - Babylon.js Playground - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - + } + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/tools/playground/public/libs/recast.js b/packages/tools/playground/public/libs/recast.js new file mode 100644 index 00000000000..ec48483c52a --- /dev/null +++ b/packages/tools/playground/public/libs/recast.js @@ -0,0 +1,6 @@ +import * as Recast from "@recast-navigation/core"; +import * as Generators from "@recast-navigation/generators"; + +await Recast.init(); +window.Recast = Recast; +window.RecastGenerators = Generators; diff --git a/packages/tools/playground/src/components/commandBarComponent.tsx b/packages/tools/playground/src/components/commandBarComponent.tsx index 7174449f35f..7e6b8d842ee 100644 --- a/packages/tools/playground/src/components/commandBarComponent.tsx +++ b/packages/tools/playground/src/components/commandBarComponent.tsx @@ -1,3 +1,4 @@ +/* eslint-disable github/no-then */ import * as React from "react"; import type { GlobalState } from "../globalState"; import { CommandButtonComponent } from "./commandButtonComponent"; @@ -29,7 +30,7 @@ export class CommandBarComponent extends React.Component response.json()) + .then(async (response) => await response.json()) .then((data) => { this._procedural = data; this._load(); @@ -45,6 +46,7 @@ export class CommandBarComponent extends React.Component { this._webGPUSupported = result; if (location.search.indexOf("webgpu") !== -1 && this._webGPUSupported) { diff --git a/packages/tools/playground/src/components/examplesComponent.tsx b/packages/tools/playground/src/components/examplesComponent.tsx index 7b2f42ec466..ce093b33b55 100644 --- a/packages/tools/playground/src/components/examplesComponent.tsx +++ b/packages/tools/playground/src/components/examplesComponent.tsx @@ -31,6 +31,7 @@ export class ExamplesComponent extends React.Component { this._webGPUSupported = result; if (location.search.indexOf("webgpu") !== -1 && this._webGPUSupported) { diff --git a/packages/tools/playground/src/components/monacoComponent.tsx b/packages/tools/playground/src/components/monacoComponent.tsx index 70a650f8e88..be1065739af 100644 --- a/packages/tools/playground/src/components/monacoComponent.tsx +++ b/packages/tools/playground/src/components/monacoComponent.tsx @@ -30,6 +30,7 @@ export class MonacoComponent extends React.Component { override componentDidMount() { const hostElement = this.props.refObject.current!; + // eslint-disable-next-line @typescript-eslint/no-floating-promises this._monacoManager.setupMonacoAsync(hostElement, true); } diff --git a/packages/tools/playground/src/components/rendererComponent.tsx b/packages/tools/playground/src/components/rendererComponent.tsx index 9477170f0d6..a1d843e763a 100644 --- a/packages/tools/playground/src/components/rendererComponent.tsx +++ b/packages/tools/playground/src/components/rendererComponent.tsx @@ -1,3 +1,5 @@ +/* eslint-disable github/no-then */ +/* eslint-disable @typescript-eslint/no-floating-promises */ import * as React from "react"; import type { GlobalState } from "../globalState"; import { RuntimeMode } from "../globalState"; @@ -40,6 +42,7 @@ export class RenderingComponent extends React.Component { + // eslint-disable-next-line @typescript-eslint/no-floating-promises this._compileAndRunAsync(); }); @@ -97,7 +100,7 @@ export class RenderingComponent extends React.Component { - return new Promise((resolve) => { + return await new Promise((resolve) => { const script = document.createElement("script"); script.setAttribute("type", "text/javascript"); script.setAttribute("src", url); diff --git a/packages/tools/playground/src/globalState.ts b/packages/tools/playground/src/globalState.ts index 990baaadb96..475f047981a 100644 --- a/packages/tools/playground/src/globalState.ts +++ b/packages/tools/playground/src/globalState.ts @@ -25,7 +25,7 @@ export class GlobalState { public currentCode: string; // eslint-disable-next-line @typescript-eslint/naming-convention public getCompiledCode: () => Promise = async () => { - return Promise.resolve(this.currentCode); + return await Promise.resolve(this.currentCode); }; public language = Utilities.ReadStringFromStore("language", "JS"); public fpsElement: HTMLDivElement; diff --git a/packages/tools/playground/src/tools/downloadManager.ts b/packages/tools/playground/src/tools/downloadManager.ts index cad920fc95f..54ddaa34212 100644 --- a/packages/tools/playground/src/tools/downloadManager.ts +++ b/packages/tools/playground/src/tools/downloadManager.ts @@ -1,3 +1,4 @@ +/* eslint-disable github/no-then */ import { DynamicTexture, RawTexture } from "@dev/core"; import type { GlobalState } from "../globalState"; import type { Nullable } from "@dev/core"; @@ -12,7 +13,7 @@ export class DownloadManager { public constructor(public globalState: GlobalState) {} private async _addContentToZipAsync(zip: typeof JSZip, name: string, url: string, replace: Nullable, buffer = false): Promise { - return new Promise((resolve) => { + return await new Promise((resolve) => { if (url.substring(0, 5) == "data:" || url.substring(0, 5) == "http:" || url.substring(0, 5) == "blob:" || url.substring(0, 6) == "https:") { resolve(); return; @@ -57,11 +58,11 @@ export class DownloadManager { private async _addTexturesToZipAsync(zip: typeof JSZip, index: number, textures: any[], folder: Nullable): Promise { if (index === textures.length || !textures[index].name) { - return Promise.resolve(); + return await Promise.resolve(); } if (textures[index].isRenderTarget || textures[index] instanceof RawTexture || textures[index] instanceof DynamicTexture || textures[index].name.indexOf("data:") !== -1) { - return this._addTexturesToZipAsync(zip, index + 1, textures, folder); + return await this._addTexturesToZipAsync(zip, index + 1, textures, folder); } if (textures[index].isCube) { @@ -78,7 +79,7 @@ export class DownloadManager { } else { textures.push({ name: textures[index].name }); } - return this._addTexturesToZipAsync(zip, index + 1, textures, folder); + return await this._addTexturesToZipAsync(zip, index + 1, textures, folder); } if (folder == null) { @@ -95,17 +96,17 @@ export class DownloadManager { const name = textures[index].name.replace("textures/", ""); if (url != null) { - return this._addContentToZipAsync(folder, name, url, null, true).then(async () => { - return this._addTexturesToZipAsync(zip, index + 1, textures, folder); + return await this._addContentToZipAsync(folder, name, url, null, true).then(async () => { + return await this._addTexturesToZipAsync(zip, index + 1, textures, folder); }); } else { - return this._addTexturesToZipAsync(zip, index + 1, textures, folder); + return await this._addTexturesToZipAsync(zip, index + 1, textures, folder); } } private async _addImportedFilesToZipAsync(zip: typeof JSZip, index: number, importedFiles: string[], folder: Nullable): Promise { if (index === importedFiles.length) { - return Promise.resolve(); + return await Promise.resolve(); } if (!folder) { @@ -115,8 +116,8 @@ export class DownloadManager { const name = url.substring(url.lastIndexOf("/") + 1); - return this._addContentToZipAsync(folder, name, url, null, true).then(async () => { - return this._addImportedFilesToZipAsync(zip, index + 1, importedFiles, folder); + return await this._addContentToZipAsync(folder, name, url, null, true).then(async () => { + return await this._addImportedFilesToZipAsync(zip, index + 1, importedFiles, folder); }); } @@ -144,12 +145,13 @@ export class DownloadManager { // eslint-disable-next-line no-constant-condition } while (true); + // eslint-disable-next-line @typescript-eslint/no-floating-promises this._addContentToZipAsync(zip, "index.html", "/zipContent/index.html", zipCode) .then(async () => { - return this._addTexturesToZipAsync(zip, 0, textures, null); + return await this._addTexturesToZipAsync(zip, 0, textures, null); }) .then(async () => { - return this._addImportedFilesToZipAsync(zip, 0, importedFiles, null); + return await this._addImportedFilesToZipAsync(zip, 0, importedFiles, null); }) .then(() => { const blob = zip.generate({ type: "blob" }); diff --git a/packages/tools/playground/src/tools/monacoManager.ts b/packages/tools/playground/src/tools/monacoManager.ts index affdbf28ac3..72047bf21e6 100644 --- a/packages/tools/playground/src/tools/monacoManager.ts +++ b/packages/tools/playground/src/tools/monacoManager.ts @@ -1,3 +1,5 @@ +/* eslint-disable no-await-in-loop */ +/* eslint-disable @typescript-eslint/no-floating-promises */ import * as monaco from "monaco-editor/esm/vs/editor/editor.api"; // import 'monaco-editor/esm/vs/basic-languages/typescript/typescript.contribution'; @@ -266,7 +268,7 @@ class Playground { this._editor = monaco.editor.create(this._hostElement, editorOptions as any); - const analyzeCodeDebounced = debounce(async () => this._analyzeCodeAsync(), 500); + const analyzeCodeDebounced = debounce(async () => await this._analyzeCodeAsync(), 500); this._editor.onDidChangeModelContent(() => { const newCode = this._editor.getValue(); if (this.globalState.currentCode !== newCode) { @@ -280,7 +282,7 @@ class Playground { this._editor.setValue(this.globalState.currentCode); } - this.globalState.getCompiledCode = async () => this._getRunCodeAsync(); + this.globalState.getCompiledCode = async () => await this._getRunCodeAsync(); if (this.globalState.currentCode) { this.globalState.onRunRequiredObservable.notifyObservers(); @@ -351,7 +353,7 @@ class Playground { } let libContent = ""; - const responses = await Promise.all(declarations.map(async (declaration) => fetch(declaration))); + const responses = await Promise.all(declarations.map(async (declaration) => await fetch(declaration))); const fallbackUrl = "https://snapshots-cvgtc2eugrd3cgfd.z01.azurefd.net/refs/heads/master"; for (const response of responses) { if (!response.ok) { diff --git a/packages/tools/sandbox/src/components/reflectorZone.tsx b/packages/tools/sandbox/src/components/reflectorZone.tsx index 8e8f0a50e5f..1fee327076b 100644 --- a/packages/tools/sandbox/src/components/reflectorZone.tsx +++ b/packages/tools/sandbox/src/components/reflectorZone.tsx @@ -56,7 +56,7 @@ class Reflector { const [command, payload] = message.split("|", 2); switch (command) { case "load": { - // eslint-disable-next-line @typescript-eslint/no-floating-promises, @typescript-eslint/no-deprecated + // eslint-disable-next-line @typescript-eslint/no-floating-promises, @typescript-eslint/no-deprecated, github/no-then SceneLoader.LoadAsync("", `data:${payload}`, this._engine).then((scene) => { if (scene.activeCamera) { scene.activeCamera.attachControl(); @@ -68,6 +68,7 @@ class Reflector { this._globalState.onSceneLoaded.notifyObservers({ scene: scene, filename: "Reflector scene" }); + // eslint-disable-next-line @typescript-eslint/no-floating-promises scene.debugLayer.show(); }); break; diff --git a/packages/tools/sandbox/src/components/renderingZone.tsx b/packages/tools/sandbox/src/components/renderingZone.tsx index 48a4db0d1a4..5766af9cc28 100644 --- a/packages/tools/sandbox/src/components/renderingZone.tsx +++ b/packages/tools/sandbox/src/components/renderingZone.tsx @@ -1,3 +1,5 @@ +/* eslint-disable github/no-then */ +/* eslint-disable @typescript-eslint/no-floating-promises */ import * as React from "react"; import type { GlobalState } from "../globalState"; @@ -120,10 +122,17 @@ export class RenderingZone extends React.Component { } } }, - null, + () => { + // Ensure we stop any existing render loop when reloading, because if there was a previous scene loaded from the URL + // the filesInput will not know about it, and so it won't call stopRenderLoop. + this._engine.stopRenderLoop(); + filesInput.reload(); + }, (file, scene, message) => { this.props.globalState.onError.notifyObservers({ message: message }); - } + }, + false, + true ); filesInput.onProcessFileCallback = (file, name, extension, setSceneFileToLoad) => { @@ -156,13 +165,13 @@ export class RenderingZone extends React.Component { const fileName = (filesToLoad[0] as any).correctName as string; const fileExtension = GetFileExtension(fileName); if (IsTextureAsset(fileExtension)) { - return Promise.resolve(this.loadTextureAsset(`file:${fileName}`)); + return await Promise.resolve(this.loadTextureAsset(`file:${fileName}`)); } } this._engine.clearInternalTexturesCache(); - return SceneLoader.LoadAsync("file:", sceneFile, this._engine, onProgress); + return await SceneLoader.LoadAsync("file:", sceneFile, this._engine, onProgress); }; filesInput.monitorElementForDragNDrop(this._canvas); @@ -182,11 +191,12 @@ export class RenderingZone extends React.Component { } prepareCamera() { + let camera = this._scene.activeCamera as ArcRotateCamera; // Attach camera to canvas inputs - if (!this._scene.activeCamera) { + if (!camera) { this._scene.createDefaultCamera(true); - const camera = this._scene.activeCamera! as ArcRotateCamera; + camera = this._scene.activeCamera! as ArcRotateCamera; if (this._currentPluginName === "gltf" || this._currentPluginName === "obj") { // glTF assets use a +Z forward convention while the default camera faces +Z. Rotate the camera to look at the front of the asset. @@ -227,7 +237,8 @@ export class RenderingZone extends React.Component { } } - this._scene.activeCamera!.attachControl(); + camera.attachControl(); + return camera; } handleErrors() { @@ -294,7 +305,7 @@ export class RenderingZone extends React.Component { this.props.globalState.onSceneLoaded.notifyObservers({ scene: this._scene, filename: filename }); - this.prepareCamera(); + const camera = this.prepareCamera(); this.prepareLighting(); this.handleErrors(); @@ -302,6 +313,14 @@ export class RenderingZone extends React.Component { this.props.globalState.showDebugLayer(); } + this._scene.executeWhenReady(() => { + this._engine.runRenderLoop(() => { + // Adapt the camera sensibility based on the distance to the object + camera.panningSensibility = 5000 / camera.radius; + this._scene.render(); + }); + }); + delete this._currentPluginName; } @@ -365,15 +384,6 @@ export class RenderingZone extends React.Component { this._scene = scene; this.onSceneLoaded(fileName); - - scene.whenReadyAsync().then(() => { - const camera = scene.activeCamera! as ArcRotateCamera; - this._engine.runRenderLoop(() => { - // Adapt the camera sensibility based on the distance to the object - camera.panningSensibility = 5000 / camera.radius; - scene.render(); - }); - }); }) .catch((reason) => { this.props.globalState.onError.notifyObservers({ message: reason.message }); diff --git a/packages/tools/sandbox/src/globalState.ts b/packages/tools/sandbox/src/globalState.ts index c7b881595f2..f542fa0a535 100644 --- a/packages/tools/sandbox/src/globalState.ts +++ b/packages/tools/sandbox/src/globalState.ts @@ -32,6 +32,7 @@ export class GlobalState { public showDebugLayer() { this.isDebugLayerEnabled = true; if (this.currentScene) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises this.currentScene.debugLayer.show(); } } diff --git a/packages/tools/sandbox/src/sandbox.tsx b/packages/tools/sandbox/src/sandbox.tsx index fc885c39182..d39f4591015 100644 --- a/packages/tools/sandbox/src/sandbox.tsx +++ b/packages/tools/sandbox/src/sandbox.tsx @@ -292,8 +292,7 @@ export class Sandbox extends React.Component< } public static async CaptureScreenshotAsync(size: IScreenshotSize | number, mimeType?: string): Promise { - return this._SceneLoadedDeferred.promise.then(async (scene) => { - return CreateScreenshotAsync(scene.getEngine(), scene.activeCamera!, size, mimeType); - }); + const scene = await this._SceneLoadedDeferred.promise; + return await CreateScreenshotAsync(scene.getEngine(), scene.activeCamera!, size, mimeType); } } diff --git a/packages/tools/testTools/src/utils.ts b/packages/tools/testTools/src/utils.ts index 7054a0b5f87..89e98049ae8 100644 --- a/packages/tools/testTools/src/utils.ts +++ b/packages/tools/testTools/src/utils.ts @@ -1,3 +1,4 @@ +/* eslint-disable no-await-in-loop */ /* eslint-disable no-console */ import type { Page } from "puppeteer"; import type { StacktracedObject } from "./window"; diff --git a/packages/tools/testTools/src/visualizationUtils.ts b/packages/tools/testTools/src/visualizationUtils.ts index 445a2dc305c..b11221d05f6 100644 --- a/packages/tools/testTools/src/visualizationUtils.ts +++ b/packages/tools/testTools/src/visualizationUtils.ts @@ -116,6 +116,7 @@ export const evaluatePrepareScene = async ( const loadedScene = eval(code + "\r\ncreateScene(engine)"); + // eslint-disable-next-line github/no-then if (loadedScene.then) { // Handle if createScene returns a promise window.scene = await loadedScene; @@ -175,7 +176,7 @@ export const evaluatePrepareScene = async ( }; export const evaluateRenderSceneForVisualization = async (renderCount: number) => { - return new Promise((resolve) => { + return await new Promise((resolve) => { if (!window.scene || !window.engine) { return resolve(false); } diff --git a/packages/tools/tests/test/audioV2/soundSource.spatial.test.ts b/packages/tools/tests/test/audioV2/soundSource.spatial.test.ts new file mode 100644 index 00000000000..16513742ad5 --- /dev/null +++ b/packages/tools/tests/test/audioV2/soundSource.spatial.test.ts @@ -0,0 +1,5 @@ +import { AddSharedAbstractAudioNodeSpatialTests } from "./shared/abstractAudioNode.spatial"; +import { InitAudioV2Tests } from "./utils/audioV2.utils"; + +InitAudioV2Tests(); +AddSharedAbstractAudioNodeSpatialTests("SoundSource"); diff --git a/packages/tools/tests/test/audioV2/soundSource.stereo.test.ts b/packages/tools/tests/test/audioV2/soundSource.stereo.test.ts new file mode 100644 index 00000000000..41795182208 --- /dev/null +++ b/packages/tools/tests/test/audioV2/soundSource.stereo.test.ts @@ -0,0 +1,5 @@ +import { AddSharedAbstractAudioNodeStereoTests } from "./shared/abstractAudioNode.stereo"; +import { InitAudioV2Tests } from "./utils/audioV2.utils"; + +InitAudioV2Tests(); +AddSharedAbstractAudioNodeStereoTests("SoundSource"); diff --git a/packages/tools/tests/test/audioV2/soundSource.volume.test.ts b/packages/tools/tests/test/audioV2/soundSource.volume.test.ts new file mode 100644 index 00000000000..05a10981e14 --- /dev/null +++ b/packages/tools/tests/test/audioV2/soundSource.volume.test.ts @@ -0,0 +1,5 @@ +import { AddSharedAbstractAudioNodeVolumeTests } from "./shared/abstractAudioNode.volume"; +import { InitAudioV2Tests } from "./utils/audioV2.utils"; + +InitAudioV2Tests(); +AddSharedAbstractAudioNodeVolumeTests("SoundSource"); diff --git a/packages/tools/tests/test/audioV2/utils/audioV2.utils.ts b/packages/tools/tests/test/audioV2/utils/audioV2.utils.ts index 5a1599eaa52..c99bc451663 100644 --- a/packages/tools/tests/test/audioV2/utils/audioV2.utils.ts +++ b/packages/tools/tests/test/audioV2/utils/audioV2.utils.ts @@ -3,7 +3,7 @@ import { test, Page, TestInfo } from "@playwright/test"; import { getGlobalConfig } from "@tools/test-tools"; export type AudioContextType = "Realtime" | "Offline"; -export type AudioNodeType = "AudioBus" | "AudioEngineV2" | "MainAudioBus" | "StaticSound" | "StreamingSound"; +export type AudioNodeType = "AudioBus" | "AudioEngineV2" | "MainAudioBus" | "SoundSource" | "StaticSound" | "StreamingSound"; export type SoundType = "StaticSound" | "StreamingSound"; export const enum Channel { @@ -52,7 +52,7 @@ declare global { audioNodeType: AudioNodeType, source: string | string[], options?: Partial | Partial - ): Promise<{ sound: BABYLON.AbstractSound; outputNode: { spatial: BABYLON.AbstractSpatialAudio; stereo: BABYLON.AbstractStereoAudio; volume: number } }>; + ): Promise<{ sound: { play(): void; stop(): void }; outputNode: { spatial: BABYLON.AbstractSpatialAudio; stereo: BABYLON.AbstractStereoAudio; volume: number } }>; public static CreateAbstractSoundAsync( soundType: SoundType, source: string | string[], @@ -64,6 +64,7 @@ declare global { options?: Partial ): Promise; public static CreateSoundAsync(source: string | string[] | BABYLON.StaticSoundBuffer, options?: Partial): Promise; + public static CreateSoundSourceAsync(source: string, options?: Partial): Promise; public static CreateStreamingSoundAsync(source: string | string[], options?: Partial): Promise; public static GetPulseCountsAsync(): Promise; public static GetResultAsync(): Promise; diff --git a/packages/tools/tests/test/visualization/ReferenceImages/FrameGraph-motion-blur-object-based.png b/packages/tools/tests/test/visualization/ReferenceImages/FrameGraph-motion-blur-object-based.png new file mode 100644 index 00000000000..ee9f305c940 Binary files /dev/null and b/packages/tools/tests/test/visualization/ReferenceImages/FrameGraph-motion-blur-object-based.png differ diff --git a/packages/tools/tests/test/visualization/ReferenceImages/FrameGraph-motion-blur-screen-based.png b/packages/tools/tests/test/visualization/ReferenceImages/FrameGraph-motion-blur-screen-based.png new file mode 100644 index 00000000000..ee7f0987b50 Binary files /dev/null and b/packages/tools/tests/test/visualization/ReferenceImages/FrameGraph-motion-blur-screen-based.png differ diff --git a/packages/tools/tests/test/visualization/ReferenceImages/FrameGraph-motion-blur-skinned.png b/packages/tools/tests/test/visualization/ReferenceImages/FrameGraph-motion-blur-skinned.png new file mode 100644 index 00000000000..df9b8f35191 Binary files /dev/null and b/packages/tools/tests/test/visualization/ReferenceImages/FrameGraph-motion-blur-skinned.png differ diff --git a/packages/tools/tests/test/visualization/ReferenceImages/FrameGraph-nrge-motion-blur.png b/packages/tools/tests/test/visualization/ReferenceImages/FrameGraph-nrge-motion-blur.png new file mode 100644 index 00000000000..cc06141851d Binary files /dev/null and b/packages/tools/tests/test/visualization/ReferenceImages/FrameGraph-nrge-motion-blur.png differ diff --git a/packages/tools/tests/test/visualization/ReferenceImages/iesprofile2.png b/packages/tools/tests/test/visualization/ReferenceImages/iesprofile2.png index ab99931ac7b..b0865a558ea 100644 Binary files a/packages/tools/tests/test/visualization/ReferenceImages/iesprofile2.png and b/packages/tools/tests/test/visualization/ReferenceImages/iesprofile2.png differ diff --git a/packages/tools/tests/test/visualization/ReferenceImages/msdf-billboard.png b/packages/tools/tests/test/visualization/ReferenceImages/msdf-billboard.png new file mode 100644 index 00000000000..4334cd97a2a Binary files /dev/null and b/packages/tools/tests/test/visualization/ReferenceImages/msdf-billboard.png differ diff --git a/packages/tools/tests/test/visualization/ReferenceImages/msdf.png b/packages/tools/tests/test/visualization/ReferenceImages/msdf.png new file mode 100644 index 00000000000..2529ed3b58e Binary files /dev/null and b/packages/tools/tests/test/visualization/ReferenceImages/msdf.png differ diff --git a/packages/tools/tests/test/visualization/ReferenceImages/normals.png b/packages/tools/tests/test/visualization/ReferenceImages/normals.png index e5731b8fbcf..c14089f9eef 100644 Binary files a/packages/tools/tests/test/visualization/ReferenceImages/normals.png and b/packages/tools/tests/test/visualization/ReferenceImages/normals.png differ diff --git a/packages/tools/tests/test/visualization/ReferenceImages/openpbr-base-diffuse-roughness-prefiltered-ibl-with-cdf.png b/packages/tools/tests/test/visualization/ReferenceImages/openpbr-base-diffuse-roughness-prefiltered-ibl-with-cdf.png new file mode 100644 index 00000000000..5874a207279 Binary files /dev/null and b/packages/tools/tests/test/visualization/ReferenceImages/openpbr-base-diffuse-roughness-prefiltered-ibl-with-cdf.png differ diff --git a/packages/tools/tests/test/visualization/ReferenceImages/openpbr-base-diffuse-roughness-prefiltered-ibl.png b/packages/tools/tests/test/visualization/ReferenceImages/openpbr-base-diffuse-roughness-prefiltered-ibl.png new file mode 100644 index 00000000000..66a5dcef4e4 Binary files /dev/null and b/packages/tools/tests/test/visualization/ReferenceImages/openpbr-base-diffuse-roughness-prefiltered-ibl.png differ diff --git a/packages/tools/tests/test/visualization/ReferenceImages/openpbr-base-diffuse-roughness-realtime-ibl.png b/packages/tools/tests/test/visualization/ReferenceImages/openpbr-base-diffuse-roughness-realtime-ibl.png new file mode 100644 index 00000000000..e2aaa629312 Binary files /dev/null and b/packages/tools/tests/test/visualization/ReferenceImages/openpbr-base-diffuse-roughness-realtime-ibl.png differ diff --git a/packages/tools/tests/test/visualization/ReferenceImages/openpbr-base-diffuse-roughness-spherical-harmonics.png b/packages/tools/tests/test/visualization/ReferenceImages/openpbr-base-diffuse-roughness-spherical-harmonics.png new file mode 100644 index 00000000000..9eb8e4112e3 Binary files /dev/null and b/packages/tools/tests/test/visualization/ReferenceImages/openpbr-base-diffuse-roughness-spherical-harmonics.png differ diff --git a/packages/tools/tests/test/visualization/ReferenceImages/openpbr-base-diffuse-roughness.png b/packages/tools/tests/test/visualization/ReferenceImages/openpbr-base-diffuse-roughness.png new file mode 100644 index 00000000000..f12bab7d72d Binary files /dev/null and b/packages/tools/tests/test/visualization/ReferenceImages/openpbr-base-diffuse-roughness.png differ diff --git a/packages/tools/tests/test/visualization/ReferenceImages/ssShadowsLeftHanded.png b/packages/tools/tests/test/visualization/ReferenceImages/ssShadowsLeftHanded.png index 1d604bdea3f..a6b8bc5c129 100644 Binary files a/packages/tools/tests/test/visualization/ReferenceImages/ssShadowsLeftHanded.png and b/packages/tools/tests/test/visualization/ReferenceImages/ssShadowsLeftHanded.png differ diff --git a/packages/tools/tests/test/visualization/ReferenceImages/ssShadowsRightHanded.png b/packages/tools/tests/test/visualization/ReferenceImages/ssShadowsRightHanded.png index d9e70dc6ced..beefe9f6fa9 100644 Binary files a/packages/tools/tests/test/visualization/ReferenceImages/ssShadowsRightHanded.png and b/packages/tools/tests/test/visualization/ReferenceImages/ssShadowsRightHanded.png differ diff --git a/packages/tools/tests/test/visualization/ReferenceImages/voxelShadows.png b/packages/tools/tests/test/visualization/ReferenceImages/voxelShadows.png index 79830ab9521..61b5fb87291 100644 Binary files a/packages/tools/tests/test/visualization/ReferenceImages/voxelShadows.png and b/packages/tools/tests/test/visualization/ReferenceImages/voxelShadows.png differ diff --git a/packages/tools/tests/test/visualization/ReferenceImages/voxelShadowsLeftHanded.png b/packages/tools/tests/test/visualization/ReferenceImages/voxelShadowsLeftHanded.png index 1878e94e6a6..5ddeffceeec 100644 Binary files a/packages/tools/tests/test/visualization/ReferenceImages/voxelShadowsLeftHanded.png and b/packages/tools/tests/test/visualization/ReferenceImages/voxelShadowsLeftHanded.png differ diff --git a/packages/tools/tests/test/visualization/ReferenceImages/voxelShadowsRightHanded.png b/packages/tools/tests/test/visualization/ReferenceImages/voxelShadowsRightHanded.png index b2b8a1a825b..21514da8ccb 100644 Binary files a/packages/tools/tests/test/visualization/ReferenceImages/voxelShadowsRightHanded.png and b/packages/tools/tests/test/visualization/ReferenceImages/voxelShadowsRightHanded.png differ diff --git a/packages/tools/tests/test/visualization/config.json b/packages/tools/tests/test/visualization/config.json index 33ae82340c6..c38a78ad306 100644 --- a/packages/tools/tests/test/visualization/config.json +++ b/packages/tools/tests/test/visualization/config.json @@ -1,6 +1,16 @@ { "root": "https://cdn.babylonjs.com", "tests": [ + { + "title": "MSDF", + "playgroundId": "#6RLCWP#20", + "referenceImage": "msdf.png" + }, + { + "title": "MSDF Billboard", + "playgroundId": "#6RLCWP#23", + "referenceImage": "msdf-billboard.png" + }, { "title": "Attractors", "playgroundId": "#DEZ79M#34", @@ -16,6 +26,35 @@ "playgroundId": "#DT1XPP#4", "referenceImage": "openpbr_base_weight.png" }, + { + "title": "OpenPBR Base Diffuse Roughness Analytical Lights", + "playgroundId": "#MXACV7#23", + "referenceImage": "openpbr_base_diffuse_roughness.png" + }, + { + "title": "OpenPBR Base Diffuse Roughness Realtime IBL", + "playgroundId": "#MXACV7#22", + "renderCount": 15, + "referenceImage": "openpbr_base_diffuse_roughness_realtime_ibl.png" + }, + { + "title": "OpenPBR Base Diffuse Roughness Prefiltered IBL with CDF", + "playgroundId": "#MXACV7#19", + "renderCount": 5, + "referenceImage": "openpbr_base_diffuse_roughness_prefiltered_ibl_with_cdf.png" + }, + { + "title": "OpenPBR Base Diffuse Roughness Prefiltered IBL", + "playgroundId": "#MXACV7#20", + "renderCount": 5, + "referenceImage": "openpbr_base_diffuse_roughness_prefiltered_ibl.png" + }, + { + "title": "OpenPBR Base Diffuse Roughness SH IBL", + "playgroundId": "#MXACV7#21", + "renderCount": 2, + "referenceImage": "openpbr_base_diffuse_roughness_spherical_harmonics.png" + }, { "title": "NME Glow Manual", "playgroundId": "#7QCYPB#320", @@ -2238,7 +2277,7 @@ { "title": "custom-handling-of-materials-for-render-target-pass", "renderCount": 60, - "playgroundId": "#FIVL25#22" + "playgroundId": "#FIVL25#21" }, { "title": "dissolve-effect-with-node-material-and-glow-layer", @@ -2407,7 +2446,7 @@ }, { "title": "IBL Voxel Shadowing", - "playgroundId": "#8R5SSE#456", + "playgroundId": "#8R5SSE#628", "referenceImage": "voxelShadows.png", "renderCount": 15, "excludedEngines": ["webgl1"], @@ -2420,21 +2459,21 @@ }, { "title": "IBL Voxel Shadowing Right-Handed", - "playgroundId": "#8R5SSE#457", + "playgroundId": "#8R5SSE#630", "referenceImage": "voxelShadowsRightHanded.png", "renderCount": 15, "excludedEngines": ["webgl1"] }, { "title": "IBL Voxel Shadowing Left-Handed", - "playgroundId": "#8R5SSE#458", + "playgroundId": "#8R5SSE#629", "referenceImage": "voxelShadowsLeftHanded.png", "renderCount": 15, "excludedEngines": ["webgl1"] }, { "title": "IBL Screen-space Shadowing Left-Handed", - "playgroundId": "#8R5SSE#459", + "playgroundId": "#8R5SSE#631", "referenceImage": "ssShadowsLeftHanded.png", "renderCount": 15, "excludedEngines": ["webgl1"], @@ -2442,7 +2481,7 @@ }, { "title": "IBL Screen-space Shadowing Right-Handed", - "playgroundId": "#8R5SSE#461", + "playgroundId": "#8R5SSE#632", "referenceImage": "ssShadowsRightHanded.png", "renderCount": 15, "excludedEngines": ["webgl1"], @@ -2503,6 +2542,12 @@ "playgroundId": "#Z6C5EF#1", "excludedEngines": ["webgl1"] }, + { + "title": "FrameGraph nrge motion blur", + "playgroundId": "#YB006J#753", + "excludedEngines": ["webgl1"], + "renderCount": 40 + }, { "title": "FrameGraph nrg gui bloom", "playgroundId": "#3LB017#1", @@ -2530,9 +2575,24 @@ "title": "FrameGraph image processing", "playgroundId": "#PV8OLY#21" }, + { + "title": "FrameGraph motion blur screen based", + "playgroundId": "#YB006J#746", + "renderCount": 10 + }, + { + "title": "FrameGraph motion blur object based", + "playgroundId": "#YB006J#747", + "renderCount": 10 + }, + { + "title": "FrameGraph motion blur skinned", + "playgroundId": "#YB006J#749", + "renderCount": 40 + }, { "title": "IBL radiance roughness", - "playgroundId": "#RNO672#7" + "playgroundId": "#RNO672#10" }, { "title": "Synchronous Effect", diff --git a/packages/tools/testsMemoryLeaks/src/index.ts b/packages/tools/testsMemoryLeaks/src/index.ts index 99d8c202871..1930fbbd2b4 100644 --- a/packages/tools/testsMemoryLeaks/src/index.ts +++ b/packages/tools/testsMemoryLeaks/src/index.ts @@ -51,6 +51,7 @@ export async function takeSnapshotsLocal(options: RunOptions = {}): Promise { @@ -69,6 +70,7 @@ export async function takeSnapshotsLocal(options: RunOptions = {}): Promise { for (const promise of scenarios) { try { + // eslint-disable-next-line no-await-in-loop const message = await promise(); console.log(message); } catch (error) { diff --git a/packages/tools/viewer-configurator/src/components/babylonViewer/viewer.tsx b/packages/tools/viewer-configurator/src/components/babylonViewer/viewer.tsx index 43c06cfed56..0f70b1d435e 100644 --- a/packages/tools/viewer-configurator/src/components/babylonViewer/viewer.tsx +++ b/packages/tools/viewer-configurator/src/components/babylonViewer/viewer.tsx @@ -26,6 +26,7 @@ declare global { export const Viewer: FunctionComponent<{ onViewerCreated: (element: ViewerElement) => void; onOptionsLoaded: (options: ViewerOptions) => void }> = (props) => { useEffect(() => { + // eslint-disable-next-line @typescript-eslint/no-floating-promises (async () => { let options: ViewerOptions = {}; if (window.location.hash) { diff --git a/packages/tools/viewer-configurator/src/components/configurator/configurator.tsx b/packages/tools/viewer-configurator/src/components/configurator/configurator.tsx index d635b76f5eb..87ba9c0cb2b 100644 --- a/packages/tools/viewer-configurator/src/components/configurator/configurator.tsx +++ b/packages/tools/viewer-configurator/src/components/configurator/configurator.tsx @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-floating-promises */ import "./configurator.scss"; // eslint-disable-next-line import/no-internal-modules import type { IDisposable, IInspectableOptions, Nullable, Observable } from "core/index"; diff --git a/packages/tools/viewer-legacy/src/configuration/renderOnlyLoader.ts b/packages/tools/viewer-legacy/src/configuration/renderOnlyLoader.ts index c905dc2c5a7..bcd721c54b3 100644 --- a/packages/tools/viewer-legacy/src/configuration/renderOnlyLoader.ts +++ b/packages/tools/viewer-legacy/src/configuration/renderOnlyLoader.ts @@ -1,3 +1,4 @@ +/* eslint-disable github/no-then */ import { mapperManager } from "./mappers"; import type { ViewerConfiguration } from "./configuration"; import { processConfigurationCompatibility } from "./configurationCompatibility"; @@ -68,7 +69,7 @@ export class RenderOnlyConfigurationLoader { if (loadedConfig.configuration) { let mapperType = "json"; - return Promise.resolve() + return await Promise.resolve() .then(() => { if (typeof loadedConfig.configuration === "string" || (loadedConfig.configuration && loadedConfig.configuration.url)) { // a file to load @@ -114,7 +115,7 @@ export class RenderOnlyConfigurationLoader { if (callback) { callback(loadedConfig); } - return Promise.resolve(loadedConfig); + return await Promise.resolve(loadedConfig); } } @@ -145,10 +146,10 @@ export class RenderOnlyConfigurationLoader { private async _loadFileAsync(url: string): Promise { const cacheReference = this._configurationCache; if (this._enableCache && cacheReference[url]) { - return Promise.resolve(cacheReference[url]); + return await Promise.resolve(cacheReference[url]); } - return new Promise((resolve, reject) => { + return await new Promise((resolve, reject) => { const fileRequest = Tools.LoadFile( url, (result) => { @@ -169,6 +170,7 @@ export class RenderOnlyConfigurationLoader { if (idx !== -1) { this._loadRequests.splice(idx, 1); } + // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors reject(error); } ); diff --git a/packages/tools/viewer-legacy/src/loader/modelLoader.ts b/packages/tools/viewer-legacy/src/loader/modelLoader.ts index 0bc637973b8..0d9cec93020 100644 --- a/packages/tools/viewer-legacy/src/loader/modelLoader.ts +++ b/packages/tools/viewer-legacy/src/loader/modelLoader.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-floating-promises */ /* eslint-disable import/no-internal-modules */ import type { GLTFFileLoader } from "loaders/glTF/glTFFileLoader"; import { GLTFLoaderAnimationStartMode } from "loaders/glTF/glTFFileLoader"; diff --git a/packages/tools/viewer-legacy/src/managers/sceneManager.ts b/packages/tools/viewer-legacy/src/managers/sceneManager.ts index 4f98451c874..256213c40be 100644 --- a/packages/tools/viewer-legacy/src/managers/sceneManager.ts +++ b/packages/tools/viewer-legacy/src/managers/sceneManager.ts @@ -224,7 +224,7 @@ export class SceneManager { updateShadows(); } }); - return this._observablesManager && this._observablesManager.onSceneInitObservable.notifyObserversWithPromise(this.scene); + return await (this._observablesManager && this._observablesManager.onSceneInitObservable.notifyObserversWithPromise(this.scene)); }); if (this._observablesManager) { this._observablesManager.onModelLoadedObservable.add((model) => { @@ -446,7 +446,7 @@ export class SceneManager { var gl = new GlowLayer("glow", this.scene, options); }*/ - return this.onSceneInitObservable.notifyObserversWithPromise(this.scene); + return await this.onSceneInitObservable.notifyObserversWithPromise(this.scene); } public clearScene(clearModels: boolean = true, clearLights: boolean = false) { @@ -681,6 +681,7 @@ export class SceneManager { } if (sceneConfig.debug === true) { + // eslint-disable-next-line @typescript-eslint/no-floating-promises this.scene.debugLayer.show(); } else if (sceneConfig.debug === false) { if (this.scene.debugLayer.isVisible()) { diff --git a/packages/tools/viewer-legacy/src/model/viewerModel.ts b/packages/tools/viewer-legacy/src/model/viewerModel.ts index 1706aa0e9a0..0b236f4cb4a 100644 --- a/packages/tools/viewer-legacy/src/model/viewerModel.ts +++ b/packages/tools/viewer-legacy/src/model/viewerModel.ts @@ -244,9 +244,9 @@ export class ViewerModel implements IDisposable { this._meshes.push(mesh); if (triggerLoaded) { - return this.onLoadedObservable.notifyObserversWithPromise(this); + return await this.onLoadedObservable.notifyObserversWithPromise(this); } - return Promise.resolve(this); + return await Promise.resolve(this); } /** diff --git a/packages/tools/viewer-legacy/src/templating/templateManager.ts b/packages/tools/viewer-legacy/src/templating/templateManager.ts index c07bf07b68f..78ee9ae9b94 100644 --- a/packages/tools/viewer-legacy/src/templating/templateManager.ts +++ b/packages/tools/viewer-legacy/src/templating/templateManager.ts @@ -1,3 +1,5 @@ +/* eslint-disable @typescript-eslint/prefer-promise-reject-errors */ +/* eslint-disable github/no-then */ /* eslint-disable @typescript-eslint/naming-convention */ import { Observable } from "core/Misc/observable"; import { Tools } from "core/Misc/tools"; @@ -101,7 +103,7 @@ export class TemplateManager { }; //build the html tree - return this._buildHTMLTree(templates).then((htmlTree) => { + return await this._buildHTMLTree(templates).then((htmlTree) => { if (this._templates["main"]) { internalInit(htmlTree, "main"); } else { @@ -124,7 +126,7 @@ export class TemplateManager { const promises: Array> = Object.keys(templates).map(async (name) => { // if the template was overridden if (!templates[name]) { - return Promise.resolve(false); + return await Promise.resolve(false); } // else - we have a template, let's do our job! const template = new Template(name, templates[name]); @@ -138,10 +140,10 @@ export class TemplateManager { // make sure the global onEventTriggered is called as well template.onEventTriggered.add((eventData) => this.onEventTriggered.notifyObservers(eventData)); this._templates[name] = template; - return template.initPromise; + return await template.initPromise; }); - return Promise.all(promises).then(() => { + return await Promise.all(promises).then(() => { const templateStructure = {}; // now iterate through all templates and check for children: const buildTree = (parentObject: any, name: string) => { @@ -480,13 +482,13 @@ export class Template { */ public async show(visibilityFunction?: (template: Template) => Promise