├── .gitignore
├── .npmignore
├── Justfile
├── LICENSE
├── README.md
├── demo
└── index.ts
├── index.html
├── package.json
├── public
└── terrain.glb
├── src
├── index.ts
├── materials.ts
├── shaders.ts
├── shaders
│ └── tileBreakingNeyret.frag
└── vite-env.d.ts
├── tsconfig.json
├── vite.config.demo.js
├── vite.config.js
└── yarn.lock
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | pnpm-debug.log*
8 | lerna-debug.log*
9 |
10 | node_modules
11 | dist
12 | demo/dist
13 | dist-ssr
14 | *.local
15 |
16 | # Editor directories and files
17 | .vscode/*
18 | !.vscode/extensions.json
19 | .idea
20 | .DS_Store
21 | *.suo
22 | *.ntvs*
23 | *.njsproj
24 | *.sln
25 | *.sw?
26 |
--------------------------------------------------------------------------------
/.npmignore:
--------------------------------------------------------------------------------
1 | .vscode
2 | build-demo
3 | demo
4 | node_modules
5 | public
6 | src
7 | .gitignore
8 | index.html
9 | Justfile
10 | README.md
11 | tsconfig.json
12 | vite.config.js
13 | yarn-error.log
14 | yarn.lock
15 | dist/*.glb
16 | dist/*.gltf
17 |
--------------------------------------------------------------------------------
/Justfile:
--------------------------------------------------------------------------------
1 | run:
2 | yarn dev
3 |
4 | build:
5 | yarn build
6 |
7 | publish:
8 | yarn publish
9 |
10 | build-demo:
11 | yarn build:demo
12 |
13 | publish-demo:
14 | phost update three-hex-tiling patch demo/dist
15 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Copyright (c) 2023-2024 Casey Primozic and others
2 |
3 | Permission is hereby granted, free of charge, to any person obtaining
4 | a copy of this software and associated documentation files (the
5 | "Software"), to deal in the Software without restriction, including
6 | without limitation the rights to use, copy, modify, merge, publish,
7 | distribute, sublicense, and/or sell copies of the Software, and to
8 | permit persons to whom the Software is furnished to do so, subject to
9 | the following conditions:
10 |
11 | The above copyright notice and this permission notice shall be
12 | included in all copies or substantial portions of the Software.
13 |
14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # `three-hex-tiling`
2 | [](https://www.npmjs.com/package/three-hex-tiling)
3 | [](https://twitter.com/ameobea10)
4 |
5 | Extends built-in Three.JS materials to support infinite, non-repeating, seamless texture tiling.
6 |
7 | 
8 |
9 | Live interactive demo:
10 |
11 | ## Installation
12 |
13 | `npm install three-hex-tiling`
14 |
15 | Then, to enable it, just add this to your project as early as possible:
16 |
17 | ```ts
18 | import 'three-hex-tiling';
19 | ```
20 |
21 | This import will patch Three.JS's shaders and materials to support the hex tiling algorithm and it will extend the types for the patched materials with parameters to control it.
22 |
23 | ### Three.JS Version Support
24 |
25 | This library has been tested with Three.JS versions `0.151` through `0.173`. Although it may work with other versions, support is not guaranteed.
26 |
27 | ## Usage
28 |
29 | After adding the `three-hex-tiling` import at the top of your project, a new `hexTiling` parameter is added to the parameters of supported materials. If your project uses TypeScript, these should be included in the types you see when creating those materials.
30 |
31 | By setting the `hexTiling` property when creating a material, hex tiling will be enabled for that material. It is disabled by default.
32 |
33 | ```ts
34 | const mat = new THREE.MeshStandardMaterial({
35 | map: myTexture,
36 | normalMap: myTextureNormalMap,
37 | roughnessMap: myTextureRoughnessMap,
38 | hexTiling: {
39 | // default values shown
40 | patchScale: 2,
41 | useContrastCorrectedBlending: true,
42 | lookupSkipThreshold: 0.01,
43 | textureSampleCoefficientExponent: 8,
44 | }
45 | });
46 | ```
47 |
48 | Hex tiling cannot be enabled or disabled after a material is created, but the values of individual parameters can be changed dynamically:
49 |
50 | ```ts
51 | mat.hexTiling.patchScale = newPatchScale;
52 | ```
53 |
54 | ### Texture Scaling
55 |
56 | When enabling hex tiling for a material, you may find that your textures need a scale adjustment to look optimal. This can be done using built-in Three.JS texture scaling support:
57 |
58 | ```ts
59 | myTexture.scale.set(1.5, 1.5);
60 | myTextureNormalMap.scale.set(1.5, 1.5);
61 | myTextureRoughnessMap.scale.set(1.5, 1.5);
62 |
63 | myTexture.needsUpdate = true;
64 | myTextureNormalMap.needsUpdate = true;
65 | myTextureRoughnessMap.needsUpdate = true;
66 | ```
67 |
68 | ### Supported Textures
69 |
70 | Textures used with `three-hex-tiling` must be seamless - meaning that there are no sharp cutoffs when the texture is tiled. There's a good chance your textures are seamless already and if they aren't, it will be obvious.
71 |
72 | ### Supported Materials
73 |
74 | The following materials are currently supported for use with `three-hex-tiling`:
75 |
76 | * `MeshStandardMaterial`
77 | * `MeshPhysicalMaterial`
78 |
79 | You can still use all of the other materials that Three.JS provides, but they will not have support for hex tiling.
80 |
81 | ### Supported Maps
82 |
83 | In addition to the base texture/color of a material provided in the `map` property, `three-hex-tiling` supports with the following maps:
84 |
85 | * `normalMap`
86 | * `roughnessMap`
87 | * `metalnessMap`
88 |
89 | ## Config Options
90 |
91 | `three-hex-tiling` accepts the following configuration properties in the `hexTiling` object:
92 |
93 | ### `patchScale: number`
94 |
95 | - **Description**: Scale factor for the hexagonal tiles used to break up the texture. This parameter is crucial in controlling the hex tiling's appearance and requires adjustment for each texture.
96 | - **Default**: `2`
97 | - **Range**: `[0, Infinity]`, typically between 0.1 and 8. Optimal values depend on the texture and desired effect.
98 | - **Behavior**: Larger values create smaller hexagonal tiles, resulting in more texture breakup.
99 |
100 | |  |  |  |
101 | |----------------------------------|----------------------------------|----------------------------------|
102 | | Patch Scale: 1 | Patch Scale: 2 | Patch Scale: 6 |
103 |
104 | ### `useContrastCorrectedBlending: boolean`
105 |
106 | - **Description**: Determines if contrast-corrected blending is used for texture samples. This method often enhances blending quality but might result in overly bright or dark patches in high-contrast textures.
107 | - **Default**: `true`
108 | - **Reference**: [ShaderToy Demo](https://www.shadertoy.com/view/4dcSDr)
109 |
110 | |  |  |
111 | |--------------------------------------|---------------------------------------|
112 | | Contrast-Corrected Blending: Enabled | Contrast-Corrected Blending: Disabled |
113 |
114 | ### `lookupSkipThreshold: number`
115 |
116 | - **Description**: The minimum magnitude below which texture lookups are skipped, mainly for optimization purposes.
117 | - **Default**: `0.01`
118 | - **Range**: `[0, 1]` (but you'll probably always want to keep it <0.1)
119 | - **Advice**: Usually doesn't require modification.
120 | - **Details**: The shader mixes up to three texture samples per fragment. Texture lookups with a final coefficient less than this threshold are skipped to reduce GPU memory bandwidth usage.
121 |
122 | ### `textureSampleCoefficientExponent: number`
123 |
124 | - **Description**: The exponent for texture sample coefficients before comparison with `lookupSkipThreshold`. Adjusting this value affects shader efficiency and the visibility of hexagonal tile borders.
125 | - **Default**: `8`
126 | - **Range**: `(0, 64]`
127 | - **Advice**: The default value is suitable for most textures. Modification is usually unnecessary.
128 | - **Details**: Coefficients raised to this exponent modify the steepness of the threshold for skipping texture lookups. Higher exponents increase efficiency by reducing texture lookups, potentially making the shader more efficient.
129 |
130 | |  |  |  |
131 | |----------------------------------|----------------------------------|----------------------------------|
132 | | Texture Sample Coefficient Exponent: 1 | Texture Sample Coefficient Exponent: 2 | Texture Sample Coefficient Exponent: 8 |
133 |
134 | ## Performance
135 |
136 | The hex tiling shader used by this library needs to make up to 3 texture fetches per map per fragment in order to function.
137 |
138 | Usually, this is fine and doesn't result in any noticeable performance hit. But in some situations, hex tiling can create a significant amount of texture bandwidth usage on the GPU and impact performance on weaker devices.
139 |
140 | ### Optimizing Performance
141 |
142 | There are some ways to tune `three-hex-tiling` to lessen its performance impact:
143 |
144 | * Increase `textureSampleCoefficientExponent` and/or `lookupSkipThreshold`
145 | * This directly reduces the average number of texture samples made per fragment, but it can make the borders between hex tiles more obvious.
146 | * Use a [depth pre-pass](https://cprimozic.net/blog/threejs-depth-pre-pass-optimization/) to your scene to reduce the number of calls to the fragment shader.
147 | * For some scenes, especially those with high overdraw, this can be a big win
148 | * Reduce the number of maps used by your material
149 | * Reduce the size of textures used or use [compressed textures](https://threejs.org/docs/#api/en/textures/CompressedTexture)
150 |
151 | ## Implementation Details
152 |
153 | The hex tiling shader itself is adapted from [a Shadertoy](https://www.shadertoy.com/view/MdyfDV) by [Fabrice Neyret](http://evasion.imag.fr/Membres/Fabrice.Neyret/).
154 |
155 | `three-hex-tiling` works by modifying Three.JS's shaders directly, patching in the hex tiling algorithm and conditionally enabling it for materials that opt in. Materials that do not explicitly set `hexTiling` will work normally.
156 |
157 | In addition to patching the shaders, it also installs a custom [`onBeforeCompile`](https://threejs.org/docs/#api/en/materials/Material.onBeforeCompile) callback on materials. If you make use of `onBeforeCompile` in your own code, there's a good chance that `three-hex-tiling` will interfere with it and cause problems.
158 |
--------------------------------------------------------------------------------
/demo/index.ts:
--------------------------------------------------------------------------------
1 | import * as THREE from "three";
2 | import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader.js";
3 | import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";
4 | import GUI from "lil-gui";
5 |
6 | // Install the hex tiling shader patch
7 | import "../src/index";
8 |
9 | // You would use this in your own code like this:
10 | // import 'three-hex-tiling';
11 |
12 | import { type HexTilingParams } from "../src/index";
13 |
14 | console.log("three.js version:", THREE.REVISION);
15 |
16 | const canvas = document.createElement("canvas");
17 | canvas.width = window.innerWidth;
18 | canvas.height = window.innerHeight;
19 | canvas.style.backgroundColor = "black";
20 | document.body.appendChild(canvas);
21 |
22 | interface TexturesDef {
23 | textureURL: string;
24 | textureNormalURL: string;
25 | textureRoughnessURL?: string;
26 | nonTilingTextureScale: number;
27 | tilingTextureScale: number;
28 | }
29 |
30 | const Materials: { [key: string]: TexturesDef } = {
31 | ore: {
32 | textureURL: "https://i.ameo.link/bd3.jpg",
33 | textureNormalURL: "https://i.ameo.link/bd6.jpg",
34 | nonTilingTextureScale: 16,
35 | tilingTextureScale: 40,
36 | },
37 | blackStone: {
38 | textureURL: "https://i.ameo.link/bdd.jpg",
39 | textureNormalURL: "https://i.ameo.link/bdf.jpg",
40 | textureRoughnessURL: "https://i.ameo.link/bdg.jpg",
41 | nonTilingTextureScale: 12,
42 | tilingTextureScale: 22,
43 | },
44 | grayStone: {
45 | textureURL: "https://i.ameo.link/bfj.jpg",
46 | textureNormalURL: "https://i.ameo.link/bfk.jpg",
47 | textureRoughnessURL: "https://i.ameo.link/bfl.jpg",
48 | nonTilingTextureScale: 22,
49 | tilingTextureScale: 42,
50 | },
51 | cartoonLava: {
52 | textureURL: "https://i.ameo.link/bl9.jpg",
53 | textureNormalURL: "https://i.ameo.link/bla.jpg",
54 | textureRoughnessURL: "https://i.ameo.link/blb.jpg",
55 | nonTilingTextureScale: 12 * 2,
56 | tilingTextureScale: 24 * 2,
57 | },
58 | };
59 |
60 | interface Textures {
61 | texture: THREE.Texture;
62 | textureNormal: THREE.Texture;
63 | textureRoughness: THREE.Texture | undefined;
64 | }
65 |
66 | interface TexturesCacheEntry {
67 | enabled: Textures;
68 | disabled: Textures;
69 | }
70 |
71 | const texturesCache: Map> = new Map();
72 |
73 | const loadTextures = (key: string) => {
74 | const cached = texturesCache.get(key);
75 | if (cached) {
76 | return cached;
77 | }
78 |
79 | const defPromise = new Promise(async (resolve) => {
80 | const {
81 | tilingTextureScale,
82 | nonTilingTextureScale,
83 | textureNormalURL,
84 | textureURL,
85 | textureRoughnessURL,
86 | } = Materials[key];
87 |
88 | const [texture, textureNormal, textureRoughness] = await Promise.all([
89 | textureLoader.loadAsync(textureURL),
90 | textureLoader.loadAsync(textureNormalURL),
91 | textureRoughnessURL
92 | ? textureLoader.loadAsync(textureRoughnessURL)
93 | : undefined,
94 | ]);
95 | texture.wrapS = THREE.RepeatWrapping;
96 | texture.wrapT = THREE.RepeatWrapping;
97 | texture.repeat.set(tilingTextureScale, tilingTextureScale);
98 | texture.magFilter = THREE.NearestFilter;
99 | texture.anisotropy = 16;
100 | // I find that this helps to make things look a bit sharper when using
101 | // the hex tile-breaking shader, but it's not necessary
102 | texture.minFilter = THREE.NearestMipMapLinearFilter;
103 |
104 | textureNormal.wrapS = THREE.RepeatWrapping;
105 | textureNormal.wrapT = THREE.RepeatWrapping;
106 | textureNormal.repeat.set(tilingTextureScale, tilingTextureScale);
107 |
108 | if (textureRoughness) {
109 | textureRoughness.wrapS = THREE.RepeatWrapping;
110 | textureRoughness.wrapT = THREE.RepeatWrapping;
111 | textureRoughness.repeat.set(tilingTextureScale, tilingTextureScale);
112 | textureRoughness.magFilter = THREE.NearestFilter;
113 | }
114 |
115 | const enabledTextures = {
116 | texture,
117 | textureNormal,
118 | textureRoughness,
119 | };
120 | const disabledTextures = {
121 | texture: texture.clone(),
122 | textureNormal: textureNormal.clone(),
123 | textureRoughness: textureRoughness ? textureRoughness.clone() : undefined,
124 | };
125 |
126 | disabledTextures.texture.repeat.set(
127 | nonTilingTextureScale,
128 | nonTilingTextureScale
129 | );
130 | disabledTextures.textureNormal.repeat.set(
131 | nonTilingTextureScale,
132 | nonTilingTextureScale
133 | );
134 | if (disabledTextures.textureRoughness) {
135 | disabledTextures.textureRoughness.repeat.set(
136 | nonTilingTextureScale,
137 | nonTilingTextureScale
138 | );
139 | }
140 |
141 | resolve({ enabled: enabledTextures, disabled: disabledTextures });
142 | });
143 |
144 | texturesCache.set(key, defPromise);
145 | return defPromise;
146 | };
147 |
148 | const textureLoader = new THREE.TextureLoader();
149 | const gltfLoader = new GLTFLoader();
150 | const gltfPromise = gltfLoader.loadAsync("/terrain.glb");
151 |
152 | const uiParams = {
153 | enabled: true,
154 | };
155 | const textureParams = {
156 | normalScale: 1.7,
157 | texture: "grayStone",
158 | };
159 |
160 | const [textures, gltf] = await Promise.all([
161 | loadTextures(textureParams.texture),
162 | gltfPromise,
163 | ]);
164 |
165 | const scene = new THREE.Scene();
166 | const camera = new THREE.PerspectiveCamera(
167 | 75,
168 | canvas.width / canvas.height,
169 | 0.1,
170 | 1000
171 | );
172 | camera.position.set(20, 20, 20);
173 |
174 | const renderer = new THREE.WebGLRenderer({ canvas, antialias: true });
175 | renderer.setSize(canvas.width, canvas.height);
176 |
177 | const hexTilingParams: HexTilingParams = {
178 | patchScale: 2,
179 | useContrastCorrectedBlending: true,
180 | lookupSkipThreshold: 0.01,
181 | textureSampleCoefficientExponent: 8,
182 | };
183 | const noHexTilingMat = new THREE.MeshPhysicalMaterial({
184 | name: "no-hex-tiling",
185 | color: 0xf0e3f6,
186 | normalScale: new THREE.Vector2(
187 | textureParams.normalScale,
188 | textureParams.normalScale
189 | ),
190 | map: textures.disabled.texture,
191 | normalMap: textures.disabled.textureNormal,
192 | roughnessMap: textures.disabled.textureRoughness,
193 | metalness: 0,
194 | roughness: 1,
195 | });
196 | const hexTilingMat = new THREE.MeshPhysicalMaterial({
197 | name: "hex-tiling",
198 | color: 0xf0e3f6,
199 | normalScale: new THREE.Vector2(
200 | textureParams.normalScale,
201 | textureParams.normalScale
202 | ),
203 | map: textures.enabled.texture,
204 | normalMap: textures.enabled.textureNormal,
205 | roughnessMap: textures.enabled.textureRoughness,
206 | metalness: 0,
207 | roughness: 1,
208 | hexTiling: hexTilingParams,
209 | });
210 |
211 | // load the terrain
212 | const terrain = gltf.scene.getObjectByName("Landscape002") as THREE.Mesh;
213 | terrain.material = hexTilingMat;
214 | scene.add(terrain);
215 |
216 | const gui = new GUI({
217 | width: window.innerWidth > 500 ? 400 : window.innerWidth - 12,
218 | title: "`three-hex-tiling` Demo Controls",
219 | });
220 | gui.$title.innerHTML =
221 | 'three-hex-tiling
Demo Controls';
222 | const link = document.querySelector(".title a")! as HTMLAnchorElement;
223 | // prevent link click from propagating to the title which causes the gui to close
224 | link.addEventListener("click", (e) => e.stopPropagation());
225 |
226 | gui.add(uiParams, "enabled").onChange((value) => {
227 | if (value) {
228 | terrain.material = hexTilingMat;
229 | } else {
230 | terrain.material = noHexTilingMat;
231 | }
232 | });
233 |
234 | const hexFolder = gui.addFolder("Hex Tiling Params");
235 |
236 | hexFolder.add(hexTilingParams, "patchScale").min(0.02).max(6);
237 | hexFolder.add(hexTilingParams, "useContrastCorrectedBlending");
238 | hexFolder.add(hexTilingParams, "lookupSkipThreshold").min(0).max(0.5);
239 | hexFolder
240 | .add(hexTilingParams, "textureSampleCoefficientExponent")
241 | .min(0.5)
242 | .max(32);
243 |
244 | const textureFolder = gui.addFolder("Texture Params");
245 | textureFolder
246 | .add(textureParams, "texture", Object.keys(Materials))
247 | .onChange(async (value) => {
248 | const textures = await loadTextures(value);
249 |
250 | hexTilingMat.map = textures.enabled.texture;
251 | hexTilingMat.normalMap = textures.enabled.textureNormal;
252 | hexTilingMat.roughnessMap = textures.enabled.textureRoughness ?? null;
253 |
254 | noHexTilingMat.map = textures.disabled.texture;
255 | noHexTilingMat.normalMap = textures.disabled.textureNormal;
256 | noHexTilingMat.roughnessMap = textures.disabled.textureRoughness ?? null;
257 |
258 | hexTilingMat.needsUpdate = true;
259 | noHexTilingMat.needsUpdate = true;
260 | });
261 | textureFolder
262 | .add(textureParams, "normalScale")
263 | .min(0)
264 | .max(5)
265 | .step(0.1)
266 | .onChange((value) => {
267 | hexTilingMat.normalScale.set(value, value);
268 | noHexTilingMat.normalScale.set(value, value);
269 | });
270 |
271 | const light = new THREE.DirectionalLight(0xf5efd5, 1.2 * Math.PI);
272 | light.position.set(40, 24, 40);
273 | scene.add(light);
274 |
275 | // Add a white sphere at the location of the light to indicate its position
276 | const lightSphere = new THREE.Mesh(
277 | new THREE.SphereGeometry(0.5, 32, 32),
278 | new THREE.MeshBasicMaterial({ color: 0xffffff })
279 | );
280 | lightSphere.castShadow = false;
281 | lightSphere.receiveShadow = false;
282 | lightSphere.position.copy(light.position);
283 | scene.add(lightSphere);
284 |
285 | const ambientLight = new THREE.AmbientLight(0x404040, 2 * Math.PI); // soft white light
286 | scene.add(ambientLight);
287 |
288 | const controls = new OrbitControls(camera, renderer.domElement);
289 | controls.enableDamping = true;
290 |
291 | // configure shadows
292 | renderer.shadowMap.enabled = true;
293 |
294 | // Set up some tone mapping to make colors look nicer
295 | renderer.shadowMap.type = THREE.PCFSoftShadowMap;
296 | // renderer.toneMapping = THREE.CineonToneMapping;
297 | renderer.toneMapping = THREE.ACESFilmicToneMapping;
298 | renderer.toneMappingExposure = 1.25;
299 | renderer.outputColorSpace = THREE.LinearSRGBColorSpace;
300 |
301 | const animate = () => {
302 | renderer.render(scene, camera);
303 | controls.update();
304 | requestAnimationFrame(animate);
305 | };
306 |
307 | window.addEventListener("resize", () => {
308 | canvas.width = window.innerWidth;
309 | canvas.height = window.innerHeight;
310 | camera.aspect = canvas.width / canvas.height;
311 | camera.updateProjectionMatrix();
312 | renderer.setSize(canvas.width, canvas.height);
313 | });
314 |
315 | animate();
316 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | three-hex-tiling
7 |
13 |
14 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "three-hex-tiling",
3 | "license": "MIT",
4 | "version": "0.1.5",
5 | "type": "module",
6 | "files": [
7 | "dist"
8 | ],
9 | "main": "./dist/index.cjs",
10 | "module": "./dist/index.js",
11 | "types": "./dist/index.d.ts",
12 | "exports": {
13 | ".": {
14 | "import": "./dist/index.js",
15 | "require": "./dist/index.umd.cjs"
16 | }
17 | },
18 | "scripts": {
19 | "dev": "vite",
20 | "build": "tsc && vite build",
21 | "build:demo": "vite build --config vite.config.demo.js",
22 | "preview": "vite preview"
23 | },
24 | "devDependencies": {
25 | "@types/three": "^0.173.0",
26 | "lil-gui": "^0.19.2",
27 | "three": "^0.173.0",
28 | "typescript": "^5.5.4",
29 | "vite": "^5.4.2",
30 | "vite-plugin-dts": "^4.0.3",
31 | "vite-plugin-glsl": "^1.3.0"
32 | },
33 | "peerDependencies": {
34 | "three": ">=0.151"
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/public/terrain.glb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Ameobea/three-hex-tiling/b27c1107495eb5c85d5ceab4ea3cb6d03fe2e1bb/public/terrain.glb
--------------------------------------------------------------------------------
/src/index.ts:
--------------------------------------------------------------------------------
1 | ///
2 |
3 | import {
4 | patchMeshPhysicalMaterial,
5 | patchMeshStandardMaterial,
6 | } from "./materials";
7 |
8 | export interface HexTilingParams {
9 | /**
10 | * Scale factor for the hexagonal tiles used to break up the texture. This is the most important
11 | * parameter for controlling the look of the hex tiling and likely needs to be adjusted for each
12 | * texture.
13 | *
14 | * Should be greater than zero and usually somewhere between 0.1 and 16, but the optimal
15 | * value depends on the texture and the desired effect.
16 | *
17 | * Larger values create smaller hexagonal tiles and break up the texture more.
18 | *
19 | * **Default**: 2
20 | */
21 | patchScale: number;
22 | /**
23 | * If set to true, contrast-corrected blending will be used to blend between the texture samples. This
24 | * greatly improves the quality of the blending for most textures, but can sometimes create very bright
25 | * or very dark patches if the texture has a lot of contrast.
26 | *
27 | * See https://www.shadertoy.com/view/4dcSDr for a demo of the effect.
28 | *
29 | * **Default**: `true`
30 | */
31 | useContrastCorrectedBlending: boolean;
32 | /**
33 | * The magnitude under which texture lookups will be skipped.
34 | *
35 | * You probably don't need to change this.
36 | *
37 | * **Default**: 0.01
38 | *
39 | * ### Details
40 | *
41 | * The hex tiling shader mixes between up to three texture samples per fragment. As an optimization,
42 | * if the magnitude of one particular mix is below this threshold, the texture lookup will be skipped to
43 | * reduce GPU memory bandwidth usage.
44 | *
45 | * If the final coefficient of a texture sample is less than `lookupSkipThreshold`, the texture lookup will
46 | * be skipped.
47 | */
48 | lookupSkipThreshold: number;
49 | /**
50 | * The exponent to which texture sample coefficients are raised before comparing to `lookupSkipThreshold`.
51 | *
52 | * Higher values make the shader more efficient but can make the borders between hexagonal tiles more visible.
53 | *
54 | * Lower values make the shader less efficient and can cause detail to get washed out and make the texture
55 | * look blurry and homogenized.
56 | *
57 | * The default value works pretty well for most textures; you likely don't need to change this.
58 | *
59 | * **Default**: 8
60 | *
61 | * ### Details
62 | *
63 | * The hex tiling shader mixes between up to three texture samples per fragment. By raising the coefficients
64 | * to a power, it's possible to make the threshold for skipping a texture lookup more or less steep. Exponents
65 | * greater than 1 make the threshold steeper, exponents less than 1 make the threshold less steep.
66 | *
67 | * Higher exponents, when combined with `lookupSkipThreshold`, can be used to make the hex tiling shader
68 | * more efficient by skipping some texture lookups and reducing GPU memory bandwidth usage.
69 | */
70 | textureSampleCoefficientExponent: number;
71 | }
72 |
73 | declare module "three" {
74 | export interface MeshStandardMaterial {
75 | /**
76 | * Parameters for controlling the hex tiling from `three-hex-tiling`.
77 | *
78 | * If this parameter is not set, hex tiling will not be applied.
79 | *
80 | * This parameter cannot be changed after the material is created.
81 | */
82 | hexTiling?: Partial;
83 | }
84 |
85 | export interface MeshStandardMaterialParameters {
86 | /**
87 | * Parameters for controlling the hex tiling from `three-hex-tiling`.
88 | *
89 | * If this parameter is not set, hex tiling will not be applied.
90 | *
91 | * This parameter cannot be changed after the material is created.
92 | */
93 | hexTiling?: Partial;
94 | }
95 | }
96 |
97 | patchMeshPhysicalMaterial();
98 | patchMeshStandardMaterial();
99 |
--------------------------------------------------------------------------------
/src/materials.ts:
--------------------------------------------------------------------------------
1 | import {
2 | ShaderLib,
3 | MeshStandardMaterial,
4 | type WebGLRenderer,
5 | MeshPhysicalMaterial,
6 | type ShaderLibShader,
7 | } from "three";
8 | import {
9 | buildFragment,
10 | buildUniforms,
11 | THREE_HEX_TILING_DEFINE,
12 | } from "./shaders";
13 | import type { HexTilingParams } from ".";
14 |
15 | const DefaultHexTilingParams: HexTilingParams = Object.freeze({
16 | patchScale: 2,
17 | useContrastCorrectedBlending: true,
18 | lookupSkipThreshold: 0.01,
19 | textureSampleCoefficientExponent: 8,
20 | });
21 |
22 | const genRandomStringID = () =>
23 | Math.random().toString(36).substring(2, 15) +
24 | Math.random().toString(36).substring(2, 15);
25 |
26 | const buildOnBeforeCompile = <
27 | T extends {
28 | hexTiling: Partial;
29 | defines: { [key: string]: string };
30 | }
31 | >(
32 | shaderMap: Map
33 | ) =>
34 | function (this: T, shader: ShaderLibShader, _renderer: WebGLRenderer) {
35 | const hexTilingID = genRandomStringID();
36 | (this as any).hexTilingID = hexTilingID;
37 | shaderMap.set(hexTilingID, shader);
38 |
39 | if (this.hexTiling && this.hexTiling !== EMPTY_HEX_TILING_PARAMS) {
40 | this.defines[THREE_HEX_TILING_DEFINE] = "";
41 | }
42 | };
43 |
44 | const buildCustomProgramCacheKey = <
45 | T extends { hexTiling: Partial }
46 | >() =>
47 | function (this: T): string {
48 | return this.hexTiling && this.hexTiling !== EMPTY_HEX_TILING_PARAMS
49 | ? "1"
50 | : "0";
51 | };
52 |
53 | const buildOnBeforeRender = }>(
54 | shaderMap: Map
55 | ) =>
56 | function onBeforeRender(this: T) {
57 | const shaderRef = shaderMap.get((this as any).hexTilingID);
58 | if (!shaderRef) {
59 | return;
60 | }
61 |
62 | const params = this.hexTiling ?? DefaultHexTilingParams;
63 |
64 | shaderRef.uniforms.hexTilingPatchScale.value =
65 | params.patchScale ?? DefaultHexTilingParams.patchScale;
66 | shaderRef.uniforms.hexTilingUseContrastCorrectedBlending.value =
67 | params.useContrastCorrectedBlending ??
68 | DefaultHexTilingParams.useContrastCorrectedBlending;
69 | shaderRef.uniforms.hexTilingLookupSkipThreshold.value =
70 | params.lookupSkipThreshold ?? DefaultHexTilingParams.lookupSkipThreshold;
71 | shaderRef.uniforms.hexTilingTextureSampleCoefficientExponent.value =
72 | params.textureSampleCoefficientExponent ??
73 | DefaultHexTilingParams.textureSampleCoefficientExponent;
74 | };
75 |
76 | const EMPTY_HEX_TILING_PARAMS = Object.freeze({});
77 |
78 | const patchMaterial = (
79 | MaterialToPatch: typeof MeshStandardMaterial | typeof MeshPhysicalMaterial
80 | ) => {
81 | const shaderMap = new Map();
82 |
83 | MaterialToPatch.prototype.onBeforeCompile = buildOnBeforeCompile(shaderMap);
84 | MaterialToPatch.prototype.customProgramCacheKey =
85 | buildCustomProgramCacheKey();
86 |
87 | // internal ID used to match the shader to the material so that the custom uniforms can be updated
88 | // from the material
89 | (MaterialToPatch.prototype as any).hexTilingID = "NOT_SET";
90 | MaterialToPatch.prototype.hexTiling = EMPTY_HEX_TILING_PARAMS;
91 |
92 | (MaterialToPatch.prototype as any).onBeforeRender =
93 | buildOnBeforeRender(shaderMap);
94 | };
95 |
96 | export const patchMeshStandardMaterial = () => {
97 | const baseFragmentShader = ShaderLib.standard.fragmentShader;
98 | const fragmentShader = buildFragment(baseFragmentShader);
99 | ShaderLib.standard.fragmentShader = fragmentShader;
100 |
101 | Object.assign(ShaderLib.standard.uniforms, buildUniforms());
102 |
103 | patchMaterial(MeshStandardMaterial);
104 | };
105 |
106 | export const patchMeshPhysicalMaterial = () => {
107 | const baseFragmentShader = ShaderLib.physical.fragmentShader;
108 | const fragmentShader = buildFragment(baseFragmentShader);
109 | ShaderLib.physical.fragmentShader = fragmentShader;
110 |
111 | Object.assign(ShaderLib.physical.uniforms, buildUniforms());
112 |
113 | patchMaterial(MeshPhysicalMaterial);
114 | };
115 |
--------------------------------------------------------------------------------
/src/shaders.ts:
--------------------------------------------------------------------------------
1 | import * as THREE from "three";
2 | import tileBreakingNeyretFragment from "./shaders/tileBreakingNeyret.frag";
3 |
4 | export const THREE_HEX_TILING_DEFINE = "USE_THREE_HEX_TILING";
5 |
6 | const buildConditionalReplacer = (
7 | haystack: string,
8 | regex: RegExp,
9 | replacement: string
10 | ): string => {
11 | const match = haystack.match(regex);
12 | if (!match) {
13 | return haystack;
14 | }
15 |
16 | const updatedMatch = `
17 | #ifdef ${THREE_HEX_TILING_DEFINE}
18 | ${replacement}
19 | #else
20 | ${match[0]}
21 | #endif
22 | `;
23 |
24 | return haystack.replace(regex, updatedMatch);
25 | };
26 |
27 | let DidPatchShaderChunks = false;
28 |
29 | const patchShaderChunks = () => {
30 | THREE.ShaderChunk.map_fragment = buildConditionalReplacer(
31 | THREE.ShaderChunk.map_fragment,
32 | /texture2D\(\s*map\s*,\s*vMapUv\s*\)/g,
33 | "textureNoTileNeyret(map, vMapUv)"
34 | );
35 |
36 | THREE.ShaderChunk.normal_fragment_maps = buildConditionalReplacer(
37 | THREE.ShaderChunk.normal_fragment_maps,
38 | /texture2D\(\s*normalMap\s*,\s*vNormalMapUv\s*\)/g,
39 | "textureNoTileNeyret(normalMap, vNormalMapUv)"
40 | );
41 |
42 | THREE.ShaderChunk.roughnessmap_fragment = buildConditionalReplacer(
43 | THREE.ShaderChunk.roughnessmap_fragment,
44 | /texture2D\(\s*roughnessMap\s*,\s*vRoughnessMapUv\s*\)/g,
45 | "textureNoTileNeyret(roughnessMap, vRoughnessMapUv)"
46 | );
47 |
48 | THREE.ShaderChunk.metalnessmap_fragment = buildConditionalReplacer(
49 | THREE.ShaderChunk.metalnessmap_fragment,
50 | /texture2D\(\s*metalnessMap\s*,\s*vMetalnessMapUv\s*\)/g,
51 | "textureNoTileNeyret(metalnessMap, vMetalnessMapUv)"
52 | );
53 |
54 | (THREE.ShaderChunk as any).tilebreaking_pars_fragment =
55 | tileBreakingNeyretFragment;
56 | };
57 |
58 | export const buildFragment = (baseFragmentShader: string) => {
59 | if (!DidPatchShaderChunks) {
60 | DidPatchShaderChunks = true;
61 | patchShaderChunks();
62 | }
63 |
64 | let fragment = baseFragmentShader;
65 | fragment = fragment.replace(
66 | "void main() {",
67 | `
68 | #include
69 |
70 | void main() {
71 | `
72 | );
73 |
74 | return fragment;
75 | };
76 |
77 | export const buildUniforms = () => ({
78 | hexTilingUseContrastCorrectedBlending: { value: true },
79 | hexTilingPatchScale: { value: 6 },
80 | hexTilingLookupSkipThreshold: { value: 0.01 },
81 | hexTilingTextureSampleCoefficientExponent: { value: 8 },
82 | });
83 |
--------------------------------------------------------------------------------
/src/shaders/tileBreakingNeyret.frag:
--------------------------------------------------------------------------------
1 | /**
2 | * Adapted from https://www.shadertoy.com/view/MdyfDV
3 | */
4 |
5 | #define rnd22(p) fract(sin((p) * mat2(127.1, 311.7, 269.5, 183.3)) * 43758.5453)
6 | // TODO: Figure out if this is correct for three.js
7 | #define srgb2rgb(V) pow(max(V, 0.), vec4(2.2)) // RGB <-> sRGB conversions
8 | #define rgb2srgb(V) pow(max(V, 0.), vec4(1. / 2.2))
9 |
10 | // (textureGrad handles MIPmap through patch borders)
11 | #define C(I) (srgb2rgb(textureGrad(samp, U / hexTilingPatchScale - rnd22(I), Gx, Gy)) - meanColor * float(hexTilingUseContrastCorrectedBlending))
12 |
13 | uniform bool hexTilingUseContrastCorrectedBlending; // https://www.shadertoy.com/view/4dcSDr
14 | uniform float hexTilingPatchScale;
15 | uniform float hexTilingLookupSkipThreshold;
16 | uniform float hexTilingTextureSampleCoefficientExponent;
17 |
18 | vec4 textureNoTileNeyret(sampler2D samp, vec2 uv) {
19 | mat2 M0 = mat2(1, 0, .5, sqrt(3.) / 2.);
20 | mat2 M = inverse(M0);
21 | vec2 U = uv * hexTilingPatchScale / 8. * exp2(4. * 0.2 + 1.);
22 | vec2 V = M * U;
23 | vec2 I = floor(V);
24 | vec2 Gx = dFdx(U / hexTilingPatchScale), Gy = dFdy(U / hexTilingPatchScale);
25 |
26 | vec4 meanColor = hexTilingUseContrastCorrectedBlending ? srgb2rgb(texture(samp, U, 99.)) : vec4(0.);
27 |
28 | vec3 F = vec3(fract(V), 0), W;
29 | F.z = 1. - F.x - F.y;
30 | vec4 fragColor = vec4(0.);
31 |
32 | if (F.z > 0.) {
33 | W = vec3(F.z, F.y, F.x);
34 | W = pow(W, vec3(hexTilingTextureSampleCoefficientExponent));
35 | W = W / dot(W, vec3(1.));
36 |
37 | if (W.x > hexTilingLookupSkipThreshold) {
38 | fragColor += C(I) * W.x;
39 | }
40 | if (W.y > hexTilingLookupSkipThreshold) {
41 | fragColor += C(I + vec2(0, 1)) * W.y;
42 | }
43 | if (W.z > hexTilingLookupSkipThreshold) {
44 | fragColor += C(I + vec2(1, 0)) * W.z;
45 | }
46 | } else {
47 | W = vec3(-F.z, 1. - F.y, 1. - F.x);
48 | W = pow(W, vec3(hexTilingTextureSampleCoefficientExponent));
49 | W = W / dot(W, vec3(1.));
50 |
51 | if (W.x > hexTilingLookupSkipThreshold) {
52 | fragColor += C(I + 1.) * W.x;
53 | }
54 | if (W.y > hexTilingLookupSkipThreshold) {
55 | fragColor += C(I + vec2(1, 0)) * W.y;
56 | }
57 | if (W.z > hexTilingLookupSkipThreshold) {
58 | fragColor += C(I + vec2(0, 1)) * W.z;
59 | }
60 | }
61 |
62 | fragColor = hexTilingUseContrastCorrectedBlending ? meanColor + fragColor / length(W) : fragColor;
63 |
64 | fragColor = clamp(rgb2srgb(fragColor), 0., 1.);
65 |
66 | return fragColor;
67 | }
68 |
--------------------------------------------------------------------------------
/src/vite-env.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "ES2020",
4 | "useDefineForClassFields": true,
5 | "module": "ESNext",
6 | "lib": ["ES2020", "DOM", "DOM.Iterable"],
7 | "skipLibCheck": true,
8 |
9 | /* Bundler mode */
10 | "moduleResolution": "bundler",
11 | "allowImportingTsExtensions": true,
12 | "resolveJsonModule": true,
13 | "isolatedModules": true,
14 | "noEmit": true,
15 |
16 | /* Linting */
17 | "strict": true,
18 | "noUnusedLocals": true,
19 | "noUnusedParameters": true,
20 | "noFallthroughCasesInSwitch": true
21 | },
22 | "include": ["src"]
23 | }
24 |
--------------------------------------------------------------------------------
/vite.config.demo.js:
--------------------------------------------------------------------------------
1 | import { resolve } from "path";
2 | import { defineConfig } from "vite";
3 | import glsl from "vite-plugin-glsl";
4 |
5 | export default defineConfig({
6 | plugins: [glsl({ compress: false })],
7 | build: {
8 | target: "chrome91",
9 | rollupOptions: {
10 | input: {
11 | main: resolve(__dirname, "index.html"),
12 | },
13 | },
14 | outDir: "demo/dist",
15 | },
16 | });
17 |
--------------------------------------------------------------------------------
/vite.config.js:
--------------------------------------------------------------------------------
1 | import { resolve } from "path";
2 | import { defineConfig } from "vite";
3 | import glsl from "vite-plugin-glsl";
4 | import dts from "vite-plugin-dts";
5 |
6 | export default defineConfig({
7 | plugins: [glsl({ compress: false }), dts({ include: "src/index.ts" })],
8 | build: {
9 | copyPublicDir: false,
10 | lib: {
11 | entry: resolve(__dirname, "src/index.ts"),
12 | name: "three-hex-tiling",
13 | fileName: "index",
14 | },
15 | rollupOptions: {
16 | // make sure to externalize deps that shouldn't be bundled into the library
17 | external: ["three"],
18 | output: {
19 | // Provide global variables to use in the UMD build for externalized deps
20 | globals: {
21 | three: "THREE",
22 | },
23 | },
24 | },
25 | },
26 | });
27 |
--------------------------------------------------------------------------------
/yarn.lock:
--------------------------------------------------------------------------------
1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2 | # yarn lockfile v1
3 |
4 |
5 | "@babel/helper-string-parser@^7.24.8":
6 | version "7.24.8"
7 | resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d"
8 | integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==
9 |
10 | "@babel/helper-validator-identifier@^7.24.7":
11 | version "7.24.7"
12 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db"
13 | integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==
14 |
15 | "@babel/parser@^7.24.7":
16 | version "7.25.6"
17 | resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.6.tgz#85660c5ef388cbbf6e3d2a694ee97a38f18afe2f"
18 | integrity sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==
19 | dependencies:
20 | "@babel/types" "^7.25.6"
21 |
22 | "@babel/types@^7.25.6":
23 | version "7.25.6"
24 | resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.6.tgz#893942ddb858f32ae7a004ec9d3a76b3463ef8e6"
25 | integrity sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==
26 | dependencies:
27 | "@babel/helper-string-parser" "^7.24.8"
28 | "@babel/helper-validator-identifier" "^7.24.7"
29 | to-fast-properties "^2.0.0"
30 |
31 | "@esbuild/aix-ppc64@0.21.5":
32 | version "0.21.5"
33 | resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f"
34 | integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==
35 |
36 | "@esbuild/android-arm64@0.21.5":
37 | version "0.21.5"
38 | resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052"
39 | integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==
40 |
41 | "@esbuild/android-arm@0.21.5":
42 | version "0.21.5"
43 | resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28"
44 | integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==
45 |
46 | "@esbuild/android-x64@0.21.5":
47 | version "0.21.5"
48 | resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e"
49 | integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==
50 |
51 | "@esbuild/darwin-arm64@0.21.5":
52 | version "0.21.5"
53 | resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a"
54 | integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==
55 |
56 | "@esbuild/darwin-x64@0.21.5":
57 | version "0.21.5"
58 | resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22"
59 | integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==
60 |
61 | "@esbuild/freebsd-arm64@0.21.5":
62 | version "0.21.5"
63 | resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e"
64 | integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==
65 |
66 | "@esbuild/freebsd-x64@0.21.5":
67 | version "0.21.5"
68 | resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261"
69 | integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==
70 |
71 | "@esbuild/linux-arm64@0.21.5":
72 | version "0.21.5"
73 | resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b"
74 | integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==
75 |
76 | "@esbuild/linux-arm@0.21.5":
77 | version "0.21.5"
78 | resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9"
79 | integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==
80 |
81 | "@esbuild/linux-ia32@0.21.5":
82 | version "0.21.5"
83 | resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2"
84 | integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==
85 |
86 | "@esbuild/linux-loong64@0.21.5":
87 | version "0.21.5"
88 | resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df"
89 | integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==
90 |
91 | "@esbuild/linux-mips64el@0.21.5":
92 | version "0.21.5"
93 | resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe"
94 | integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==
95 |
96 | "@esbuild/linux-ppc64@0.21.5":
97 | version "0.21.5"
98 | resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4"
99 | integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==
100 |
101 | "@esbuild/linux-riscv64@0.21.5":
102 | version "0.21.5"
103 | resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc"
104 | integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==
105 |
106 | "@esbuild/linux-s390x@0.21.5":
107 | version "0.21.5"
108 | resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de"
109 | integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==
110 |
111 | "@esbuild/linux-x64@0.21.5":
112 | version "0.21.5"
113 | resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0"
114 | integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==
115 |
116 | "@esbuild/netbsd-x64@0.21.5":
117 | version "0.21.5"
118 | resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047"
119 | integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==
120 |
121 | "@esbuild/openbsd-x64@0.21.5":
122 | version "0.21.5"
123 | resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70"
124 | integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==
125 |
126 | "@esbuild/sunos-x64@0.21.5":
127 | version "0.21.5"
128 | resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b"
129 | integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==
130 |
131 | "@esbuild/win32-arm64@0.21.5":
132 | version "0.21.5"
133 | resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d"
134 | integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==
135 |
136 | "@esbuild/win32-ia32@0.21.5":
137 | version "0.21.5"
138 | resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b"
139 | integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==
140 |
141 | "@esbuild/win32-x64@0.21.5":
142 | version "0.21.5"
143 | resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c"
144 | integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==
145 |
146 | "@jridgewell/sourcemap-codec@^1.5.0":
147 | version "1.5.0"
148 | resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a"
149 | integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==
150 |
151 | "@microsoft/api-extractor-model@7.29.4":
152 | version "7.29.4"
153 | resolved "https://registry.yarnpkg.com/@microsoft/api-extractor-model/-/api-extractor-model-7.29.4.tgz#098f94f304db98f3cea8618fd1107946e212eaf5"
154 | integrity sha512-LHOMxmT8/tU1IiiiHOdHFF83Qsi+V8d0kLfscG4EvQE9cafiR8blOYr8SfkQKWB1wgEilQgXJX3MIA4vetDLZw==
155 | dependencies:
156 | "@microsoft/tsdoc" "~0.15.0"
157 | "@microsoft/tsdoc-config" "~0.17.0"
158 | "@rushstack/node-core-library" "5.5.1"
159 |
160 | "@microsoft/api-extractor@7.47.4":
161 | version "7.47.4"
162 | resolved "https://registry.yarnpkg.com/@microsoft/api-extractor/-/api-extractor-7.47.4.tgz#1a66dc9d6f316fe86eef336e7f8004ab9222499b"
163 | integrity sha512-HKm+P4VNzWwvq1Ey+Jfhhj/3MjsD+ka2hbt8L5AcRM95lu1MFOYnz3XlU7Gr79Q/ZhOb7W/imAKeYrOI0bFydg==
164 | dependencies:
165 | "@microsoft/api-extractor-model" "7.29.4"
166 | "@microsoft/tsdoc" "~0.15.0"
167 | "@microsoft/tsdoc-config" "~0.17.0"
168 | "@rushstack/node-core-library" "5.5.1"
169 | "@rushstack/rig-package" "0.5.3"
170 | "@rushstack/terminal" "0.13.3"
171 | "@rushstack/ts-command-line" "4.22.3"
172 | lodash "~4.17.15"
173 | minimatch "~3.0.3"
174 | resolve "~1.22.1"
175 | semver "~7.5.4"
176 | source-map "~0.6.1"
177 | typescript "5.4.2"
178 |
179 | "@microsoft/tsdoc-config@~0.17.0":
180 | version "0.17.0"
181 | resolved "https://registry.yarnpkg.com/@microsoft/tsdoc-config/-/tsdoc-config-0.17.0.tgz#82605152b3c1d3f5cd4a11697bc298437484d55d"
182 | integrity sha512-v/EYRXnCAIHxOHW+Plb6OWuUoMotxTN0GLatnpOb1xq0KuTNw/WI3pamJx/UbsoJP5k9MCw1QxvvhPcF9pH3Zg==
183 | dependencies:
184 | "@microsoft/tsdoc" "0.15.0"
185 | ajv "~8.12.0"
186 | jju "~1.4.0"
187 | resolve "~1.22.2"
188 |
189 | "@microsoft/tsdoc@0.15.0", "@microsoft/tsdoc@~0.15.0":
190 | version "0.15.0"
191 | resolved "https://registry.yarnpkg.com/@microsoft/tsdoc/-/tsdoc-0.15.0.tgz#f29a55df17cb6e87cfbabce33ff6a14a9f85076d"
192 | integrity sha512-HZpPoABogPvjeJOdzCOSJsXeL/SMCBgBZMVC3X3d7YYp2gf31MfxhUoYUNwf1ERPJOnQc0wkFn9trqI6ZEdZuA==
193 |
194 | "@rollup/pluginutils@^5.1.0":
195 | version "5.1.0"
196 | resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.1.0.tgz#7e53eddc8c7f483a4ad0b94afb1f7f5fd3c771e0"
197 | integrity sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==
198 | dependencies:
199 | "@types/estree" "^1.0.0"
200 | estree-walker "^2.0.2"
201 | picomatch "^2.3.1"
202 |
203 | "@rollup/rollup-android-arm-eabi@4.21.2":
204 | version "4.21.2"
205 | resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.2.tgz#0412834dc423d1ff7be4cb1fc13a86a0cd262c11"
206 | integrity sha512-fSuPrt0ZO8uXeS+xP3b+yYTCBUd05MoSp2N/MFOgjhhUhMmchXlpTQrTpI8T+YAwAQuK7MafsCOxW7VrPMrJcg==
207 |
208 | "@rollup/rollup-android-arm64@4.21.2":
209 | version "4.21.2"
210 | resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.2.tgz#baf1a014b13654f3b9e835388df9caf8c35389cb"
211 | integrity sha512-xGU5ZQmPlsjQS6tzTTGwMsnKUtu0WVbl0hYpTPauvbRAnmIvpInhJtgjj3mcuJpEiuUw4v1s4BimkdfDWlh7gA==
212 |
213 | "@rollup/rollup-darwin-arm64@4.21.2":
214 | version "4.21.2"
215 | resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.2.tgz#0a2c364e775acdf1172fe3327662eec7c46e55b1"
216 | integrity sha512-99AhQ3/ZMxU7jw34Sq8brzXqWH/bMnf7ZVhvLk9QU2cOepbQSVTns6qoErJmSiAvU3InRqC2RRZ5ovh1KN0d0Q==
217 |
218 | "@rollup/rollup-darwin-x64@4.21.2":
219 | version "4.21.2"
220 | resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.2.tgz#a972db75890dfab8df0da228c28993220a468c42"
221 | integrity sha512-ZbRaUvw2iN/y37x6dY50D8m2BnDbBjlnMPotDi/qITMJ4sIxNY33HArjikDyakhSv0+ybdUxhWxE6kTI4oX26w==
222 |
223 | "@rollup/rollup-linux-arm-gnueabihf@4.21.2":
224 | version "4.21.2"
225 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.2.tgz#1609d0630ef61109dd19a278353e5176d92e30a1"
226 | integrity sha512-ztRJJMiE8nnU1YFcdbd9BcH6bGWG1z+jP+IPW2oDUAPxPjo9dverIOyXz76m6IPA6udEL12reYeLojzW2cYL7w==
227 |
228 | "@rollup/rollup-linux-arm-musleabihf@4.21.2":
229 | version "4.21.2"
230 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.2.tgz#3c1dca5f160aa2e79e4b20ff6395eab21804f266"
231 | integrity sha512-flOcGHDZajGKYpLV0JNc0VFH361M7rnV1ee+NTeC/BQQ1/0pllYcFmxpagltANYt8FYf9+kL6RSk80Ziwyhr7w==
232 |
233 | "@rollup/rollup-linux-arm64-gnu@4.21.2":
234 | version "4.21.2"
235 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.2.tgz#c2fe376e8b04eafb52a286668a8df7c761470ac7"
236 | integrity sha512-69CF19Kp3TdMopyteO/LJbWufOzqqXzkrv4L2sP8kfMaAQ6iwky7NoXTp7bD6/irKgknDKM0P9E/1l5XxVQAhw==
237 |
238 | "@rollup/rollup-linux-arm64-musl@4.21.2":
239 | version "4.21.2"
240 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.2.tgz#e62a4235f01e0f66dbba587c087ca6db8008ec80"
241 | integrity sha512-48pD/fJkTiHAZTnZwR0VzHrao70/4MlzJrq0ZsILjLW/Ab/1XlVUStYyGt7tdyIiVSlGZbnliqmult/QGA2O2w==
242 |
243 | "@rollup/rollup-linux-powerpc64le-gnu@4.21.2":
244 | version "4.21.2"
245 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.2.tgz#24b3457e75ee9ae5b1c198bd39eea53222a74e54"
246 | integrity sha512-cZdyuInj0ofc7mAQpKcPR2a2iu4YM4FQfuUzCVA2u4HI95lCwzjoPtdWjdpDKyHxI0UO82bLDoOaLfpZ/wviyQ==
247 |
248 | "@rollup/rollup-linux-riscv64-gnu@4.21.2":
249 | version "4.21.2"
250 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.2.tgz#38edfba9620fe2ca8116c97e02bd9f2d606bde09"
251 | integrity sha512-RL56JMT6NwQ0lXIQmMIWr1SW28z4E4pOhRRNqwWZeXpRlykRIlEpSWdsgNWJbYBEWD84eocjSGDu/XxbYeCmwg==
252 |
253 | "@rollup/rollup-linux-s390x-gnu@4.21.2":
254 | version "4.21.2"
255 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.2.tgz#a3bfb8bc5f1e802f8c76cff4a4be2e9f9ac36a18"
256 | integrity sha512-PMxkrWS9z38bCr3rWvDFVGD6sFeZJw4iQlhrup7ReGmfn7Oukrr/zweLhYX6v2/8J6Cep9IEA/SmjXjCmSbrMQ==
257 |
258 | "@rollup/rollup-linux-x64-gnu@4.21.2":
259 | version "4.21.2"
260 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.2.tgz#0dadf34be9199fcdda44b5985a086326344f30ad"
261 | integrity sha512-B90tYAUoLhU22olrafY3JQCFLnT3NglazdwkHyxNDYF/zAxJt5fJUB/yBoWFoIQ7SQj+KLe3iL4BhOMa9fzgpw==
262 |
263 | "@rollup/rollup-linux-x64-musl@4.21.2":
264 | version "4.21.2"
265 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.2.tgz#7b7deddce240400eb87f2406a445061b4fed99a8"
266 | integrity sha512-7twFizNXudESmC9oneLGIUmoHiiLppz/Xs5uJQ4ShvE6234K0VB1/aJYU3f/4g7PhssLGKBVCC37uRkkOi8wjg==
267 |
268 | "@rollup/rollup-win32-arm64-msvc@4.21.2":
269 | version "4.21.2"
270 | resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.2.tgz#a0ca0c5149c2cfb26fab32e6ba3f16996fbdb504"
271 | integrity sha512-9rRero0E7qTeYf6+rFh3AErTNU1VCQg2mn7CQcI44vNUWM9Ze7MSRS/9RFuSsox+vstRt97+x3sOhEey024FRQ==
272 |
273 | "@rollup/rollup-win32-ia32-msvc@4.21.2":
274 | version "4.21.2"
275 | resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.2.tgz#aae2886beec3024203dbb5569db3a137bc385f8e"
276 | integrity sha512-5rA4vjlqgrpbFVVHX3qkrCo/fZTj1q0Xxpg+Z7yIo3J2AilW7t2+n6Q8Jrx+4MrYpAnjttTYF8rr7bP46BPzRw==
277 |
278 | "@rollup/rollup-win32-x64-msvc@4.21.2":
279 | version "4.21.2"
280 | resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.2.tgz#e4291e3c1bc637083f87936c333cdbcad22af63b"
281 | integrity sha512-6UUxd0+SKomjdzuAcp+HAmxw1FlGBnl1v2yEPSabtx4lBfdXHDVsW7+lQkgz9cNFJGY3AWR7+V8P5BqkD9L9nA==
282 |
283 | "@rushstack/node-core-library@5.5.1":
284 | version "5.5.1"
285 | resolved "https://registry.yarnpkg.com/@rushstack/node-core-library/-/node-core-library-5.5.1.tgz#890db37eafaab582c79eb6bf421447b82b3a964b"
286 | integrity sha512-ZutW56qIzH8xIOlfyaLQJFx+8IBqdbVCZdnj+XT1MorQ1JqqxHse8vbCpEM+2MjsrqcbxcgDIbfggB1ZSQ2A3g==
287 | dependencies:
288 | ajv "~8.13.0"
289 | ajv-draft-04 "~1.0.0"
290 | ajv-formats "~3.0.1"
291 | fs-extra "~7.0.1"
292 | import-lazy "~4.0.0"
293 | jju "~1.4.0"
294 | resolve "~1.22.1"
295 | semver "~7.5.4"
296 |
297 | "@rushstack/rig-package@0.5.3":
298 | version "0.5.3"
299 | resolved "https://registry.yarnpkg.com/@rushstack/rig-package/-/rig-package-0.5.3.tgz#ea4d8a3458540b1295500149c04e645f23134e5d"
300 | integrity sha512-olzSSjYrvCNxUFZowevC3uz8gvKr3WTpHQ7BkpjtRpA3wK+T0ybep/SRUMfr195gBzJm5gaXw0ZMgjIyHqJUow==
301 | dependencies:
302 | resolve "~1.22.1"
303 | strip-json-comments "~3.1.1"
304 |
305 | "@rushstack/terminal@0.13.3":
306 | version "0.13.3"
307 | resolved "https://registry.yarnpkg.com/@rushstack/terminal/-/terminal-0.13.3.tgz#9a05b8cf759f14161a49d3ccb09d556e4161caca"
308 | integrity sha512-fc3zjXOw8E0pXS5t9vTiIPx9gHA0fIdTXsu9mT4WbH+P3mYvnrX0iAQ5a6NvyK1+CqYWBTw/wVNx7SDJkI+WYQ==
309 | dependencies:
310 | "@rushstack/node-core-library" "5.5.1"
311 | supports-color "~8.1.1"
312 |
313 | "@rushstack/ts-command-line@4.22.3":
314 | version "4.22.3"
315 | resolved "https://registry.yarnpkg.com/@rushstack/ts-command-line/-/ts-command-line-4.22.3.tgz#dcc75bd25b21031b32b2758ee3f2f4973b112572"
316 | integrity sha512-edMpWB3QhFFZ4KtSzS8WNjBgR4PXPPOVrOHMbb7kNpmQ1UFS9HdVtjCXg1H5fG+xYAbeE+TMPcVPUyX2p84STA==
317 | dependencies:
318 | "@rushstack/terminal" "0.13.3"
319 | "@types/argparse" "1.0.38"
320 | argparse "~1.0.9"
321 | string-argv "~0.3.1"
322 |
323 | "@tweenjs/tween.js@~23.1.3":
324 | version "23.1.3"
325 | resolved "https://registry.yarnpkg.com/@tweenjs/tween.js/-/tween.js-23.1.3.tgz#eff0245735c04a928bb19c026b58c2a56460539d"
326 | integrity sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==
327 |
328 | "@types/argparse@1.0.38":
329 | version "1.0.38"
330 | resolved "https://registry.yarnpkg.com/@types/argparse/-/argparse-1.0.38.tgz#a81fd8606d481f873a3800c6ebae4f1d768a56a9"
331 | integrity sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==
332 |
333 | "@types/estree@1.0.5":
334 | version "1.0.5"
335 | resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4"
336 | integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==
337 |
338 | "@types/estree@^1.0.0":
339 | version "1.0.1"
340 | resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.1.tgz#aa22750962f3bf0e79d753d3cc067f010c95f194"
341 | integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==
342 |
343 | "@types/stats.js@*":
344 | version "0.17.0"
345 | resolved "https://registry.yarnpkg.com/@types/stats.js/-/stats.js-0.17.0.tgz#0ed81d48e03b590c24da85540c1d952077a9fe20"
346 | integrity sha512-9w+a7bR8PeB0dCT/HBULU2fMqf6BAzvKbxFboYhmDtDkKPiyXYbjoe2auwsXlEFI7CFNMF1dCv3dFH5Poy9R1w==
347 |
348 | "@types/three@^0.173.0":
349 | version "0.173.0"
350 | resolved "https://registry.yarnpkg.com/@types/three/-/three-0.173.0.tgz#527a9d13b963cf98bf2789b9a771fca0c98554a3"
351 | integrity sha512-KtNjfI/CRB6JVKIVeZM1R3GYDX2wkoV2itNcQu2j4d7qkhjGOuB+s2oF6jl9mztycDLGMtrAnJQYxInC8Bb20A==
352 | dependencies:
353 | "@tweenjs/tween.js" "~23.1.3"
354 | "@types/stats.js" "*"
355 | "@types/webxr" "*"
356 | "@webgpu/types" "*"
357 | fflate "~0.8.2"
358 | meshoptimizer "~0.18.1"
359 |
360 | "@types/webxr@*":
361 | version "0.5.2"
362 | resolved "https://registry.yarnpkg.com/@types/webxr/-/webxr-0.5.2.tgz#5d9627b0ffe223aa3b166de7112ac8a9460dc54f"
363 | integrity sha512-szL74BnIcok9m7QwYtVmQ+EdIKwbjPANudfuvDrAF8Cljg9MKUlIoc1w5tjj9PMpeSH3U1Xnx//czQybJ0EfSw==
364 |
365 | "@volar/language-core@2.4.1", "@volar/language-core@~2.4.0-alpha.18":
366 | version "2.4.1"
367 | resolved "https://registry.yarnpkg.com/@volar/language-core/-/language-core-2.4.1.tgz#267984b2b06908b78f1c016392fc75b75516595b"
368 | integrity sha512-9AKhC7Qn2mQYxj7Dz3bVxeOk7gGJladhWixUYKef/o0o7Bm4an+A3XvmcTHVqZ8stE6lBVH++g050tBtJ4TZPQ==
369 | dependencies:
370 | "@volar/source-map" "2.4.1"
371 |
372 | "@volar/source-map@2.4.1":
373 | version "2.4.1"
374 | resolved "https://registry.yarnpkg.com/@volar/source-map/-/source-map-2.4.1.tgz#6a6d02b9dac66a5dd99378dcdae63107a0b45fce"
375 | integrity sha512-Xq6ep3OZg9xUqN90jEgB9ztX5SsTz1yiV8wiQbcYNjWkek+Ie3dc8l7AVt3EhDm9mSIR58oWczHkzM2H6HIsmQ==
376 |
377 | "@volar/typescript@^2.3.4", "@volar/typescript@~2.4.0-alpha.18":
378 | version "2.4.1"
379 | resolved "https://registry.yarnpkg.com/@volar/typescript/-/typescript-2.4.1.tgz#6285f29b36c58769ccc14153f329d11e89ee13bc"
380 | integrity sha512-UoRzC0PXcwajFQTu8XxKSYNsWNBtVja6Y9gC8eLv7kYm+UEKJCcZ8g7dialsOYA0HKs3Vpg57MeCsawFLC6m9Q==
381 | dependencies:
382 | "@volar/language-core" "2.4.1"
383 | path-browserify "^1.0.1"
384 | vscode-uri "^3.0.8"
385 |
386 | "@vue/compiler-core@3.4.38":
387 | version "3.4.38"
388 | resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.4.38.tgz#326dfe3c92fa2b0f1dc9b39a948a231980253496"
389 | integrity sha512-8IQOTCWnLFqfHzOGm9+P8OPSEDukgg3Huc92qSG49if/xI2SAwLHQO2qaPQbjCWPBcQoO1WYfXfTACUrWV3c5A==
390 | dependencies:
391 | "@babel/parser" "^7.24.7"
392 | "@vue/shared" "3.4.38"
393 | entities "^4.5.0"
394 | estree-walker "^2.0.2"
395 | source-map-js "^1.2.0"
396 |
397 | "@vue/compiler-dom@^3.4.0":
398 | version "3.4.38"
399 | resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.4.38.tgz#90348fac1130e0bbd408b650635cb626b3b9df06"
400 | integrity sha512-Osc/c7ABsHXTsETLgykcOwIxFktHfGSUDkb05V61rocEfsFDcjDLH/IHJSNJP+/Sv9KeN2Lx1V6McZzlSb9EhQ==
401 | dependencies:
402 | "@vue/compiler-core" "3.4.38"
403 | "@vue/shared" "3.4.38"
404 |
405 | "@vue/compiler-vue2@^2.7.16":
406 | version "2.7.16"
407 | resolved "https://registry.yarnpkg.com/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz#2ba837cbd3f1b33c2bc865fbe1a3b53fb611e249"
408 | integrity sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==
409 | dependencies:
410 | de-indent "^1.0.2"
411 | he "^1.2.0"
412 |
413 | "@vue/language-core@2.0.29":
414 | version "2.0.29"
415 | resolved "https://registry.yarnpkg.com/@vue/language-core/-/language-core-2.0.29.tgz#19462d786cd7a1c21dbe575b46970a57094e0357"
416 | integrity sha512-o2qz9JPjhdoVj8D2+9bDXbaI4q2uZTHQA/dbyZT4Bj1FR9viZxDJnLcKVHfxdn6wsOzRgpqIzJEEmSSvgMvDTQ==
417 | dependencies:
418 | "@volar/language-core" "~2.4.0-alpha.18"
419 | "@vue/compiler-dom" "^3.4.0"
420 | "@vue/compiler-vue2" "^2.7.16"
421 | "@vue/shared" "^3.4.0"
422 | computeds "^0.0.1"
423 | minimatch "^9.0.3"
424 | muggle-string "^0.4.1"
425 | path-browserify "^1.0.1"
426 |
427 | "@vue/shared@3.4.38", "@vue/shared@^3.4.0":
428 | version "3.4.38"
429 | resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.4.38.tgz#552a6770098bfd556fa3e2c686c9d3b4f4cd94c2"
430 | integrity sha512-q0xCiLkuWWQLzVrecPb0RMsNWyxICOjPrcrwxTUEHb1fsnvni4dcuyG7RT/Ie7VPTvnjzIaWzRMUBsrqNj/hhw==
431 |
432 | "@webgpu/types@*":
433 | version "0.1.44"
434 | resolved "https://registry.yarnpkg.com/@webgpu/types/-/types-0.1.44.tgz#1b264c0bfcb298df59d0943dad8ef02b4ff98d14"
435 | integrity sha512-JDpYJN5E/asw84LTYhKyvPpxGnD+bAKPtpW9Ilurf7cZpxaTbxkQcGwOd7jgB9BPBrTYQ+32ufo4HiuomTjHNQ==
436 |
437 | acorn@^8.11.3:
438 | version "8.12.1"
439 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248"
440 | integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==
441 |
442 | ajv-draft-04@~1.0.0:
443 | version "1.0.0"
444 | resolved "https://registry.yarnpkg.com/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz#3b64761b268ba0b9e668f0b41ba53fce0ad77fc8"
445 | integrity sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==
446 |
447 | ajv-formats@~3.0.1:
448 | version "3.0.1"
449 | resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-3.0.1.tgz#3d5dc762bca17679c3c2ea7e90ad6b7532309578"
450 | integrity sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==
451 | dependencies:
452 | ajv "^8.0.0"
453 |
454 | ajv@^8.0.0:
455 | version "8.17.1"
456 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6"
457 | integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==
458 | dependencies:
459 | fast-deep-equal "^3.1.3"
460 | fast-uri "^3.0.1"
461 | json-schema-traverse "^1.0.0"
462 | require-from-string "^2.0.2"
463 |
464 | ajv@~8.12.0:
465 | version "8.12.0"
466 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1"
467 | integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==
468 | dependencies:
469 | fast-deep-equal "^3.1.1"
470 | json-schema-traverse "^1.0.0"
471 | require-from-string "^2.0.2"
472 | uri-js "^4.2.2"
473 |
474 | ajv@~8.13.0:
475 | version "8.13.0"
476 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.13.0.tgz#a3939eaec9fb80d217ddf0c3376948c023f28c91"
477 | integrity sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==
478 | dependencies:
479 | fast-deep-equal "^3.1.3"
480 | json-schema-traverse "^1.0.0"
481 | require-from-string "^2.0.2"
482 | uri-js "^4.4.1"
483 |
484 | argparse@~1.0.9:
485 | version "1.0.10"
486 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
487 | integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
488 | dependencies:
489 | sprintf-js "~1.0.2"
490 |
491 | balanced-match@^1.0.0:
492 | version "1.0.2"
493 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
494 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
495 |
496 | brace-expansion@^1.1.7:
497 | version "1.1.11"
498 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
499 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
500 | dependencies:
501 | balanced-match "^1.0.0"
502 | concat-map "0.0.1"
503 |
504 | brace-expansion@^2.0.1:
505 | version "2.0.1"
506 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae"
507 | integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==
508 | dependencies:
509 | balanced-match "^1.0.0"
510 |
511 | compare-versions@^6.1.1:
512 | version "6.1.1"
513 | resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-6.1.1.tgz#7af3cc1099ba37d244b3145a9af5201b629148a9"
514 | integrity sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==
515 |
516 | computeds@^0.0.1:
517 | version "0.0.1"
518 | resolved "https://registry.yarnpkg.com/computeds/-/computeds-0.0.1.tgz#215b08a4ba3e08a11ff6eee5d6d8d7166a97ce2e"
519 | integrity sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==
520 |
521 | concat-map@0.0.1:
522 | version "0.0.1"
523 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
524 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
525 |
526 | confbox@^0.1.7:
527 | version "0.1.7"
528 | resolved "https://registry.yarnpkg.com/confbox/-/confbox-0.1.7.tgz#ccfc0a2bcae36a84838e83a3b7f770fb17d6c579"
529 | integrity sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==
530 |
531 | de-indent@^1.0.2:
532 | version "1.0.2"
533 | resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d"
534 | integrity sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==
535 |
536 | debug@^4.3.6:
537 | version "4.3.6"
538 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.6.tgz#2ab2c38fbaffebf8aa95fdfe6d88438c7a13c52b"
539 | integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==
540 | dependencies:
541 | ms "2.1.2"
542 |
543 | entities@^4.5.0:
544 | version "4.5.0"
545 | resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48"
546 | integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==
547 |
548 | esbuild@^0.21.3:
549 | version "0.21.5"
550 | resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d"
551 | integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==
552 | optionalDependencies:
553 | "@esbuild/aix-ppc64" "0.21.5"
554 | "@esbuild/android-arm" "0.21.5"
555 | "@esbuild/android-arm64" "0.21.5"
556 | "@esbuild/android-x64" "0.21.5"
557 | "@esbuild/darwin-arm64" "0.21.5"
558 | "@esbuild/darwin-x64" "0.21.5"
559 | "@esbuild/freebsd-arm64" "0.21.5"
560 | "@esbuild/freebsd-x64" "0.21.5"
561 | "@esbuild/linux-arm" "0.21.5"
562 | "@esbuild/linux-arm64" "0.21.5"
563 | "@esbuild/linux-ia32" "0.21.5"
564 | "@esbuild/linux-loong64" "0.21.5"
565 | "@esbuild/linux-mips64el" "0.21.5"
566 | "@esbuild/linux-ppc64" "0.21.5"
567 | "@esbuild/linux-riscv64" "0.21.5"
568 | "@esbuild/linux-s390x" "0.21.5"
569 | "@esbuild/linux-x64" "0.21.5"
570 | "@esbuild/netbsd-x64" "0.21.5"
571 | "@esbuild/openbsd-x64" "0.21.5"
572 | "@esbuild/sunos-x64" "0.21.5"
573 | "@esbuild/win32-arm64" "0.21.5"
574 | "@esbuild/win32-ia32" "0.21.5"
575 | "@esbuild/win32-x64" "0.21.5"
576 |
577 | estree-walker@^2.0.2:
578 | version "2.0.2"
579 | resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac"
580 | integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==
581 |
582 | fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
583 | version "3.1.3"
584 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
585 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
586 |
587 | fast-uri@^3.0.1:
588 | version "3.0.1"
589 | resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.1.tgz#cddd2eecfc83a71c1be2cc2ef2061331be8a7134"
590 | integrity sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==
591 |
592 | fflate@~0.8.2:
593 | version "0.8.2"
594 | resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.8.2.tgz#fc8631f5347812ad6028bbe4a2308b2792aa1dea"
595 | integrity sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==
596 |
597 | fs-extra@~7.0.1:
598 | version "7.0.1"
599 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9"
600 | integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==
601 | dependencies:
602 | graceful-fs "^4.1.2"
603 | jsonfile "^4.0.0"
604 | universalify "^0.1.0"
605 |
606 | fsevents@~2.3.2:
607 | version "2.3.2"
608 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
609 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
610 |
611 | fsevents@~2.3.3:
612 | version "2.3.3"
613 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
614 | integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
615 |
616 | function-bind@^1.1.2:
617 | version "1.1.2"
618 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c"
619 | integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
620 |
621 | graceful-fs@^4.1.2, graceful-fs@^4.1.6:
622 | version "4.2.11"
623 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3"
624 | integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
625 |
626 | has-flag@^4.0.0:
627 | version "4.0.0"
628 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
629 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
630 |
631 | hasown@^2.0.0:
632 | version "2.0.0"
633 | resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c"
634 | integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==
635 | dependencies:
636 | function-bind "^1.1.2"
637 |
638 | he@^1.2.0:
639 | version "1.2.0"
640 | resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
641 | integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
642 |
643 | import-lazy@~4.0.0:
644 | version "4.0.0"
645 | resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153"
646 | integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==
647 |
648 | is-core-module@^2.13.0:
649 | version "2.13.1"
650 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384"
651 | integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==
652 | dependencies:
653 | hasown "^2.0.0"
654 |
655 | jju@~1.4.0:
656 | version "1.4.0"
657 | resolved "https://registry.yarnpkg.com/jju/-/jju-1.4.0.tgz#a3abe2718af241a2b2904f84a625970f389ae32a"
658 | integrity sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==
659 |
660 | json-schema-traverse@^1.0.0:
661 | version "1.0.0"
662 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2"
663 | integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==
664 |
665 | jsonfile@^4.0.0:
666 | version "4.0.0"
667 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
668 | integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==
669 | optionalDependencies:
670 | graceful-fs "^4.1.6"
671 |
672 | kolorist@^1.8.0:
673 | version "1.8.0"
674 | resolved "https://registry.yarnpkg.com/kolorist/-/kolorist-1.8.0.tgz#edddbbbc7894bc13302cdf740af6374d4a04743c"
675 | integrity sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==
676 |
677 | lil-gui@^0.19.2:
678 | version "0.19.2"
679 | resolved "https://registry.yarnpkg.com/lil-gui/-/lil-gui-0.19.2.tgz#774bf46f1f43ec5fec00884af46b8060786f97fc"
680 | integrity sha512-nU8j4ND702ouGfQZoaTN4dfXxacvGOAVK0DtmZBVcUYUAeYQXLQAjAN50igMHiba3T5jZyKEjXZU+Ntm1Qs6ZQ==
681 |
682 | local-pkg@^0.5.0:
683 | version "0.5.0"
684 | resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-0.5.0.tgz#093d25a346bae59a99f80e75f6e9d36d7e8c925c"
685 | integrity sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==
686 | dependencies:
687 | mlly "^1.4.2"
688 | pkg-types "^1.0.3"
689 |
690 | lodash@~4.17.15:
691 | version "4.17.21"
692 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
693 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
694 |
695 | lru-cache@^6.0.0:
696 | version "6.0.0"
697 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
698 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
699 | dependencies:
700 | yallist "^4.0.0"
701 |
702 | magic-string@^0.30.11:
703 | version "0.30.11"
704 | resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.11.tgz#301a6f93b3e8c2cb13ac1a7a673492c0dfd12954"
705 | integrity sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==
706 | dependencies:
707 | "@jridgewell/sourcemap-codec" "^1.5.0"
708 |
709 | meshoptimizer@~0.18.1:
710 | version "0.18.1"
711 | resolved "https://registry.yarnpkg.com/meshoptimizer/-/meshoptimizer-0.18.1.tgz#cdb90907f30a7b5b1190facd3b7ee6b7087797d8"
712 | integrity sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw==
713 |
714 | minimatch@^9.0.3:
715 | version "9.0.3"
716 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825"
717 | integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==
718 | dependencies:
719 | brace-expansion "^2.0.1"
720 |
721 | minimatch@~3.0.3:
722 | version "3.0.8"
723 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.8.tgz#5e6a59bd11e2ab0de1cfb843eb2d82e546c321c1"
724 | integrity sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==
725 | dependencies:
726 | brace-expansion "^1.1.7"
727 |
728 | mlly@^1.4.2, mlly@^1.7.1:
729 | version "1.7.1"
730 | resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.7.1.tgz#e0336429bb0731b6a8e887b438cbdae522c8f32f"
731 | integrity sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==
732 | dependencies:
733 | acorn "^8.11.3"
734 | pathe "^1.1.2"
735 | pkg-types "^1.1.1"
736 | ufo "^1.5.3"
737 |
738 | ms@2.1.2:
739 | version "2.1.2"
740 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
741 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
742 |
743 | muggle-string@^0.4.1:
744 | version "0.4.1"
745 | resolved "https://registry.yarnpkg.com/muggle-string/-/muggle-string-0.4.1.tgz#3b366bd43b32f809dc20659534dd30e7c8a0d328"
746 | integrity sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==
747 |
748 | nanoid@^3.3.7:
749 | version "3.3.7"
750 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8"
751 | integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==
752 |
753 | path-browserify@^1.0.1:
754 | version "1.0.1"
755 | resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd"
756 | integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==
757 |
758 | path-parse@^1.0.7:
759 | version "1.0.7"
760 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
761 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
762 |
763 | pathe@^1.1.2:
764 | version "1.1.2"
765 | resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.2.tgz#6c4cb47a945692e48a1ddd6e4094d170516437ec"
766 | integrity sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==
767 |
768 | picocolors@^1.0.1:
769 | version "1.0.1"
770 | resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1"
771 | integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==
772 |
773 | picomatch@^2.3.1:
774 | version "2.3.1"
775 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
776 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
777 |
778 | pkg-types@^1.0.3, pkg-types@^1.1.1:
779 | version "1.2.0"
780 | resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-1.2.0.tgz#d0268e894e93acff11a6279de147e83354ebd42d"
781 | integrity sha512-+ifYuSSqOQ8CqP4MbZA5hDpb97n3E8SVWdJe+Wms9kj745lmd3b7EZJiqvmLwAlmRfjrI7Hi5z3kdBJ93lFNPA==
782 | dependencies:
783 | confbox "^0.1.7"
784 | mlly "^1.7.1"
785 | pathe "^1.1.2"
786 |
787 | postcss@^8.4.41:
788 | version "8.4.41"
789 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.41.tgz#d6104d3ba272d882fe18fc07d15dc2da62fa2681"
790 | integrity sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==
791 | dependencies:
792 | nanoid "^3.3.7"
793 | picocolors "^1.0.1"
794 | source-map-js "^1.2.0"
795 |
796 | punycode@^2.1.0:
797 | version "2.3.1"
798 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5"
799 | integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==
800 |
801 | require-from-string@^2.0.2:
802 | version "2.0.2"
803 | resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
804 | integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
805 |
806 | resolve@~1.22.1, resolve@~1.22.2:
807 | version "1.22.8"
808 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d"
809 | integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==
810 | dependencies:
811 | is-core-module "^2.13.0"
812 | path-parse "^1.0.7"
813 | supports-preserve-symlinks-flag "^1.0.0"
814 |
815 | rollup@^4.20.0:
816 | version "4.21.2"
817 | resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.21.2.tgz#f41f277a448d6264e923dd1ea179f0a926aaf9b7"
818 | integrity sha512-e3TapAgYf9xjdLvKQCkQTnbTKd4a6jwlpQSJJFokHGaX2IVjoEqkIIhiQfqsi0cdwlOD+tQGuOd5AJkc5RngBw==
819 | dependencies:
820 | "@types/estree" "1.0.5"
821 | optionalDependencies:
822 | "@rollup/rollup-android-arm-eabi" "4.21.2"
823 | "@rollup/rollup-android-arm64" "4.21.2"
824 | "@rollup/rollup-darwin-arm64" "4.21.2"
825 | "@rollup/rollup-darwin-x64" "4.21.2"
826 | "@rollup/rollup-linux-arm-gnueabihf" "4.21.2"
827 | "@rollup/rollup-linux-arm-musleabihf" "4.21.2"
828 | "@rollup/rollup-linux-arm64-gnu" "4.21.2"
829 | "@rollup/rollup-linux-arm64-musl" "4.21.2"
830 | "@rollup/rollup-linux-powerpc64le-gnu" "4.21.2"
831 | "@rollup/rollup-linux-riscv64-gnu" "4.21.2"
832 | "@rollup/rollup-linux-s390x-gnu" "4.21.2"
833 | "@rollup/rollup-linux-x64-gnu" "4.21.2"
834 | "@rollup/rollup-linux-x64-musl" "4.21.2"
835 | "@rollup/rollup-win32-arm64-msvc" "4.21.2"
836 | "@rollup/rollup-win32-ia32-msvc" "4.21.2"
837 | "@rollup/rollup-win32-x64-msvc" "4.21.2"
838 | fsevents "~2.3.2"
839 |
840 | semver@^7.5.4, semver@~7.5.4:
841 | version "7.5.4"
842 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e"
843 | integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==
844 | dependencies:
845 | lru-cache "^6.0.0"
846 |
847 | source-map-js@^1.2.0:
848 | version "1.2.0"
849 | resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af"
850 | integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==
851 |
852 | source-map@~0.6.1:
853 | version "0.6.1"
854 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
855 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
856 |
857 | sprintf-js@~1.0.2:
858 | version "1.0.3"
859 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
860 | integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==
861 |
862 | string-argv@~0.3.1:
863 | version "0.3.2"
864 | resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6"
865 | integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==
866 |
867 | strip-json-comments@~3.1.1:
868 | version "3.1.1"
869 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
870 | integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
871 |
872 | supports-color@~8.1.1:
873 | version "8.1.1"
874 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c"
875 | integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==
876 | dependencies:
877 | has-flag "^4.0.0"
878 |
879 | supports-preserve-symlinks-flag@^1.0.0:
880 | version "1.0.0"
881 | resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
882 | integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
883 |
884 | three@^0.173.0:
885 | version "0.173.0"
886 | resolved "https://registry.yarnpkg.com/three/-/three-0.173.0.tgz#e82989961cd2db05768540458c81b29f565be921"
887 | integrity sha512-AUwVmViIEUgBwxJJ7stnF0NkPpZxx1aZ6WiAbQ/Qq61h6I9UR4grXtZDmO8mnlaNORhHnIBlXJ1uBxILEKuVyw==
888 |
889 | to-fast-properties@^2.0.0:
890 | version "2.0.0"
891 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
892 | integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==
893 |
894 | typescript@5.4.2:
895 | version "5.4.2"
896 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.2.tgz#0ae9cebcfae970718474fe0da2c090cad6577372"
897 | integrity sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==
898 |
899 | typescript@^5.5.4:
900 | version "5.5.4"
901 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba"
902 | integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==
903 |
904 | ufo@^1.5.3:
905 | version "1.5.4"
906 | resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.5.4.tgz#16d6949674ca0c9e0fbbae1fa20a71d7b1ded754"
907 | integrity sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==
908 |
909 | universalify@^0.1.0:
910 | version "0.1.2"
911 | resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
912 | integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
913 |
914 | uri-js@^4.2.2, uri-js@^4.4.1:
915 | version "4.4.1"
916 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
917 | integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
918 | dependencies:
919 | punycode "^2.1.0"
920 |
921 | vite-plugin-dts@^4.0.3:
922 | version "4.0.3"
923 | resolved "https://registry.yarnpkg.com/vite-plugin-dts/-/vite-plugin-dts-4.0.3.tgz#0f452be5ea81a50fa27ade4e0f3a0d750873affc"
924 | integrity sha512-+xnTsaONwU2kV6zhRjtbRJSGN41uFR/whqmcb4k4fftLFDJElxthp0PP5Fq8gMeM9ytWMt1yk5gGgekLREWYQQ==
925 | dependencies:
926 | "@microsoft/api-extractor" "7.47.4"
927 | "@rollup/pluginutils" "^5.1.0"
928 | "@volar/typescript" "^2.3.4"
929 | "@vue/language-core" "2.0.29"
930 | compare-versions "^6.1.1"
931 | debug "^4.3.6"
932 | kolorist "^1.8.0"
933 | local-pkg "^0.5.0"
934 | magic-string "^0.30.11"
935 | vue-tsc "2.0.29"
936 |
937 | vite-plugin-glsl@^1.3.0:
938 | version "1.3.0"
939 | resolved "https://registry.yarnpkg.com/vite-plugin-glsl/-/vite-plugin-glsl-1.3.0.tgz#6138dc373afbd3891481b529779f76b3625c37ac"
940 | integrity sha512-SzEoLet9Bp5VSozjrhUiSc3xX1+u7rCTjXAsq4qWM3u8UjilI76A9ucX/T+CRGQCe25j50GSY+9mKSGUVPET1w==
941 | dependencies:
942 | "@rollup/pluginutils" "^5.1.0"
943 |
944 | vite@^5.4.2:
945 | version "5.4.2"
946 | resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.2.tgz#8acb6ec4bfab823cdfc1cb2d6c53ed311bc4e47e"
947 | integrity sha512-dDrQTRHp5C1fTFzcSaMxjk6vdpKvT+2/mIdE07Gw2ykehT49O0z/VHS3zZ8iV/Gh8BJJKHWOe5RjaNrW5xf/GA==
948 | dependencies:
949 | esbuild "^0.21.3"
950 | postcss "^8.4.41"
951 | rollup "^4.20.0"
952 | optionalDependencies:
953 | fsevents "~2.3.3"
954 |
955 | vscode-uri@^3.0.8:
956 | version "3.0.8"
957 | resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.0.8.tgz#1770938d3e72588659a172d0fd4642780083ff9f"
958 | integrity sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==
959 |
960 | vue-tsc@2.0.29:
961 | version "2.0.29"
962 | resolved "https://registry.yarnpkg.com/vue-tsc/-/vue-tsc-2.0.29.tgz#bf7e9605af9fadec7fd6037d242217f5c6ad2c3b"
963 | integrity sha512-MHhsfyxO3mYShZCGYNziSbc63x7cQ5g9kvijV7dRe1TTXBRLxXyL0FnXWpUF1xII2mJ86mwYpYsUmMwkmerq7Q==
964 | dependencies:
965 | "@volar/typescript" "~2.4.0-alpha.18"
966 | "@vue/language-core" "2.0.29"
967 | semver "^7.5.4"
968 |
969 | yallist@^4.0.0:
970 | version "4.0.0"
971 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
972 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
973 |
--------------------------------------------------------------------------------