├── .gitattributes
├── .gitignore
├── .husky
└── pre-commit
├── .prettierignore
├── .prettierrc.json
├── .yarn
└── releases
│ └── yarn-3.2.1.cjs
├── .yarnrc.yml
├── LICENSE
├── README.md
├── assets
├── docs
│ ├── example.jpg
│ └── screenshot.jpg
├── github.png
└── twitter.png
├── favicon.ico
├── index.html
├── package-lock.json
├── package.json
├── public
└── textures
│ ├── cloud-noise.png
│ ├── color-noise.png
│ └── fiber-noise.png
├── scripts
└── cleanup.js
├── src
├── engine
│ ├── Camera.ts
│ ├── Engine.ts
│ ├── Experience.ts
│ ├── GameEntity.ts
│ ├── RenderEngine.ts
│ ├── RenderLoop.ts
│ ├── Resources.ts
│ ├── Sizes.ts
│ ├── interface
│ │ ├── DebugUI.ts
│ │ ├── InfoUI.ts
│ │ ├── Loader.ts
│ │ ├── info.scss
│ │ └── loader.scss
│ └── utilities
│ │ └── EventEmitter.ts
├── main.ts
├── pencil-lines
│ ├── Box.ts
│ ├── PencilLines.ts
│ ├── PencilLinesPass.ts
│ ├── PencilLinesShader.ts
│ └── shaders
│ │ ├── gradientNoise.glsl
│ │ ├── pencil-lines.frag
│ │ ├── pencil-lines.vert
│ │ ├── shader.frag
│ │ └── shader.vert
├── style.scss
├── types
│ └── glsl.d.ts
└── vite-env.d.ts
├── tsconfig.json
├── vite.config.js
└── yarn.lock
/.gitattributes:
--------------------------------------------------------------------------------
1 | /.yarn/releases/** binary
2 | /.yarn/plugins/** binary
3 |
--------------------------------------------------------------------------------
/.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 | dist-ssr
13 | *.local
14 |
15 | # Editor directories and files
16 | .vscode/*
17 | !.vscode/extensions.json
18 | .idea
19 | .DS_Store
20 | *.suo
21 | *.ntvs*
22 | *.njsproj
23 | *.sln
24 | *.sw?
25 |
26 | .pnp.*
27 | .yarn/*
28 | !.yarn/patches
29 | !.yarn/plugins
30 | !.yarn/releases
31 | !.yarn/sdks
32 | !.yarn/versions
33 |
--------------------------------------------------------------------------------
/.husky/pre-commit:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env sh
2 | . "$(dirname -- "$0")/_/husky.sh"
3 |
4 | npx lint-staged
5 |
--------------------------------------------------------------------------------
/.prettierignore:
--------------------------------------------------------------------------------
1 | dist
2 | assets
3 | public
4 |
5 | .yarn
6 | .husky
7 | package-lock.json
8 | .yarnrc.yml
9 |
10 | *.glsl
11 | *.vert
12 | *.frag
13 |
--------------------------------------------------------------------------------
/.prettierrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "semi": false,
3 | "singleQuote": true
4 | }
5 |
--------------------------------------------------------------------------------
/.yarnrc.yml:
--------------------------------------------------------------------------------
1 | yarnPath: .yarn/releases/yarn-3.2.1.cjs
2 | nodeLinker: 'node-modules'
3 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2022 Maya Nedeljkovich Batić
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Sketchy Pencil Lines Post-Processing Effect
2 |
3 | ✏️[Link to live demo](https://pencil-lines.vercel.app/)
4 |
5 | 
6 |
7 | ## Prerequisites
8 |
9 | - [Node.js](https://nodejs.org)
10 | - [yarn](https://yarnpkg.com) OR [npm](https://www.npmjs.com)
11 |
12 | > 💡 This project uses **yarn@3.2.1** and **npm@8.1.2**. Other versions might lead to different package resolutions, proceed with caution. Example commands use **yarn**.
13 |
14 | ## Development
15 |
16 | To start the development server, run the following command:
17 |
18 | ```bash
19 | yarn install
20 | yarn dev
21 | ```
22 |
23 | To build the project, run:
24 |
25 | ```bash
26 | yarn build
27 | ```
28 |
29 | And if you wish to automatically start a server to preview your build, you can run:
30 |
31 | ```bash
32 | yarn build && yarn preview
33 | ```
34 |
--------------------------------------------------------------------------------
/assets/docs/example.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mayacoda/pencil-lines/35680c15ec0b02951c92c3274a27c89be05a3faf/assets/docs/example.jpg
--------------------------------------------------------------------------------
/assets/docs/screenshot.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mayacoda/pencil-lines/35680c15ec0b02951c92c3274a27c89be05a3faf/assets/docs/screenshot.jpg
--------------------------------------------------------------------------------
/assets/github.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mayacoda/pencil-lines/35680c15ec0b02951c92c3274a27c89be05a3faf/assets/github.png
--------------------------------------------------------------------------------
/assets/twitter.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mayacoda/pencil-lines/35680c15ec0b02951c92c3274a27c89be05a3faf/assets/twitter.png
--------------------------------------------------------------------------------
/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mayacoda/pencil-lines/35680c15ec0b02951c92c3274a27c89be05a3faf/favicon.ico
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Simple Three.js + TypeScript Starter
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "simple-threejs-typescript-starter",
3 | "version": "0.1.0",
4 | "lockfileVersion": 2,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "simple-threejs-typescript-starter",
9 | "version": "0.1.0",
10 | "license": "MIT",
11 | "dependencies": {
12 | "lil-gui": "^0.16.1",
13 | "three": "^0.141.0"
14 | },
15 | "devDependencies": {
16 | "@types/three": "^0.141.0",
17 | "sass": "^1.52.3",
18 | "typescript": "^4.7.4",
19 | "vite": "^2.9.12",
20 | "vite-plugin-glsl": "^0.1.5"
21 | }
22 | },
23 | "node_modules/@rollup/pluginutils": {
24 | "version": "4.2.1",
25 | "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz",
26 | "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==",
27 | "dev": true,
28 | "dependencies": {
29 | "estree-walker": "^2.0.1",
30 | "picomatch": "^2.2.2"
31 | },
32 | "engines": {
33 | "node": ">= 8.0.0"
34 | }
35 | },
36 | "node_modules/@types/three": {
37 | "version": "0.141.0",
38 | "resolved": "https://registry.npmjs.org/@types/three/-/three-0.141.0.tgz",
39 | "integrity": "sha512-OJdKDgTPVBUgc+s74DYoy4aLznbFFC38Xm4ElmU1YwGNgR7GGFVvFCX7lpVgOsT6S1zSJtGdajTsOYE8/xY9nA==",
40 | "dev": true,
41 | "dependencies": {
42 | "@types/webxr": "*"
43 | }
44 | },
45 | "node_modules/@types/webxr": {
46 | "version": "0.4.0",
47 | "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.4.0.tgz",
48 | "integrity": "sha512-LQvrACV3Pj17GpkwHwXuTd733gfY+D7b9mKdrTmLdO7vo7P/o6209Qqtk63y/FCv/lspdmi0pWz6Qe/ull9kQg==",
49 | "dev": true
50 | },
51 | "node_modules/anymatch": {
52 | "version": "3.1.2",
53 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
54 | "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
55 | "dev": true,
56 | "dependencies": {
57 | "normalize-path": "^3.0.0",
58 | "picomatch": "^2.0.4"
59 | },
60 | "engines": {
61 | "node": ">= 8"
62 | }
63 | },
64 | "node_modules/binary-extensions": {
65 | "version": "2.2.0",
66 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
67 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
68 | "dev": true,
69 | "engines": {
70 | "node": ">=8"
71 | }
72 | },
73 | "node_modules/braces": {
74 | "version": "3.0.2",
75 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
76 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
77 | "dev": true,
78 | "dependencies": {
79 | "fill-range": "^7.0.1"
80 | },
81 | "engines": {
82 | "node": ">=8"
83 | }
84 | },
85 | "node_modules/chokidar": {
86 | "version": "3.5.3",
87 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
88 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
89 | "dev": true,
90 | "funding": [
91 | {
92 | "type": "individual",
93 | "url": "https://paulmillr.com/funding/"
94 | }
95 | ],
96 | "dependencies": {
97 | "anymatch": "~3.1.2",
98 | "braces": "~3.0.2",
99 | "glob-parent": "~5.1.2",
100 | "is-binary-path": "~2.1.0",
101 | "is-glob": "~4.0.1",
102 | "normalize-path": "~3.0.0",
103 | "readdirp": "~3.6.0"
104 | },
105 | "engines": {
106 | "node": ">= 8.10.0"
107 | },
108 | "optionalDependencies": {
109 | "fsevents": "~2.3.2"
110 | }
111 | },
112 | "node_modules/esbuild": {
113 | "version": "0.14.45",
114 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.45.tgz",
115 | "integrity": "sha512-JOxGUD8jcs8xE8DjyGWC8by/vLMCXTJ/wuauWipL5kJRZx1dhpqIntb31QHjA45GZJWaXv7SjC/Zwu1bCkXWtQ==",
116 | "dev": true,
117 | "hasInstallScript": true,
118 | "bin": {
119 | "esbuild": "bin/esbuild"
120 | },
121 | "engines": {
122 | "node": ">=12"
123 | },
124 | "optionalDependencies": {
125 | "esbuild-android-64": "0.14.45",
126 | "esbuild-android-arm64": "0.14.45",
127 | "esbuild-darwin-64": "0.14.45",
128 | "esbuild-darwin-arm64": "0.14.45",
129 | "esbuild-freebsd-64": "0.14.45",
130 | "esbuild-freebsd-arm64": "0.14.45",
131 | "esbuild-linux-32": "0.14.45",
132 | "esbuild-linux-64": "0.14.45",
133 | "esbuild-linux-arm": "0.14.45",
134 | "esbuild-linux-arm64": "0.14.45",
135 | "esbuild-linux-mips64le": "0.14.45",
136 | "esbuild-linux-ppc64le": "0.14.45",
137 | "esbuild-linux-riscv64": "0.14.45",
138 | "esbuild-linux-s390x": "0.14.45",
139 | "esbuild-netbsd-64": "0.14.45",
140 | "esbuild-openbsd-64": "0.14.45",
141 | "esbuild-sunos-64": "0.14.45",
142 | "esbuild-windows-32": "0.14.45",
143 | "esbuild-windows-64": "0.14.45",
144 | "esbuild-windows-arm64": "0.14.45"
145 | }
146 | },
147 | "node_modules/esbuild-android-64": {
148 | "version": "0.14.45",
149 | "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.45.tgz",
150 | "integrity": "sha512-krVmwL2uXQN1A+Ci4u2MR+Y0IAvQK0u3no5TsgguHVhTy138szjuohScCGjkpvLCpGLk7P4kFP1LKuntvJ0d4A==",
151 | "cpu": [
152 | "x64"
153 | ],
154 | "dev": true,
155 | "optional": true,
156 | "os": [
157 | "android"
158 | ],
159 | "engines": {
160 | "node": ">=12"
161 | }
162 | },
163 | "node_modules/esbuild-android-arm64": {
164 | "version": "0.14.45",
165 | "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.45.tgz",
166 | "integrity": "sha512-62POGdzAjM+XOXEM5MmFW6k9Pjdjg1hTrXKKBbPE700LFF36B+1Jv9QkskT5UadbTk4cdH9BQ7bGiRPYY0p/Dw==",
167 | "cpu": [
168 | "arm64"
169 | ],
170 | "dev": true,
171 | "optional": true,
172 | "os": [
173 | "android"
174 | ],
175 | "engines": {
176 | "node": ">=12"
177 | }
178 | },
179 | "node_modules/esbuild-darwin-64": {
180 | "version": "0.14.45",
181 | "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.45.tgz",
182 | "integrity": "sha512-dbkVUAnGx5IeZesWnIhnvxy7dSvgUQvfy0TVLzd9XVP3oI/VsKs8UNsfPrxI5HiN4SINv7oPAbxWceMpB7IqNA==",
183 | "cpu": [
184 | "x64"
185 | ],
186 | "dev": true,
187 | "optional": true,
188 | "os": [
189 | "darwin"
190 | ],
191 | "engines": {
192 | "node": ">=12"
193 | }
194 | },
195 | "node_modules/esbuild-darwin-arm64": {
196 | "version": "0.14.45",
197 | "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.45.tgz",
198 | "integrity": "sha512-O6Bz7nnOae5rvbh2Ueo8ibSr7+/eLjsbPdgeMsAZri+LkOa7nsVPnhmocpO3Hy/LWfagTtHy1O9HRPIaArPmTg==",
199 | "cpu": [
200 | "arm64"
201 | ],
202 | "dev": true,
203 | "optional": true,
204 | "os": [
205 | "darwin"
206 | ],
207 | "engines": {
208 | "node": ">=12"
209 | }
210 | },
211 | "node_modules/esbuild-freebsd-64": {
212 | "version": "0.14.45",
213 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.45.tgz",
214 | "integrity": "sha512-y1X2nr3XSWnDC7MRcy21EVAT0TiCtdefOntJ+SQcZnPBTURzX77f99S8lDF2KswukChkiacpd2Wd4VZieo7w7Q==",
215 | "cpu": [
216 | "x64"
217 | ],
218 | "dev": true,
219 | "optional": true,
220 | "os": [
221 | "freebsd"
222 | ],
223 | "engines": {
224 | "node": ">=12"
225 | }
226 | },
227 | "node_modules/esbuild-freebsd-arm64": {
228 | "version": "0.14.45",
229 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.45.tgz",
230 | "integrity": "sha512-r3ZNejkx1BKXQ6sYOP6C5rTwgiUajyAh03wygLWZtl+SLyygvAnu+OouqtveesufjBDgujp4wZXP/n8PVqXkqg==",
231 | "cpu": [
232 | "arm64"
233 | ],
234 | "dev": true,
235 | "optional": true,
236 | "os": [
237 | "freebsd"
238 | ],
239 | "engines": {
240 | "node": ">=12"
241 | }
242 | },
243 | "node_modules/esbuild-linux-32": {
244 | "version": "0.14.45",
245 | "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.45.tgz",
246 | "integrity": "sha512-Qk9cCO3PJig/Y+SdslN/Th4pbAjgaH9oUjVH28eMsLTPf6QDUuK6EED91jepJdR3vxhcnVjyl6JqtOWmP+uxCg==",
247 | "cpu": [
248 | "ia32"
249 | ],
250 | "dev": true,
251 | "optional": true,
252 | "os": [
253 | "linux"
254 | ],
255 | "engines": {
256 | "node": ">=12"
257 | }
258 | },
259 | "node_modules/esbuild-linux-64": {
260 | "version": "0.14.45",
261 | "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.45.tgz",
262 | "integrity": "sha512-IybO2ugqvc/Zzn1Kih3x0FVjYAy3GTCwhtcp91dbdqk3wPqxYCzObYspa8ca0s+OovI0Cnb+rhXrUtq8gBqlqw==",
263 | "cpu": [
264 | "x64"
265 | ],
266 | "dev": true,
267 | "optional": true,
268 | "os": [
269 | "linux"
270 | ],
271 | "engines": {
272 | "node": ">=12"
273 | }
274 | },
275 | "node_modules/esbuild-linux-arm": {
276 | "version": "0.14.45",
277 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.45.tgz",
278 | "integrity": "sha512-qKWJ4A4TAcxXV2TBLPw3Av5X2SYNfyNnBHNJTQJ5VuevK6Aq5i6XEMvUgdlcVuZ9MYPfS5aJZWglzDzJMf1Lpw==",
279 | "cpu": [
280 | "arm"
281 | ],
282 | "dev": true,
283 | "optional": true,
284 | "os": [
285 | "linux"
286 | ],
287 | "engines": {
288 | "node": ">=12"
289 | }
290 | },
291 | "node_modules/esbuild-linux-arm64": {
292 | "version": "0.14.45",
293 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.45.tgz",
294 | "integrity": "sha512-UNEyuHTwztrkEU/+mWIxGzKrYBo2cEtjYAZQVZB1kliANKgRITktg2miaO/b/VtNe84ob1aXSvW8XOPEn5RTGQ==",
295 | "cpu": [
296 | "arm64"
297 | ],
298 | "dev": true,
299 | "optional": true,
300 | "os": [
301 | "linux"
302 | ],
303 | "engines": {
304 | "node": ">=12"
305 | }
306 | },
307 | "node_modules/esbuild-linux-mips64le": {
308 | "version": "0.14.45",
309 | "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.45.tgz",
310 | "integrity": "sha512-s/jcfw3Vpku5dIVSFVY7idJsGdIpIJ88IrkyprVgCG2yBeXatb67B7yIt0E1tL+OHrJJdNBw6GikCiMPAAu1VA==",
311 | "cpu": [
312 | "mips64el"
313 | ],
314 | "dev": true,
315 | "optional": true,
316 | "os": [
317 | "linux"
318 | ],
319 | "engines": {
320 | "node": ">=12"
321 | }
322 | },
323 | "node_modules/esbuild-linux-ppc64le": {
324 | "version": "0.14.45",
325 | "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.45.tgz",
326 | "integrity": "sha512-lJItl6ESZnhSx951U9R7MTBopgwIELHlQzC6SBR023V5JC1rPRFDZ/UEBsV+7BFcCAfqlyb+odGEAmcBSf4XCA==",
327 | "cpu": [
328 | "ppc64"
329 | ],
330 | "dev": true,
331 | "optional": true,
332 | "os": [
333 | "linux"
334 | ],
335 | "engines": {
336 | "node": ">=12"
337 | }
338 | },
339 | "node_modules/esbuild-linux-riscv64": {
340 | "version": "0.14.45",
341 | "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.45.tgz",
342 | "integrity": "sha512-8anMu+QLl9MununVCGJN2I/JvUWPm1EVsBBLq/J+Nz4hr8t6QOCuEp0HRaeMohyl2XiMFBchVu0mwa05rF7GFQ==",
343 | "cpu": [
344 | "riscv64"
345 | ],
346 | "dev": true,
347 | "optional": true,
348 | "os": [
349 | "linux"
350 | ],
351 | "engines": {
352 | "node": ">=12"
353 | }
354 | },
355 | "node_modules/esbuild-linux-s390x": {
356 | "version": "0.14.45",
357 | "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.45.tgz",
358 | "integrity": "sha512-1TPeNvNCoahMw745KNTA6POKaFfSqQrBb3fdOL82GXZqyKU/6rHNwGP0NgHe88bAUMp3QZfjGfCGKxfBHL77RQ==",
359 | "cpu": [
360 | "s390x"
361 | ],
362 | "dev": true,
363 | "optional": true,
364 | "os": [
365 | "linux"
366 | ],
367 | "engines": {
368 | "node": ">=12"
369 | }
370 | },
371 | "node_modules/esbuild-netbsd-64": {
372 | "version": "0.14.45",
373 | "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.45.tgz",
374 | "integrity": "sha512-55f2eZ8EQhhOZosqX0mApgRoI9PrVyXlHd9Uivk+B0B4WTKUgzkoHaVk4EkIUtNRQTpDWPciTlpb/C2tUYVejA==",
375 | "cpu": [
376 | "x64"
377 | ],
378 | "dev": true,
379 | "optional": true,
380 | "os": [
381 | "netbsd"
382 | ],
383 | "engines": {
384 | "node": ">=12"
385 | }
386 | },
387 | "node_modules/esbuild-openbsd-64": {
388 | "version": "0.14.45",
389 | "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.45.tgz",
390 | "integrity": "sha512-Z5sNcT3oN9eryMW3mGn5HAgg7XCxiUS4isqH1tZXpsdOdOESbgbTEP0mBEJU0WU7Vt2gIN5XMbAp7Oigm0k71g==",
391 | "cpu": [
392 | "x64"
393 | ],
394 | "dev": true,
395 | "optional": true,
396 | "os": [
397 | "openbsd"
398 | ],
399 | "engines": {
400 | "node": ">=12"
401 | }
402 | },
403 | "node_modules/esbuild-sunos-64": {
404 | "version": "0.14.45",
405 | "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.45.tgz",
406 | "integrity": "sha512-WmWu4wAm8mIxxK9aWFCj5VHunY3BHQDT3dAPexMLLszPyMF7RDtUYf+Dash9tjyitvnoxPAvR7DpWpirDLQIlQ==",
407 | "cpu": [
408 | "x64"
409 | ],
410 | "dev": true,
411 | "optional": true,
412 | "os": [
413 | "sunos"
414 | ],
415 | "engines": {
416 | "node": ">=12"
417 | }
418 | },
419 | "node_modules/esbuild-windows-32": {
420 | "version": "0.14.45",
421 | "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.45.tgz",
422 | "integrity": "sha512-DPPehKwPJFBoSG+jILc/vcJNN8pTwz1m6FWojxqtqPhgw8OabTgN4vL7gNMqL/FSeDxF+zyvZeeMrZFYF1d81Q==",
423 | "cpu": [
424 | "ia32"
425 | ],
426 | "dev": true,
427 | "optional": true,
428 | "os": [
429 | "win32"
430 | ],
431 | "engines": {
432 | "node": ">=12"
433 | }
434 | },
435 | "node_modules/esbuild-windows-64": {
436 | "version": "0.14.45",
437 | "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.45.tgz",
438 | "integrity": "sha512-t6bxFZcp9bLmSs+1pCNL/BW2bq3QEQHxU4HoiMEyWfF8QBU8iNXFI1iLGdyCzB1Ue2739h55tpOvojFrfyNPWA==",
439 | "cpu": [
440 | "x64"
441 | ],
442 | "dev": true,
443 | "optional": true,
444 | "os": [
445 | "win32"
446 | ],
447 | "engines": {
448 | "node": ">=12"
449 | }
450 | },
451 | "node_modules/esbuild-windows-arm64": {
452 | "version": "0.14.45",
453 | "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.45.tgz",
454 | "integrity": "sha512-DnhrvjECBJ2L0owoznPb4RqQKZ498SM8J+YHqmqzi0Gf/enkUwwTjB8vPCK6dDuFnNU/NE8f94FhKdkBHYruDQ==",
455 | "cpu": [
456 | "arm64"
457 | ],
458 | "dev": true,
459 | "optional": true,
460 | "os": [
461 | "win32"
462 | ],
463 | "engines": {
464 | "node": ">=12"
465 | }
466 | },
467 | "node_modules/estree-walker": {
468 | "version": "2.0.2",
469 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
470 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
471 | "dev": true
472 | },
473 | "node_modules/fill-range": {
474 | "version": "7.0.1",
475 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
476 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
477 | "dev": true,
478 | "dependencies": {
479 | "to-regex-range": "^5.0.1"
480 | },
481 | "engines": {
482 | "node": ">=8"
483 | }
484 | },
485 | "node_modules/fsevents": {
486 | "version": "2.3.2",
487 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
488 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
489 | "dev": true,
490 | "hasInstallScript": true,
491 | "optional": true,
492 | "os": [
493 | "darwin"
494 | ],
495 | "engines": {
496 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
497 | }
498 | },
499 | "node_modules/function-bind": {
500 | "version": "1.1.1",
501 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
502 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
503 | "dev": true
504 | },
505 | "node_modules/glob-parent": {
506 | "version": "5.1.2",
507 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
508 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
509 | "dev": true,
510 | "dependencies": {
511 | "is-glob": "^4.0.1"
512 | },
513 | "engines": {
514 | "node": ">= 6"
515 | }
516 | },
517 | "node_modules/has": {
518 | "version": "1.0.3",
519 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
520 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
521 | "dev": true,
522 | "dependencies": {
523 | "function-bind": "^1.1.1"
524 | },
525 | "engines": {
526 | "node": ">= 0.4.0"
527 | }
528 | },
529 | "node_modules/immutable": {
530 | "version": "4.1.0",
531 | "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz",
532 | "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==",
533 | "dev": true
534 | },
535 | "node_modules/is-binary-path": {
536 | "version": "2.1.0",
537 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
538 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
539 | "dev": true,
540 | "dependencies": {
541 | "binary-extensions": "^2.0.0"
542 | },
543 | "engines": {
544 | "node": ">=8"
545 | }
546 | },
547 | "node_modules/is-core-module": {
548 | "version": "2.9.0",
549 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz",
550 | "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==",
551 | "dev": true,
552 | "dependencies": {
553 | "has": "^1.0.3"
554 | },
555 | "funding": {
556 | "url": "https://github.com/sponsors/ljharb"
557 | }
558 | },
559 | "node_modules/is-extglob": {
560 | "version": "2.1.1",
561 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
562 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
563 | "dev": true,
564 | "engines": {
565 | "node": ">=0.10.0"
566 | }
567 | },
568 | "node_modules/is-glob": {
569 | "version": "4.0.3",
570 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
571 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
572 | "dev": true,
573 | "dependencies": {
574 | "is-extglob": "^2.1.1"
575 | },
576 | "engines": {
577 | "node": ">=0.10.0"
578 | }
579 | },
580 | "node_modules/is-number": {
581 | "version": "7.0.0",
582 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
583 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
584 | "dev": true,
585 | "engines": {
586 | "node": ">=0.12.0"
587 | }
588 | },
589 | "node_modules/lil-gui": {
590 | "version": "0.16.1",
591 | "resolved": "https://registry.npmjs.org/lil-gui/-/lil-gui-0.16.1.tgz",
592 | "integrity": "sha512-6wnnfBvQxJYRhdLyIA+w5b8utwbuVxNmtpTXElm36OSgHa8lyKp00Xz/4AEx3kvodT0AJYgbfadCFWAM0Q8DgQ=="
593 | },
594 | "node_modules/nanoid": {
595 | "version": "3.3.4",
596 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
597 | "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
598 | "dev": true,
599 | "bin": {
600 | "nanoid": "bin/nanoid.cjs"
601 | },
602 | "engines": {
603 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
604 | }
605 | },
606 | "node_modules/normalize-path": {
607 | "version": "3.0.0",
608 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
609 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
610 | "dev": true,
611 | "engines": {
612 | "node": ">=0.10.0"
613 | }
614 | },
615 | "node_modules/path-parse": {
616 | "version": "1.0.7",
617 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
618 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
619 | "dev": true
620 | },
621 | "node_modules/picocolors": {
622 | "version": "1.0.0",
623 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
624 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
625 | "dev": true
626 | },
627 | "node_modules/picomatch": {
628 | "version": "2.3.1",
629 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
630 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
631 | "dev": true,
632 | "engines": {
633 | "node": ">=8.6"
634 | },
635 | "funding": {
636 | "url": "https://github.com/sponsors/jonschlinkert"
637 | }
638 | },
639 | "node_modules/postcss": {
640 | "version": "8.4.14",
641 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz",
642 | "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==",
643 | "dev": true,
644 | "funding": [
645 | {
646 | "type": "opencollective",
647 | "url": "https://opencollective.com/postcss/"
648 | },
649 | {
650 | "type": "tidelift",
651 | "url": "https://tidelift.com/funding/github/npm/postcss"
652 | }
653 | ],
654 | "dependencies": {
655 | "nanoid": "^3.3.4",
656 | "picocolors": "^1.0.0",
657 | "source-map-js": "^1.0.2"
658 | },
659 | "engines": {
660 | "node": "^10 || ^12 || >=14"
661 | }
662 | },
663 | "node_modules/readdirp": {
664 | "version": "3.6.0",
665 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
666 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
667 | "dev": true,
668 | "dependencies": {
669 | "picomatch": "^2.2.1"
670 | },
671 | "engines": {
672 | "node": ">=8.10.0"
673 | }
674 | },
675 | "node_modules/resolve": {
676 | "version": "1.22.1",
677 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
678 | "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
679 | "dev": true,
680 | "dependencies": {
681 | "is-core-module": "^2.9.0",
682 | "path-parse": "^1.0.7",
683 | "supports-preserve-symlinks-flag": "^1.0.0"
684 | },
685 | "bin": {
686 | "resolve": "bin/resolve"
687 | },
688 | "funding": {
689 | "url": "https://github.com/sponsors/ljharb"
690 | }
691 | },
692 | "node_modules/rollup": {
693 | "version": "2.75.6",
694 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.75.6.tgz",
695 | "integrity": "sha512-OEf0TgpC9vU6WGROJIk1JA3LR5vk/yvqlzxqdrE2CzzXnqKXNzbAwlWUXis8RS3ZPe7LAq+YUxsRa0l3r27MLA==",
696 | "dev": true,
697 | "bin": {
698 | "rollup": "dist/bin/rollup"
699 | },
700 | "engines": {
701 | "node": ">=10.0.0"
702 | },
703 | "optionalDependencies": {
704 | "fsevents": "~2.3.2"
705 | }
706 | },
707 | "node_modules/sass": {
708 | "version": "1.52.3",
709 | "resolved": "https://registry.npmjs.org/sass/-/sass-1.52.3.tgz",
710 | "integrity": "sha512-LNNPJ9lafx+j1ArtA7GyEJm9eawXN8KlA1+5dF6IZyoONg1Tyo/g+muOsENWJH/2Q1FHbbV4UwliU0cXMa/VIA==",
711 | "dev": true,
712 | "dependencies": {
713 | "chokidar": ">=3.0.0 <4.0.0",
714 | "immutable": "^4.0.0",
715 | "source-map-js": ">=0.6.2 <2.0.0"
716 | },
717 | "bin": {
718 | "sass": "sass.js"
719 | },
720 | "engines": {
721 | "node": ">=12.0.0"
722 | }
723 | },
724 | "node_modules/source-map-js": {
725 | "version": "1.0.2",
726 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
727 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
728 | "dev": true,
729 | "engines": {
730 | "node": ">=0.10.0"
731 | }
732 | },
733 | "node_modules/supports-preserve-symlinks-flag": {
734 | "version": "1.0.0",
735 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
736 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
737 | "dev": true,
738 | "engines": {
739 | "node": ">= 0.4"
740 | },
741 | "funding": {
742 | "url": "https://github.com/sponsors/ljharb"
743 | }
744 | },
745 | "node_modules/three": {
746 | "version": "0.141.0",
747 | "resolved": "https://registry.npmjs.org/three/-/three-0.141.0.tgz",
748 | "integrity": "sha512-JaSDAPWuk4RTzG5BYRQm8YZbERUxTfTDVouWgHMisS2to4E5fotMS9F2zPFNOIJyEFTTQDDKPpsgZVThKU3pXA=="
749 | },
750 | "node_modules/to-regex-range": {
751 | "version": "5.0.1",
752 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
753 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
754 | "dev": true,
755 | "dependencies": {
756 | "is-number": "^7.0.0"
757 | },
758 | "engines": {
759 | "node": ">=8.0"
760 | }
761 | },
762 | "node_modules/tslib": {
763 | "version": "2.4.0",
764 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
765 | "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==",
766 | "dev": true
767 | },
768 | "node_modules/typescript": {
769 | "version": "4.7.4",
770 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz",
771 | "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==",
772 | "dev": true,
773 | "bin": {
774 | "tsc": "bin/tsc",
775 | "tsserver": "bin/tsserver"
776 | },
777 | "engines": {
778 | "node": ">=4.2.0"
779 | }
780 | },
781 | "node_modules/vite": {
782 | "version": "2.9.12",
783 | "resolved": "https://registry.npmjs.org/vite/-/vite-2.9.12.tgz",
784 | "integrity": "sha512-suxC36dQo9Rq1qMB2qiRorNJtJAdxguu5TMvBHOc/F370KvqAe9t48vYp+/TbPKRNrMh/J55tOUmkuIqstZaew==",
785 | "dev": true,
786 | "dependencies": {
787 | "esbuild": "^0.14.27",
788 | "postcss": "^8.4.13",
789 | "resolve": "^1.22.0",
790 | "rollup": "^2.59.0"
791 | },
792 | "bin": {
793 | "vite": "bin/vite.js"
794 | },
795 | "engines": {
796 | "node": ">=12.2.0"
797 | },
798 | "optionalDependencies": {
799 | "fsevents": "~2.3.2"
800 | },
801 | "peerDependencies": {
802 | "less": "*",
803 | "sass": "*",
804 | "stylus": "*"
805 | },
806 | "peerDependenciesMeta": {
807 | "less": {
808 | "optional": true
809 | },
810 | "sass": {
811 | "optional": true
812 | },
813 | "stylus": {
814 | "optional": true
815 | }
816 | }
817 | },
818 | "node_modules/vite-plugin-glsl": {
819 | "version": "0.1.5",
820 | "resolved": "https://registry.npmjs.org/vite-plugin-glsl/-/vite-plugin-glsl-0.1.5.tgz",
821 | "integrity": "sha512-BsY0ndZthCXYipF/rc/Vri0s6N/JNwMyCDRJx7qiJNNY8+MiDgzhT2iOIHL7O7v3CvjOG9yOM2+WVTNvnHGT1w==",
822 | "dev": true,
823 | "dependencies": {
824 | "@rollup/pluginutils": "^4.2.1",
825 | "tslib": "^2.4.0"
826 | },
827 | "engines": {
828 | "node": ">= 14.17.0",
829 | "npm": ">= 6.14.13"
830 | }
831 | }
832 | },
833 | "dependencies": {
834 | "@rollup/pluginutils": {
835 | "version": "4.2.1",
836 | "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz",
837 | "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==",
838 | "dev": true,
839 | "requires": {
840 | "estree-walker": "^2.0.1",
841 | "picomatch": "^2.2.2"
842 | }
843 | },
844 | "@types/three": {
845 | "version": "0.141.0",
846 | "resolved": "https://registry.npmjs.org/@types/three/-/three-0.141.0.tgz",
847 | "integrity": "sha512-OJdKDgTPVBUgc+s74DYoy4aLznbFFC38Xm4ElmU1YwGNgR7GGFVvFCX7lpVgOsT6S1zSJtGdajTsOYE8/xY9nA==",
848 | "dev": true,
849 | "requires": {
850 | "@types/webxr": "*"
851 | }
852 | },
853 | "@types/webxr": {
854 | "version": "0.4.0",
855 | "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.4.0.tgz",
856 | "integrity": "sha512-LQvrACV3Pj17GpkwHwXuTd733gfY+D7b9mKdrTmLdO7vo7P/o6209Qqtk63y/FCv/lspdmi0pWz6Qe/ull9kQg==",
857 | "dev": true
858 | },
859 | "anymatch": {
860 | "version": "3.1.2",
861 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
862 | "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
863 | "dev": true,
864 | "requires": {
865 | "normalize-path": "^3.0.0",
866 | "picomatch": "^2.0.4"
867 | }
868 | },
869 | "binary-extensions": {
870 | "version": "2.2.0",
871 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
872 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
873 | "dev": true
874 | },
875 | "braces": {
876 | "version": "3.0.2",
877 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
878 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
879 | "dev": true,
880 | "requires": {
881 | "fill-range": "^7.0.1"
882 | }
883 | },
884 | "chokidar": {
885 | "version": "3.5.3",
886 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
887 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
888 | "dev": true,
889 | "requires": {
890 | "anymatch": "~3.1.2",
891 | "braces": "~3.0.2",
892 | "fsevents": "~2.3.2",
893 | "glob-parent": "~5.1.2",
894 | "is-binary-path": "~2.1.0",
895 | "is-glob": "~4.0.1",
896 | "normalize-path": "~3.0.0",
897 | "readdirp": "~3.6.0"
898 | }
899 | },
900 | "esbuild": {
901 | "version": "0.14.45",
902 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.45.tgz",
903 | "integrity": "sha512-JOxGUD8jcs8xE8DjyGWC8by/vLMCXTJ/wuauWipL5kJRZx1dhpqIntb31QHjA45GZJWaXv7SjC/Zwu1bCkXWtQ==",
904 | "dev": true,
905 | "requires": {
906 | "esbuild-android-64": "0.14.45",
907 | "esbuild-android-arm64": "0.14.45",
908 | "esbuild-darwin-64": "0.14.45",
909 | "esbuild-darwin-arm64": "0.14.45",
910 | "esbuild-freebsd-64": "0.14.45",
911 | "esbuild-freebsd-arm64": "0.14.45",
912 | "esbuild-linux-32": "0.14.45",
913 | "esbuild-linux-64": "0.14.45",
914 | "esbuild-linux-arm": "0.14.45",
915 | "esbuild-linux-arm64": "0.14.45",
916 | "esbuild-linux-mips64le": "0.14.45",
917 | "esbuild-linux-ppc64le": "0.14.45",
918 | "esbuild-linux-riscv64": "0.14.45",
919 | "esbuild-linux-s390x": "0.14.45",
920 | "esbuild-netbsd-64": "0.14.45",
921 | "esbuild-openbsd-64": "0.14.45",
922 | "esbuild-sunos-64": "0.14.45",
923 | "esbuild-windows-32": "0.14.45",
924 | "esbuild-windows-64": "0.14.45",
925 | "esbuild-windows-arm64": "0.14.45"
926 | }
927 | },
928 | "esbuild-android-64": {
929 | "version": "0.14.45",
930 | "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.45.tgz",
931 | "integrity": "sha512-krVmwL2uXQN1A+Ci4u2MR+Y0IAvQK0u3no5TsgguHVhTy138szjuohScCGjkpvLCpGLk7P4kFP1LKuntvJ0d4A==",
932 | "dev": true,
933 | "optional": true
934 | },
935 | "esbuild-android-arm64": {
936 | "version": "0.14.45",
937 | "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.45.tgz",
938 | "integrity": "sha512-62POGdzAjM+XOXEM5MmFW6k9Pjdjg1hTrXKKBbPE700LFF36B+1Jv9QkskT5UadbTk4cdH9BQ7bGiRPYY0p/Dw==",
939 | "dev": true,
940 | "optional": true
941 | },
942 | "esbuild-darwin-64": {
943 | "version": "0.14.45",
944 | "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.45.tgz",
945 | "integrity": "sha512-dbkVUAnGx5IeZesWnIhnvxy7dSvgUQvfy0TVLzd9XVP3oI/VsKs8UNsfPrxI5HiN4SINv7oPAbxWceMpB7IqNA==",
946 | "dev": true,
947 | "optional": true
948 | },
949 | "esbuild-darwin-arm64": {
950 | "version": "0.14.45",
951 | "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.45.tgz",
952 | "integrity": "sha512-O6Bz7nnOae5rvbh2Ueo8ibSr7+/eLjsbPdgeMsAZri+LkOa7nsVPnhmocpO3Hy/LWfagTtHy1O9HRPIaArPmTg==",
953 | "dev": true,
954 | "optional": true
955 | },
956 | "esbuild-freebsd-64": {
957 | "version": "0.14.45",
958 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.45.tgz",
959 | "integrity": "sha512-y1X2nr3XSWnDC7MRcy21EVAT0TiCtdefOntJ+SQcZnPBTURzX77f99S8lDF2KswukChkiacpd2Wd4VZieo7w7Q==",
960 | "dev": true,
961 | "optional": true
962 | },
963 | "esbuild-freebsd-arm64": {
964 | "version": "0.14.45",
965 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.45.tgz",
966 | "integrity": "sha512-r3ZNejkx1BKXQ6sYOP6C5rTwgiUajyAh03wygLWZtl+SLyygvAnu+OouqtveesufjBDgujp4wZXP/n8PVqXkqg==",
967 | "dev": true,
968 | "optional": true
969 | },
970 | "esbuild-linux-32": {
971 | "version": "0.14.45",
972 | "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.45.tgz",
973 | "integrity": "sha512-Qk9cCO3PJig/Y+SdslN/Th4pbAjgaH9oUjVH28eMsLTPf6QDUuK6EED91jepJdR3vxhcnVjyl6JqtOWmP+uxCg==",
974 | "dev": true,
975 | "optional": true
976 | },
977 | "esbuild-linux-64": {
978 | "version": "0.14.45",
979 | "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.45.tgz",
980 | "integrity": "sha512-IybO2ugqvc/Zzn1Kih3x0FVjYAy3GTCwhtcp91dbdqk3wPqxYCzObYspa8ca0s+OovI0Cnb+rhXrUtq8gBqlqw==",
981 | "dev": true,
982 | "optional": true
983 | },
984 | "esbuild-linux-arm": {
985 | "version": "0.14.45",
986 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.45.tgz",
987 | "integrity": "sha512-qKWJ4A4TAcxXV2TBLPw3Av5X2SYNfyNnBHNJTQJ5VuevK6Aq5i6XEMvUgdlcVuZ9MYPfS5aJZWglzDzJMf1Lpw==",
988 | "dev": true,
989 | "optional": true
990 | },
991 | "esbuild-linux-arm64": {
992 | "version": "0.14.45",
993 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.45.tgz",
994 | "integrity": "sha512-UNEyuHTwztrkEU/+mWIxGzKrYBo2cEtjYAZQVZB1kliANKgRITktg2miaO/b/VtNe84ob1aXSvW8XOPEn5RTGQ==",
995 | "dev": true,
996 | "optional": true
997 | },
998 | "esbuild-linux-mips64le": {
999 | "version": "0.14.45",
1000 | "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.45.tgz",
1001 | "integrity": "sha512-s/jcfw3Vpku5dIVSFVY7idJsGdIpIJ88IrkyprVgCG2yBeXatb67B7yIt0E1tL+OHrJJdNBw6GikCiMPAAu1VA==",
1002 | "dev": true,
1003 | "optional": true
1004 | },
1005 | "esbuild-linux-ppc64le": {
1006 | "version": "0.14.45",
1007 | "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.45.tgz",
1008 | "integrity": "sha512-lJItl6ESZnhSx951U9R7MTBopgwIELHlQzC6SBR023V5JC1rPRFDZ/UEBsV+7BFcCAfqlyb+odGEAmcBSf4XCA==",
1009 | "dev": true,
1010 | "optional": true
1011 | },
1012 | "esbuild-linux-riscv64": {
1013 | "version": "0.14.45",
1014 | "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.45.tgz",
1015 | "integrity": "sha512-8anMu+QLl9MununVCGJN2I/JvUWPm1EVsBBLq/J+Nz4hr8t6QOCuEp0HRaeMohyl2XiMFBchVu0mwa05rF7GFQ==",
1016 | "dev": true,
1017 | "optional": true
1018 | },
1019 | "esbuild-linux-s390x": {
1020 | "version": "0.14.45",
1021 | "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.45.tgz",
1022 | "integrity": "sha512-1TPeNvNCoahMw745KNTA6POKaFfSqQrBb3fdOL82GXZqyKU/6rHNwGP0NgHe88bAUMp3QZfjGfCGKxfBHL77RQ==",
1023 | "dev": true,
1024 | "optional": true
1025 | },
1026 | "esbuild-netbsd-64": {
1027 | "version": "0.14.45",
1028 | "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.45.tgz",
1029 | "integrity": "sha512-55f2eZ8EQhhOZosqX0mApgRoI9PrVyXlHd9Uivk+B0B4WTKUgzkoHaVk4EkIUtNRQTpDWPciTlpb/C2tUYVejA==",
1030 | "dev": true,
1031 | "optional": true
1032 | },
1033 | "esbuild-openbsd-64": {
1034 | "version": "0.14.45",
1035 | "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.45.tgz",
1036 | "integrity": "sha512-Z5sNcT3oN9eryMW3mGn5HAgg7XCxiUS4isqH1tZXpsdOdOESbgbTEP0mBEJU0WU7Vt2gIN5XMbAp7Oigm0k71g==",
1037 | "dev": true,
1038 | "optional": true
1039 | },
1040 | "esbuild-sunos-64": {
1041 | "version": "0.14.45",
1042 | "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.45.tgz",
1043 | "integrity": "sha512-WmWu4wAm8mIxxK9aWFCj5VHunY3BHQDT3dAPexMLLszPyMF7RDtUYf+Dash9tjyitvnoxPAvR7DpWpirDLQIlQ==",
1044 | "dev": true,
1045 | "optional": true
1046 | },
1047 | "esbuild-windows-32": {
1048 | "version": "0.14.45",
1049 | "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.45.tgz",
1050 | "integrity": "sha512-DPPehKwPJFBoSG+jILc/vcJNN8pTwz1m6FWojxqtqPhgw8OabTgN4vL7gNMqL/FSeDxF+zyvZeeMrZFYF1d81Q==",
1051 | "dev": true,
1052 | "optional": true
1053 | },
1054 | "esbuild-windows-64": {
1055 | "version": "0.14.45",
1056 | "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.45.tgz",
1057 | "integrity": "sha512-t6bxFZcp9bLmSs+1pCNL/BW2bq3QEQHxU4HoiMEyWfF8QBU8iNXFI1iLGdyCzB1Ue2739h55tpOvojFrfyNPWA==",
1058 | "dev": true,
1059 | "optional": true
1060 | },
1061 | "esbuild-windows-arm64": {
1062 | "version": "0.14.45",
1063 | "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.45.tgz",
1064 | "integrity": "sha512-DnhrvjECBJ2L0owoznPb4RqQKZ498SM8J+YHqmqzi0Gf/enkUwwTjB8vPCK6dDuFnNU/NE8f94FhKdkBHYruDQ==",
1065 | "dev": true,
1066 | "optional": true
1067 | },
1068 | "estree-walker": {
1069 | "version": "2.0.2",
1070 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
1071 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
1072 | "dev": true
1073 | },
1074 | "fill-range": {
1075 | "version": "7.0.1",
1076 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
1077 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
1078 | "dev": true,
1079 | "requires": {
1080 | "to-regex-range": "^5.0.1"
1081 | }
1082 | },
1083 | "fsevents": {
1084 | "version": "2.3.2",
1085 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
1086 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
1087 | "dev": true,
1088 | "optional": true
1089 | },
1090 | "function-bind": {
1091 | "version": "1.1.1",
1092 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
1093 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
1094 | "dev": true
1095 | },
1096 | "glob-parent": {
1097 | "version": "5.1.2",
1098 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
1099 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
1100 | "dev": true,
1101 | "requires": {
1102 | "is-glob": "^4.0.1"
1103 | }
1104 | },
1105 | "has": {
1106 | "version": "1.0.3",
1107 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
1108 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
1109 | "dev": true,
1110 | "requires": {
1111 | "function-bind": "^1.1.1"
1112 | }
1113 | },
1114 | "immutable": {
1115 | "version": "4.1.0",
1116 | "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz",
1117 | "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==",
1118 | "dev": true
1119 | },
1120 | "is-binary-path": {
1121 | "version": "2.1.0",
1122 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
1123 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
1124 | "dev": true,
1125 | "requires": {
1126 | "binary-extensions": "^2.0.0"
1127 | }
1128 | },
1129 | "is-core-module": {
1130 | "version": "2.9.0",
1131 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz",
1132 | "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==",
1133 | "dev": true,
1134 | "requires": {
1135 | "has": "^1.0.3"
1136 | }
1137 | },
1138 | "is-extglob": {
1139 | "version": "2.1.1",
1140 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
1141 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
1142 | "dev": true
1143 | },
1144 | "is-glob": {
1145 | "version": "4.0.3",
1146 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
1147 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
1148 | "dev": true,
1149 | "requires": {
1150 | "is-extglob": "^2.1.1"
1151 | }
1152 | },
1153 | "is-number": {
1154 | "version": "7.0.0",
1155 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
1156 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
1157 | "dev": true
1158 | },
1159 | "lil-gui": {
1160 | "version": "0.16.1",
1161 | "resolved": "https://registry.npmjs.org/lil-gui/-/lil-gui-0.16.1.tgz",
1162 | "integrity": "sha512-6wnnfBvQxJYRhdLyIA+w5b8utwbuVxNmtpTXElm36OSgHa8lyKp00Xz/4AEx3kvodT0AJYgbfadCFWAM0Q8DgQ=="
1163 | },
1164 | "nanoid": {
1165 | "version": "3.3.4",
1166 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
1167 | "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
1168 | "dev": true
1169 | },
1170 | "normalize-path": {
1171 | "version": "3.0.0",
1172 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
1173 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
1174 | "dev": true
1175 | },
1176 | "path-parse": {
1177 | "version": "1.0.7",
1178 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
1179 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
1180 | "dev": true
1181 | },
1182 | "picocolors": {
1183 | "version": "1.0.0",
1184 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
1185 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
1186 | "dev": true
1187 | },
1188 | "picomatch": {
1189 | "version": "2.3.1",
1190 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
1191 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
1192 | "dev": true
1193 | },
1194 | "postcss": {
1195 | "version": "8.4.14",
1196 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz",
1197 | "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==",
1198 | "dev": true,
1199 | "requires": {
1200 | "nanoid": "^3.3.4",
1201 | "picocolors": "^1.0.0",
1202 | "source-map-js": "^1.0.2"
1203 | }
1204 | },
1205 | "readdirp": {
1206 | "version": "3.6.0",
1207 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
1208 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
1209 | "dev": true,
1210 | "requires": {
1211 | "picomatch": "^2.2.1"
1212 | }
1213 | },
1214 | "resolve": {
1215 | "version": "1.22.1",
1216 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
1217 | "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
1218 | "dev": true,
1219 | "requires": {
1220 | "is-core-module": "^2.9.0",
1221 | "path-parse": "^1.0.7",
1222 | "supports-preserve-symlinks-flag": "^1.0.0"
1223 | }
1224 | },
1225 | "rollup": {
1226 | "version": "2.75.6",
1227 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.75.6.tgz",
1228 | "integrity": "sha512-OEf0TgpC9vU6WGROJIk1JA3LR5vk/yvqlzxqdrE2CzzXnqKXNzbAwlWUXis8RS3ZPe7LAq+YUxsRa0l3r27MLA==",
1229 | "dev": true,
1230 | "requires": {
1231 | "fsevents": "~2.3.2"
1232 | }
1233 | },
1234 | "sass": {
1235 | "version": "1.52.3",
1236 | "resolved": "https://registry.npmjs.org/sass/-/sass-1.52.3.tgz",
1237 | "integrity": "sha512-LNNPJ9lafx+j1ArtA7GyEJm9eawXN8KlA1+5dF6IZyoONg1Tyo/g+muOsENWJH/2Q1FHbbV4UwliU0cXMa/VIA==",
1238 | "dev": true,
1239 | "requires": {
1240 | "chokidar": ">=3.0.0 <4.0.0",
1241 | "immutable": "^4.0.0",
1242 | "source-map-js": ">=0.6.2 <2.0.0"
1243 | }
1244 | },
1245 | "source-map-js": {
1246 | "version": "1.0.2",
1247 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
1248 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
1249 | "dev": true
1250 | },
1251 | "supports-preserve-symlinks-flag": {
1252 | "version": "1.0.0",
1253 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
1254 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
1255 | "dev": true
1256 | },
1257 | "three": {
1258 | "version": "0.141.0",
1259 | "resolved": "https://registry.npmjs.org/three/-/three-0.141.0.tgz",
1260 | "integrity": "sha512-JaSDAPWuk4RTzG5BYRQm8YZbERUxTfTDVouWgHMisS2to4E5fotMS9F2zPFNOIJyEFTTQDDKPpsgZVThKU3pXA=="
1261 | },
1262 | "to-regex-range": {
1263 | "version": "5.0.1",
1264 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
1265 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
1266 | "dev": true,
1267 | "requires": {
1268 | "is-number": "^7.0.0"
1269 | }
1270 | },
1271 | "tslib": {
1272 | "version": "2.4.0",
1273 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
1274 | "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==",
1275 | "dev": true
1276 | },
1277 | "typescript": {
1278 | "version": "4.7.4",
1279 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz",
1280 | "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==",
1281 | "dev": true
1282 | },
1283 | "vite": {
1284 | "version": "2.9.12",
1285 | "resolved": "https://registry.npmjs.org/vite/-/vite-2.9.12.tgz",
1286 | "integrity": "sha512-suxC36dQo9Rq1qMB2qiRorNJtJAdxguu5TMvBHOc/F370KvqAe9t48vYp+/TbPKRNrMh/J55tOUmkuIqstZaew==",
1287 | "dev": true,
1288 | "requires": {
1289 | "esbuild": "^0.14.27",
1290 | "fsevents": "~2.3.2",
1291 | "postcss": "^8.4.13",
1292 | "resolve": "^1.22.0",
1293 | "rollup": "^2.59.0"
1294 | }
1295 | },
1296 | "vite-plugin-glsl": {
1297 | "version": "0.1.5",
1298 | "resolved": "https://registry.npmjs.org/vite-plugin-glsl/-/vite-plugin-glsl-0.1.5.tgz",
1299 | "integrity": "sha512-BsY0ndZthCXYipF/rc/Vri0s6N/JNwMyCDRJx7qiJNNY8+MiDgzhT2iOIHL7O7v3CvjOG9yOM2+WVTNvnHGT1w==",
1300 | "dev": true,
1301 | "requires": {
1302 | "@rollup/pluginutils": "^4.2.1",
1303 | "tslib": "^2.4.0"
1304 | }
1305 | }
1306 | }
1307 | }
1308 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "simple-threejs-typescript-starter",
3 | "version": "0.1.0",
4 | "description": "Simple starter for Three.js projects with TypeScript",
5 | "main": "index.html",
6 | "repository": "https://github.com/mayacoda/simple-threejs-typescript-starter",
7 | "author": "Maya Nedeljković Batić",
8 | "license": "MIT",
9 | "scripts": {
10 | "dev": "vite",
11 | "build": "tsc && vite build",
12 | "preview": "vite preview",
13 | "cleanup": "node ./scripts/cleanup.js",
14 | "prepare": "husky install"
15 | },
16 | "type": "module",
17 | "dependencies": {
18 | "lil-gui": "^0.17.0",
19 | "three": "^0.146.0"
20 | },
21 | "devDependencies": {
22 | "@types/three": "^0.144.0",
23 | "husky": "^8.0.1",
24 | "lint-staged": "^13.0.3",
25 | "prettier": "2.7.1",
26 | "sass": "^1.52.3",
27 | "typescript": "^4.7.4",
28 | "vite": "^3.0.3",
29 | "vite-plugin-glsl": "^0.1.5"
30 | },
31 | "packageManager": "yarn@3.2.1",
32 | "lint-staged": {
33 | "**/*": "prettier --write --ignore-unknown"
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/public/textures/cloud-noise.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mayacoda/pencil-lines/35680c15ec0b02951c92c3274a27c89be05a3faf/public/textures/cloud-noise.png
--------------------------------------------------------------------------------
/public/textures/color-noise.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mayacoda/pencil-lines/35680c15ec0b02951c92c3274a27c89be05a3faf/public/textures/color-noise.png
--------------------------------------------------------------------------------
/public/textures/fiber-noise.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mayacoda/pencil-lines/35680c15ec0b02951c92c3274a27c89be05a3faf/public/textures/fiber-noise.png
--------------------------------------------------------------------------------
/scripts/cleanup.js:
--------------------------------------------------------------------------------
1 | import * as fs from 'fs'
2 |
3 | // remove src/demo directory
4 | fs.rm('./src/demo', { recursive: true }, () => {})
5 |
6 | // remove public/space_dog directory
7 | fs.rm('./public/space_dog', { recursive: true }, () => {})
8 |
9 | fs.rm('./assets/docs', { recursive: true }, () => {})
10 |
11 | // rewrite src/main.ts to only include the style import
12 | fs.writeFileSync(
13 | './src/main.ts',
14 | `import './style.scss'
15 | import { Engine } from './engine/Engine'
16 | import { Experience } from './engine/Experience'
17 |
18 | new Engine({
19 | canvas: document.querySelector('#canvas') as HTMLCanvasElement,
20 | experience: class implements Experience {
21 | resources = []
22 | init() {}
23 | update() {}
24 | resize() {}
25 | }
26 | })`
27 | )
28 |
29 | fs.writeFileSync(
30 | './README.md',
31 | `# Simple Three.js + TypeScript + Vite Starter
32 |
33 | Local development:
34 | \`\`\`bash
35 | yarn
36 | yarn dev
37 | \`\`\`
38 | `
39 | )
40 |
41 | console.log('🧹 Repo cleaned up')
42 |
--------------------------------------------------------------------------------
/src/engine/Camera.ts:
--------------------------------------------------------------------------------
1 | import { Engine } from './Engine'
2 | import * as THREE from 'three'
3 | import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js'
4 | import { GameEntity } from './GameEntity'
5 |
6 | export class Camera implements GameEntity {
7 | public instance!: THREE.PerspectiveCamera
8 | private controls!: OrbitControls
9 |
10 | constructor(private engine: Engine) {
11 | this.initCamera()
12 | this.initControls()
13 | }
14 |
15 | private initCamera() {
16 | this.instance = new THREE.PerspectiveCamera(
17 | 75,
18 | window.innerWidth / window.innerHeight,
19 | 0.1,
20 | 1000
21 | )
22 | this.instance.position.z = 5
23 | this.instance.position.y = 2
24 | this.engine.scene.add(this.instance)
25 | }
26 |
27 | private initControls() {
28 | this.controls = new OrbitControls(this.instance, this.engine.canvas)
29 | this.controls.update()
30 | }
31 |
32 | resize() {
33 | this.instance.aspect = this.engine.sizes.aspectRatio
34 | this.instance.updateProjectionMatrix()
35 | }
36 |
37 | update() {
38 | this.controls.update()
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/src/engine/Engine.ts:
--------------------------------------------------------------------------------
1 | import * as THREE from 'three'
2 | import { RenderEngine } from './RenderEngine'
3 | import { RenderLoop } from './RenderLoop'
4 | import { DebugUI } from './interface/DebugUI'
5 | import { Sizes } from './Sizes'
6 | import { Camera } from './Camera'
7 | import { Resources } from './Resources'
8 | import { InfoConfig, InfoUI } from './interface/InfoUI'
9 | import { Experience, ExperienceConstructor } from './Experience'
10 | import { Loader } from './interface/Loader'
11 |
12 | export class Engine {
13 | public readonly camera!: Camera
14 | public readonly scene!: THREE.Scene
15 | public readonly renderEngine!: RenderEngine
16 | public readonly time!: RenderLoop
17 | public readonly debug!: DebugUI
18 | public readonly infoUI!: InfoUI
19 | public readonly sizes!: Sizes
20 | public readonly canvas!: HTMLCanvasElement
21 | public readonly resources!: Resources
22 | public readonly experience!: Experience
23 | private readonly loader!: Loader
24 |
25 | constructor({
26 | canvas,
27 | experience,
28 | info,
29 | }: {
30 | canvas: HTMLCanvasElement
31 | experience: ExperienceConstructor
32 | info?: InfoConfig
33 | }) {
34 | if (!canvas) {
35 | throw new Error('No canvas provided')
36 | }
37 |
38 | this.canvas = canvas
39 | this.sizes = new Sizes(this)
40 | this.debug = new DebugUI()
41 | this.time = new RenderLoop(this)
42 | this.scene = new THREE.Scene()
43 | this.camera = new Camera(this)
44 | this.infoUI = new InfoUI(info)
45 | this.renderEngine = new RenderEngine(this)
46 | this.experience = new experience(this)
47 | this.resources = new Resources(this.experience.resources)
48 | this.loader = new Loader()
49 |
50 | this.resources.on('loaded', () => {
51 | this.experience.init()
52 | this.loader.complete()
53 | })
54 |
55 | this.resources.on('progress', (progress: number) => {
56 | this.loader.setProgress(progress)
57 | })
58 | }
59 |
60 | update(delta: number) {
61 | this.camera.update()
62 | this.renderEngine.update()
63 | this.experience.update(delta)
64 | this.debug.update()
65 | }
66 |
67 | resize() {
68 | this.camera.resize()
69 | this.renderEngine.resize()
70 | if (this.experience.resize) {
71 | this.experience.resize()
72 | }
73 | }
74 | }
75 |
--------------------------------------------------------------------------------
/src/engine/Experience.ts:
--------------------------------------------------------------------------------
1 | import { GameEntity } from './GameEntity'
2 | import { Engine } from './Engine'
3 | import { Resource } from './Resources'
4 |
5 | export type ExperienceConstructor = new (engine: Engine) => Experience
6 | export interface Experience extends GameEntity {
7 | init(): void
8 | resources: Resource[]
9 | }
10 |
--------------------------------------------------------------------------------
/src/engine/GameEntity.ts:
--------------------------------------------------------------------------------
1 | export interface GameEntity {
2 | update(delta: number): void
3 | resize?(): void
4 | }
5 |
--------------------------------------------------------------------------------
/src/engine/RenderEngine.ts:
--------------------------------------------------------------------------------
1 | import { WebGLRenderer } from 'three'
2 | import { Engine } from './Engine'
3 | import * as THREE from 'three'
4 | import { GameEntity } from './GameEntity'
5 | import { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer'
6 | import { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass'
7 |
8 | export class RenderEngine implements GameEntity {
9 | private readonly renderer: WebGLRenderer
10 | composer: EffectComposer
11 |
12 | constructor(private engine: Engine) {
13 | this.renderer = new WebGLRenderer({
14 | canvas: this.engine.canvas,
15 | antialias: true,
16 | })
17 |
18 | this.renderer.physicallyCorrectLights = true
19 | this.renderer.outputEncoding = THREE.sRGBEncoding
20 | this.renderer.toneMapping = THREE.CineonToneMapping
21 | this.renderer.toneMappingExposure = 1.75
22 | this.renderer.shadowMap.enabled = true
23 | this.renderer.shadowMap.type = THREE.PCFSoftShadowMap
24 | this.renderer.setClearColor('#ddd')
25 | this.renderer.setSize(this.engine.sizes.width, this.engine.sizes.height)
26 | this.renderer.setPixelRatio(Math.min(this.engine.sizes.pixelRatio, 2))
27 |
28 | this.composer = new EffectComposer(this.renderer)
29 |
30 | const renderPass = new RenderPass(
31 | this.engine.scene,
32 | this.engine.camera.instance
33 | )
34 | this.composer.addPass(renderPass)
35 | }
36 |
37 | update() {
38 | this.composer.render()
39 | }
40 |
41 | resize() {
42 | this.renderer.setSize(this.engine.sizes.width, this.engine.sizes.height)
43 | this.composer.setSize(this.engine.sizes.width, this.engine.sizes.height)
44 | this.composer.render()
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/src/engine/RenderLoop.ts:
--------------------------------------------------------------------------------
1 | import { Engine } from './Engine'
2 | import * as THREE from 'three'
3 |
4 | export class RenderLoop {
5 | private clock: THREE.Clock
6 | public deltaTime: number = 16
7 | public currentTime: number = 0
8 |
9 | constructor(private engine: Engine) {
10 | this.clock = new THREE.Clock()
11 | window.requestAnimationFrame(() => this.update())
12 | }
13 |
14 | update() {
15 | const step = () => {
16 | requestAnimationFrame(step)
17 | const elapsedTime = this.clock.getElapsedTime()
18 |
19 | this.deltaTime = elapsedTime - this.currentTime
20 |
21 | this.currentTime = elapsedTime
22 |
23 | this.engine.update(this.deltaTime)
24 | }
25 | step()
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/src/engine/Resources.ts:
--------------------------------------------------------------------------------
1 | import * as THREE from 'three'
2 | import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader'
3 | import { EventEmitter } from './utilities/EventEmitter'
4 |
5 | export type Resource =
6 | | {
7 | name: string
8 | type: Exclude
9 | path: string
10 | }
11 | | {
12 | name: string
13 | type: 'cubeTexture'
14 | path: string[]
15 | }
16 |
17 | type AssetType = 'gltf' | 'texture' | 'cubeTexture'
18 |
19 | type Loaders = {
20 | gltf: GLTFLoader
21 | texture: THREE.TextureLoader
22 | cubeTexture: THREE.CubeTextureLoader
23 | }
24 |
25 | export class Resources extends EventEmitter {
26 | private loadingManager = new THREE.LoadingManager(
27 | () => {
28 | this.emit('loaded')
29 | },
30 | // @ts-ignore
31 | (url: string, item: number, total: number) => {
32 | this.emit('progress', item / total)
33 | },
34 | (url: string) => {
35 | console.error(`Failed to load ${url}`)
36 | }
37 | )
38 | private loaders!: Loaders
39 | public items: Record = {}
40 |
41 | constructor(private readonly resources: Resource[]) {
42 | super()
43 | this.initLoaders()
44 | this.load()
45 | }
46 |
47 | private initLoaders() {
48 | this.loaders = {
49 | gltf: new GLTFLoader(this.loadingManager),
50 | texture: new THREE.TextureLoader(this.loadingManager),
51 | cubeTexture: new THREE.CubeTextureLoader(this.loadingManager),
52 | }
53 | }
54 |
55 | getItem(name: string) {
56 | let item = this.items[name]
57 | if (!item) {
58 | throw new Error(`Resource ${name} not found`)
59 | }
60 | return item
61 | }
62 |
63 | load() {
64 | if (this.resources.length === 0) {
65 | setTimeout(() => {
66 | this.emit('loaded')
67 | })
68 | }
69 |
70 | for (const resource of this.resources) {
71 | switch (resource.type) {
72 | case 'gltf':
73 | this.loaders.gltf.load(
74 | resource.path,
75 | (file) => (this.items[resource.name] = file)
76 | )
77 | break
78 | case 'texture':
79 | this.loaders.texture.load(
80 | resource.path,
81 | (file) => (this.items[resource.name] = file)
82 | )
83 | break
84 | case 'cubeTexture':
85 | this.loaders.cubeTexture.load(
86 | resource.path,
87 | (file) => (this.items[resource.name] = file)
88 | )
89 | break
90 | }
91 | }
92 | }
93 | }
94 |
--------------------------------------------------------------------------------
/src/engine/Sizes.ts:
--------------------------------------------------------------------------------
1 | import { Engine } from './Engine'
2 | import { EventEmitter } from './utilities/EventEmitter'
3 |
4 | type Sizing = 'cover' | 'contain'
5 |
6 | export class Sizes extends EventEmitter {
7 | public width!: number
8 | public height!: number
9 | public pixelRatio: number = Math.min(window.devicePixelRatio, 2)
10 | public aspectRatio!: number
11 |
12 | public sizing: Sizing = 'contain'
13 |
14 | constructor(private engine: Engine) {
15 | super()
16 | this.setContainsSizing()
17 |
18 | window.addEventListener('resize', () => {
19 | this.resize()
20 | this.engine.resize()
21 | this.emit('resize')
22 | })
23 | }
24 |
25 | public setContainsSizing() {
26 | this.width = window.innerWidth
27 | this.height = window.innerHeight
28 |
29 | this.aspectRatio = this.width / this.height
30 | }
31 |
32 | public setCoverSizing() {
33 | const maxWidth = window.innerWidth
34 | const maxHeight = window.innerHeight
35 |
36 | if (maxWidth / maxHeight < this.aspectRatio) {
37 | this.width = maxWidth
38 | this.height = maxWidth / this.aspectRatio
39 | } else {
40 | this.width = maxHeight * this.aspectRatio
41 | this.height = maxHeight
42 | }
43 | }
44 |
45 | setAspectRatio(aspectRatio: number) {
46 | this.aspectRatio = aspectRatio
47 | }
48 |
49 | setSizing(sizing: Sizing) {
50 | this.sizing = sizing
51 |
52 | this.resize()
53 | }
54 |
55 | resize() {
56 | if (this.sizing === 'contain') {
57 | this.setContainsSizing()
58 | } else {
59 | this.setCoverSizing()
60 | }
61 | }
62 | }
63 |
--------------------------------------------------------------------------------
/src/engine/interface/DebugUI.ts:
--------------------------------------------------------------------------------
1 | import * as lilGui from 'lil-gui'
2 | import Stats from 'three/examples/jsm/libs/stats.module'
3 |
4 | let instance: DebugUI | null = null
5 |
6 | export class DebugUI {
7 | gui!: lilGui.GUI
8 | stats!: Stats
9 |
10 | constructor() {
11 | if (instance) {
12 | return this
13 | }
14 |
15 | instance = this
16 |
17 | this.stats = Stats()
18 | document.body.appendChild(this.stats.dom)
19 |
20 | this.gui = new lilGui.GUI()
21 |
22 | if (!window.location.search.includes('debug')) {
23 | this.gui.hide()
24 | this.stats.dom.style.display = 'none'
25 | }
26 |
27 | window.addEventListener('keydown', (event) => {
28 | if (event.key === 'h') {
29 | if (this.gui._hidden) {
30 | this.gui.show()
31 | this.stats.dom.style.display = 'block'
32 | } else {
33 | this.gui.hide()
34 | this.stats.dom.style.display = 'none'
35 | }
36 | }
37 | })
38 | }
39 |
40 | update() {
41 | this.stats.update()
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/src/engine/interface/InfoUI.ts:
--------------------------------------------------------------------------------
1 | import './info.scss'
2 | import gitHubLogo from '../../../assets/github.png'
3 | import twitterLogo from '../../../assets/twitter.png'
4 |
5 | export type InfoConfig = {
6 | twitter?: string
7 | github?: string
8 | description?: string
9 | title?: string
10 | documentTitle?: string
11 | }
12 |
13 | export class InfoUI {
14 | constructor(config: InfoConfig = {}) {
15 | if (config.documentTitle) {
16 | document.title = config.documentTitle
17 | }
18 |
19 | const container = document.createElement('div')
20 | container.classList.add('info-container')
21 | container.insertAdjacentHTML(
22 | 'beforeend',
23 | `
24 | ${config.title ? `${config.title}
` : ''}
25 | ${
26 | config.description
27 | ? `
28 |
${config.description}
29 |
`
30 | : ``
31 | }
32 |
33 | ${
34 | config.twitter
35 | ? `
36 |
37 | `
38 | : ``
39 | }
40 | ${
41 | config.github
42 | ? `
43 |
44 | `
45 | : ``
46 | }
47 |
48 | `
49 | )
50 | document.body.prepend(container)
51 | }
52 | }
53 |
--------------------------------------------------------------------------------
/src/engine/interface/Loader.ts:
--------------------------------------------------------------------------------
1 | import './loader.scss'
2 |
3 | export class Loader {
4 | element: HTMLDivElement
5 |
6 | constructor() {
7 | this.element = document.createElement('div')
8 | this.element.classList.add('loader')
9 | this.element.insertAdjacentHTML(
10 | 'beforeend',
11 | `
12 |
16 | `
17 | )
18 |
19 | this.start()
20 | }
21 |
22 | start() {
23 | document.body.prepend(this.element)
24 | }
25 |
26 | setProgress(progress: number) {
27 | const progressNumber = this.element.querySelector(
28 | '.progress-number'
29 | ) as HTMLHeadingElement
30 |
31 | progressNumber!.innerText = `${Math.floor(progress * 100)}%`
32 |
33 | const progressBar = this.element.querySelector(
34 | '.progress-bar'
35 | ) as HTMLDivElement
36 |
37 | progressBar.style.width = `${progress * 100}%`
38 | }
39 |
40 | complete() {
41 | this.element.remove()
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/src/engine/interface/info.scss:
--------------------------------------------------------------------------------
1 | .info-container {
2 | position: absolute;
3 | bottom: 0;
4 | left: 0;
5 | padding: 16px 20px;
6 |
7 | display: flex;
8 | flex-direction: column;
9 |
10 | user-select: none;
11 | opacity: 40%;
12 | transition: opacity 0.3s ease-in-out;
13 |
14 | color: #fff;
15 | font-family: 'Helvetica', 'Arial', sans-serif;
16 | text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
17 |
18 | &:hover {
19 | opacity: 100%;
20 | }
21 |
22 | h1 {
23 | margin-bottom: 0;
24 | font-weight: normal;
25 | }
26 |
27 | .description {
28 | width: 250px;
29 | max-width: 100%;
30 | margin-bottom: 4px;
31 | }
32 |
33 | .social-container {
34 | display: flex;
35 | flex-direction: row;
36 | justify-content: flex-start;
37 | align-items: center;
38 | }
39 |
40 | .social-button {
41 | display: flex;
42 | width: 24px;
43 | height: 24px;
44 | padding: 8px;
45 | margin-right: 8px;
46 | border-radius: 50px;
47 | align-items: center;
48 |
49 | background: #fff;
50 | transition: box-shadow 0.3s ease-in-out;
51 |
52 | &:hover {
53 | box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
54 | }
55 |
56 | img {
57 | max-width: 100%;
58 | }
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/src/engine/interface/loader.scss:
--------------------------------------------------------------------------------
1 | .loader {
2 | width: 100%;
3 | height: 100%;
4 | display: flex;
5 | justify-content: center;
6 | align-items: center;
7 |
8 | color: #fff;
9 | font-family: 'Helvetica', 'Arial', sans-serif;
10 | font-weight: normal;
11 |
12 | .loader-inner {
13 | width: 500px;
14 | max-width: 95%;
15 | }
16 |
17 | .progress-number {
18 | text-align: center;
19 | }
20 |
21 | .progress-bar {
22 | background-color: #fff;
23 | transition: width 0.3s ease-in-out;
24 |
25 | height: 5px;
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/src/engine/utilities/EventEmitter.ts:
--------------------------------------------------------------------------------
1 | export class EventEmitter {
2 | private listeners: { [key: string]: Function[] } = {}
3 |
4 | public on(event: string, listener: Function) {
5 | if (!this.listeners[event]) {
6 | this.listeners[event] = []
7 | }
8 |
9 | this.listeners[event].push(listener)
10 |
11 | return () => this.off(event, listener)
12 | }
13 |
14 | public off(event: string, listener: Function) {
15 | if (!this.listeners[event]) {
16 | return
17 | }
18 |
19 | const index = this.listeners[event].indexOf(listener)
20 |
21 | if (index === -1) {
22 | return
23 | }
24 |
25 | this.listeners[event].splice(index, 1)
26 | }
27 |
28 | public emit(event: string, ...args: any[]) {
29 | if (!this.listeners[event]) {
30 | return
31 | }
32 |
33 | this.listeners[event].forEach((listener) => listener(...args))
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/src/main.ts:
--------------------------------------------------------------------------------
1 | import './style.scss'
2 | import { Engine } from './engine/Engine'
3 | import { PencilLines } from './pencil-lines/PencilLines'
4 |
5 | new Engine({
6 | canvas: document.querySelector('#canvas') as HTMLCanvasElement,
7 | experience: PencilLines,
8 | info: {
9 | twitter: 'https://twitter.com/maya_ndljk',
10 | github: 'https://github.com/mayacoda/pencil-lines',
11 | description: 'Three.js postprocessing effect to mimic sketchy lines',
12 | documentTitle: 'Pencil Lines',
13 | title: 'Pencil Lines',
14 | },
15 | })
16 |
--------------------------------------------------------------------------------
/src/pencil-lines/Box.ts:
--------------------------------------------------------------------------------
1 | import * as THREE from 'three'
2 |
3 | export class Box extends THREE.Mesh {
4 | constructor() {
5 | const geometry = new THREE.TorusKnotGeometry(1, 0.3, 200, 32)
6 |
7 | const material = new THREE.MeshBasicMaterial({
8 | color: 0x99dd99,
9 | })
10 |
11 | super(geometry, material)
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/src/pencil-lines/PencilLines.ts:
--------------------------------------------------------------------------------
1 | import type { Experience } from '../engine/Experience'
2 | import type { Resource } from '../engine/Resources'
3 | import type { Engine } from '../engine/Engine'
4 | import * as THREE from 'three'
5 | import { Box } from './Box'
6 | import { PencilLinesPass } from './PencilLinesPass'
7 |
8 | export class PencilLines implements Experience {
9 | resources: Resource[] = [
10 | {
11 | name: 'colorNoiseTexture',
12 | type: 'texture',
13 | path: 'textures/color-noise.png',
14 | },
15 | {
16 | name: 'cloudTexture',
17 | type: 'texture',
18 | path: 'textures/cloud-noise.png',
19 | },
20 | ]
21 | pencilLinesPass!: PencilLinesPass
22 |
23 | constructor(private engine: Engine) {}
24 |
25 | init() {
26 | const plane = new THREE.Mesh(
27 | new THREE.PlaneGeometry(10, 10),
28 | new THREE.MeshStandardMaterial({ color: 0xffffff })
29 | )
30 |
31 | plane.rotation.x = -Math.PI / 2
32 | plane.receiveShadow = true
33 |
34 | this.engine.scene.add(plane)
35 | this.engine.scene.add(new THREE.AmbientLight(0xffffff, 0.5))
36 |
37 | let directionalLight = new THREE.DirectionalLight(0xffffff, 1)
38 | directionalLight.castShadow = true
39 | directionalLight.position.set(2, 2, 2)
40 | directionalLight.shadow.mapSize.width = 2048
41 | directionalLight.shadow.mapSize.height = 2048
42 |
43 | this.engine.scene.add(directionalLight)
44 |
45 | const box = new Box()
46 | box.castShadow = true
47 | box.rotation.y = Math.PI / 4
48 | box.position.set(0, 0.5, 0)
49 |
50 | this.engine.scene.add(box)
51 |
52 | this.pencilLinesPass = new PencilLinesPass(this.engine)
53 | this.engine.renderEngine.composer.addPass(this.pencilLinesPass)
54 | }
55 |
56 | update() {}
57 | }
58 |
--------------------------------------------------------------------------------
/src/pencil-lines/PencilLinesPass.ts:
--------------------------------------------------------------------------------
1 | import { FullScreenQuad, Pass } from 'three/examples/jsm/postprocessing/Pass'
2 | import type { WebGLRenderer } from 'three'
3 | import {
4 | HalfFloatType,
5 | MeshNormalMaterial,
6 | NearestFilter,
7 | RGBAFormat,
8 | WebGLRenderTarget,
9 | } from 'three'
10 | import { PencilLinesShader } from './PencilLinesShader'
11 | import type { Engine } from '../engine/Engine'
12 |
13 | export class PencilLinesPass extends Pass {
14 | fsQuad: FullScreenQuad
15 | material: PencilLinesShader
16 | normalMaterial: MeshNormalMaterial
17 |
18 | surfaceBuffer: WebGLRenderTarget
19 |
20 | constructor(private engine: Engine) {
21 | super()
22 |
23 | this.fsQuad = new FullScreenQuad()
24 | this.material = new PencilLinesShader(this.engine)
25 |
26 | this.fsQuad.material = this.material
27 |
28 | const surfaceBuffer = new WebGLRenderTarget(
29 | this.engine.sizes.width,
30 | this.engine.sizes.height
31 | )
32 | surfaceBuffer.texture.format = RGBAFormat
33 | surfaceBuffer.texture.type = HalfFloatType
34 | surfaceBuffer.texture.minFilter = NearestFilter
35 | surfaceBuffer.texture.magFilter = NearestFilter
36 | surfaceBuffer.texture.generateMipmaps = false
37 | surfaceBuffer.stencilBuffer = false
38 | this.surfaceBuffer = surfaceBuffer
39 |
40 | this.normalMaterial = new MeshNormalMaterial()
41 |
42 | this.material.uniforms.uCameraNear.value = this.engine.camera.instance.near
43 | this.material.uniforms.uCameraFar.value = this.engine.camera.instance.far
44 | }
45 |
46 | render(
47 | renderer: WebGLRenderer,
48 | writeBuffer: WebGLRenderTarget,
49 | readBuffer: WebGLRenderTarget
50 | ) {
51 | const depthBuffer = writeBuffer.depthBuffer
52 | writeBuffer.depthBuffer = false
53 |
54 | renderer.setRenderTarget(this.surfaceBuffer)
55 | const overrideMaterialValue = this.engine.scene.overrideMaterial
56 |
57 | this.engine.scene.overrideMaterial = this.normalMaterial
58 | renderer.render(this.engine.scene, this.engine.camera.instance)
59 | this.engine.scene.overrideMaterial = overrideMaterialValue
60 |
61 | this.material.uniforms.uDiffuse.value = readBuffer.texture
62 | this.material.uniforms.uDepthBuffer.value = readBuffer.depthTexture
63 | this.material.uniforms.uSurfaceBuffer.value = this.surfaceBuffer.texture
64 |
65 | if (this.renderToScreen) {
66 | renderer.setRenderTarget(null)
67 | this.fsQuad.render(renderer)
68 | } else {
69 | renderer.setRenderTarget(writeBuffer)
70 | if (this.clear) renderer.clear()
71 | this.fsQuad.render(renderer)
72 | }
73 |
74 | writeBuffer.depthBuffer = depthBuffer
75 | }
76 |
77 | dispose() {
78 | this.material.dispose()
79 | this.fsQuad.dispose()
80 | }
81 |
82 | setSize() {
83 | this.material.resize()
84 | }
85 | }
86 |
--------------------------------------------------------------------------------
/src/pencil-lines/PencilLinesShader.ts:
--------------------------------------------------------------------------------
1 | import { ShaderMaterial, Vector2 } from 'three'
2 | import fragmentShader from './shaders/pencil-lines.frag'
3 | import vertexShader from './shaders/pencil-lines.vert'
4 | import { GameEntity } from '../engine/GameEntity'
5 | import { Engine } from '../engine/Engine'
6 |
7 | export class PencilLinesShader extends ShaderMaterial implements GameEntity {
8 | constructor(private engine: Engine) {
9 | super({
10 | uniforms: {
11 | uDiffuse: { value: null },
12 | uResolution: {
13 | value: new Vector2(1, 1),
14 | },
15 | uDepthBuffer: { value: null },
16 | uSurfaceBuffer: { value: null },
17 | uCameraNear: { value: engine.camera.instance.near },
18 | uCameraFar: { value: engine.camera.instance.far },
19 |
20 | uColorTexture: {
21 | value: engine.resources.getItem('colorNoiseTexture'),
22 | },
23 | uCloudTexture: {
24 | value: engine.resources.getItem('cloudTexture'),
25 | },
26 | },
27 | fragmentShader,
28 | vertexShader,
29 | })
30 |
31 | this.uniforms.uResolution.value = new Vector2(
32 | this.engine.sizes.width,
33 | this.engine.sizes.height
34 | )
35 | }
36 |
37 | update() {}
38 |
39 | resize() {
40 | this.uniforms.uResolution.value = new Vector2(
41 | this.engine.sizes.width,
42 | this.engine.sizes.height
43 | )
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/src/pencil-lines/shaders/gradientNoise.glsl:
--------------------------------------------------------------------------------
1 | // The MIT License
2 | // Copyright © 2013 Inigo Quilez
3 | // Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
4 | // https://www.youtube.com/c/InigoQuilez
5 | // https://iquilezles.org
6 |
7 |
8 | // Gradient Noise (http://en.wikipedia.org/wiki/Gradient_noise), not to be confused with
9 | // Value Noise, and neither with Perlin's Noise (which is one form of Gradient Noise)
10 | // is probably the most convenient way to generate noise (a random smooth signal with
11 | // mostly all its energy in the low frequencies) suitable for procedural texturing/shading,
12 | // modeling and animation.
13 | //
14 | // It produces smoother and higher quality than Value Noise, but it's of course slighty more
15 | // expensive.
16 | //
17 | // The princpiple is to create a virtual grid/latice all over the plane, and assign one
18 | // random vector to every vertex in the grid. When querying/requesting a noise value at
19 | // an arbitrary point in the plane, the grid cell in which the query is performed is
20 | // determined, the four vertices of the grid are determined and their random vectors
21 | // fetched. Then, the position of the current point under evaluation relative to each
22 | // vertex is doted (projected) with that vertex' random vector, and the result is
23 | // bilinearly interpolated with a smooth interpolant.
24 |
25 |
26 | // Value Noise 2D, Derivatives: https://www.shadertoy.com/view/4dXBRH
27 | // Gradient Noise 2D, Derivatives: https://www.shadertoy.com/view/XdXBRH
28 | // Value Noise 3D, Derivatives: https://www.shadertoy.com/view/XsXfRH
29 | // Gradient Noise 3D, Derivatives: https://www.shadertoy.com/view/4dffRH
30 | // Value Noise 2D : https://www.shadertoy.com/view/lsf3WH
31 | // Value Noise 3D : https://www.shadertoy.com/view/4sfGzS
32 | // Gradient Noise 2D : https://www.shadertoy.com/view/XdXGW8
33 | // Gradient Noise 3D : https://www.shadertoy.com/view/Xsl3Dl
34 | // Simplex Noise 2D : https://www.shadertoy.com/view/Msf3WH
35 | // Wave Noise 2D : https://www.shadertoy.com/view/tldSRj
36 |
37 | // replace this anything that returns a random vector
38 | vec2 grad(ivec2 z) {
39 | // 2D to 1D (feel free to replace by some other)
40 | int n = z.x+z.y*11111;
41 |
42 | // Hugo Elias hash (feel free to replace by another one)
43 | n = (n<<13)^n;
44 | n = (n*(n*n*15731+789221)+1376312589)>>16;
45 |
46 | #if 0
47 |
48 | // simple random vectors
49 | return vec2(cos(float(n)), sin(float(n)));
50 |
51 | #else
52 |
53 | // Perlin style vectors
54 | n &= 7;
55 | vec2 gr = vec2(n&1, n>>1)*2.0-1.0;
56 | return (n>=6) ? vec2(0.0, gr.x) :
57 | (n>=4) ? vec2(gr.x, 0.0) :
58 | gr;
59 | #endif
60 | }
61 |
62 | float noise(in vec2 p) {
63 | ivec2 i = ivec2(floor(p));
64 | vec2 f = fract(p);
65 |
66 | vec2 u = f*f*(3.0-2.0*f);// feel free to replace by a quintic smoothstep instead
67 |
68 | return mix(mix(dot(grad(i+ivec2(0, 0)), f-vec2(0.0, 0.0)),
69 | dot(grad(i+ivec2(1, 0)), f-vec2(1.0, 0.0)), u.x),
70 | mix(dot(grad(i+ivec2(0, 1)), f-vec2(0.0, 1.0)),
71 | dot(grad(i+ivec2(1, 1)), f-vec2(1.0, 1.0)), u.x), u.y);
72 | }
73 |
--------------------------------------------------------------------------------
/src/pencil-lines/shaders/pencil-lines.frag:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | #include ./gradientNoise.glsl;
4 |
5 | uniform sampler2D uDiffuse;
6 | uniform sampler2D uSurfaceBuffer;
7 | uniform sampler2D uDepthBuffer;
8 |
9 | uniform sampler2D uCloudTexture;
10 | uniform sampler2D uColorTexture;
11 |
12 | uniform float uNear;
13 | uniform float uFar;
14 |
15 | uniform vec2 uResolution;
16 |
17 | varying vec2 vUv;
18 |
19 |
20 | // The MIT License
21 | // Copyright © 2013 Inigo Quilez
22 | // Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 | // https://www.youtube.com/c/InigoQuilez
24 | // https://iquilezles.org/
25 | //
26 | // https://www.shadertoy.com/view/lsf3WH
27 | // SimonDev: Renamed function to "Math_Random" from "hash"
28 | //float Math_Random(vec2 p) // replace this by something better
29 | //{
30 | // p = 50.0*fract( p*0.3183099 + vec2(0.71,0.113));
31 | // return -1.0+2.0*fract( p.x*p.y*(p.x+p.y) );
32 | //}
33 | //
34 | //float noise( in vec2 p )
35 | //{
36 | // vec2 i = floor( p );
37 | // vec2 f = fract( p );
38 | //
39 | // vec2 u = f*f*(3.0-2.0*f);
40 | //
41 | // return mix( mix( Math_Random( i + vec2(0.0,0.0) ),
42 | // Math_Random( i + vec2(1.0,0.0) ), u.x),
43 | // mix( Math_Random( i + vec2(0.0,1.0) ),
44 | // Math_Random( i + vec2(1.0,1.0) ), u.x), u.y);
45 | //}
46 |
47 | float valueAtPoint(sampler2D image, vec2 coord, vec2 texel, vec2 point) {
48 | vec3 luma = vec3(0.299, 0.587, 0.114);
49 |
50 | return dot(texture2D(image, coord + texel * point).xyz, luma);
51 | }
52 |
53 | float diffuseValue(int x, int y) {
54 | float cutoff = 40.0;
55 | float offset = 0.5 / cutoff;
56 | float noiseValue = clamp(texture(uCloudTexture, vUv).r, 0.0, cutoff) / cutoff - offset;
57 |
58 | return valueAtPoint(uDiffuse, vUv + noiseValue, vec2(1.0 / uResolution.x, 1.0 / uResolution.y), vec2(x, y)) * 0.6;
59 | }
60 |
61 | float normalValue(int x, int y) {
62 | float cutoff = 50.0;
63 | float offset = 0.5 / cutoff;
64 | float noiseValue = clamp(texture(uCloudTexture, vUv).r, 0.0, cutoff) / cutoff - offset;
65 |
66 | return valueAtPoint(uSurfaceBuffer, vUv + noiseValue, vec2(1.0 / uResolution.x, 1.0 / uResolution.y), vec2(x, y)) * 0.3;
67 | }
68 |
69 | float getValue(int x, int y) {
70 | float noiseValue = noise(gl_FragCoord.xy);
71 | noiseValue = noiseValue * 2.0 - 1.0;
72 | noiseValue *= 10.0;
73 |
74 | return diffuseValue(x, y) + normalValue(x, y) * noiseValue;
75 | // return diffuseValue(x, y) + normalValue(x, y);
76 | }
77 |
78 | float getPixelDepth(int x, int y) {
79 | float fragCoordZ = texture2D(uDepthBuffer, vUv + vec2(x, y) * 1.0 / uResolution).x;
80 | float viewZ = perspectiveDepthToViewZ(fragCoordZ, uNear, uFar);
81 | return viewZToOrthographicDepth(viewZ, uNear, uFar);
82 | }
83 |
84 | vec3 getSurfaceValue(int x, int y) {
85 | return texture2D(uSurfaceBuffer, vUv + vec2(x, y) / uResolution).rgb;
86 | }
87 |
88 | float sobelFloat(sampler2D diffuse, vec2 uv, vec2 texel) {
89 | // kernel definition (in glsl matrices are filled in column-major order)
90 | const mat3 Gx = mat3(-1, -2, -1, 0, 0, 0, 1, 2, 1);// x direction kernel
91 | const mat3 Gy = mat3(-1, 0, 1, -2, 0, 2, -1, 0, 1);// y direction kernel
92 |
93 | // fetch the 3x3 neighbourhood of a fragment
94 |
95 | // first column
96 | float tx0y0 = getValue(-1, -1);
97 | float tx0y1 = getValue(-1, 0);
98 | float tx0y2 = getValue(-1, 1);
99 |
100 | // second column
101 | float tx1y0 = getValue(0, -1);
102 | float tx1y1 = getValue(0, 0);
103 | float tx1y2 = getValue(0, 1);
104 |
105 | // third column
106 | float tx2y0 = getValue(1, -1);
107 | float tx2y1 = getValue(1, 0);
108 | float tx2y2 = getValue(1, 1);
109 |
110 | // gradient value in x direction
111 | float valueGx = Gx[0][0] * tx0y0 + Gx[1][0] * tx1y0 + Gx[2][0] * tx2y0 +
112 | Gx[0][1] * tx0y1 + Gx[1][1] * tx1y1 + Gx[2][1] * tx2y1 +
113 | Gx[0][2] * tx0y2 + Gx[1][2] * tx1y2 + Gx[2][2] * tx2y2;
114 |
115 | // gradient value in y direction
116 | float valueGy = Gy[0][0] * tx0y0 + Gy[1][0] * tx1y0 + Gy[2][0] * tx2y0 +
117 | Gy[0][1] * tx0y1 + Gy[1][1] * tx1y1 + Gy[2][1] * tx2y1 +
118 | Gy[0][2] * tx0y2 + Gy[1][2] * tx1y2 + Gy[2][2] * tx2y2;
119 |
120 | // magnitute of the total gradient
121 | float G = (valueGx * valueGx) + (valueGy * valueGy);
122 | return clamp(G, 0.0, 1.0);
123 | }
124 |
125 | float readDepth( sampler2D depthSampler, vec2 coord ) {
126 | float fragCoordZ = texture2D( depthSampler, coord ).x;
127 | float viewZ = perspectiveDepthToViewZ( fragCoordZ, uNear, uFar );
128 | return viewZToOrthographicDepth( viewZ, uNear, uFar );
129 | }
130 |
131 |
132 | void main() {
133 | vec2 size = vec2(textureSize(uDiffuse, 0));
134 | vec4 texel = texture2D(uDiffuse, vUv);
135 |
136 | vec2 fragCoord = gl_FragCoord.xy;
137 |
138 | vec2 noiseValue = vec2(noise(fragCoord));
139 | noiseValue = noiseValue * 2.0 - 1.0;
140 | noiseValue *= 10.0;
141 |
142 | vec4 cloudNoiseValue = texture2D(uCloudTexture, vUv);
143 |
144 | float sobelValue = sobelFloat(uDiffuse, vUv, 1.0 / uResolution);
145 | sobelValue = smoothstep(0.01, 0.03, sobelValue);
146 |
147 | vec4 uLineColor = vec4(0.32, 0.12, 0.2, 1.0);
148 |
149 | if (sobelValue > 0.1) {
150 | gl_FragColor = uLineColor * 0.5;
151 | } else {
152 | gl_FragColor = texel;
153 | }
154 | }
155 |
--------------------------------------------------------------------------------
/src/pencil-lines/shaders/pencil-lines.vert:
--------------------------------------------------------------------------------
1 | varying vec2 vUv;
2 |
3 | void main() {
4 |
5 | vUv = uv;
6 |
7 | gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
8 | }
9 |
--------------------------------------------------------------------------------
/src/pencil-lines/shaders/shader.frag:
--------------------------------------------------------------------------------
1 | void main() {
2 | gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
3 | }
4 |
--------------------------------------------------------------------------------
/src/pencil-lines/shaders/shader.vert:
--------------------------------------------------------------------------------
1 | void main() {
2 | gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.0);
3 | }
4 |
--------------------------------------------------------------------------------
/src/style.scss:
--------------------------------------------------------------------------------
1 | html,
2 | body,
3 | #canvas {
4 | height: 100%;
5 | width: 100%;
6 | margin: 0;
7 | padding: 0;
8 | overflow: hidden;
9 | background: #000;
10 | }
11 |
12 | #canvas {
13 | outline: none;
14 | }
15 |
--------------------------------------------------------------------------------
/src/types/glsl.d.ts:
--------------------------------------------------------------------------------
1 | declare module '*.glsl' {
2 | const value: string
3 | export default value
4 | }
5 |
6 | declare module '*.frag' {
7 | const value: string
8 | export default value
9 | }
10 |
11 | declare module '*.vert' {
12 | const value: string
13 | export default value
14 | }
15 |
--------------------------------------------------------------------------------
/src/vite-env.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "ESNext",
4 | "useDefineForClassFields": true,
5 | "module": "ESNext",
6 | "lib": ["ESNext", "DOM"],
7 | "moduleResolution": "Node",
8 | "strict": true,
9 | "sourceMap": true,
10 | "resolveJsonModule": true,
11 | "isolatedModules": true,
12 | "esModuleInterop": true,
13 | "noEmit": true,
14 | "noUnusedLocals": true,
15 | "noUnusedParameters": true,
16 | "noImplicitReturns": true,
17 | "skipLibCheck": true
18 | },
19 | "include": ["src"]
20 | }
21 |
--------------------------------------------------------------------------------
/vite.config.js:
--------------------------------------------------------------------------------
1 | import glsl from 'vite-plugin-glsl'
2 | import { defineConfig } from 'vite'
3 |
4 | export default defineConfig({
5 | plugins: [glsl.default()], //For some reason, cannot resolve glsl(). Workaround found on vite-plugin-glsl issue (https://github.com/UstymUkhman/vite-plugin-glsl/issues/1#issuecomment-972660771)
6 | })
7 |
--------------------------------------------------------------------------------
/yarn.lock:
--------------------------------------------------------------------------------
1 | # This file is generated by running "yarn install" inside your project.
2 | # Manual changes might be lost - proceed with caution!
3 |
4 | __metadata:
5 | version: 6
6 | cacheKey: 8
7 |
8 | "@gar/promisify@npm:^1.1.3":
9 | version: 1.1.3
10 | resolution: "@gar/promisify@npm:1.1.3"
11 | checksum: 4059f790e2d07bf3c3ff3e0fec0daa8144fe35c1f6e0111c9921bd32106adaa97a4ab096ad7dab1e28ee6a9060083c4d1a4ada42a7f5f3f7a96b8812e2b757c1
12 | languageName: node
13 | linkType: hard
14 |
15 | "@npmcli/fs@npm:^2.1.0":
16 | version: 2.1.1
17 | resolution: "@npmcli/fs@npm:2.1.1"
18 | dependencies:
19 | "@gar/promisify": ^1.1.3
20 | semver: ^7.3.5
21 | checksum: 4944a0545d38d3e6e29780eeb3cd4be6059c1e9627509d2c9ced635c53b852d28b37cdc615a2adf815b51ab8673adb6507e370401a20a7e90c8a6dc4fac02389
22 | languageName: node
23 | linkType: hard
24 |
25 | "@npmcli/move-file@npm:^2.0.0":
26 | version: 2.0.0
27 | resolution: "@npmcli/move-file@npm:2.0.0"
28 | dependencies:
29 | mkdirp: ^1.0.4
30 | rimraf: ^3.0.2
31 | checksum: 1388777b507b0c592d53f41b9d182e1a8de7763bc625fc07999b8edbc22325f074e5b3ec90af79c89d6987fdb2325bc66d59f483258543c14a43661621f841b0
32 | languageName: node
33 | linkType: hard
34 |
35 | "@rollup/pluginutils@npm:^4.2.1":
36 | version: 4.2.1
37 | resolution: "@rollup/pluginutils@npm:4.2.1"
38 | dependencies:
39 | estree-walker: ^2.0.1
40 | picomatch: ^2.2.2
41 | checksum: 6bc41f22b1a0f1efec3043899e4d3b6b1497b3dea4d94292d8f83b4cf07a1073ecbaedd562a22d11913ff7659f459677b01b09e9598a98936e746780ecc93a12
42 | languageName: node
43 | linkType: hard
44 |
45 | "@tootallnate/once@npm:2":
46 | version: 2.0.0
47 | resolution: "@tootallnate/once@npm:2.0.0"
48 | checksum: ad87447820dd3f24825d2d947ebc03072b20a42bfc96cbafec16bff8bbda6c1a81fcb0be56d5b21968560c5359a0af4038a68ba150c3e1694fe4c109a063bed8
49 | languageName: node
50 | linkType: hard
51 |
52 | "@types/three@npm:^0.144.0":
53 | version: 0.144.0
54 | resolution: "@types/three@npm:0.144.0"
55 | dependencies:
56 | "@types/webxr": "*"
57 | checksum: 7ce69e1a48ba6d19dc9efb78c5c67a3e66c036f240386dd700eda7a5964e44550066ac45bc0997bd4fe7be446edae356313d992361c18415191468dfdbfb454d
58 | languageName: node
59 | linkType: hard
60 |
61 | "@types/webxr@npm:*":
62 | version: 0.4.0
63 | resolution: "@types/webxr@npm:0.4.0"
64 | checksum: 4388c18a5b08ef4aa97f2177d3d80d384c5557c4b06278215d46472585923128fb316353e5fb799d22ffe99be149af90d0c27c41cb3681e82228088e48b24184
65 | languageName: node
66 | linkType: hard
67 |
68 | "abbrev@npm:1":
69 | version: 1.1.1
70 | resolution: "abbrev@npm:1.1.1"
71 | checksum: a4a97ec07d7ea112c517036882b2ac22f3109b7b19077dc656316d07d308438aac28e4d9746dc4d84bf6b1e75b4a7b0a5f3cb30592419f128ca9a8cee3bcfa17
72 | languageName: node
73 | linkType: hard
74 |
75 | "agent-base@npm:6, agent-base@npm:^6.0.2":
76 | version: 6.0.2
77 | resolution: "agent-base@npm:6.0.2"
78 | dependencies:
79 | debug: 4
80 | checksum: f52b6872cc96fd5f622071b71ef200e01c7c4c454ee68bc9accca90c98cfb39f2810e3e9aa330435835eedc8c23f4f8a15267f67c6e245d2b33757575bdac49d
81 | languageName: node
82 | linkType: hard
83 |
84 | "agentkeepalive@npm:^4.2.1":
85 | version: 4.2.1
86 | resolution: "agentkeepalive@npm:4.2.1"
87 | dependencies:
88 | debug: ^4.1.0
89 | depd: ^1.1.2
90 | humanize-ms: ^1.2.1
91 | checksum: 39cb49ed8cf217fd6da058a92828a0a84e0b74c35550f82ee0a10e1ee403c4b78ade7948be2279b188b7a7303f5d396ea2738b134731e464bf28de00a4f72a18
92 | languageName: node
93 | linkType: hard
94 |
95 | "aggregate-error@npm:^3.0.0":
96 | version: 3.1.0
97 | resolution: "aggregate-error@npm:3.1.0"
98 | dependencies:
99 | clean-stack: ^2.0.0
100 | indent-string: ^4.0.0
101 | checksum: 1101a33f21baa27a2fa8e04b698271e64616b886795fd43c31068c07533c7b3facfcaf4e9e0cab3624bd88f729a592f1c901a1a229c9e490eafce411a8644b79
102 | languageName: node
103 | linkType: hard
104 |
105 | "ansi-escapes@npm:^4.3.0":
106 | version: 4.3.2
107 | resolution: "ansi-escapes@npm:4.3.2"
108 | dependencies:
109 | type-fest: ^0.21.3
110 | checksum: 93111c42189c0a6bed9cdb4d7f2829548e943827ee8479c74d6e0b22ee127b2a21d3f8b5ca57723b8ef78ce011fbfc2784350eb2bde3ccfccf2f575fa8489815
111 | languageName: node
112 | linkType: hard
113 |
114 | "ansi-regex@npm:^5.0.1":
115 | version: 5.0.1
116 | resolution: "ansi-regex@npm:5.0.1"
117 | checksum: 2aa4bb54caf2d622f1afdad09441695af2a83aa3fe8b8afa581d205e57ed4261c183c4d3877cee25794443fde5876417d859c108078ab788d6af7e4fe52eb66b
118 | languageName: node
119 | linkType: hard
120 |
121 | "ansi-regex@npm:^6.0.1":
122 | version: 6.0.1
123 | resolution: "ansi-regex@npm:6.0.1"
124 | checksum: 1ff8b7667cded1de4fa2c9ae283e979fc87036864317da86a2e546725f96406746411d0d85e87a2d12fa5abd715d90006de7fa4fa0477c92321ad3b4c7d4e169
125 | languageName: node
126 | linkType: hard
127 |
128 | "ansi-styles@npm:^4.0.0":
129 | version: 4.3.0
130 | resolution: "ansi-styles@npm:4.3.0"
131 | dependencies:
132 | color-convert: ^2.0.1
133 | checksum: 513b44c3b2105dd14cc42a19271e80f386466c4be574bccf60b627432f9198571ebf4ab1e4c3ba17347658f4ee1711c163d574248c0c1cdc2d5917a0ad582ec4
134 | languageName: node
135 | linkType: hard
136 |
137 | "ansi-styles@npm:^6.0.0":
138 | version: 6.1.0
139 | resolution: "ansi-styles@npm:6.1.0"
140 | checksum: 7a7f8528c07a9d20c3a92bccd2b6bc3bb4d26e5cb775c02826921477377bd495d615d61f710d56216344b6238d1d11ef2b0348e146c5b128715578bfb3217229
141 | languageName: node
142 | linkType: hard
143 |
144 | "anymatch@npm:~3.1.2":
145 | version: 3.1.2
146 | resolution: "anymatch@npm:3.1.2"
147 | dependencies:
148 | normalize-path: ^3.0.0
149 | picomatch: ^2.0.4
150 | checksum: 985163db2292fac9e5a1e072bf99f1b5baccf196e4de25a0b0b81865ebddeb3b3eb4480734ef0a2ac8c002845396b91aa89121f5b84f93981a4658164a9ec6e9
151 | languageName: node
152 | linkType: hard
153 |
154 | "aproba@npm:^1.0.3 || ^2.0.0":
155 | version: 2.0.0
156 | resolution: "aproba@npm:2.0.0"
157 | checksum: 5615cadcfb45289eea63f8afd064ab656006361020e1735112e346593856f87435e02d8dcc7ff0d11928bc7d425f27bc7c2a84f6c0b35ab0ff659c814c138a24
158 | languageName: node
159 | linkType: hard
160 |
161 | "are-we-there-yet@npm:^3.0.0":
162 | version: 3.0.0
163 | resolution: "are-we-there-yet@npm:3.0.0"
164 | dependencies:
165 | delegates: ^1.0.0
166 | readable-stream: ^3.6.0
167 | checksum: 348edfdd931b0b50868b55402c01c3f64df1d4c229ab6f063539a5025fd6c5f5bb8a0cab409bbed8d75d34762d22aa91b7c20b4204eb8177063158d9ba792981
168 | languageName: node
169 | linkType: hard
170 |
171 | "astral-regex@npm:^2.0.0":
172 | version: 2.0.0
173 | resolution: "astral-regex@npm:2.0.0"
174 | checksum: 876231688c66400473ba505731df37ea436e574dd524520294cc3bbc54ea40334865e01fa0d074d74d036ee874ee7e62f486ea38bc421ee8e6a871c06f011766
175 | languageName: node
176 | linkType: hard
177 |
178 | "balanced-match@npm:^1.0.0":
179 | version: 1.0.2
180 | resolution: "balanced-match@npm:1.0.2"
181 | checksum: 9706c088a283058a8a99e0bf91b0a2f75497f185980d9ffa8b304de1d9e58ebda7c72c07ebf01dadedaac5b2907b2c6f566f660d62bd336c3468e960403b9d65
182 | languageName: node
183 | linkType: hard
184 |
185 | "binary-extensions@npm:^2.0.0":
186 | version: 2.2.0
187 | resolution: "binary-extensions@npm:2.2.0"
188 | checksum: ccd267956c58d2315f5d3ea6757cf09863c5fc703e50fbeb13a7dc849b812ef76e3cf9ca8f35a0c48498776a7478d7b4a0418e1e2b8cb9cb9731f2922aaad7f8
189 | languageName: node
190 | linkType: hard
191 |
192 | "brace-expansion@npm:^1.1.7":
193 | version: 1.1.11
194 | resolution: "brace-expansion@npm:1.1.11"
195 | dependencies:
196 | balanced-match: ^1.0.0
197 | concat-map: 0.0.1
198 | checksum: faf34a7bb0c3fcf4b59c7808bc5d2a96a40988addf2e7e09dfbb67a2251800e0d14cd2bfc1aa79174f2f5095c54ff27f46fb1289fe2d77dac755b5eb3434cc07
199 | languageName: node
200 | linkType: hard
201 |
202 | "brace-expansion@npm:^2.0.1":
203 | version: 2.0.1
204 | resolution: "brace-expansion@npm:2.0.1"
205 | dependencies:
206 | balanced-match: ^1.0.0
207 | checksum: a61e7cd2e8a8505e9f0036b3b6108ba5e926b4b55089eeb5550cd04a471fe216c96d4fe7e4c7f995c728c554ae20ddfc4244cad10aef255e72b62930afd233d1
208 | languageName: node
209 | linkType: hard
210 |
211 | "braces@npm:^3.0.2, braces@npm:~3.0.2":
212 | version: 3.0.2
213 | resolution: "braces@npm:3.0.2"
214 | dependencies:
215 | fill-range: ^7.0.1
216 | checksum: e2a8e769a863f3d4ee887b5fe21f63193a891c68b612ddb4b68d82d1b5f3ff9073af066c343e9867a393fe4c2555dcb33e89b937195feb9c1613d259edfcd459
217 | languageName: node
218 | linkType: hard
219 |
220 | "cacache@npm:^16.1.0":
221 | version: 16.1.1
222 | resolution: "cacache@npm:16.1.1"
223 | dependencies:
224 | "@npmcli/fs": ^2.1.0
225 | "@npmcli/move-file": ^2.0.0
226 | chownr: ^2.0.0
227 | fs-minipass: ^2.1.0
228 | glob: ^8.0.1
229 | infer-owner: ^1.0.4
230 | lru-cache: ^7.7.1
231 | minipass: ^3.1.6
232 | minipass-collect: ^1.0.2
233 | minipass-flush: ^1.0.5
234 | minipass-pipeline: ^1.2.4
235 | mkdirp: ^1.0.4
236 | p-map: ^4.0.0
237 | promise-inflight: ^1.0.1
238 | rimraf: ^3.0.2
239 | ssri: ^9.0.0
240 | tar: ^6.1.11
241 | unique-filename: ^1.1.1
242 | checksum: 488524617008b793f0249b0c4ea2c330c710ca997921376e15650cc2415a8054491ae2dee9f01382c2015602c0641f3f977faf2fa7361aa33d2637dcfb03907a
243 | languageName: node
244 | linkType: hard
245 |
246 | "chokidar@npm:>=3.0.0 <4.0.0":
247 | version: 3.5.3
248 | resolution: "chokidar@npm:3.5.3"
249 | dependencies:
250 | anymatch: ~3.1.2
251 | braces: ~3.0.2
252 | fsevents: ~2.3.2
253 | glob-parent: ~5.1.2
254 | is-binary-path: ~2.1.0
255 | is-glob: ~4.0.1
256 | normalize-path: ~3.0.0
257 | readdirp: ~3.6.0
258 | dependenciesMeta:
259 | fsevents:
260 | optional: true
261 | checksum: b49fcde40176ba007ff361b198a2d35df60d9bb2a5aab228279eb810feae9294a6b4649ab15981304447afe1e6ffbf4788ad5db77235dc770ab777c6e771980c
262 | languageName: node
263 | linkType: hard
264 |
265 | "chownr@npm:^2.0.0":
266 | version: 2.0.0
267 | resolution: "chownr@npm:2.0.0"
268 | checksum: c57cf9dd0791e2f18a5ee9c1a299ae6e801ff58fee96dc8bfd0dcb4738a6ce58dd252a3605b1c93c6418fe4f9d5093b28ffbf4d66648cb2a9c67eaef9679be2f
269 | languageName: node
270 | linkType: hard
271 |
272 | "clean-stack@npm:^2.0.0":
273 | version: 2.2.0
274 | resolution: "clean-stack@npm:2.2.0"
275 | checksum: 2ac8cd2b2f5ec986a3c743935ec85b07bc174d5421a5efc8017e1f146a1cf5f781ae962618f416352103b32c9cd7e203276e8c28241bbe946160cab16149fb68
276 | languageName: node
277 | linkType: hard
278 |
279 | "cli-cursor@npm:^3.1.0":
280 | version: 3.1.0
281 | resolution: "cli-cursor@npm:3.1.0"
282 | dependencies:
283 | restore-cursor: ^3.1.0
284 | checksum: 2692784c6cd2fd85cfdbd11f53aea73a463a6d64a77c3e098b2b4697a20443f430c220629e1ca3b195ea5ac4a97a74c2ee411f3807abf6df2b66211fec0c0a29
285 | languageName: node
286 | linkType: hard
287 |
288 | "cli-truncate@npm:^2.1.0":
289 | version: 2.1.0
290 | resolution: "cli-truncate@npm:2.1.0"
291 | dependencies:
292 | slice-ansi: ^3.0.0
293 | string-width: ^4.2.0
294 | checksum: bf1e4e6195392dc718bf9cd71f317b6300dc4a9191d052f31046b8773230ece4fa09458813bf0e3455a5e68c0690d2ea2c197d14a8b85a7b5e01c97f4b5feb5d
295 | languageName: node
296 | linkType: hard
297 |
298 | "cli-truncate@npm:^3.1.0":
299 | version: 3.1.0
300 | resolution: "cli-truncate@npm:3.1.0"
301 | dependencies:
302 | slice-ansi: ^5.0.0
303 | string-width: ^5.0.0
304 | checksum: c3243e41974445691c63f8b405df1d5a24049dc33d324fe448dc572e561a7b772ae982692900b1a5960901cc4fc7def25a629b9c69a4208ee89d12ab3332617a
305 | languageName: node
306 | linkType: hard
307 |
308 | "color-convert@npm:^2.0.1":
309 | version: 2.0.1
310 | resolution: "color-convert@npm:2.0.1"
311 | dependencies:
312 | color-name: ~1.1.4
313 | checksum: 79e6bdb9fd479a205c71d89574fccfb22bd9053bd98c6c4d870d65c132e5e904e6034978e55b43d69fcaa7433af2016ee203ce76eeba9cfa554b373e7f7db336
314 | languageName: node
315 | linkType: hard
316 |
317 | "color-name@npm:~1.1.4":
318 | version: 1.1.4
319 | resolution: "color-name@npm:1.1.4"
320 | checksum: b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610
321 | languageName: node
322 | linkType: hard
323 |
324 | "color-support@npm:^1.1.3":
325 | version: 1.1.3
326 | resolution: "color-support@npm:1.1.3"
327 | bin:
328 | color-support: bin.js
329 | checksum: 9b7356817670b9a13a26ca5af1c21615463b500783b739b7634a0c2047c16cef4b2865d7576875c31c3cddf9dd621fa19285e628f20198b233a5cfdda6d0793b
330 | languageName: node
331 | linkType: hard
332 |
333 | "colorette@npm:^2.0.16, colorette@npm:^2.0.17":
334 | version: 2.0.19
335 | resolution: "colorette@npm:2.0.19"
336 | checksum: 888cf5493f781e5fcf54ce4d49e9d7d698f96ea2b2ef67906834bb319a392c667f9ec69f4a10e268d2946d13a9503d2d19b3abaaaf174e3451bfe91fb9d82427
337 | languageName: node
338 | linkType: hard
339 |
340 | "commander@npm:^9.3.0":
341 | version: 9.4.0
342 | resolution: "commander@npm:9.4.0"
343 | checksum: a322de584a6ccd1ea83c24f6a660e52d16ffbe2613fcfbb8d2cc68bc9dec637492456d754fe8bb5b039ad843ed8e04fb0b107e581a75f62cde9e1a0ab1546e09
344 | languageName: node
345 | linkType: hard
346 |
347 | "concat-map@npm:0.0.1":
348 | version: 0.0.1
349 | resolution: "concat-map@npm:0.0.1"
350 | checksum: 902a9f5d8967a3e2faf138d5cb784b9979bad2e6db5357c5b21c568df4ebe62bcb15108af1b2253744844eb964fc023fbd9afbbbb6ddd0bcc204c6fb5b7bf3af
351 | languageName: node
352 | linkType: hard
353 |
354 | "console-control-strings@npm:^1.1.0":
355 | version: 1.1.0
356 | resolution: "console-control-strings@npm:1.1.0"
357 | checksum: 8755d76787f94e6cf79ce4666f0c5519906d7f5b02d4b884cf41e11dcd759ed69c57da0670afd9236d229a46e0f9cf519db0cd829c6dca820bb5a5c3def584ed
358 | languageName: node
359 | linkType: hard
360 |
361 | "cross-spawn@npm:^7.0.3":
362 | version: 7.0.3
363 | resolution: "cross-spawn@npm:7.0.3"
364 | dependencies:
365 | path-key: ^3.1.0
366 | shebang-command: ^2.0.0
367 | which: ^2.0.1
368 | checksum: 671cc7c7288c3a8406f3c69a3ae2fc85555c04169e9d611def9a675635472614f1c0ed0ef80955d5b6d4e724f6ced67f0ad1bb006c2ea643488fcfef994d7f52
369 | languageName: node
370 | linkType: hard
371 |
372 | "debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.3.3, debug@npm:^4.3.4":
373 | version: 4.3.4
374 | resolution: "debug@npm:4.3.4"
375 | dependencies:
376 | ms: 2.1.2
377 | peerDependenciesMeta:
378 | supports-color:
379 | optional: true
380 | checksum: 3dbad3f94ea64f34431a9cbf0bafb61853eda57bff2880036153438f50fb5a84f27683ba0d8e5426bf41a8c6ff03879488120cf5b3a761e77953169c0600a708
381 | languageName: node
382 | linkType: hard
383 |
384 | "delegates@npm:^1.0.0":
385 | version: 1.0.0
386 | resolution: "delegates@npm:1.0.0"
387 | checksum: a51744d9b53c164ba9c0492471a1a2ffa0b6727451bdc89e31627fdf4adda9d51277cfcbfb20f0a6f08ccb3c436f341df3e92631a3440226d93a8971724771fd
388 | languageName: node
389 | linkType: hard
390 |
391 | "depd@npm:^1.1.2":
392 | version: 1.1.2
393 | resolution: "depd@npm:1.1.2"
394 | checksum: 6b406620d269619852885ce15965272b829df6f409724415e0002c8632ab6a8c0a08ec1f0bd2add05dc7bd7507606f7e2cc034fa24224ab829580040b835ecd9
395 | languageName: node
396 | linkType: hard
397 |
398 | "eastasianwidth@npm:^0.2.0":
399 | version: 0.2.0
400 | resolution: "eastasianwidth@npm:0.2.0"
401 | checksum: 7d00d7cd8e49b9afa762a813faac332dee781932d6f2c848dc348939c4253f1d4564341b7af1d041853bc3f32c2ef141b58e0a4d9862c17a7f08f68df1e0f1ed
402 | languageName: node
403 | linkType: hard
404 |
405 | "emoji-regex@npm:^8.0.0":
406 | version: 8.0.0
407 | resolution: "emoji-regex@npm:8.0.0"
408 | checksum: d4c5c39d5a9868b5fa152f00cada8a936868fd3367f33f71be515ecee4c803132d11b31a6222b2571b1e5f7e13890156a94880345594d0ce7e3c9895f560f192
409 | languageName: node
410 | linkType: hard
411 |
412 | "emoji-regex@npm:^9.2.2":
413 | version: 9.2.2
414 | resolution: "emoji-regex@npm:9.2.2"
415 | checksum: 8487182da74aabd810ac6d6f1994111dfc0e331b01271ae01ec1eb0ad7b5ecc2bbbbd2f053c05cb55a1ac30449527d819bbfbf0e3de1023db308cbcb47f86601
416 | languageName: node
417 | linkType: hard
418 |
419 | "encoding@npm:^0.1.13":
420 | version: 0.1.13
421 | resolution: "encoding@npm:0.1.13"
422 | dependencies:
423 | iconv-lite: ^0.6.2
424 | checksum: bb98632f8ffa823996e508ce6a58ffcf5856330fde839ae42c9e1f436cc3b5cc651d4aeae72222916545428e54fd0f6aa8862fd8d25bdbcc4589f1e3f3715e7f
425 | languageName: node
426 | linkType: hard
427 |
428 | "env-paths@npm:^2.2.0":
429 | version: 2.2.1
430 | resolution: "env-paths@npm:2.2.1"
431 | checksum: 65b5df55a8bab92229ab2b40dad3b387fad24613263d103a97f91c9fe43ceb21965cd3392b1ccb5d77088021e525c4e0481adb309625d0cb94ade1d1fb8dc17e
432 | languageName: node
433 | linkType: hard
434 |
435 | "err-code@npm:^2.0.2":
436 | version: 2.0.3
437 | resolution: "err-code@npm:2.0.3"
438 | checksum: 8b7b1be20d2de12d2255c0bc2ca638b7af5171142693299416e6a9339bd7d88fc8d7707d913d78e0993176005405a236b066b45666b27b797252c771156ace54
439 | languageName: node
440 | linkType: hard
441 |
442 | "esbuild-android-64@npm:0.14.50":
443 | version: 0.14.50
444 | resolution: "esbuild-android-64@npm:0.14.50"
445 | conditions: os=android & cpu=x64
446 | languageName: node
447 | linkType: hard
448 |
449 | "esbuild-android-arm64@npm:0.14.50":
450 | version: 0.14.50
451 | resolution: "esbuild-android-arm64@npm:0.14.50"
452 | conditions: os=android & cpu=arm64
453 | languageName: node
454 | linkType: hard
455 |
456 | "esbuild-darwin-64@npm:0.14.50":
457 | version: 0.14.50
458 | resolution: "esbuild-darwin-64@npm:0.14.50"
459 | conditions: os=darwin & cpu=x64
460 | languageName: node
461 | linkType: hard
462 |
463 | "esbuild-darwin-arm64@npm:0.14.50":
464 | version: 0.14.50
465 | resolution: "esbuild-darwin-arm64@npm:0.14.50"
466 | conditions: os=darwin & cpu=arm64
467 | languageName: node
468 | linkType: hard
469 |
470 | "esbuild-freebsd-64@npm:0.14.50":
471 | version: 0.14.50
472 | resolution: "esbuild-freebsd-64@npm:0.14.50"
473 | conditions: os=freebsd & cpu=x64
474 | languageName: node
475 | linkType: hard
476 |
477 | "esbuild-freebsd-arm64@npm:0.14.50":
478 | version: 0.14.50
479 | resolution: "esbuild-freebsd-arm64@npm:0.14.50"
480 | conditions: os=freebsd & cpu=arm64
481 | languageName: node
482 | linkType: hard
483 |
484 | "esbuild-linux-32@npm:0.14.50":
485 | version: 0.14.50
486 | resolution: "esbuild-linux-32@npm:0.14.50"
487 | conditions: os=linux & cpu=ia32
488 | languageName: node
489 | linkType: hard
490 |
491 | "esbuild-linux-64@npm:0.14.50":
492 | version: 0.14.50
493 | resolution: "esbuild-linux-64@npm:0.14.50"
494 | conditions: os=linux & cpu=x64
495 | languageName: node
496 | linkType: hard
497 |
498 | "esbuild-linux-arm64@npm:0.14.50":
499 | version: 0.14.50
500 | resolution: "esbuild-linux-arm64@npm:0.14.50"
501 | conditions: os=linux & cpu=arm64
502 | languageName: node
503 | linkType: hard
504 |
505 | "esbuild-linux-arm@npm:0.14.50":
506 | version: 0.14.50
507 | resolution: "esbuild-linux-arm@npm:0.14.50"
508 | conditions: os=linux & cpu=arm
509 | languageName: node
510 | linkType: hard
511 |
512 | "esbuild-linux-mips64le@npm:0.14.50":
513 | version: 0.14.50
514 | resolution: "esbuild-linux-mips64le@npm:0.14.50"
515 | conditions: os=linux & cpu=mips64el
516 | languageName: node
517 | linkType: hard
518 |
519 | "esbuild-linux-ppc64le@npm:0.14.50":
520 | version: 0.14.50
521 | resolution: "esbuild-linux-ppc64le@npm:0.14.50"
522 | conditions: os=linux & cpu=ppc64
523 | languageName: node
524 | linkType: hard
525 |
526 | "esbuild-linux-riscv64@npm:0.14.50":
527 | version: 0.14.50
528 | resolution: "esbuild-linux-riscv64@npm:0.14.50"
529 | conditions: os=linux & cpu=riscv64
530 | languageName: node
531 | linkType: hard
532 |
533 | "esbuild-linux-s390x@npm:0.14.50":
534 | version: 0.14.50
535 | resolution: "esbuild-linux-s390x@npm:0.14.50"
536 | conditions: os=linux & cpu=s390x
537 | languageName: node
538 | linkType: hard
539 |
540 | "esbuild-netbsd-64@npm:0.14.50":
541 | version: 0.14.50
542 | resolution: "esbuild-netbsd-64@npm:0.14.50"
543 | conditions: os=netbsd & cpu=x64
544 | languageName: node
545 | linkType: hard
546 |
547 | "esbuild-openbsd-64@npm:0.14.50":
548 | version: 0.14.50
549 | resolution: "esbuild-openbsd-64@npm:0.14.50"
550 | conditions: os=openbsd & cpu=x64
551 | languageName: node
552 | linkType: hard
553 |
554 | "esbuild-sunos-64@npm:0.14.50":
555 | version: 0.14.50
556 | resolution: "esbuild-sunos-64@npm:0.14.50"
557 | conditions: os=sunos & cpu=x64
558 | languageName: node
559 | linkType: hard
560 |
561 | "esbuild-windows-32@npm:0.14.50":
562 | version: 0.14.50
563 | resolution: "esbuild-windows-32@npm:0.14.50"
564 | conditions: os=win32 & cpu=ia32
565 | languageName: node
566 | linkType: hard
567 |
568 | "esbuild-windows-64@npm:0.14.50":
569 | version: 0.14.50
570 | resolution: "esbuild-windows-64@npm:0.14.50"
571 | conditions: os=win32 & cpu=x64
572 | languageName: node
573 | linkType: hard
574 |
575 | "esbuild-windows-arm64@npm:0.14.50":
576 | version: 0.14.50
577 | resolution: "esbuild-windows-arm64@npm:0.14.50"
578 | conditions: os=win32 & cpu=arm64
579 | languageName: node
580 | linkType: hard
581 |
582 | "esbuild@npm:^0.14.47":
583 | version: 0.14.50
584 | resolution: "esbuild@npm:0.14.50"
585 | dependencies:
586 | esbuild-android-64: 0.14.50
587 | esbuild-android-arm64: 0.14.50
588 | esbuild-darwin-64: 0.14.50
589 | esbuild-darwin-arm64: 0.14.50
590 | esbuild-freebsd-64: 0.14.50
591 | esbuild-freebsd-arm64: 0.14.50
592 | esbuild-linux-32: 0.14.50
593 | esbuild-linux-64: 0.14.50
594 | esbuild-linux-arm: 0.14.50
595 | esbuild-linux-arm64: 0.14.50
596 | esbuild-linux-mips64le: 0.14.50
597 | esbuild-linux-ppc64le: 0.14.50
598 | esbuild-linux-riscv64: 0.14.50
599 | esbuild-linux-s390x: 0.14.50
600 | esbuild-netbsd-64: 0.14.50
601 | esbuild-openbsd-64: 0.14.50
602 | esbuild-sunos-64: 0.14.50
603 | esbuild-windows-32: 0.14.50
604 | esbuild-windows-64: 0.14.50
605 | esbuild-windows-arm64: 0.14.50
606 | dependenciesMeta:
607 | esbuild-android-64:
608 | optional: true
609 | esbuild-android-arm64:
610 | optional: true
611 | esbuild-darwin-64:
612 | optional: true
613 | esbuild-darwin-arm64:
614 | optional: true
615 | esbuild-freebsd-64:
616 | optional: true
617 | esbuild-freebsd-arm64:
618 | optional: true
619 | esbuild-linux-32:
620 | optional: true
621 | esbuild-linux-64:
622 | optional: true
623 | esbuild-linux-arm:
624 | optional: true
625 | esbuild-linux-arm64:
626 | optional: true
627 | esbuild-linux-mips64le:
628 | optional: true
629 | esbuild-linux-ppc64le:
630 | optional: true
631 | esbuild-linux-riscv64:
632 | optional: true
633 | esbuild-linux-s390x:
634 | optional: true
635 | esbuild-netbsd-64:
636 | optional: true
637 | esbuild-openbsd-64:
638 | optional: true
639 | esbuild-sunos-64:
640 | optional: true
641 | esbuild-windows-32:
642 | optional: true
643 | esbuild-windows-64:
644 | optional: true
645 | esbuild-windows-arm64:
646 | optional: true
647 | bin:
648 | esbuild: bin/esbuild
649 | checksum: 91e9b9403804ad24c61477d509bbe908ee17d53a6ad368e29882889da0e1c7d352937239ca8bad82c4357960c1606a8ef9c2ac97781e59aa82dc9dadff345525
650 | languageName: node
651 | linkType: hard
652 |
653 | "estree-walker@npm:^2.0.1":
654 | version: 2.0.2
655 | resolution: "estree-walker@npm:2.0.2"
656 | checksum: 6151e6f9828abe2259e57f5fd3761335bb0d2ebd76dc1a01048ccee22fabcfef3c0859300f6d83ff0d1927849368775ec5a6d265dde2f6de5a1be1721cd94efc
657 | languageName: node
658 | linkType: hard
659 |
660 | "execa@npm:^6.1.0":
661 | version: 6.1.0
662 | resolution: "execa@npm:6.1.0"
663 | dependencies:
664 | cross-spawn: ^7.0.3
665 | get-stream: ^6.0.1
666 | human-signals: ^3.0.1
667 | is-stream: ^3.0.0
668 | merge-stream: ^2.0.0
669 | npm-run-path: ^5.1.0
670 | onetime: ^6.0.0
671 | signal-exit: ^3.0.7
672 | strip-final-newline: ^3.0.0
673 | checksum: 1a4af799839134f5c72eb63d525b87304c1114a63aa71676c91d57ccef2e26f2f53e14c11384ab11c4ec479be1efa83d11c8190e00040355c2c5c3364327fa8e
674 | languageName: node
675 | linkType: hard
676 |
677 | "fill-range@npm:^7.0.1":
678 | version: 7.0.1
679 | resolution: "fill-range@npm:7.0.1"
680 | dependencies:
681 | to-regex-range: ^5.0.1
682 | checksum: cc283f4e65b504259e64fd969bcf4def4eb08d85565e906b7d36516e87819db52029a76b6363d0f02d0d532f0033c9603b9e2d943d56ee3b0d4f7ad3328ff917
683 | languageName: node
684 | linkType: hard
685 |
686 | "fs-minipass@npm:^2.0.0, fs-minipass@npm:^2.1.0":
687 | version: 2.1.0
688 | resolution: "fs-minipass@npm:2.1.0"
689 | dependencies:
690 | minipass: ^3.0.0
691 | checksum: 1b8d128dae2ac6cc94230cc5ead341ba3e0efaef82dab46a33d171c044caaa6ca001364178d42069b2809c35a1c3c35079a32107c770e9ffab3901b59af8c8b1
692 | languageName: node
693 | linkType: hard
694 |
695 | "fs.realpath@npm:^1.0.0":
696 | version: 1.0.0
697 | resolution: "fs.realpath@npm:1.0.0"
698 | checksum: 99ddea01a7e75aa276c250a04eedeffe5662bce66c65c07164ad6264f9de18fb21be9433ead460e54cff20e31721c811f4fb5d70591799df5f85dce6d6746fd0
699 | languageName: node
700 | linkType: hard
701 |
702 | "fsevents@npm:~2.3.2":
703 | version: 2.3.2
704 | resolution: "fsevents@npm:2.3.2"
705 | dependencies:
706 | node-gyp: latest
707 | checksum: 97ade64e75091afee5265e6956cb72ba34db7819b4c3e94c431d4be2b19b8bb7a2d4116da417950c3425f17c8fe693d25e20212cac583ac1521ad066b77ae31f
708 | conditions: os=darwin
709 | languageName: node
710 | linkType: hard
711 |
712 | "fsevents@patch:fsevents@~2.3.2#~builtin":
713 | version: 2.3.2
714 | resolution: "fsevents@patch:fsevents@npm%3A2.3.2#~builtin::version=2.3.2&hash=18f3a7"
715 | dependencies:
716 | node-gyp: latest
717 | conditions: os=darwin
718 | languageName: node
719 | linkType: hard
720 |
721 | "function-bind@npm:^1.1.1":
722 | version: 1.1.1
723 | resolution: "function-bind@npm:1.1.1"
724 | checksum: b32fbaebb3f8ec4969f033073b43f5c8befbb58f1a79e12f1d7490358150359ebd92f49e72ff0144f65f2c48ea2a605bff2d07965f548f6474fd8efd95bf361a
725 | languageName: node
726 | linkType: hard
727 |
728 | "gauge@npm:^4.0.3":
729 | version: 4.0.4
730 | resolution: "gauge@npm:4.0.4"
731 | dependencies:
732 | aproba: ^1.0.3 || ^2.0.0
733 | color-support: ^1.1.3
734 | console-control-strings: ^1.1.0
735 | has-unicode: ^2.0.1
736 | signal-exit: ^3.0.7
737 | string-width: ^4.2.3
738 | strip-ansi: ^6.0.1
739 | wide-align: ^1.1.5
740 | checksum: 788b6bfe52f1dd8e263cda800c26ac0ca2ff6de0b6eee2fe0d9e3abf15e149b651bd27bf5226be10e6e3edb5c4e5d5985a5a1a98137e7a892f75eff76467ad2d
741 | languageName: node
742 | linkType: hard
743 |
744 | "get-stream@npm:^6.0.1":
745 | version: 6.0.1
746 | resolution: "get-stream@npm:6.0.1"
747 | checksum: e04ecece32c92eebf5b8c940f51468cd53554dcbb0ea725b2748be583c9523d00128137966afce410b9b051eb2ef16d657cd2b120ca8edafcf5a65e81af63cad
748 | languageName: node
749 | linkType: hard
750 |
751 | "glob-parent@npm:~5.1.2":
752 | version: 5.1.2
753 | resolution: "glob-parent@npm:5.1.2"
754 | dependencies:
755 | is-glob: ^4.0.1
756 | checksum: f4f2bfe2425296e8a47e36864e4f42be38a996db40420fe434565e4480e3322f18eb37589617a98640c5dc8fdec1a387007ee18dbb1f3f5553409c34d17f425e
757 | languageName: node
758 | linkType: hard
759 |
760 | "glob@npm:^7.1.3, glob@npm:^7.1.4":
761 | version: 7.2.3
762 | resolution: "glob@npm:7.2.3"
763 | dependencies:
764 | fs.realpath: ^1.0.0
765 | inflight: ^1.0.4
766 | inherits: 2
767 | minimatch: ^3.1.1
768 | once: ^1.3.0
769 | path-is-absolute: ^1.0.0
770 | checksum: 29452e97b38fa704dabb1d1045350fb2467cf0277e155aa9ff7077e90ad81d1ea9d53d3ee63bd37c05b09a065e90f16aec4a65f5b8de401d1dac40bc5605d133
771 | languageName: node
772 | linkType: hard
773 |
774 | "glob@npm:^8.0.1":
775 | version: 8.0.3
776 | resolution: "glob@npm:8.0.3"
777 | dependencies:
778 | fs.realpath: ^1.0.0
779 | inflight: ^1.0.4
780 | inherits: 2
781 | minimatch: ^5.0.1
782 | once: ^1.3.0
783 | checksum: 50bcdea19d8e79d8de5f460b1939ffc2b3299eac28deb502093fdca22a78efebc03e66bf54f0abc3d3d07d8134d19a32850288b7440d77e072aa55f9d33b18c5
784 | languageName: node
785 | linkType: hard
786 |
787 | "graceful-fs@npm:^4.2.6":
788 | version: 4.2.10
789 | resolution: "graceful-fs@npm:4.2.10"
790 | checksum: 3f109d70ae123951905d85032ebeae3c2a5a7a997430df00ea30df0e3a6c60cf6689b109654d6fdacd28810a053348c4d14642da1d075049e6be1ba5216218da
791 | languageName: node
792 | linkType: hard
793 |
794 | "has-unicode@npm:^2.0.1":
795 | version: 2.0.1
796 | resolution: "has-unicode@npm:2.0.1"
797 | checksum: 1eab07a7436512db0be40a710b29b5dc21fa04880b7f63c9980b706683127e3c1b57cb80ea96d47991bdae2dfe479604f6a1ba410106ee1046a41d1bd0814400
798 | languageName: node
799 | linkType: hard
800 |
801 | "has@npm:^1.0.3":
802 | version: 1.0.3
803 | resolution: "has@npm:1.0.3"
804 | dependencies:
805 | function-bind: ^1.1.1
806 | checksum: b9ad53d53be4af90ce5d1c38331e712522417d017d5ef1ebd0507e07c2fbad8686fffb8e12ddecd4c39ca9b9b47431afbb975b8abf7f3c3b82c98e9aad052792
807 | languageName: node
808 | linkType: hard
809 |
810 | "http-cache-semantics@npm:^4.1.0":
811 | version: 4.1.0
812 | resolution: "http-cache-semantics@npm:4.1.0"
813 | checksum: 974de94a81c5474be07f269f9fd8383e92ebb5a448208223bfb39e172a9dbc26feff250192ecc23b9593b3f92098e010406b0f24bd4d588d631f80214648ed42
814 | languageName: node
815 | linkType: hard
816 |
817 | "http-proxy-agent@npm:^5.0.0":
818 | version: 5.0.0
819 | resolution: "http-proxy-agent@npm:5.0.0"
820 | dependencies:
821 | "@tootallnate/once": 2
822 | agent-base: 6
823 | debug: 4
824 | checksum: e2ee1ff1656a131953839b2a19cd1f3a52d97c25ba87bd2559af6ae87114abf60971e498021f9b73f9fd78aea8876d1fb0d4656aac8a03c6caa9fc175f22b786
825 | languageName: node
826 | linkType: hard
827 |
828 | "https-proxy-agent@npm:^5.0.0":
829 | version: 5.0.1
830 | resolution: "https-proxy-agent@npm:5.0.1"
831 | dependencies:
832 | agent-base: 6
833 | debug: 4
834 | checksum: 571fccdf38184f05943e12d37d6ce38197becdd69e58d03f43637f7fa1269cf303a7d228aa27e5b27bbd3af8f09fd938e1c91dcfefff2df7ba77c20ed8dfc765
835 | languageName: node
836 | linkType: hard
837 |
838 | "human-signals@npm:^3.0.1":
839 | version: 3.0.1
840 | resolution: "human-signals@npm:3.0.1"
841 | checksum: f252a7769c8094a5c9dc6772816bdb417b188820b04c8b42d0fc468e03a0ba905b1dd07afabe9385cc83504af1ccc2b985cd1e4aeeeb8e0029896c5af2e6f354
842 | languageName: node
843 | linkType: hard
844 |
845 | "humanize-ms@npm:^1.2.1":
846 | version: 1.2.1
847 | resolution: "humanize-ms@npm:1.2.1"
848 | dependencies:
849 | ms: ^2.0.0
850 | checksum: 9c7a74a2827f9294c009266c82031030eae811ca87b0da3dceb8d6071b9bde22c9f3daef0469c3c533cc67a97d8a167cd9fc0389350e5f415f61a79b171ded16
851 | languageName: node
852 | linkType: hard
853 |
854 | "husky@npm:^8.0.1":
855 | version: 8.0.1
856 | resolution: "husky@npm:8.0.1"
857 | bin:
858 | husky: lib/bin.js
859 | checksum: 943a73a13d0201318fd30e83d299bb81d866bd245b69e6277804c3b462638dc1921694cb94c2b8c920a4a187060f7d6058d3365152865406352e934c5fff70dc
860 | languageName: node
861 | linkType: hard
862 |
863 | "iconv-lite@npm:^0.6.2":
864 | version: 0.6.3
865 | resolution: "iconv-lite@npm:0.6.3"
866 | dependencies:
867 | safer-buffer: ">= 2.1.2 < 3.0.0"
868 | checksum: 3f60d47a5c8fc3313317edfd29a00a692cc87a19cac0159e2ce711d0ebc9019064108323b5e493625e25594f11c6236647d8e256fbe7a58f4a3b33b89e6d30bf
869 | languageName: node
870 | linkType: hard
871 |
872 | "immutable@npm:^4.0.0":
873 | version: 4.1.0
874 | resolution: "immutable@npm:4.1.0"
875 | checksum: b9bc1f14fb18eb382d48339c064b24a1f97ae4cf43102e0906c0a6e186a27afcd18b55ca4a0b63c98eefb58143e2b5ebc7755a5fb4da4a7ad84b7a6096ac5b13
876 | languageName: node
877 | linkType: hard
878 |
879 | "imurmurhash@npm:^0.1.4":
880 | version: 0.1.4
881 | resolution: "imurmurhash@npm:0.1.4"
882 | checksum: 7cae75c8cd9a50f57dadd77482359f659eaebac0319dd9368bcd1714f55e65badd6929ca58569da2b6494ef13fdd5598cd700b1eba23f8b79c5f19d195a3ecf7
883 | languageName: node
884 | linkType: hard
885 |
886 | "indent-string@npm:^4.0.0":
887 | version: 4.0.0
888 | resolution: "indent-string@npm:4.0.0"
889 | checksum: 824cfb9929d031dabf059bebfe08cf3137365e112019086ed3dcff6a0a7b698cb80cf67ccccde0e25b9e2d7527aa6cc1fed1ac490c752162496caba3e6699612
890 | languageName: node
891 | linkType: hard
892 |
893 | "infer-owner@npm:^1.0.4":
894 | version: 1.0.4
895 | resolution: "infer-owner@npm:1.0.4"
896 | checksum: 181e732764e4a0611576466b4b87dac338972b839920b2a8cde43642e4ed6bd54dc1fb0b40874728f2a2df9a1b097b8ff83b56d5f8f8e3927f837fdcb47d8a89
897 | languageName: node
898 | linkType: hard
899 |
900 | "inflight@npm:^1.0.4":
901 | version: 1.0.6
902 | resolution: "inflight@npm:1.0.6"
903 | dependencies:
904 | once: ^1.3.0
905 | wrappy: 1
906 | checksum: f4f76aa072ce19fae87ce1ef7d221e709afb59d445e05d47fba710e85470923a75de35bfae47da6de1b18afc3ce83d70facf44cfb0aff89f0a3f45c0a0244dfd
907 | languageName: node
908 | linkType: hard
909 |
910 | "inherits@npm:2, inherits@npm:^2.0.3":
911 | version: 2.0.4
912 | resolution: "inherits@npm:2.0.4"
913 | checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1
914 | languageName: node
915 | linkType: hard
916 |
917 | "ip@npm:^2.0.0":
918 | version: 2.0.0
919 | resolution: "ip@npm:2.0.0"
920 | checksum: cfcfac6b873b701996d71ec82a7dd27ba92450afdb421e356f44044ed688df04567344c36cbacea7d01b1c39a4c732dc012570ebe9bebfb06f27314bca625349
921 | languageName: node
922 | linkType: hard
923 |
924 | "is-binary-path@npm:~2.1.0":
925 | version: 2.1.0
926 | resolution: "is-binary-path@npm:2.1.0"
927 | dependencies:
928 | binary-extensions: ^2.0.0
929 | checksum: 84192eb88cff70d320426f35ecd63c3d6d495da9d805b19bc65b518984b7c0760280e57dbf119b7e9be6b161784a5a673ab2c6abe83abb5198a432232ad5b35c
930 | languageName: node
931 | linkType: hard
932 |
933 | "is-core-module@npm:^2.9.0":
934 | version: 2.9.0
935 | resolution: "is-core-module@npm:2.9.0"
936 | dependencies:
937 | has: ^1.0.3
938 | checksum: b27034318b4b462f1c8f1dfb1b32baecd651d891a4e2d1922135daeff4141dfced2b82b07aef83ef54275c4a3526aa38da859223664d0868ca24182badb784ce
939 | languageName: node
940 | linkType: hard
941 |
942 | "is-extglob@npm:^2.1.1":
943 | version: 2.1.1
944 | resolution: "is-extglob@npm:2.1.1"
945 | checksum: df033653d06d0eb567461e58a7a8c9f940bd8c22274b94bf7671ab36df5719791aae15eef6d83bbb5e23283967f2f984b8914559d4449efda578c775c4be6f85
946 | languageName: node
947 | linkType: hard
948 |
949 | "is-fullwidth-code-point@npm:^3.0.0":
950 | version: 3.0.0
951 | resolution: "is-fullwidth-code-point@npm:3.0.0"
952 | checksum: 44a30c29457c7fb8f00297bce733f0a64cd22eca270f83e58c105e0d015e45c019491a4ab2faef91ab51d4738c670daff901c799f6a700e27f7314029e99e348
953 | languageName: node
954 | linkType: hard
955 |
956 | "is-fullwidth-code-point@npm:^4.0.0":
957 | version: 4.0.0
958 | resolution: "is-fullwidth-code-point@npm:4.0.0"
959 | checksum: 8ae89bf5057bdf4f57b346fb6c55e9c3dd2549983d54191d722d5c739397a903012cc41a04ee3403fd872e811243ef91a7c5196da7b5841dc6b6aae31a264a8d
960 | languageName: node
961 | linkType: hard
962 |
963 | "is-glob@npm:^4.0.1, is-glob@npm:~4.0.1":
964 | version: 4.0.3
965 | resolution: "is-glob@npm:4.0.3"
966 | dependencies:
967 | is-extglob: ^2.1.1
968 | checksum: d381c1319fcb69d341cc6e6c7cd588e17cd94722d9a32dbd60660b993c4fb7d0f19438674e68dfec686d09b7c73139c9166b47597f846af387450224a8101ab4
969 | languageName: node
970 | linkType: hard
971 |
972 | "is-lambda@npm:^1.0.1":
973 | version: 1.0.1
974 | resolution: "is-lambda@npm:1.0.1"
975 | checksum: 93a32f01940220532e5948538699ad610d5924ac86093fcee83022252b363eb0cc99ba53ab084a04e4fb62bf7b5731f55496257a4c38adf87af9c4d352c71c35
976 | languageName: node
977 | linkType: hard
978 |
979 | "is-number@npm:^7.0.0":
980 | version: 7.0.0
981 | resolution: "is-number@npm:7.0.0"
982 | checksum: 456ac6f8e0f3111ed34668a624e45315201dff921e5ac181f8ec24923b99e9f32ca1a194912dc79d539c97d33dba17dc635202ff0b2cf98326f608323276d27a
983 | languageName: node
984 | linkType: hard
985 |
986 | "is-stream@npm:^3.0.0":
987 | version: 3.0.0
988 | resolution: "is-stream@npm:3.0.0"
989 | checksum: 172093fe99119ffd07611ab6d1bcccfe8bc4aa80d864b15f43e63e54b7abc71e779acd69afdb854c4e2a67fdc16ae710e370eda40088d1cfc956a50ed82d8f16
990 | languageName: node
991 | linkType: hard
992 |
993 | "isexe@npm:^2.0.0":
994 | version: 2.0.0
995 | resolution: "isexe@npm:2.0.0"
996 | checksum: 26bf6c5480dda5161c820c5b5c751ae1e766c587b1f951ea3fcfc973bafb7831ae5b54a31a69bd670220e42e99ec154475025a468eae58ea262f813fdc8d1c62
997 | languageName: node
998 | linkType: hard
999 |
1000 | "lil-gui@npm:^0.17.0":
1001 | version: 0.17.0
1002 | resolution: "lil-gui@npm:0.17.0"
1003 | checksum: a6f33e90748ea98477f1f7af6d6cbdc4a1b38ce9da86d674d73f7b0bbdc7f3e947d81edee04c32f33fb28c69a108ba04c24270a8398064ffcc56ffeabc0a916e
1004 | languageName: node
1005 | linkType: hard
1006 |
1007 | "lilconfig@npm:2.0.5":
1008 | version: 2.0.5
1009 | resolution: "lilconfig@npm:2.0.5"
1010 | checksum: f7bb9e42656f06930ad04e583026f087508ae408d3526b8b54895e934eb2a966b7aafae569656f2c79a29fe6d779b3ec44ba577e80814734c8655d6f71cdf2d1
1011 | languageName: node
1012 | linkType: hard
1013 |
1014 | "lint-staged@npm:^13.0.3":
1015 | version: 13.0.3
1016 | resolution: "lint-staged@npm:13.0.3"
1017 | dependencies:
1018 | cli-truncate: ^3.1.0
1019 | colorette: ^2.0.17
1020 | commander: ^9.3.0
1021 | debug: ^4.3.4
1022 | execa: ^6.1.0
1023 | lilconfig: 2.0.5
1024 | listr2: ^4.0.5
1025 | micromatch: ^4.0.5
1026 | normalize-path: ^3.0.0
1027 | object-inspect: ^1.12.2
1028 | pidtree: ^0.6.0
1029 | string-argv: ^0.3.1
1030 | yaml: ^2.1.1
1031 | bin:
1032 | lint-staged: bin/lint-staged.js
1033 | checksum: 53d585007df06e162febab6b0836b55016d902586a267823c8a1158529d8c742dc7297e523f7023dff02250bef3eb0d6934f4ec4f9961adfc2ebbed5f54162d0
1034 | languageName: node
1035 | linkType: hard
1036 |
1037 | "listr2@npm:^4.0.5":
1038 | version: 4.0.5
1039 | resolution: "listr2@npm:4.0.5"
1040 | dependencies:
1041 | cli-truncate: ^2.1.0
1042 | colorette: ^2.0.16
1043 | log-update: ^4.0.0
1044 | p-map: ^4.0.0
1045 | rfdc: ^1.3.0
1046 | rxjs: ^7.5.5
1047 | through: ^2.3.8
1048 | wrap-ansi: ^7.0.0
1049 | peerDependencies:
1050 | enquirer: ">= 2.3.0 < 3"
1051 | peerDependenciesMeta:
1052 | enquirer:
1053 | optional: true
1054 | checksum: 7af31851abe25969ef0581c6db808117e36af15b131401795182427769d9824f451ba9e8aff6ccd25b6a4f6c8796f816292caf08e5f1f9b1775e8e9c313dc6c5
1055 | languageName: node
1056 | linkType: hard
1057 |
1058 | "log-update@npm:^4.0.0":
1059 | version: 4.0.0
1060 | resolution: "log-update@npm:4.0.0"
1061 | dependencies:
1062 | ansi-escapes: ^4.3.0
1063 | cli-cursor: ^3.1.0
1064 | slice-ansi: ^4.0.0
1065 | wrap-ansi: ^6.2.0
1066 | checksum: ae2f85bbabc1906034154fb7d4c4477c79b3e703d22d78adee8b3862fa913942772e7fa11713e3d96fb46de4e3cabefbf5d0a544344f03b58d3c4bff52aa9eb2
1067 | languageName: node
1068 | linkType: hard
1069 |
1070 | "lru-cache@npm:^6.0.0":
1071 | version: 6.0.0
1072 | resolution: "lru-cache@npm:6.0.0"
1073 | dependencies:
1074 | yallist: ^4.0.0
1075 | checksum: f97f499f898f23e4585742138a22f22526254fdba6d75d41a1c2526b3b6cc5747ef59c5612ba7375f42aca4f8461950e925ba08c991ead0651b4918b7c978297
1076 | languageName: node
1077 | linkType: hard
1078 |
1079 | "lru-cache@npm:^7.7.1":
1080 | version: 7.13.1
1081 | resolution: "lru-cache@npm:7.13.1"
1082 | checksum: f53c7dd098a7afd6342b23f7182629edff206c7665de79445a7f5455440e768a4d1c6ec52e1a16175580c71535c9437dfb6f6bc22ca1a0e4a7454a97cde87329
1083 | languageName: node
1084 | linkType: hard
1085 |
1086 | "make-fetch-happen@npm:^10.0.3":
1087 | version: 10.2.0
1088 | resolution: "make-fetch-happen@npm:10.2.0"
1089 | dependencies:
1090 | agentkeepalive: ^4.2.1
1091 | cacache: ^16.1.0
1092 | http-cache-semantics: ^4.1.0
1093 | http-proxy-agent: ^5.0.0
1094 | https-proxy-agent: ^5.0.0
1095 | is-lambda: ^1.0.1
1096 | lru-cache: ^7.7.1
1097 | minipass: ^3.1.6
1098 | minipass-collect: ^1.0.2
1099 | minipass-fetch: ^2.0.3
1100 | minipass-flush: ^1.0.5
1101 | minipass-pipeline: ^1.2.4
1102 | negotiator: ^0.6.3
1103 | promise-retry: ^2.0.1
1104 | socks-proxy-agent: ^7.0.0
1105 | ssri: ^9.0.0
1106 | checksum: 2f6c294179972f56fab40fd8618f07841e06550692bb78f6da16e7afaa9dca78c345b08cf44a77a8907ef3948e4dc77e93eb7492b8381f1217d7ac057a7522f8
1107 | languageName: node
1108 | linkType: hard
1109 |
1110 | "merge-stream@npm:^2.0.0":
1111 | version: 2.0.0
1112 | resolution: "merge-stream@npm:2.0.0"
1113 | checksum: 6fa4dcc8d86629705cea944a4b88ef4cb0e07656ebf223fa287443256414283dd25d91c1cd84c77987f2aec5927af1a9db6085757cb43d90eb170ebf4b47f4f4
1114 | languageName: node
1115 | linkType: hard
1116 |
1117 | "micromatch@npm:^4.0.5":
1118 | version: 4.0.5
1119 | resolution: "micromatch@npm:4.0.5"
1120 | dependencies:
1121 | braces: ^3.0.2
1122 | picomatch: ^2.3.1
1123 | checksum: 02a17b671c06e8fefeeb6ef996119c1e597c942e632a21ef589154f23898c9c6a9858526246abb14f8bca6e77734aa9dcf65476fca47cedfb80d9577d52843fc
1124 | languageName: node
1125 | linkType: hard
1126 |
1127 | "mimic-fn@npm:^2.1.0":
1128 | version: 2.1.0
1129 | resolution: "mimic-fn@npm:2.1.0"
1130 | checksum: d2421a3444848ce7f84bd49115ddacff29c15745db73f54041edc906c14b131a38d05298dae3081667627a59b2eb1ca4b436ff2e1b80f69679522410418b478a
1131 | languageName: node
1132 | linkType: hard
1133 |
1134 | "mimic-fn@npm:^4.0.0":
1135 | version: 4.0.0
1136 | resolution: "mimic-fn@npm:4.0.0"
1137 | checksum: 995dcece15ee29aa16e188de6633d43a3db4611bcf93620e7e62109ec41c79c0f34277165b8ce5e361205049766e371851264c21ac64ca35499acb5421c2ba56
1138 | languageName: node
1139 | linkType: hard
1140 |
1141 | "minimatch@npm:^3.1.1":
1142 | version: 3.1.2
1143 | resolution: "minimatch@npm:3.1.2"
1144 | dependencies:
1145 | brace-expansion: ^1.1.7
1146 | checksum: c154e566406683e7bcb746e000b84d74465b3a832c45d59912b9b55cd50dee66e5c4b1e5566dba26154040e51672f9aa450a9aef0c97cfc7336b78b7afb9540a
1147 | languageName: node
1148 | linkType: hard
1149 |
1150 | "minimatch@npm:^5.0.1":
1151 | version: 5.1.0
1152 | resolution: "minimatch@npm:5.1.0"
1153 | dependencies:
1154 | brace-expansion: ^2.0.1
1155 | checksum: 15ce53d31a06361e8b7a629501b5c75491bc2b59712d53e802b1987121d91b433d73fcc5be92974fde66b2b51d8fb28d75a9ae900d249feb792bb1ba2a4f0a90
1156 | languageName: node
1157 | linkType: hard
1158 |
1159 | "minipass-collect@npm:^1.0.2":
1160 | version: 1.0.2
1161 | resolution: "minipass-collect@npm:1.0.2"
1162 | dependencies:
1163 | minipass: ^3.0.0
1164 | checksum: 14df761028f3e47293aee72888f2657695ec66bd7d09cae7ad558da30415fdc4752bbfee66287dcc6fd5e6a2fa3466d6c484dc1cbd986525d9393b9523d97f10
1165 | languageName: node
1166 | linkType: hard
1167 |
1168 | "minipass-fetch@npm:^2.0.3":
1169 | version: 2.1.0
1170 | resolution: "minipass-fetch@npm:2.1.0"
1171 | dependencies:
1172 | encoding: ^0.1.13
1173 | minipass: ^3.1.6
1174 | minipass-sized: ^1.0.3
1175 | minizlib: ^2.1.2
1176 | dependenciesMeta:
1177 | encoding:
1178 | optional: true
1179 | checksum: 1334732859a3f7959ed22589bafd9c40384b885aebb5932328071c33f86b3eb181d54c86919675d1825ab5f1c8e4f328878c863873258d113c29d79a4b0c9c9f
1180 | languageName: node
1181 | linkType: hard
1182 |
1183 | "minipass-flush@npm:^1.0.5":
1184 | version: 1.0.5
1185 | resolution: "minipass-flush@npm:1.0.5"
1186 | dependencies:
1187 | minipass: ^3.0.0
1188 | checksum: 56269a0b22bad756a08a94b1ffc36b7c9c5de0735a4dd1ab2b06c066d795cfd1f0ac44a0fcae13eece5589b908ecddc867f04c745c7009be0b566421ea0944cf
1189 | languageName: node
1190 | linkType: hard
1191 |
1192 | "minipass-pipeline@npm:^1.2.4":
1193 | version: 1.2.4
1194 | resolution: "minipass-pipeline@npm:1.2.4"
1195 | dependencies:
1196 | minipass: ^3.0.0
1197 | checksum: b14240dac0d29823c3d5911c286069e36d0b81173d7bdf07a7e4a91ecdef92cdff4baaf31ea3746f1c61e0957f652e641223970870e2353593f382112257971b
1198 | languageName: node
1199 | linkType: hard
1200 |
1201 | "minipass-sized@npm:^1.0.3":
1202 | version: 1.0.3
1203 | resolution: "minipass-sized@npm:1.0.3"
1204 | dependencies:
1205 | minipass: ^3.0.0
1206 | checksum: 79076749fcacf21b5d16dd596d32c3b6bf4d6e62abb43868fac21674078505c8b15eaca4e47ed844985a4514854f917d78f588fcd029693709417d8f98b2bd60
1207 | languageName: node
1208 | linkType: hard
1209 |
1210 | "minipass@npm:^3.0.0, minipass@npm:^3.1.1, minipass@npm:^3.1.6":
1211 | version: 3.3.4
1212 | resolution: "minipass@npm:3.3.4"
1213 | dependencies:
1214 | yallist: ^4.0.0
1215 | checksum: 5d95a7738c54852ba78d484141e850c792e062666a2d0c681a5ac1021275beb7e1acb077e59f9523ff1defb80901aea4e30fac10ded9a20a25d819a42916ef1b
1216 | languageName: node
1217 | linkType: hard
1218 |
1219 | "minizlib@npm:^2.1.1, minizlib@npm:^2.1.2":
1220 | version: 2.1.2
1221 | resolution: "minizlib@npm:2.1.2"
1222 | dependencies:
1223 | minipass: ^3.0.0
1224 | yallist: ^4.0.0
1225 | checksum: f1fdeac0b07cf8f30fcf12f4b586795b97be856edea22b5e9072707be51fc95d41487faec3f265b42973a304fe3a64acd91a44a3826a963e37b37bafde0212c3
1226 | languageName: node
1227 | linkType: hard
1228 |
1229 | "mkdirp@npm:^1.0.3, mkdirp@npm:^1.0.4":
1230 | version: 1.0.4
1231 | resolution: "mkdirp@npm:1.0.4"
1232 | bin:
1233 | mkdirp: bin/cmd.js
1234 | checksum: a96865108c6c3b1b8e1d5e9f11843de1e077e57737602de1b82030815f311be11f96f09cce59bd5b903d0b29834733e5313f9301e3ed6d6f6fba2eae0df4298f
1235 | languageName: node
1236 | linkType: hard
1237 |
1238 | "ms@npm:2.1.2":
1239 | version: 2.1.2
1240 | resolution: "ms@npm:2.1.2"
1241 | checksum: 673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f
1242 | languageName: node
1243 | linkType: hard
1244 |
1245 | "ms@npm:^2.0.0":
1246 | version: 2.1.3
1247 | resolution: "ms@npm:2.1.3"
1248 | checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d
1249 | languageName: node
1250 | linkType: hard
1251 |
1252 | "nanoid@npm:^3.3.4":
1253 | version: 3.3.4
1254 | resolution: "nanoid@npm:3.3.4"
1255 | bin:
1256 | nanoid: bin/nanoid.cjs
1257 | checksum: 2fddd6dee994b7676f008d3ffa4ab16035a754f4bb586c61df5a22cf8c8c94017aadd360368f47d653829e0569a92b129979152ff97af23a558331e47e37cd9c
1258 | languageName: node
1259 | linkType: hard
1260 |
1261 | "negotiator@npm:^0.6.3":
1262 | version: 0.6.3
1263 | resolution: "negotiator@npm:0.6.3"
1264 | checksum: b8ffeb1e262eff7968fc90a2b6767b04cfd9842582a9d0ece0af7049537266e7b2506dfb1d107a32f06dd849ab2aea834d5830f7f4d0e5cb7d36e1ae55d021d9
1265 | languageName: node
1266 | linkType: hard
1267 |
1268 | "node-gyp@npm:latest":
1269 | version: 9.1.0
1270 | resolution: "node-gyp@npm:9.1.0"
1271 | dependencies:
1272 | env-paths: ^2.2.0
1273 | glob: ^7.1.4
1274 | graceful-fs: ^4.2.6
1275 | make-fetch-happen: ^10.0.3
1276 | nopt: ^5.0.0
1277 | npmlog: ^6.0.0
1278 | rimraf: ^3.0.2
1279 | semver: ^7.3.5
1280 | tar: ^6.1.2
1281 | which: ^2.0.2
1282 | bin:
1283 | node-gyp: bin/node-gyp.js
1284 | checksum: 1437fa4a879b5b9010604128e8da8609b57c66034262087539ee04a8b764b8436af2be01bab66f8fc729a3adba2dcc21b10a32b9f552696c3fa8cd657d134fc4
1285 | languageName: node
1286 | linkType: hard
1287 |
1288 | "nopt@npm:^5.0.0":
1289 | version: 5.0.0
1290 | resolution: "nopt@npm:5.0.0"
1291 | dependencies:
1292 | abbrev: 1
1293 | bin:
1294 | nopt: bin/nopt.js
1295 | checksum: d35fdec187269503843924e0114c0c6533fb54bbf1620d0f28b4b60ba01712d6687f62565c55cc20a504eff0fbe5c63e22340c3fad549ad40469ffb611b04f2f
1296 | languageName: node
1297 | linkType: hard
1298 |
1299 | "normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0":
1300 | version: 3.0.0
1301 | resolution: "normalize-path@npm:3.0.0"
1302 | checksum: 88eeb4da891e10b1318c4b2476b6e2ecbeb5ff97d946815ffea7794c31a89017c70d7f34b3c2ebf23ef4e9fc9fb99f7dffe36da22011b5b5c6ffa34f4873ec20
1303 | languageName: node
1304 | linkType: hard
1305 |
1306 | "npm-run-path@npm:^5.1.0":
1307 | version: 5.1.0
1308 | resolution: "npm-run-path@npm:5.1.0"
1309 | dependencies:
1310 | path-key: ^4.0.0
1311 | checksum: dc184eb5ec239d6a2b990b43236845332ef12f4e0beaa9701de724aa797fe40b6bbd0157fb7639d24d3ab13f5d5cf22d223a19c6300846b8126f335f788bee66
1312 | languageName: node
1313 | linkType: hard
1314 |
1315 | "npmlog@npm:^6.0.0":
1316 | version: 6.0.2
1317 | resolution: "npmlog@npm:6.0.2"
1318 | dependencies:
1319 | are-we-there-yet: ^3.0.0
1320 | console-control-strings: ^1.1.0
1321 | gauge: ^4.0.3
1322 | set-blocking: ^2.0.0
1323 | checksum: ae238cd264a1c3f22091cdd9e2b106f684297d3c184f1146984ecbe18aaa86343953f26b9520dedd1b1372bc0316905b736c1932d778dbeb1fcf5a1001390e2a
1324 | languageName: node
1325 | linkType: hard
1326 |
1327 | "object-inspect@npm:^1.12.2":
1328 | version: 1.12.2
1329 | resolution: "object-inspect@npm:1.12.2"
1330 | checksum: a534fc1b8534284ed71f25ce3a496013b7ea030f3d1b77118f6b7b1713829262be9e6243acbcb3ef8c626e2b64186112cb7f6db74e37b2789b9c789ca23048b2
1331 | languageName: node
1332 | linkType: hard
1333 |
1334 | "once@npm:^1.3.0":
1335 | version: 1.4.0
1336 | resolution: "once@npm:1.4.0"
1337 | dependencies:
1338 | wrappy: 1
1339 | checksum: cd0a88501333edd640d95f0d2700fbde6bff20b3d4d9bdc521bdd31af0656b5706570d6c6afe532045a20bb8dc0849f8332d6f2a416e0ba6d3d3b98806c7db68
1340 | languageName: node
1341 | linkType: hard
1342 |
1343 | "onetime@npm:^5.1.0":
1344 | version: 5.1.2
1345 | resolution: "onetime@npm:5.1.2"
1346 | dependencies:
1347 | mimic-fn: ^2.1.0
1348 | checksum: 2478859ef817fc5d4e9c2f9e5728512ddd1dbc9fb7829ad263765bb6d3b91ce699d6e2332eef6b7dff183c2f490bd3349f1666427eaba4469fba0ac38dfd0d34
1349 | languageName: node
1350 | linkType: hard
1351 |
1352 | "onetime@npm:^6.0.0":
1353 | version: 6.0.0
1354 | resolution: "onetime@npm:6.0.0"
1355 | dependencies:
1356 | mimic-fn: ^4.0.0
1357 | checksum: 0846ce78e440841335d4e9182ef69d5762e9f38aa7499b19f42ea1c4cd40f0b4446094c455c713f9adac3f4ae86f613bb5e30c99e52652764d06a89f709b3788
1358 | languageName: node
1359 | linkType: hard
1360 |
1361 | "p-map@npm:^4.0.0":
1362 | version: 4.0.0
1363 | resolution: "p-map@npm:4.0.0"
1364 | dependencies:
1365 | aggregate-error: ^3.0.0
1366 | checksum: cb0ab21ec0f32ddffd31dfc250e3afa61e103ef43d957cc45497afe37513634589316de4eb88abdfd969fe6410c22c0b93ab24328833b8eb1ccc087fc0442a1c
1367 | languageName: node
1368 | linkType: hard
1369 |
1370 | "path-is-absolute@npm:^1.0.0":
1371 | version: 1.0.1
1372 | resolution: "path-is-absolute@npm:1.0.1"
1373 | checksum: 060840f92cf8effa293bcc1bea81281bd7d363731d214cbe5c227df207c34cd727430f70c6037b5159c8a870b9157cba65e775446b0ab06fd5ecc7e54615a3b8
1374 | languageName: node
1375 | linkType: hard
1376 |
1377 | "path-key@npm:^3.1.0":
1378 | version: 3.1.1
1379 | resolution: "path-key@npm:3.1.1"
1380 | checksum: 55cd7a9dd4b343412a8386a743f9c746ef196e57c823d90ca3ab917f90ab9f13dd0ded27252ba49dbdfcab2b091d998bc446f6220cd3cea65db407502a740020
1381 | languageName: node
1382 | linkType: hard
1383 |
1384 | "path-key@npm:^4.0.0":
1385 | version: 4.0.0
1386 | resolution: "path-key@npm:4.0.0"
1387 | checksum: 8e6c314ae6d16b83e93032c61020129f6f4484590a777eed709c4a01b50e498822b00f76ceaf94bc64dbd90b327df56ceadce27da3d83393790f1219e07721d7
1388 | languageName: node
1389 | linkType: hard
1390 |
1391 | "path-parse@npm:^1.0.7":
1392 | version: 1.0.7
1393 | resolution: "path-parse@npm:1.0.7"
1394 | checksum: 49abf3d81115642938a8700ec580da6e830dde670be21893c62f4e10bd7dd4c3742ddc603fe24f898cba7eb0c6bc1777f8d9ac14185d34540c6d4d80cd9cae8a
1395 | languageName: node
1396 | linkType: hard
1397 |
1398 | "picocolors@npm:^1.0.0":
1399 | version: 1.0.0
1400 | resolution: "picocolors@npm:1.0.0"
1401 | checksum: a2e8092dd86c8396bdba9f2b5481032848525b3dc295ce9b57896f931e63fc16f79805144321f72976383fc249584672a75cc18d6777c6b757603f372f745981
1402 | languageName: node
1403 | linkType: hard
1404 |
1405 | "picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.2.2, picomatch@npm:^2.3.1":
1406 | version: 2.3.1
1407 | resolution: "picomatch@npm:2.3.1"
1408 | checksum: 050c865ce81119c4822c45d3c84f1ced46f93a0126febae20737bd05ca20589c564d6e9226977df859ed5e03dc73f02584a2b0faad36e896936238238b0446cf
1409 | languageName: node
1410 | linkType: hard
1411 |
1412 | "pidtree@npm:^0.6.0":
1413 | version: 0.6.0
1414 | resolution: "pidtree@npm:0.6.0"
1415 | bin:
1416 | pidtree: bin/pidtree.js
1417 | checksum: 8fbc073ede9209dd15e80d616e65eb674986c93be49f42d9ddde8dbbd141bb53d628a7ca4e58ab5c370bb00383f67d75df59a9a226dede8fa801267a7030c27a
1418 | languageName: node
1419 | linkType: hard
1420 |
1421 | "postcss@npm:^8.4.14":
1422 | version: 8.4.14
1423 | resolution: "postcss@npm:8.4.14"
1424 | dependencies:
1425 | nanoid: ^3.3.4
1426 | picocolors: ^1.0.0
1427 | source-map-js: ^1.0.2
1428 | checksum: fe58766ff32e4becf65a7d57678995cfd239df6deed2fe0557f038b47c94e4132e7e5f68b5aa820c13adfec32e523b693efaeb65798efb995ce49ccd83953816
1429 | languageName: node
1430 | linkType: hard
1431 |
1432 | "prettier@npm:2.7.1":
1433 | version: 2.7.1
1434 | resolution: "prettier@npm:2.7.1"
1435 | bin:
1436 | prettier: bin-prettier.js
1437 | checksum: 55a4409182260866ab31284d929b3cb961e5fdb91fe0d2e099dac92eaecec890f36e524b4c19e6ceae839c99c6d7195817579cdffc8e2c80da0cb794463a748b
1438 | languageName: node
1439 | linkType: hard
1440 |
1441 | "promise-inflight@npm:^1.0.1":
1442 | version: 1.0.1
1443 | resolution: "promise-inflight@npm:1.0.1"
1444 | checksum: 22749483091d2c594261517f4f80e05226d4d5ecc1fc917e1886929da56e22b5718b7f2a75f3807e7a7d471bc3be2907fe92e6e8f373ddf5c64bae35b5af3981
1445 | languageName: node
1446 | linkType: hard
1447 |
1448 | "promise-retry@npm:^2.0.1":
1449 | version: 2.0.1
1450 | resolution: "promise-retry@npm:2.0.1"
1451 | dependencies:
1452 | err-code: ^2.0.2
1453 | retry: ^0.12.0
1454 | checksum: f96a3f6d90b92b568a26f71e966cbbc0f63ab85ea6ff6c81284dc869b41510e6cdef99b6b65f9030f0db422bf7c96652a3fff9f2e8fb4a0f069d8f4430359429
1455 | languageName: node
1456 | linkType: hard
1457 |
1458 | "readable-stream@npm:^3.6.0":
1459 | version: 3.6.0
1460 | resolution: "readable-stream@npm:3.6.0"
1461 | dependencies:
1462 | inherits: ^2.0.3
1463 | string_decoder: ^1.1.1
1464 | util-deprecate: ^1.0.1
1465 | checksum: d4ea81502d3799439bb955a3a5d1d808592cf3133350ed352aeaa499647858b27b1c4013984900238b0873ec8d0d8defce72469fb7a83e61d53f5ad61cb80dc8
1466 | languageName: node
1467 | linkType: hard
1468 |
1469 | "readdirp@npm:~3.6.0":
1470 | version: 3.6.0
1471 | resolution: "readdirp@npm:3.6.0"
1472 | dependencies:
1473 | picomatch: ^2.2.1
1474 | checksum: 1ced032e6e45670b6d7352d71d21ce7edf7b9b928494dcaba6f11fba63180d9da6cd7061ebc34175ffda6ff529f481818c962952004d273178acd70f7059b320
1475 | languageName: node
1476 | linkType: hard
1477 |
1478 | "resolve@npm:^1.22.1":
1479 | version: 1.22.1
1480 | resolution: "resolve@npm:1.22.1"
1481 | dependencies:
1482 | is-core-module: ^2.9.0
1483 | path-parse: ^1.0.7
1484 | supports-preserve-symlinks-flag: ^1.0.0
1485 | bin:
1486 | resolve: bin/resolve
1487 | checksum: 07af5fc1e81aa1d866cbc9e9460fbb67318a10fa3c4deadc35c3ad8a898ee9a71a86a65e4755ac3195e0ea0cfbe201eb323ebe655ce90526fd61917313a34e4e
1488 | languageName: node
1489 | linkType: hard
1490 |
1491 | "resolve@patch:resolve@^1.22.1#~builtin":
1492 | version: 1.22.1
1493 | resolution: "resolve@patch:resolve@npm%3A1.22.1#~builtin::version=1.22.1&hash=07638b"
1494 | dependencies:
1495 | is-core-module: ^2.9.0
1496 | path-parse: ^1.0.7
1497 | supports-preserve-symlinks-flag: ^1.0.0
1498 | bin:
1499 | resolve: bin/resolve
1500 | checksum: 5656f4d0bedcf8eb52685c1abdf8fbe73a1603bb1160a24d716e27a57f6cecbe2432ff9c89c2bd57542c3a7b9d14b1882b73bfe2e9d7849c9a4c0b8b39f02b8b
1501 | languageName: node
1502 | linkType: hard
1503 |
1504 | "restore-cursor@npm:^3.1.0":
1505 | version: 3.1.0
1506 | resolution: "restore-cursor@npm:3.1.0"
1507 | dependencies:
1508 | onetime: ^5.1.0
1509 | signal-exit: ^3.0.2
1510 | checksum: f877dd8741796b909f2a82454ec111afb84eb45890eb49ac947d87991379406b3b83ff9673a46012fca0d7844bb989f45cc5b788254cf1a39b6b5a9659de0630
1511 | languageName: node
1512 | linkType: hard
1513 |
1514 | "retry@npm:^0.12.0":
1515 | version: 0.12.0
1516 | resolution: "retry@npm:0.12.0"
1517 | checksum: 623bd7d2e5119467ba66202d733ec3c2e2e26568074923bc0585b6b99db14f357e79bdedb63cab56cec47491c4a0da7e6021a7465ca6dc4f481d3898fdd3158c
1518 | languageName: node
1519 | linkType: hard
1520 |
1521 | "rfdc@npm:^1.3.0":
1522 | version: 1.3.0
1523 | resolution: "rfdc@npm:1.3.0"
1524 | checksum: fb2ba8512e43519983b4c61bd3fa77c0f410eff6bae68b08614437bc3f35f91362215f7b4a73cbda6f67330b5746ce07db5dd9850ad3edc91271ad6deea0df32
1525 | languageName: node
1526 | linkType: hard
1527 |
1528 | "rimraf@npm:^3.0.2":
1529 | version: 3.0.2
1530 | resolution: "rimraf@npm:3.0.2"
1531 | dependencies:
1532 | glob: ^7.1.3
1533 | bin:
1534 | rimraf: bin.js
1535 | checksum: 87f4164e396f0171b0a3386cc1877a817f572148ee13a7e113b238e48e8a9f2f31d009a92ec38a591ff1567d9662c6b67fd8818a2dbbaed74bc26a87a2a4a9a0
1536 | languageName: node
1537 | linkType: hard
1538 |
1539 | "rollup@npm:^2.75.6":
1540 | version: 2.77.2
1541 | resolution: "rollup@npm:2.77.2"
1542 | dependencies:
1543 | fsevents: ~2.3.2
1544 | dependenciesMeta:
1545 | fsevents:
1546 | optional: true
1547 | bin:
1548 | rollup: dist/bin/rollup
1549 | checksum: 5a84fb98a6f858906bceba091430442f6c1f362b07c5fa9123b708f87e39f52640e34a189cd9a1776ceae61300055c78ba648205fa03188451539ebeb19797df
1550 | languageName: node
1551 | linkType: hard
1552 |
1553 | "rxjs@npm:^7.5.5":
1554 | version: 7.5.6
1555 | resolution: "rxjs@npm:7.5.6"
1556 | dependencies:
1557 | tslib: ^2.1.0
1558 | checksum: fc05f01364a74dac57490fb3e07ea63b422af04017fae1db641a009073f902ef69f285c5daac31359620dc8d9aee7d81e42b370ca2a8573d1feae0b04329383b
1559 | languageName: node
1560 | linkType: hard
1561 |
1562 | "safe-buffer@npm:~5.2.0":
1563 | version: 5.2.1
1564 | resolution: "safe-buffer@npm:5.2.1"
1565 | checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491
1566 | languageName: node
1567 | linkType: hard
1568 |
1569 | "safer-buffer@npm:>= 2.1.2 < 3.0.0":
1570 | version: 2.1.2
1571 | resolution: "safer-buffer@npm:2.1.2"
1572 | checksum: cab8f25ae6f1434abee8d80023d7e72b598cf1327164ddab31003c51215526801e40b66c5e65d658a0af1e9d6478cadcb4c745f4bd6751f97d8644786c0978b0
1573 | languageName: node
1574 | linkType: hard
1575 |
1576 | "sass@npm:^1.52.3":
1577 | version: 1.52.3
1578 | resolution: "sass@npm:1.52.3"
1579 | dependencies:
1580 | chokidar: ">=3.0.0 <4.0.0"
1581 | immutable: ^4.0.0
1582 | source-map-js: ">=0.6.2 <2.0.0"
1583 | bin:
1584 | sass: sass.js
1585 | checksum: 175a073c0e7b67d1baff6d3969431228002ece681886cebc2a354c241134ff120fda5c12a0465989966dacfb1ca518d85507304f4d4cd03d4a91d71dbc77d978
1586 | languageName: node
1587 | linkType: hard
1588 |
1589 | "semver@npm:^7.3.5":
1590 | version: 7.3.7
1591 | resolution: "semver@npm:7.3.7"
1592 | dependencies:
1593 | lru-cache: ^6.0.0
1594 | bin:
1595 | semver: bin/semver.js
1596 | checksum: 2fa3e877568cd6ce769c75c211beaed1f9fce80b28338cadd9d0b6c40f2e2862bafd62c19a6cff42f3d54292b7c623277bcab8816a2b5521cf15210d43e75232
1597 | languageName: node
1598 | linkType: hard
1599 |
1600 | "set-blocking@npm:^2.0.0":
1601 | version: 2.0.0
1602 | resolution: "set-blocking@npm:2.0.0"
1603 | checksum: 6e65a05f7cf7ebdf8b7c75b101e18c0b7e3dff4940d480efed8aad3a36a4005140b660fa1d804cb8bce911cac290441dc728084a30504d3516ac2ff7ad607b02
1604 | languageName: node
1605 | linkType: hard
1606 |
1607 | "shebang-command@npm:^2.0.0":
1608 | version: 2.0.0
1609 | resolution: "shebang-command@npm:2.0.0"
1610 | dependencies:
1611 | shebang-regex: ^3.0.0
1612 | checksum: 6b52fe87271c12968f6a054e60f6bde5f0f3d2db483a1e5c3e12d657c488a15474121a1d55cd958f6df026a54374ec38a4a963988c213b7570e1d51575cea7fa
1613 | languageName: node
1614 | linkType: hard
1615 |
1616 | "shebang-regex@npm:^3.0.0":
1617 | version: 3.0.0
1618 | resolution: "shebang-regex@npm:3.0.0"
1619 | checksum: 1a2bcae50de99034fcd92ad4212d8e01eedf52c7ec7830eedcf886622804fe36884278f2be8be0ea5fde3fd1c23911643a4e0f726c8685b61871c8908af01222
1620 | languageName: node
1621 | linkType: hard
1622 |
1623 | "signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.7":
1624 | version: 3.0.7
1625 | resolution: "signal-exit@npm:3.0.7"
1626 | checksum: a2f098f247adc367dffc27845853e9959b9e88b01cb301658cfe4194352d8d2bb32e18467c786a7fe15f1d44b233ea35633d076d5e737870b7139949d1ab6318
1627 | languageName: node
1628 | linkType: hard
1629 |
1630 | "simple-threejs-typescript-starter@workspace:.":
1631 | version: 0.0.0-use.local
1632 | resolution: "simple-threejs-typescript-starter@workspace:."
1633 | dependencies:
1634 | "@types/three": ^0.144.0
1635 | husky: ^8.0.1
1636 | lil-gui: ^0.17.0
1637 | lint-staged: ^13.0.3
1638 | prettier: 2.7.1
1639 | sass: ^1.52.3
1640 | three: ^0.146.0
1641 | typescript: ^4.7.4
1642 | vite: ^3.0.3
1643 | vite-plugin-glsl: ^0.1.5
1644 | languageName: unknown
1645 | linkType: soft
1646 |
1647 | "slice-ansi@npm:^3.0.0":
1648 | version: 3.0.0
1649 | resolution: "slice-ansi@npm:3.0.0"
1650 | dependencies:
1651 | ansi-styles: ^4.0.0
1652 | astral-regex: ^2.0.0
1653 | is-fullwidth-code-point: ^3.0.0
1654 | checksum: 5ec6d022d12e016347e9e3e98a7eb2a592213a43a65f1b61b74d2c78288da0aded781f665807a9f3876b9daa9ad94f64f77d7633a0458876c3a4fdc4eb223f24
1655 | languageName: node
1656 | linkType: hard
1657 |
1658 | "slice-ansi@npm:^4.0.0":
1659 | version: 4.0.0
1660 | resolution: "slice-ansi@npm:4.0.0"
1661 | dependencies:
1662 | ansi-styles: ^4.0.0
1663 | astral-regex: ^2.0.0
1664 | is-fullwidth-code-point: ^3.0.0
1665 | checksum: 4a82d7f085b0e1b070e004941ada3c40d3818563ac44766cca4ceadd2080427d337554f9f99a13aaeb3b4a94d9964d9466c807b3d7b7541d1ec37ee32d308756
1666 | languageName: node
1667 | linkType: hard
1668 |
1669 | "slice-ansi@npm:^5.0.0":
1670 | version: 5.0.0
1671 | resolution: "slice-ansi@npm:5.0.0"
1672 | dependencies:
1673 | ansi-styles: ^6.0.0
1674 | is-fullwidth-code-point: ^4.0.0
1675 | checksum: 7e600a2a55e333a21ef5214b987c8358fe28bfb03c2867ff2cbf919d62143d1812ac27b4297a077fdaf27a03da3678e49551c93e35f9498a3d90221908a1180e
1676 | languageName: node
1677 | linkType: hard
1678 |
1679 | "smart-buffer@npm:^4.2.0":
1680 | version: 4.2.0
1681 | resolution: "smart-buffer@npm:4.2.0"
1682 | checksum: b5167a7142c1da704c0e3af85c402002b597081dd9575031a90b4f229ca5678e9a36e8a374f1814c8156a725d17008ae3bde63b92f9cfd132526379e580bec8b
1683 | languageName: node
1684 | linkType: hard
1685 |
1686 | "socks-proxy-agent@npm:^7.0.0":
1687 | version: 7.0.0
1688 | resolution: "socks-proxy-agent@npm:7.0.0"
1689 | dependencies:
1690 | agent-base: ^6.0.2
1691 | debug: ^4.3.3
1692 | socks: ^2.6.2
1693 | checksum: 720554370154cbc979e2e9ce6a6ec6ced205d02757d8f5d93fe95adae454fc187a5cbfc6b022afab850a5ce9b4c7d73e0f98e381879cf45f66317a4895953846
1694 | languageName: node
1695 | linkType: hard
1696 |
1697 | "socks@npm:^2.6.2":
1698 | version: 2.7.0
1699 | resolution: "socks@npm:2.7.0"
1700 | dependencies:
1701 | ip: ^2.0.0
1702 | smart-buffer: ^4.2.0
1703 | checksum: 0b5d94e2b3c11e7937b40fc5dac1e80d8b92a330e68c51f1d271ce6980c70adca42a3f8cd47c4a5769956bada074823b53374f2dc5f2ea5c2121b222dec6eadf
1704 | languageName: node
1705 | linkType: hard
1706 |
1707 | "source-map-js@npm:>=0.6.2 <2.0.0, source-map-js@npm:^1.0.2":
1708 | version: 1.0.2
1709 | resolution: "source-map-js@npm:1.0.2"
1710 | checksum: c049a7fc4deb9a7e9b481ae3d424cc793cb4845daa690bc5a05d428bf41bf231ced49b4cf0c9e77f9d42fdb3d20d6187619fc586605f5eabe995a316da8d377c
1711 | languageName: node
1712 | linkType: hard
1713 |
1714 | "ssri@npm:^9.0.0":
1715 | version: 9.0.1
1716 | resolution: "ssri@npm:9.0.1"
1717 | dependencies:
1718 | minipass: ^3.1.1
1719 | checksum: fb58f5e46b6923ae67b87ad5ef1c5ab6d427a17db0bead84570c2df3cd50b4ceb880ebdba2d60726588272890bae842a744e1ecce5bd2a2a582fccd5068309eb
1720 | languageName: node
1721 | linkType: hard
1722 |
1723 | "string-argv@npm:^0.3.1":
1724 | version: 0.3.1
1725 | resolution: "string-argv@npm:0.3.1"
1726 | checksum: efbd0289b599bee808ce80820dfe49c9635610715429c6b7cc50750f0437e3c2f697c81e5c390208c13b5d5d12d904a1546172a88579f6ee5cbaaaa4dc9ec5cf
1727 | languageName: node
1728 | linkType: hard
1729 |
1730 | "string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3":
1731 | version: 4.2.3
1732 | resolution: "string-width@npm:4.2.3"
1733 | dependencies:
1734 | emoji-regex: ^8.0.0
1735 | is-fullwidth-code-point: ^3.0.0
1736 | strip-ansi: ^6.0.1
1737 | checksum: e52c10dc3fbfcd6c3a15f159f54a90024241d0f149cf8aed2982a2d801d2e64df0bf1dc351cf8e95c3319323f9f220c16e740b06faecd53e2462df1d2b5443fb
1738 | languageName: node
1739 | linkType: hard
1740 |
1741 | "string-width@npm:^5.0.0":
1742 | version: 5.1.2
1743 | resolution: "string-width@npm:5.1.2"
1744 | dependencies:
1745 | eastasianwidth: ^0.2.0
1746 | emoji-regex: ^9.2.2
1747 | strip-ansi: ^7.0.1
1748 | checksum: 7369deaa29f21dda9a438686154b62c2c5f661f8dda60449088f9f980196f7908fc39fdd1803e3e01541970287cf5deae336798337e9319a7055af89dafa7193
1749 | languageName: node
1750 | linkType: hard
1751 |
1752 | "string_decoder@npm:^1.1.1":
1753 | version: 1.3.0
1754 | resolution: "string_decoder@npm:1.3.0"
1755 | dependencies:
1756 | safe-buffer: ~5.2.0
1757 | checksum: 8417646695a66e73aefc4420eb3b84cc9ffd89572861fe004e6aeb13c7bc00e2f616247505d2dbbef24247c372f70268f594af7126f43548565c68c117bdeb56
1758 | languageName: node
1759 | linkType: hard
1760 |
1761 | "strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1":
1762 | version: 6.0.1
1763 | resolution: "strip-ansi@npm:6.0.1"
1764 | dependencies:
1765 | ansi-regex: ^5.0.1
1766 | checksum: f3cd25890aef3ba6e1a74e20896c21a46f482e93df4a06567cebf2b57edabb15133f1f94e57434e0a958d61186087b1008e89c94875d019910a213181a14fc8c
1767 | languageName: node
1768 | linkType: hard
1769 |
1770 | "strip-ansi@npm:^7.0.1":
1771 | version: 7.0.1
1772 | resolution: "strip-ansi@npm:7.0.1"
1773 | dependencies:
1774 | ansi-regex: ^6.0.1
1775 | checksum: 257f78fa433520e7f9897722731d78599cb3fce29ff26a20a5e12ba4957463b50a01136f37c43707f4951817a75e90820174853d6ccc240997adc5df8f966039
1776 | languageName: node
1777 | linkType: hard
1778 |
1779 | "strip-final-newline@npm:^3.0.0":
1780 | version: 3.0.0
1781 | resolution: "strip-final-newline@npm:3.0.0"
1782 | checksum: 23ee263adfa2070cd0f23d1ac14e2ed2f000c9b44229aec9c799f1367ec001478469560abefd00c5c99ee6f0b31c137d53ec6029c53e9f32a93804e18c201050
1783 | languageName: node
1784 | linkType: hard
1785 |
1786 | "supports-preserve-symlinks-flag@npm:^1.0.0":
1787 | version: 1.0.0
1788 | resolution: "supports-preserve-symlinks-flag@npm:1.0.0"
1789 | checksum: 53b1e247e68e05db7b3808b99b892bd36fb096e6fba213a06da7fab22045e97597db425c724f2bbd6c99a3c295e1e73f3e4de78592289f38431049e1277ca0ae
1790 | languageName: node
1791 | linkType: hard
1792 |
1793 | "tar@npm:^6.1.11, tar@npm:^6.1.2":
1794 | version: 6.1.11
1795 | resolution: "tar@npm:6.1.11"
1796 | dependencies:
1797 | chownr: ^2.0.0
1798 | fs-minipass: ^2.0.0
1799 | minipass: ^3.0.0
1800 | minizlib: ^2.1.1
1801 | mkdirp: ^1.0.3
1802 | yallist: ^4.0.0
1803 | checksum: a04c07bb9e2d8f46776517d4618f2406fb977a74d914ad98b264fc3db0fe8224da5bec11e5f8902c5b9bcb8ace22d95fbe3c7b36b8593b7dfc8391a25898f32f
1804 | languageName: node
1805 | linkType: hard
1806 |
1807 | "three@npm:^0.146.0":
1808 | version: 0.146.0
1809 | resolution: "three@npm:0.146.0"
1810 | checksum: c6eb2005d97c599de7f4eccf73c4b1e8731c353ca3e7b9bf9d3bc2b52a8e288c59c06c148fd93df16df323b28938947227a37e07cc6fbe04aa8f8725e49caa8a
1811 | languageName: node
1812 | linkType: hard
1813 |
1814 | "through@npm:^2.3.8":
1815 | version: 2.3.8
1816 | resolution: "through@npm:2.3.8"
1817 | checksum: a38c3e059853c494af95d50c072b83f8b676a9ba2818dcc5b108ef252230735c54e0185437618596c790bbba8fcdaef5b290405981ffa09dce67b1f1bf190cbd
1818 | languageName: node
1819 | linkType: hard
1820 |
1821 | "to-regex-range@npm:^5.0.1":
1822 | version: 5.0.1
1823 | resolution: "to-regex-range@npm:5.0.1"
1824 | dependencies:
1825 | is-number: ^7.0.0
1826 | checksum: f76fa01b3d5be85db6a2a143e24df9f60dd047d151062d0ba3df62953f2f697b16fe5dad9b0ac6191c7efc7b1d9dcaa4b768174b7b29da89d4428e64bc0a20ed
1827 | languageName: node
1828 | linkType: hard
1829 |
1830 | "tslib@npm:^2.1.0, tslib@npm:^2.4.0":
1831 | version: 2.4.0
1832 | resolution: "tslib@npm:2.4.0"
1833 | checksum: 8c4aa6a3c5a754bf76aefc38026134180c053b7bd2f81338cb5e5ebf96fefa0f417bff221592bf801077f5bf990562f6264fecbc42cd3309b33872cb6fc3b113
1834 | languageName: node
1835 | linkType: hard
1836 |
1837 | "type-fest@npm:^0.21.3":
1838 | version: 0.21.3
1839 | resolution: "type-fest@npm:0.21.3"
1840 | checksum: e6b32a3b3877f04339bae01c193b273c62ba7bfc9e325b8703c4ee1b32dc8fe4ef5dfa54bf78265e069f7667d058e360ae0f37be5af9f153b22382cd55a9afe0
1841 | languageName: node
1842 | linkType: hard
1843 |
1844 | "typescript@npm:^4.7.4":
1845 | version: 4.7.4
1846 | resolution: "typescript@npm:4.7.4"
1847 | bin:
1848 | tsc: bin/tsc
1849 | tsserver: bin/tsserver
1850 | checksum: 5750181b1cd7e6482c4195825547e70f944114fb47e58e4aa7553e62f11b3f3173766aef9c281783edfd881f7b8299cf35e3ca8caebe73d8464528c907a164df
1851 | languageName: node
1852 | linkType: hard
1853 |
1854 | "typescript@patch:typescript@^4.7.4#~builtin":
1855 | version: 4.7.4
1856 | resolution: "typescript@patch:typescript@npm%3A4.7.4#~builtin::version=4.7.4&hash=7ad353"
1857 | bin:
1858 | tsc: bin/tsc
1859 | tsserver: bin/tsserver
1860 | checksum: 9096d8f6c16cb80ef3bf96fcbbd055bf1c4a43bd14f3b7be45a9fbe7ada46ec977f604d5feed3263b4f2aa7d4c7477ce5f9cd87de0d6feedec69a983f3a4f93e
1861 | languageName: node
1862 | linkType: hard
1863 |
1864 | "unique-filename@npm:^1.1.1":
1865 | version: 1.1.1
1866 | resolution: "unique-filename@npm:1.1.1"
1867 | dependencies:
1868 | unique-slug: ^2.0.0
1869 | checksum: cf4998c9228cc7647ba7814e255dec51be43673903897b1786eff2ac2d670f54d4d733357eb08dea969aa5e6875d0e1bd391d668fbdb5a179744e7c7551a6f80
1870 | languageName: node
1871 | linkType: hard
1872 |
1873 | "unique-slug@npm:^2.0.0":
1874 | version: 2.0.2
1875 | resolution: "unique-slug@npm:2.0.2"
1876 | dependencies:
1877 | imurmurhash: ^0.1.4
1878 | checksum: 5b6876a645da08d505dedb970d1571f6cebdf87044cb6b740c8dbb24f0d6e1dc8bdbf46825fd09f994d7cf50760e6f6e063cfa197d51c5902c00a861702eb75a
1879 | languageName: node
1880 | linkType: hard
1881 |
1882 | "util-deprecate@npm:^1.0.1":
1883 | version: 1.0.2
1884 | resolution: "util-deprecate@npm:1.0.2"
1885 | checksum: 474acf1146cb2701fe3b074892217553dfcf9a031280919ba1b8d651a068c9b15d863b7303cb15bd00a862b498e6cf4ad7b4a08fb134edd5a6f7641681cb54a2
1886 | languageName: node
1887 | linkType: hard
1888 |
1889 | "vite-plugin-glsl@npm:^0.1.5":
1890 | version: 0.1.5
1891 | resolution: "vite-plugin-glsl@npm:0.1.5"
1892 | dependencies:
1893 | "@rollup/pluginutils": ^4.2.1
1894 | tslib: ^2.4.0
1895 | checksum: a7802ff40194dd9078dd2a5810769d1d1e2a285259887ccf6738defda24b4cc675d0d8637b8388e7af194bb9f3873c95dd4cc36cad7d052945bd99b3949584ba
1896 | languageName: node
1897 | linkType: hard
1898 |
1899 | "vite@npm:^3.0.3":
1900 | version: 3.0.3
1901 | resolution: "vite@npm:3.0.3"
1902 | dependencies:
1903 | esbuild: ^0.14.47
1904 | fsevents: ~2.3.2
1905 | postcss: ^8.4.14
1906 | resolve: ^1.22.1
1907 | rollup: ^2.75.6
1908 | peerDependencies:
1909 | less: "*"
1910 | sass: "*"
1911 | stylus: "*"
1912 | terser: ^5.4.0
1913 | dependenciesMeta:
1914 | fsevents:
1915 | optional: true
1916 | peerDependenciesMeta:
1917 | less:
1918 | optional: true
1919 | sass:
1920 | optional: true
1921 | stylus:
1922 | optional: true
1923 | terser:
1924 | optional: true
1925 | bin:
1926 | vite: bin/vite.js
1927 | checksum: 0b15d6bb062ab56dd8a0d47262344dcb48423d658c153c88a8a41f9301a70f32dd0fa2c037fa39a0a7888be1005cb763aad94235f82439441a13cef5103c29c4
1928 | languageName: node
1929 | linkType: hard
1930 |
1931 | "which@npm:^2.0.1, which@npm:^2.0.2":
1932 | version: 2.0.2
1933 | resolution: "which@npm:2.0.2"
1934 | dependencies:
1935 | isexe: ^2.0.0
1936 | bin:
1937 | node-which: ./bin/node-which
1938 | checksum: 1a5c563d3c1b52d5f893c8b61afe11abc3bab4afac492e8da5bde69d550de701cf9806235f20a47b5c8fa8a1d6a9135841de2596535e998027a54589000e66d1
1939 | languageName: node
1940 | linkType: hard
1941 |
1942 | "wide-align@npm:^1.1.5":
1943 | version: 1.1.5
1944 | resolution: "wide-align@npm:1.1.5"
1945 | dependencies:
1946 | string-width: ^1.0.2 || 2 || 3 || 4
1947 | checksum: d5fc37cd561f9daee3c80e03b92ed3e84d80dde3365a8767263d03dacfc8fa06b065ffe1df00d8c2a09f731482fcacae745abfbb478d4af36d0a891fad4834d3
1948 | languageName: node
1949 | linkType: hard
1950 |
1951 | "wrap-ansi@npm:^6.2.0":
1952 | version: 6.2.0
1953 | resolution: "wrap-ansi@npm:6.2.0"
1954 | dependencies:
1955 | ansi-styles: ^4.0.0
1956 | string-width: ^4.1.0
1957 | strip-ansi: ^6.0.0
1958 | checksum: 6cd96a410161ff617b63581a08376f0cb9162375adeb7956e10c8cd397821f7eb2a6de24eb22a0b28401300bf228c86e50617cd568209b5f6775b93c97d2fe3a
1959 | languageName: node
1960 | linkType: hard
1961 |
1962 | "wrap-ansi@npm:^7.0.0":
1963 | version: 7.0.0
1964 | resolution: "wrap-ansi@npm:7.0.0"
1965 | dependencies:
1966 | ansi-styles: ^4.0.0
1967 | string-width: ^4.1.0
1968 | strip-ansi: ^6.0.0
1969 | checksum: a790b846fd4505de962ba728a21aaeda189b8ee1c7568ca5e817d85930e06ef8d1689d49dbf0e881e8ef84436af3a88bc49115c2e2788d841ff1b8b5b51a608b
1970 | languageName: node
1971 | linkType: hard
1972 |
1973 | "wrappy@npm:1":
1974 | version: 1.0.2
1975 | resolution: "wrappy@npm:1.0.2"
1976 | checksum: 159da4805f7e84a3d003d8841557196034155008f817172d4e986bd591f74aa82aa7db55929a54222309e01079a65a92a9e6414da5a6aa4b01ee44a511ac3ee5
1977 | languageName: node
1978 | linkType: hard
1979 |
1980 | "yallist@npm:^4.0.0":
1981 | version: 4.0.0
1982 | resolution: "yallist@npm:4.0.0"
1983 | checksum: 343617202af32df2a15a3be36a5a8c0c8545208f3d3dfbc6bb7c3e3b7e8c6f8e7485432e4f3b88da3031a6e20afa7c711eded32ddfb122896ac5d914e75848d5
1984 | languageName: node
1985 | linkType: hard
1986 |
1987 | "yaml@npm:^2.1.1":
1988 | version: 2.1.1
1989 | resolution: "yaml@npm:2.1.1"
1990 | checksum: f48bb209918aa57cfaf78ef6448d1a1f8187f45c746f933268b7023dc59e5456004611879126c9bb5ea55b0a2b1c2b392dfde436931ece0c703a3d754562bb96
1991 | languageName: node
1992 | linkType: hard
1993 |
--------------------------------------------------------------------------------