├── .gitignore
├── README.md
├── package-lock.json
├── package.json
├── src
├── events.ts
├── index.ts
├── renderer.ts
└── scratcher.ts
└── tsconfig.json
/.gitignore:
--------------------------------------------------------------------------------
1 | # dependencies
2 | node_modules
3 |
4 | # build directories
5 | dist
6 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # scratchable
2 |
3 | https://github.com/HoseungJang/scratchable/assets/39669819/5e3e5e4b-ce97-47b5-877c-d04d8375e843
4 |
5 | # Overview
6 |
7 | `scratchable` is a scratch card renderer using HTML Canvas. It renders a scratchable canvas element on your content, and provides percentage of scratched pixels.
8 |
9 | # Usage
10 |
11 | First of all, you should pass `container` to `Scratchable`, which will be overlapped by a scratchable canvas.
12 |
13 | ```javascript
14 | const container = document.getElementById("container");
15 |
16 | const scratchable = new Scratchable({
17 | container,
18 | /* ... */
19 | });
20 | ```
21 |
22 | ```html
23 |
/* CONTENT */
24 | ```
25 |
26 | Or in React,
27 |
28 | ```typescript
29 | const container = ref.current;
30 |
31 | const scratchable = new Scratchable({
32 | container,
33 | /* ... */
34 | });
35 | ```
36 |
37 | ```tsx
38 | {/* CONTENT */}
39 | ```
40 |
41 | And then it will render the canvas on your `/* CONTENT */`, when you call `Scratchable.render()`. It returns `Promise`.
42 |
43 | ```typescript
44 | await scratchable.render();
45 | ```
46 |
47 | And you can also remove the rendered canvas.
48 |
49 | ```typescript
50 | scratchable.destroy();
51 | ```
52 |
53 | This is the basic. Now let's see another required option `background`.
54 |
55 | ## Background
56 |
57 | You should pass `background` to `Scratchable`, which is the color of the rendered canvas.
58 |
59 | It has three kinds of type, `single`, `linear-gradient` and `image`.
60 |
61 | ### Single Background
62 |
63 | ```typescript
64 | new Scratchable({
65 | /* ... */
66 | background: {
67 | type: "single",
68 | color: "#FA58D0",
69 | },
70 | });
71 | ```
72 |
73 | https://github.com/HoseungJang/scratchable/assets/39669819/7915c2af-8bbe-43d8-9169-631fd7124b91
74 |
75 | ### Linear Gradient Background
76 |
77 | ```typescript
78 | new Scratchable({
79 | /* ... */
80 | background: {
81 | type: "linear-gradient",
82 | gradients: [
83 | { offset: 0, color: "#FA58D0" },
84 | { offset: 0.5, color: "#DA81F5" },
85 | { offset: 1, color: "#BE81F7" },
86 | ],
87 | },
88 | });
89 | ```
90 |
91 | https://github.com/HoseungJang/scratchable/assets/39669819/bef24ef0-2860-4150-9133-35a922950936
92 |
93 | ### Image Background
94 |
95 | ```typescript
96 | new Scratchable({
97 | /* ... */
98 | background: {
99 | type: "image",
100 | url: "karina.jpeg",
101 | },
102 | });
103 | ```
104 |
105 | https://github.com/HoseungJang/scratchable/assets/39669819/8fd80f49-bb3c-4582-af82-b57273e6a8c2
106 |
107 | ## Radius
108 |
109 | You can set radius of a circle which is rendered when you scratch the canvas. Let's compare between 20 and 40.
110 |
111 | ### 20
112 |
113 | ```typescript
114 | new Scratchable({
115 | /* ... */
116 | radius: 20,
117 | });
118 | ```
119 |
120 | https://github.com/HoseungJang/scratchable/assets/39669819/44c38fac-a130-427d-8c8e-874f03e132f1
121 |
122 | ### 40
123 |
124 | ```typescript
125 | new Scratchable({
126 | /* ... */
127 | radius: 40,
128 | });
129 | ```
130 |
131 | https://github.com/HoseungJang/scratchable/assets/39669819/b8421e3b-f79e-4114-a002-0f8c066e1c95
132 |
133 | ## Scratch Event
134 |
135 | You can register a function which will be called when `scratch` event fires. The event fires when an user is scratching the canvas.
136 |
137 | ```typescript
138 | const handler = (e: ScratchableEvent) => {
139 | /* ... */
140 | };
141 |
142 | scratchable.addEventListener("scratch", handler);
143 | scratchable.removeEventListener("scratch", handler);
144 | ```
145 |
146 | ## Scratched Percentage
147 |
148 | You can get percentage(0 ~ 1) from `ScratchEvent` above. The percentage is ratio of scratched area to all scratchable area.
149 |
150 | ```typescript
151 | const handler = (e: ScratchableEvent) => {
152 | if (e.percentage > 0.5) {
153 | scratchable.destroy();
154 | }
155 | };
156 |
157 | scratchable.addEventListener("scratch", handler);
158 | ```
159 |
160 | https://github.com/HoseungJang/scratchable/assets/39669819/877e7224-5311-443e-84d1-be24632f5d21
161 |
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "scratchable",
3 | "version": "0.0.4",
4 | "lockfileVersion": 2,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "scratchable",
9 | "version": "0.0.4",
10 | "license": "MIT",
11 | "devDependencies": {
12 | "tsup": "^7.1.0",
13 | "typescript": "^5.1.6"
14 | }
15 | },
16 | "node_modules/@esbuild/android-arm": {
17 | "version": "0.18.15",
18 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.15.tgz",
19 | "integrity": "sha512-wlkQBWb79/jeEEoRmrxt/yhn5T1lU236OCNpnfRzaCJHZ/5gf82uYx1qmADTBWE0AR/v7FiozE1auk2riyQd3w==",
20 | "cpu": [
21 | "arm"
22 | ],
23 | "dev": true,
24 | "optional": true,
25 | "os": [
26 | "android"
27 | ],
28 | "engines": {
29 | "node": ">=12"
30 | }
31 | },
32 | "node_modules/@esbuild/android-arm64": {
33 | "version": "0.18.15",
34 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.15.tgz",
35 | "integrity": "sha512-NI/gnWcMl2kXt1HJKOn2H69SYn4YNheKo6NZt1hyfKWdMbaGadxjZIkcj4Gjk/WPxnbFXs9/3HjGHaknCqjrww==",
36 | "cpu": [
37 | "arm64"
38 | ],
39 | "dev": true,
40 | "optional": true,
41 | "os": [
42 | "android"
43 | ],
44 | "engines": {
45 | "node": ">=12"
46 | }
47 | },
48 | "node_modules/@esbuild/android-x64": {
49 | "version": "0.18.15",
50 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.15.tgz",
51 | "integrity": "sha512-FM9NQamSaEm/IZIhegF76aiLnng1kEsZl2eve/emxDeReVfRuRNmvT28l6hoFD9TsCxpK+i4v8LPpEj74T7yjA==",
52 | "cpu": [
53 | "x64"
54 | ],
55 | "dev": true,
56 | "optional": true,
57 | "os": [
58 | "android"
59 | ],
60 | "engines": {
61 | "node": ">=12"
62 | }
63 | },
64 | "node_modules/@esbuild/darwin-arm64": {
65 | "version": "0.18.15",
66 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.15.tgz",
67 | "integrity": "sha512-XmrFwEOYauKte9QjS6hz60FpOCnw4zaPAb7XV7O4lx1r39XjJhTN7ZpXqJh4sN6q60zbP6QwAVVA8N/wUyBH/w==",
68 | "cpu": [
69 | "arm64"
70 | ],
71 | "dev": true,
72 | "optional": true,
73 | "os": [
74 | "darwin"
75 | ],
76 | "engines": {
77 | "node": ">=12"
78 | }
79 | },
80 | "node_modules/@esbuild/darwin-x64": {
81 | "version": "0.18.15",
82 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.15.tgz",
83 | "integrity": "sha512-bMqBmpw1e//7Fh5GLetSZaeo9zSC4/CMtrVFdj+bqKPGJuKyfNJ5Nf2m3LknKZTS+Q4oyPiON+v3eaJ59sLB5A==",
84 | "cpu": [
85 | "x64"
86 | ],
87 | "dev": true,
88 | "optional": true,
89 | "os": [
90 | "darwin"
91 | ],
92 | "engines": {
93 | "node": ">=12"
94 | }
95 | },
96 | "node_modules/@esbuild/freebsd-arm64": {
97 | "version": "0.18.15",
98 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.15.tgz",
99 | "integrity": "sha512-LoTK5N3bOmNI9zVLCeTgnk5Rk0WdUTrr9dyDAQGVMrNTh9EAPuNwSTCgaKOKiDpverOa0htPcO9NwslSE5xuLA==",
100 | "cpu": [
101 | "arm64"
102 | ],
103 | "dev": true,
104 | "optional": true,
105 | "os": [
106 | "freebsd"
107 | ],
108 | "engines": {
109 | "node": ">=12"
110 | }
111 | },
112 | "node_modules/@esbuild/freebsd-x64": {
113 | "version": "0.18.15",
114 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.15.tgz",
115 | "integrity": "sha512-62jX5n30VzgrjAjOk5orYeHFq6sqjvsIj1QesXvn5OZtdt5Gdj0vUNJy9NIpjfdNdqr76jjtzBJKf+h2uzYuTQ==",
116 | "cpu": [
117 | "x64"
118 | ],
119 | "dev": true,
120 | "optional": true,
121 | "os": [
122 | "freebsd"
123 | ],
124 | "engines": {
125 | "node": ">=12"
126 | }
127 | },
128 | "node_modules/@esbuild/linux-arm": {
129 | "version": "0.18.15",
130 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.15.tgz",
131 | "integrity": "sha512-dT4URUv6ir45ZkBqhwZwyFV6cH61k8MttIwhThp2BGiVtagYvCToF+Bggyx2VI57RG4Fbt21f9TmXaYx0DeUJg==",
132 | "cpu": [
133 | "arm"
134 | ],
135 | "dev": true,
136 | "optional": true,
137 | "os": [
138 | "linux"
139 | ],
140 | "engines": {
141 | "node": ">=12"
142 | }
143 | },
144 | "node_modules/@esbuild/linux-arm64": {
145 | "version": "0.18.15",
146 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.15.tgz",
147 | "integrity": "sha512-BWncQeuWDgYv0jTNzJjaNgleduV4tMbQjmk/zpPh/lUdMcNEAxy+jvneDJ6RJkrqloG7tB9S9rCrtfk/kuplsQ==",
148 | "cpu": [
149 | "arm64"
150 | ],
151 | "dev": true,
152 | "optional": true,
153 | "os": [
154 | "linux"
155 | ],
156 | "engines": {
157 | "node": ">=12"
158 | }
159 | },
160 | "node_modules/@esbuild/linux-ia32": {
161 | "version": "0.18.15",
162 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.15.tgz",
163 | "integrity": "sha512-JPXORvgHRHITqfms1dWT/GbEY89u848dC08o0yK3fNskhp0t2TuNUnsrrSgOdH28ceb1hJuwyr8R/1RnyPwocw==",
164 | "cpu": [
165 | "ia32"
166 | ],
167 | "dev": true,
168 | "optional": true,
169 | "os": [
170 | "linux"
171 | ],
172 | "engines": {
173 | "node": ">=12"
174 | }
175 | },
176 | "node_modules/@esbuild/linux-loong64": {
177 | "version": "0.18.15",
178 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.15.tgz",
179 | "integrity": "sha512-kArPI0DopjJCEplsVj/H+2Qgzz7vdFSacHNsgoAKpPS6W/Ndh8Oe24HRDQ5QCu4jHgN6XOtfFfLpRx3TXv/mEg==",
180 | "cpu": [
181 | "loong64"
182 | ],
183 | "dev": true,
184 | "optional": true,
185 | "os": [
186 | "linux"
187 | ],
188 | "engines": {
189 | "node": ">=12"
190 | }
191 | },
192 | "node_modules/@esbuild/linux-mips64el": {
193 | "version": "0.18.15",
194 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.15.tgz",
195 | "integrity": "sha512-b/tmngUfO02E00c1XnNTw/0DmloKjb6XQeqxaYuzGwHe0fHVgx5/D6CWi+XH1DvkszjBUkK9BX7n1ARTOst59w==",
196 | "cpu": [
197 | "mips64el"
198 | ],
199 | "dev": true,
200 | "optional": true,
201 | "os": [
202 | "linux"
203 | ],
204 | "engines": {
205 | "node": ">=12"
206 | }
207 | },
208 | "node_modules/@esbuild/linux-ppc64": {
209 | "version": "0.18.15",
210 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.15.tgz",
211 | "integrity": "sha512-KXPY69MWw79QJkyvUYb2ex/OgnN/8N/Aw5UDPlgoRtoEfcBqfeLodPr42UojV3NdkoO4u10NXQdamWm1YEzSKw==",
212 | "cpu": [
213 | "ppc64"
214 | ],
215 | "dev": true,
216 | "optional": true,
217 | "os": [
218 | "linux"
219 | ],
220 | "engines": {
221 | "node": ">=12"
222 | }
223 | },
224 | "node_modules/@esbuild/linux-riscv64": {
225 | "version": "0.18.15",
226 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.15.tgz",
227 | "integrity": "sha512-komK3NEAeeGRnvFEjX1SfVg6EmkfIi5aKzevdvJqMydYr9N+pRQK0PGJXk+bhoPZwOUgLO4l99FZmLGk/L1jWg==",
228 | "cpu": [
229 | "riscv64"
230 | ],
231 | "dev": true,
232 | "optional": true,
233 | "os": [
234 | "linux"
235 | ],
236 | "engines": {
237 | "node": ">=12"
238 | }
239 | },
240 | "node_modules/@esbuild/linux-s390x": {
241 | "version": "0.18.15",
242 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.15.tgz",
243 | "integrity": "sha512-632T5Ts6gQ2WiMLWRRyeflPAm44u2E/s/TJvn+BP6M5mnHSk93cieaypj3VSMYO2ePTCRqAFXtuYi1yv8uZJNA==",
244 | "cpu": [
245 | "s390x"
246 | ],
247 | "dev": true,
248 | "optional": true,
249 | "os": [
250 | "linux"
251 | ],
252 | "engines": {
253 | "node": ">=12"
254 | }
255 | },
256 | "node_modules/@esbuild/linux-x64": {
257 | "version": "0.18.15",
258 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.15.tgz",
259 | "integrity": "sha512-MsHtX0NgvRHsoOtYkuxyk4Vkmvk3PLRWfA4okK7c+6dT0Fu4SUqXAr9y4Q3d8vUf1VWWb6YutpL4XNe400iQ1g==",
260 | "cpu": [
261 | "x64"
262 | ],
263 | "dev": true,
264 | "optional": true,
265 | "os": [
266 | "linux"
267 | ],
268 | "engines": {
269 | "node": ">=12"
270 | }
271 | },
272 | "node_modules/@esbuild/netbsd-x64": {
273 | "version": "0.18.15",
274 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.15.tgz",
275 | "integrity": "sha512-djST6s+jQiwxMIVQ5rlt24JFIAr4uwUnzceuFL7BQT4CbrRtqBPueS4GjXSiIpmwVri1Icj/9pFRJ7/aScvT+A==",
276 | "cpu": [
277 | "x64"
278 | ],
279 | "dev": true,
280 | "optional": true,
281 | "os": [
282 | "netbsd"
283 | ],
284 | "engines": {
285 | "node": ">=12"
286 | }
287 | },
288 | "node_modules/@esbuild/openbsd-x64": {
289 | "version": "0.18.15",
290 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.15.tgz",
291 | "integrity": "sha512-naeRhUIvhsgeounjkF5mvrNAVMGAm6EJWiabskeE5yOeBbLp7T89tAEw0j5Jm/CZAwyLe3c67zyCWH6fsBLCpw==",
292 | "cpu": [
293 | "x64"
294 | ],
295 | "dev": true,
296 | "optional": true,
297 | "os": [
298 | "openbsd"
299 | ],
300 | "engines": {
301 | "node": ">=12"
302 | }
303 | },
304 | "node_modules/@esbuild/sunos-x64": {
305 | "version": "0.18.15",
306 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.15.tgz",
307 | "integrity": "sha512-qkT2+WxyKbNIKV1AEhI8QiSIgTHMcRctzSaa/I3kVgMS5dl3fOeoqkb7pW76KwxHoriImhx7Mg3TwN/auMDsyQ==",
308 | "cpu": [
309 | "x64"
310 | ],
311 | "dev": true,
312 | "optional": true,
313 | "os": [
314 | "sunos"
315 | ],
316 | "engines": {
317 | "node": ">=12"
318 | }
319 | },
320 | "node_modules/@esbuild/win32-arm64": {
321 | "version": "0.18.15",
322 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.15.tgz",
323 | "integrity": "sha512-HC4/feP+pB2Vb+cMPUjAnFyERs+HJN7E6KaeBlFdBv799MhD+aPJlfi/yk36SED58J9TPwI8MAcVpJgej4ud0A==",
324 | "cpu": [
325 | "arm64"
326 | ],
327 | "dev": true,
328 | "optional": true,
329 | "os": [
330 | "win32"
331 | ],
332 | "engines": {
333 | "node": ">=12"
334 | }
335 | },
336 | "node_modules/@esbuild/win32-ia32": {
337 | "version": "0.18.15",
338 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.15.tgz",
339 | "integrity": "sha512-ovjwoRXI+gf52EVF60u9sSDj7myPixPxqzD5CmkEUmvs+W9Xd0iqISVBQn8xcx4ciIaIVlWCuTbYDOXOnOL44Q==",
340 | "cpu": [
341 | "ia32"
342 | ],
343 | "dev": true,
344 | "optional": true,
345 | "os": [
346 | "win32"
347 | ],
348 | "engines": {
349 | "node": ">=12"
350 | }
351 | },
352 | "node_modules/@esbuild/win32-x64": {
353 | "version": "0.18.15",
354 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.15.tgz",
355 | "integrity": "sha512-imUxH9a3WJARyAvrG7srLyiK73XdX83NXQkjKvQ+7vPh3ZxoLrzvPkQKKw2DwZ+RV2ZB6vBfNHP8XScAmQC3aA==",
356 | "cpu": [
357 | "x64"
358 | ],
359 | "dev": true,
360 | "optional": true,
361 | "os": [
362 | "win32"
363 | ],
364 | "engines": {
365 | "node": ">=12"
366 | }
367 | },
368 | "node_modules/@jridgewell/gen-mapping": {
369 | "version": "0.3.3",
370 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
371 | "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
372 | "dev": true,
373 | "dependencies": {
374 | "@jridgewell/set-array": "^1.0.1",
375 | "@jridgewell/sourcemap-codec": "^1.4.10",
376 | "@jridgewell/trace-mapping": "^0.3.9"
377 | },
378 | "engines": {
379 | "node": ">=6.0.0"
380 | }
381 | },
382 | "node_modules/@jridgewell/resolve-uri": {
383 | "version": "3.1.0",
384 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
385 | "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
386 | "dev": true,
387 | "engines": {
388 | "node": ">=6.0.0"
389 | }
390 | },
391 | "node_modules/@jridgewell/set-array": {
392 | "version": "1.1.2",
393 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
394 | "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
395 | "dev": true,
396 | "engines": {
397 | "node": ">=6.0.0"
398 | }
399 | },
400 | "node_modules/@jridgewell/sourcemap-codec": {
401 | "version": "1.4.15",
402 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
403 | "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
404 | "dev": true
405 | },
406 | "node_modules/@jridgewell/trace-mapping": {
407 | "version": "0.3.18",
408 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz",
409 | "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==",
410 | "dev": true,
411 | "dependencies": {
412 | "@jridgewell/resolve-uri": "3.1.0",
413 | "@jridgewell/sourcemap-codec": "1.4.14"
414 | }
415 | },
416 | "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": {
417 | "version": "1.4.14",
418 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
419 | "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
420 | "dev": true
421 | },
422 | "node_modules/@nodelib/fs.scandir": {
423 | "version": "2.1.5",
424 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
425 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
426 | "dev": true,
427 | "dependencies": {
428 | "@nodelib/fs.stat": "2.0.5",
429 | "run-parallel": "^1.1.9"
430 | },
431 | "engines": {
432 | "node": ">= 8"
433 | }
434 | },
435 | "node_modules/@nodelib/fs.stat": {
436 | "version": "2.0.5",
437 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
438 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
439 | "dev": true,
440 | "engines": {
441 | "node": ">= 8"
442 | }
443 | },
444 | "node_modules/@nodelib/fs.walk": {
445 | "version": "1.2.8",
446 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
447 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
448 | "dev": true,
449 | "dependencies": {
450 | "@nodelib/fs.scandir": "2.1.5",
451 | "fastq": "^1.6.0"
452 | },
453 | "engines": {
454 | "node": ">= 8"
455 | }
456 | },
457 | "node_modules/any-promise": {
458 | "version": "1.3.0",
459 | "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
460 | "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
461 | "dev": true
462 | },
463 | "node_modules/anymatch": {
464 | "version": "3.1.3",
465 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
466 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
467 | "dev": true,
468 | "dependencies": {
469 | "normalize-path": "^3.0.0",
470 | "picomatch": "^2.0.4"
471 | },
472 | "engines": {
473 | "node": ">= 8"
474 | }
475 | },
476 | "node_modules/array-union": {
477 | "version": "2.1.0",
478 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
479 | "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
480 | "dev": true,
481 | "engines": {
482 | "node": ">=8"
483 | }
484 | },
485 | "node_modules/balanced-match": {
486 | "version": "1.0.2",
487 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
488 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
489 | "dev": true
490 | },
491 | "node_modules/binary-extensions": {
492 | "version": "2.2.0",
493 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
494 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
495 | "dev": true,
496 | "engines": {
497 | "node": ">=8"
498 | }
499 | },
500 | "node_modules/brace-expansion": {
501 | "version": "1.1.11",
502 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
503 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
504 | "dev": true,
505 | "dependencies": {
506 | "balanced-match": "^1.0.0",
507 | "concat-map": "0.0.1"
508 | }
509 | },
510 | "node_modules/braces": {
511 | "version": "3.0.2",
512 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
513 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
514 | "dev": true,
515 | "dependencies": {
516 | "fill-range": "^7.0.1"
517 | },
518 | "engines": {
519 | "node": ">=8"
520 | }
521 | },
522 | "node_modules/bundle-require": {
523 | "version": "4.0.1",
524 | "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-4.0.1.tgz",
525 | "integrity": "sha512-9NQkRHlNdNpDBGmLpngF3EFDcwodhMUuLz9PaWYciVcQF9SE4LFjM2DB/xV1Li5JiuDMv7ZUWuC3rGbqR0MAXQ==",
526 | "dev": true,
527 | "dependencies": {
528 | "load-tsconfig": "^0.2.3"
529 | },
530 | "engines": {
531 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
532 | },
533 | "peerDependencies": {
534 | "esbuild": ">=0.17"
535 | }
536 | },
537 | "node_modules/cac": {
538 | "version": "6.7.14",
539 | "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
540 | "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==",
541 | "dev": true,
542 | "engines": {
543 | "node": ">=8"
544 | }
545 | },
546 | "node_modules/chokidar": {
547 | "version": "3.5.3",
548 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
549 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
550 | "dev": true,
551 | "funding": [
552 | {
553 | "type": "individual",
554 | "url": "https://paulmillr.com/funding/"
555 | }
556 | ],
557 | "dependencies": {
558 | "anymatch": "~3.1.2",
559 | "braces": "~3.0.2",
560 | "glob-parent": "~5.1.2",
561 | "is-binary-path": "~2.1.0",
562 | "is-glob": "~4.0.1",
563 | "normalize-path": "~3.0.0",
564 | "readdirp": "~3.6.0"
565 | },
566 | "engines": {
567 | "node": ">= 8.10.0"
568 | },
569 | "optionalDependencies": {
570 | "fsevents": "~2.3.2"
571 | }
572 | },
573 | "node_modules/commander": {
574 | "version": "4.1.1",
575 | "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
576 | "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
577 | "dev": true,
578 | "engines": {
579 | "node": ">= 6"
580 | }
581 | },
582 | "node_modules/concat-map": {
583 | "version": "0.0.1",
584 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
585 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
586 | "dev": true
587 | },
588 | "node_modules/cross-spawn": {
589 | "version": "7.0.3",
590 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
591 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
592 | "dev": true,
593 | "dependencies": {
594 | "path-key": "^3.1.0",
595 | "shebang-command": "^2.0.0",
596 | "which": "^2.0.1"
597 | },
598 | "engines": {
599 | "node": ">= 8"
600 | }
601 | },
602 | "node_modules/debug": {
603 | "version": "4.3.4",
604 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
605 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
606 | "dev": true,
607 | "dependencies": {
608 | "ms": "2.1.2"
609 | },
610 | "engines": {
611 | "node": ">=6.0"
612 | },
613 | "peerDependenciesMeta": {
614 | "supports-color": {
615 | "optional": true
616 | }
617 | }
618 | },
619 | "node_modules/dir-glob": {
620 | "version": "3.0.1",
621 | "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
622 | "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
623 | "dev": true,
624 | "dependencies": {
625 | "path-type": "^4.0.0"
626 | },
627 | "engines": {
628 | "node": ">=8"
629 | }
630 | },
631 | "node_modules/esbuild": {
632 | "version": "0.18.15",
633 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.15.tgz",
634 | "integrity": "sha512-3WOOLhrvuTGPRzQPU6waSDWrDTnQriia72McWcn6UCi43GhCHrXH4S59hKMeez+IITmdUuUyvbU9JIp+t3xlPQ==",
635 | "dev": true,
636 | "hasInstallScript": true,
637 | "bin": {
638 | "esbuild": "bin/esbuild"
639 | },
640 | "engines": {
641 | "node": ">=12"
642 | },
643 | "optionalDependencies": {
644 | "@esbuild/android-arm": "0.18.15",
645 | "@esbuild/android-arm64": "0.18.15",
646 | "@esbuild/android-x64": "0.18.15",
647 | "@esbuild/darwin-arm64": "0.18.15",
648 | "@esbuild/darwin-x64": "0.18.15",
649 | "@esbuild/freebsd-arm64": "0.18.15",
650 | "@esbuild/freebsd-x64": "0.18.15",
651 | "@esbuild/linux-arm": "0.18.15",
652 | "@esbuild/linux-arm64": "0.18.15",
653 | "@esbuild/linux-ia32": "0.18.15",
654 | "@esbuild/linux-loong64": "0.18.15",
655 | "@esbuild/linux-mips64el": "0.18.15",
656 | "@esbuild/linux-ppc64": "0.18.15",
657 | "@esbuild/linux-riscv64": "0.18.15",
658 | "@esbuild/linux-s390x": "0.18.15",
659 | "@esbuild/linux-x64": "0.18.15",
660 | "@esbuild/netbsd-x64": "0.18.15",
661 | "@esbuild/openbsd-x64": "0.18.15",
662 | "@esbuild/sunos-x64": "0.18.15",
663 | "@esbuild/win32-arm64": "0.18.15",
664 | "@esbuild/win32-ia32": "0.18.15",
665 | "@esbuild/win32-x64": "0.18.15"
666 | }
667 | },
668 | "node_modules/execa": {
669 | "version": "5.1.1",
670 | "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
671 | "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
672 | "dev": true,
673 | "dependencies": {
674 | "cross-spawn": "^7.0.3",
675 | "get-stream": "^6.0.0",
676 | "human-signals": "^2.1.0",
677 | "is-stream": "^2.0.0",
678 | "merge-stream": "^2.0.0",
679 | "npm-run-path": "^4.0.1",
680 | "onetime": "^5.1.2",
681 | "signal-exit": "^3.0.3",
682 | "strip-final-newline": "^2.0.0"
683 | },
684 | "engines": {
685 | "node": ">=10"
686 | },
687 | "funding": {
688 | "url": "https://github.com/sindresorhus/execa?sponsor=1"
689 | }
690 | },
691 | "node_modules/fast-glob": {
692 | "version": "3.3.1",
693 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz",
694 | "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==",
695 | "dev": true,
696 | "dependencies": {
697 | "@nodelib/fs.stat": "^2.0.2",
698 | "@nodelib/fs.walk": "^1.2.3",
699 | "glob-parent": "^5.1.2",
700 | "merge2": "^1.3.0",
701 | "micromatch": "^4.0.4"
702 | },
703 | "engines": {
704 | "node": ">=8.6.0"
705 | }
706 | },
707 | "node_modules/fastq": {
708 | "version": "1.15.0",
709 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
710 | "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
711 | "dev": true,
712 | "dependencies": {
713 | "reusify": "^1.0.4"
714 | }
715 | },
716 | "node_modules/fill-range": {
717 | "version": "7.0.1",
718 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
719 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
720 | "dev": true,
721 | "dependencies": {
722 | "to-regex-range": "^5.0.1"
723 | },
724 | "engines": {
725 | "node": ">=8"
726 | }
727 | },
728 | "node_modules/fs.realpath": {
729 | "version": "1.0.0",
730 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
731 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
732 | "dev": true
733 | },
734 | "node_modules/fsevents": {
735 | "version": "2.3.2",
736 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
737 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
738 | "dev": true,
739 | "hasInstallScript": true,
740 | "optional": true,
741 | "os": [
742 | "darwin"
743 | ],
744 | "engines": {
745 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
746 | }
747 | },
748 | "node_modules/get-stream": {
749 | "version": "6.0.1",
750 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
751 | "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
752 | "dev": true,
753 | "engines": {
754 | "node": ">=10"
755 | },
756 | "funding": {
757 | "url": "https://github.com/sponsors/sindresorhus"
758 | }
759 | },
760 | "node_modules/glob": {
761 | "version": "7.1.6",
762 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
763 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
764 | "dev": true,
765 | "dependencies": {
766 | "fs.realpath": "^1.0.0",
767 | "inflight": "^1.0.4",
768 | "inherits": "2",
769 | "minimatch": "^3.0.4",
770 | "once": "^1.3.0",
771 | "path-is-absolute": "^1.0.0"
772 | },
773 | "engines": {
774 | "node": "*"
775 | },
776 | "funding": {
777 | "url": "https://github.com/sponsors/isaacs"
778 | }
779 | },
780 | "node_modules/glob-parent": {
781 | "version": "5.1.2",
782 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
783 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
784 | "dev": true,
785 | "dependencies": {
786 | "is-glob": "^4.0.1"
787 | },
788 | "engines": {
789 | "node": ">= 6"
790 | }
791 | },
792 | "node_modules/globby": {
793 | "version": "11.1.0",
794 | "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
795 | "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
796 | "dev": true,
797 | "dependencies": {
798 | "array-union": "^2.1.0",
799 | "dir-glob": "^3.0.1",
800 | "fast-glob": "^3.2.9",
801 | "ignore": "^5.2.0",
802 | "merge2": "^1.4.1",
803 | "slash": "^3.0.0"
804 | },
805 | "engines": {
806 | "node": ">=10"
807 | },
808 | "funding": {
809 | "url": "https://github.com/sponsors/sindresorhus"
810 | }
811 | },
812 | "node_modules/human-signals": {
813 | "version": "2.1.0",
814 | "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
815 | "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
816 | "dev": true,
817 | "engines": {
818 | "node": ">=10.17.0"
819 | }
820 | },
821 | "node_modules/ignore": {
822 | "version": "5.2.4",
823 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
824 | "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==",
825 | "dev": true,
826 | "engines": {
827 | "node": ">= 4"
828 | }
829 | },
830 | "node_modules/inflight": {
831 | "version": "1.0.6",
832 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
833 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
834 | "dev": true,
835 | "dependencies": {
836 | "once": "^1.3.0",
837 | "wrappy": "1"
838 | }
839 | },
840 | "node_modules/inherits": {
841 | "version": "2.0.4",
842 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
843 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
844 | "dev": true
845 | },
846 | "node_modules/is-binary-path": {
847 | "version": "2.1.0",
848 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
849 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
850 | "dev": true,
851 | "dependencies": {
852 | "binary-extensions": "^2.0.0"
853 | },
854 | "engines": {
855 | "node": ">=8"
856 | }
857 | },
858 | "node_modules/is-extglob": {
859 | "version": "2.1.1",
860 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
861 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
862 | "dev": true,
863 | "engines": {
864 | "node": ">=0.10.0"
865 | }
866 | },
867 | "node_modules/is-glob": {
868 | "version": "4.0.3",
869 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
870 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
871 | "dev": true,
872 | "dependencies": {
873 | "is-extglob": "^2.1.1"
874 | },
875 | "engines": {
876 | "node": ">=0.10.0"
877 | }
878 | },
879 | "node_modules/is-number": {
880 | "version": "7.0.0",
881 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
882 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
883 | "dev": true,
884 | "engines": {
885 | "node": ">=0.12.0"
886 | }
887 | },
888 | "node_modules/is-stream": {
889 | "version": "2.0.1",
890 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
891 | "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
892 | "dev": true,
893 | "engines": {
894 | "node": ">=8"
895 | },
896 | "funding": {
897 | "url": "https://github.com/sponsors/sindresorhus"
898 | }
899 | },
900 | "node_modules/isexe": {
901 | "version": "2.0.0",
902 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
903 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
904 | "dev": true
905 | },
906 | "node_modules/joycon": {
907 | "version": "3.1.1",
908 | "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz",
909 | "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==",
910 | "dev": true,
911 | "engines": {
912 | "node": ">=10"
913 | }
914 | },
915 | "node_modules/lilconfig": {
916 | "version": "2.1.0",
917 | "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",
918 | "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
919 | "dev": true,
920 | "engines": {
921 | "node": ">=10"
922 | }
923 | },
924 | "node_modules/lines-and-columns": {
925 | "version": "1.2.4",
926 | "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
927 | "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
928 | "dev": true
929 | },
930 | "node_modules/load-tsconfig": {
931 | "version": "0.2.5",
932 | "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz",
933 | "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==",
934 | "dev": true,
935 | "engines": {
936 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
937 | }
938 | },
939 | "node_modules/lodash.sortby": {
940 | "version": "4.7.0",
941 | "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
942 | "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==",
943 | "dev": true
944 | },
945 | "node_modules/merge-stream": {
946 | "version": "2.0.0",
947 | "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
948 | "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
949 | "dev": true
950 | },
951 | "node_modules/merge2": {
952 | "version": "1.4.1",
953 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
954 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
955 | "dev": true,
956 | "engines": {
957 | "node": ">= 8"
958 | }
959 | },
960 | "node_modules/micromatch": {
961 | "version": "4.0.5",
962 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
963 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
964 | "dev": true,
965 | "dependencies": {
966 | "braces": "^3.0.2",
967 | "picomatch": "^2.3.1"
968 | },
969 | "engines": {
970 | "node": ">=8.6"
971 | }
972 | },
973 | "node_modules/mimic-fn": {
974 | "version": "2.1.0",
975 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
976 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
977 | "dev": true,
978 | "engines": {
979 | "node": ">=6"
980 | }
981 | },
982 | "node_modules/minimatch": {
983 | "version": "3.1.2",
984 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
985 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
986 | "dev": true,
987 | "dependencies": {
988 | "brace-expansion": "^1.1.7"
989 | },
990 | "engines": {
991 | "node": "*"
992 | }
993 | },
994 | "node_modules/ms": {
995 | "version": "2.1.2",
996 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
997 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
998 | "dev": true
999 | },
1000 | "node_modules/mz": {
1001 | "version": "2.7.0",
1002 | "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
1003 | "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
1004 | "dev": true,
1005 | "dependencies": {
1006 | "any-promise": "^1.0.0",
1007 | "object-assign": "^4.0.1",
1008 | "thenify-all": "^1.0.0"
1009 | }
1010 | },
1011 | "node_modules/normalize-path": {
1012 | "version": "3.0.0",
1013 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
1014 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
1015 | "dev": true,
1016 | "engines": {
1017 | "node": ">=0.10.0"
1018 | }
1019 | },
1020 | "node_modules/npm-run-path": {
1021 | "version": "4.0.1",
1022 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
1023 | "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
1024 | "dev": true,
1025 | "dependencies": {
1026 | "path-key": "^3.0.0"
1027 | },
1028 | "engines": {
1029 | "node": ">=8"
1030 | }
1031 | },
1032 | "node_modules/object-assign": {
1033 | "version": "4.1.1",
1034 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1035 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
1036 | "dev": true,
1037 | "engines": {
1038 | "node": ">=0.10.0"
1039 | }
1040 | },
1041 | "node_modules/once": {
1042 | "version": "1.4.0",
1043 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1044 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
1045 | "dev": true,
1046 | "dependencies": {
1047 | "wrappy": "1"
1048 | }
1049 | },
1050 | "node_modules/onetime": {
1051 | "version": "5.1.2",
1052 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
1053 | "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
1054 | "dev": true,
1055 | "dependencies": {
1056 | "mimic-fn": "^2.1.0"
1057 | },
1058 | "engines": {
1059 | "node": ">=6"
1060 | },
1061 | "funding": {
1062 | "url": "https://github.com/sponsors/sindresorhus"
1063 | }
1064 | },
1065 | "node_modules/path-is-absolute": {
1066 | "version": "1.0.1",
1067 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
1068 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
1069 | "dev": true,
1070 | "engines": {
1071 | "node": ">=0.10.0"
1072 | }
1073 | },
1074 | "node_modules/path-key": {
1075 | "version": "3.1.1",
1076 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
1077 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
1078 | "dev": true,
1079 | "engines": {
1080 | "node": ">=8"
1081 | }
1082 | },
1083 | "node_modules/path-type": {
1084 | "version": "4.0.0",
1085 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
1086 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
1087 | "dev": true,
1088 | "engines": {
1089 | "node": ">=8"
1090 | }
1091 | },
1092 | "node_modules/picomatch": {
1093 | "version": "2.3.1",
1094 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
1095 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
1096 | "dev": true,
1097 | "engines": {
1098 | "node": ">=8.6"
1099 | },
1100 | "funding": {
1101 | "url": "https://github.com/sponsors/jonschlinkert"
1102 | }
1103 | },
1104 | "node_modules/pirates": {
1105 | "version": "4.0.6",
1106 | "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
1107 | "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
1108 | "dev": true,
1109 | "engines": {
1110 | "node": ">= 6"
1111 | }
1112 | },
1113 | "node_modules/postcss-load-config": {
1114 | "version": "4.0.1",
1115 | "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz",
1116 | "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==",
1117 | "dev": true,
1118 | "dependencies": {
1119 | "lilconfig": "^2.0.5",
1120 | "yaml": "^2.1.1"
1121 | },
1122 | "engines": {
1123 | "node": ">= 14"
1124 | },
1125 | "funding": {
1126 | "type": "opencollective",
1127 | "url": "https://opencollective.com/postcss/"
1128 | },
1129 | "peerDependencies": {
1130 | "postcss": ">=8.0.9",
1131 | "ts-node": ">=9.0.0"
1132 | },
1133 | "peerDependenciesMeta": {
1134 | "postcss": {
1135 | "optional": true
1136 | },
1137 | "ts-node": {
1138 | "optional": true
1139 | }
1140 | }
1141 | },
1142 | "node_modules/punycode": {
1143 | "version": "2.3.0",
1144 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
1145 | "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
1146 | "dev": true,
1147 | "engines": {
1148 | "node": ">=6"
1149 | }
1150 | },
1151 | "node_modules/queue-microtask": {
1152 | "version": "1.2.3",
1153 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
1154 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
1155 | "dev": true,
1156 | "funding": [
1157 | {
1158 | "type": "github",
1159 | "url": "https://github.com/sponsors/feross"
1160 | },
1161 | {
1162 | "type": "patreon",
1163 | "url": "https://www.patreon.com/feross"
1164 | },
1165 | {
1166 | "type": "consulting",
1167 | "url": "https://feross.org/support"
1168 | }
1169 | ]
1170 | },
1171 | "node_modules/readdirp": {
1172 | "version": "3.6.0",
1173 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
1174 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
1175 | "dev": true,
1176 | "dependencies": {
1177 | "picomatch": "^2.2.1"
1178 | },
1179 | "engines": {
1180 | "node": ">=8.10.0"
1181 | }
1182 | },
1183 | "node_modules/resolve-from": {
1184 | "version": "5.0.0",
1185 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
1186 | "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
1187 | "dev": true,
1188 | "engines": {
1189 | "node": ">=8"
1190 | }
1191 | },
1192 | "node_modules/reusify": {
1193 | "version": "1.0.4",
1194 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
1195 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
1196 | "dev": true,
1197 | "engines": {
1198 | "iojs": ">=1.0.0",
1199 | "node": ">=0.10.0"
1200 | }
1201 | },
1202 | "node_modules/rollup": {
1203 | "version": "3.26.3",
1204 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.26.3.tgz",
1205 | "integrity": "sha512-7Tin0C8l86TkpcMtXvQu6saWH93nhG3dGQ1/+l5V2TDMceTxO7kDiK6GzbfLWNNxqJXm591PcEZUozZm51ogwQ==",
1206 | "dev": true,
1207 | "bin": {
1208 | "rollup": "dist/bin/rollup"
1209 | },
1210 | "engines": {
1211 | "node": ">=14.18.0",
1212 | "npm": ">=8.0.0"
1213 | },
1214 | "optionalDependencies": {
1215 | "fsevents": "~2.3.2"
1216 | }
1217 | },
1218 | "node_modules/run-parallel": {
1219 | "version": "1.2.0",
1220 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
1221 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
1222 | "dev": true,
1223 | "funding": [
1224 | {
1225 | "type": "github",
1226 | "url": "https://github.com/sponsors/feross"
1227 | },
1228 | {
1229 | "type": "patreon",
1230 | "url": "https://www.patreon.com/feross"
1231 | },
1232 | {
1233 | "type": "consulting",
1234 | "url": "https://feross.org/support"
1235 | }
1236 | ],
1237 | "dependencies": {
1238 | "queue-microtask": "^1.2.2"
1239 | }
1240 | },
1241 | "node_modules/shebang-command": {
1242 | "version": "2.0.0",
1243 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
1244 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
1245 | "dev": true,
1246 | "dependencies": {
1247 | "shebang-regex": "^3.0.0"
1248 | },
1249 | "engines": {
1250 | "node": ">=8"
1251 | }
1252 | },
1253 | "node_modules/shebang-regex": {
1254 | "version": "3.0.0",
1255 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
1256 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
1257 | "dev": true,
1258 | "engines": {
1259 | "node": ">=8"
1260 | }
1261 | },
1262 | "node_modules/signal-exit": {
1263 | "version": "3.0.7",
1264 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
1265 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
1266 | "dev": true
1267 | },
1268 | "node_modules/slash": {
1269 | "version": "3.0.0",
1270 | "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
1271 | "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
1272 | "dev": true,
1273 | "engines": {
1274 | "node": ">=8"
1275 | }
1276 | },
1277 | "node_modules/source-map": {
1278 | "version": "0.8.0-beta.0",
1279 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz",
1280 | "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==",
1281 | "dev": true,
1282 | "dependencies": {
1283 | "whatwg-url": "^7.0.0"
1284 | },
1285 | "engines": {
1286 | "node": ">= 8"
1287 | }
1288 | },
1289 | "node_modules/strip-final-newline": {
1290 | "version": "2.0.0",
1291 | "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
1292 | "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
1293 | "dev": true,
1294 | "engines": {
1295 | "node": ">=6"
1296 | }
1297 | },
1298 | "node_modules/sucrase": {
1299 | "version": "3.34.0",
1300 | "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz",
1301 | "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==",
1302 | "dev": true,
1303 | "dependencies": {
1304 | "@jridgewell/gen-mapping": "^0.3.2",
1305 | "commander": "^4.0.0",
1306 | "glob": "7.1.6",
1307 | "lines-and-columns": "^1.1.6",
1308 | "mz": "^2.7.0",
1309 | "pirates": "^4.0.1",
1310 | "ts-interface-checker": "^0.1.9"
1311 | },
1312 | "bin": {
1313 | "sucrase": "bin/sucrase",
1314 | "sucrase-node": "bin/sucrase-node"
1315 | },
1316 | "engines": {
1317 | "node": ">=8"
1318 | }
1319 | },
1320 | "node_modules/thenify": {
1321 | "version": "3.3.1",
1322 | "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
1323 | "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
1324 | "dev": true,
1325 | "dependencies": {
1326 | "any-promise": "^1.0.0"
1327 | }
1328 | },
1329 | "node_modules/thenify-all": {
1330 | "version": "1.6.0",
1331 | "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
1332 | "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
1333 | "dev": true,
1334 | "dependencies": {
1335 | "thenify": ">= 3.1.0 < 4"
1336 | },
1337 | "engines": {
1338 | "node": ">=0.8"
1339 | }
1340 | },
1341 | "node_modules/to-regex-range": {
1342 | "version": "5.0.1",
1343 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
1344 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
1345 | "dev": true,
1346 | "dependencies": {
1347 | "is-number": "^7.0.0"
1348 | },
1349 | "engines": {
1350 | "node": ">=8.0"
1351 | }
1352 | },
1353 | "node_modules/tr46": {
1354 | "version": "1.0.1",
1355 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
1356 | "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==",
1357 | "dev": true,
1358 | "dependencies": {
1359 | "punycode": "^2.1.0"
1360 | }
1361 | },
1362 | "node_modules/tree-kill": {
1363 | "version": "1.2.2",
1364 | "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
1365 | "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
1366 | "dev": true,
1367 | "bin": {
1368 | "tree-kill": "cli.js"
1369 | }
1370 | },
1371 | "node_modules/ts-interface-checker": {
1372 | "version": "0.1.13",
1373 | "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
1374 | "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
1375 | "dev": true
1376 | },
1377 | "node_modules/tsup": {
1378 | "version": "7.1.0",
1379 | "resolved": "https://registry.npmjs.org/tsup/-/tsup-7.1.0.tgz",
1380 | "integrity": "sha512-mazl/GRAk70j8S43/AbSYXGgvRP54oQeX8Un4iZxzATHt0roW0t6HYDVZIXMw0ZQIpvr1nFMniIVnN5186lW7w==",
1381 | "dev": true,
1382 | "dependencies": {
1383 | "bundle-require": "^4.0.0",
1384 | "cac": "^6.7.12",
1385 | "chokidar": "^3.5.1",
1386 | "debug": "^4.3.1",
1387 | "esbuild": "^0.18.2",
1388 | "execa": "^5.0.0",
1389 | "globby": "^11.0.3",
1390 | "joycon": "^3.0.1",
1391 | "postcss-load-config": "^4.0.1",
1392 | "resolve-from": "^5.0.0",
1393 | "rollup": "^3.2.5",
1394 | "source-map": "0.8.0-beta.0",
1395 | "sucrase": "^3.20.3",
1396 | "tree-kill": "^1.2.2"
1397 | },
1398 | "bin": {
1399 | "tsup": "dist/cli-default.js",
1400 | "tsup-node": "dist/cli-node.js"
1401 | },
1402 | "engines": {
1403 | "node": ">=16.14"
1404 | },
1405 | "peerDependencies": {
1406 | "@swc/core": "^1",
1407 | "postcss": "^8.4.12",
1408 | "typescript": ">=4.1.0"
1409 | },
1410 | "peerDependenciesMeta": {
1411 | "@swc/core": {
1412 | "optional": true
1413 | },
1414 | "postcss": {
1415 | "optional": true
1416 | },
1417 | "typescript": {
1418 | "optional": true
1419 | }
1420 | }
1421 | },
1422 | "node_modules/typescript": {
1423 | "version": "5.1.6",
1424 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz",
1425 | "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==",
1426 | "dev": true,
1427 | "bin": {
1428 | "tsc": "bin/tsc",
1429 | "tsserver": "bin/tsserver"
1430 | },
1431 | "engines": {
1432 | "node": ">=14.17"
1433 | }
1434 | },
1435 | "node_modules/webidl-conversions": {
1436 | "version": "4.0.2",
1437 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
1438 | "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
1439 | "dev": true
1440 | },
1441 | "node_modules/whatwg-url": {
1442 | "version": "7.1.0",
1443 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz",
1444 | "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==",
1445 | "dev": true,
1446 | "dependencies": {
1447 | "lodash.sortby": "^4.7.0",
1448 | "tr46": "^1.0.1",
1449 | "webidl-conversions": "^4.0.2"
1450 | }
1451 | },
1452 | "node_modules/which": {
1453 | "version": "2.0.2",
1454 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
1455 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
1456 | "dev": true,
1457 | "dependencies": {
1458 | "isexe": "^2.0.0"
1459 | },
1460 | "bin": {
1461 | "node-which": "bin/node-which"
1462 | },
1463 | "engines": {
1464 | "node": ">= 8"
1465 | }
1466 | },
1467 | "node_modules/wrappy": {
1468 | "version": "1.0.2",
1469 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
1470 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
1471 | "dev": true
1472 | },
1473 | "node_modules/yaml": {
1474 | "version": "2.3.1",
1475 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz",
1476 | "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==",
1477 | "dev": true,
1478 | "engines": {
1479 | "node": ">= 14"
1480 | }
1481 | }
1482 | },
1483 | "dependencies": {
1484 | "@esbuild/android-arm": {
1485 | "version": "0.18.15",
1486 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.15.tgz",
1487 | "integrity": "sha512-wlkQBWb79/jeEEoRmrxt/yhn5T1lU236OCNpnfRzaCJHZ/5gf82uYx1qmADTBWE0AR/v7FiozE1auk2riyQd3w==",
1488 | "dev": true,
1489 | "optional": true
1490 | },
1491 | "@esbuild/android-arm64": {
1492 | "version": "0.18.15",
1493 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.15.tgz",
1494 | "integrity": "sha512-NI/gnWcMl2kXt1HJKOn2H69SYn4YNheKo6NZt1hyfKWdMbaGadxjZIkcj4Gjk/WPxnbFXs9/3HjGHaknCqjrww==",
1495 | "dev": true,
1496 | "optional": true
1497 | },
1498 | "@esbuild/android-x64": {
1499 | "version": "0.18.15",
1500 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.15.tgz",
1501 | "integrity": "sha512-FM9NQamSaEm/IZIhegF76aiLnng1kEsZl2eve/emxDeReVfRuRNmvT28l6hoFD9TsCxpK+i4v8LPpEj74T7yjA==",
1502 | "dev": true,
1503 | "optional": true
1504 | },
1505 | "@esbuild/darwin-arm64": {
1506 | "version": "0.18.15",
1507 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.15.tgz",
1508 | "integrity": "sha512-XmrFwEOYauKte9QjS6hz60FpOCnw4zaPAb7XV7O4lx1r39XjJhTN7ZpXqJh4sN6q60zbP6QwAVVA8N/wUyBH/w==",
1509 | "dev": true,
1510 | "optional": true
1511 | },
1512 | "@esbuild/darwin-x64": {
1513 | "version": "0.18.15",
1514 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.15.tgz",
1515 | "integrity": "sha512-bMqBmpw1e//7Fh5GLetSZaeo9zSC4/CMtrVFdj+bqKPGJuKyfNJ5Nf2m3LknKZTS+Q4oyPiON+v3eaJ59sLB5A==",
1516 | "dev": true,
1517 | "optional": true
1518 | },
1519 | "@esbuild/freebsd-arm64": {
1520 | "version": "0.18.15",
1521 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.15.tgz",
1522 | "integrity": "sha512-LoTK5N3bOmNI9zVLCeTgnk5Rk0WdUTrr9dyDAQGVMrNTh9EAPuNwSTCgaKOKiDpverOa0htPcO9NwslSE5xuLA==",
1523 | "dev": true,
1524 | "optional": true
1525 | },
1526 | "@esbuild/freebsd-x64": {
1527 | "version": "0.18.15",
1528 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.15.tgz",
1529 | "integrity": "sha512-62jX5n30VzgrjAjOk5orYeHFq6sqjvsIj1QesXvn5OZtdt5Gdj0vUNJy9NIpjfdNdqr76jjtzBJKf+h2uzYuTQ==",
1530 | "dev": true,
1531 | "optional": true
1532 | },
1533 | "@esbuild/linux-arm": {
1534 | "version": "0.18.15",
1535 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.15.tgz",
1536 | "integrity": "sha512-dT4URUv6ir45ZkBqhwZwyFV6cH61k8MttIwhThp2BGiVtagYvCToF+Bggyx2VI57RG4Fbt21f9TmXaYx0DeUJg==",
1537 | "dev": true,
1538 | "optional": true
1539 | },
1540 | "@esbuild/linux-arm64": {
1541 | "version": "0.18.15",
1542 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.15.tgz",
1543 | "integrity": "sha512-BWncQeuWDgYv0jTNzJjaNgleduV4tMbQjmk/zpPh/lUdMcNEAxy+jvneDJ6RJkrqloG7tB9S9rCrtfk/kuplsQ==",
1544 | "dev": true,
1545 | "optional": true
1546 | },
1547 | "@esbuild/linux-ia32": {
1548 | "version": "0.18.15",
1549 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.15.tgz",
1550 | "integrity": "sha512-JPXORvgHRHITqfms1dWT/GbEY89u848dC08o0yK3fNskhp0t2TuNUnsrrSgOdH28ceb1hJuwyr8R/1RnyPwocw==",
1551 | "dev": true,
1552 | "optional": true
1553 | },
1554 | "@esbuild/linux-loong64": {
1555 | "version": "0.18.15",
1556 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.15.tgz",
1557 | "integrity": "sha512-kArPI0DopjJCEplsVj/H+2Qgzz7vdFSacHNsgoAKpPS6W/Ndh8Oe24HRDQ5QCu4jHgN6XOtfFfLpRx3TXv/mEg==",
1558 | "dev": true,
1559 | "optional": true
1560 | },
1561 | "@esbuild/linux-mips64el": {
1562 | "version": "0.18.15",
1563 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.15.tgz",
1564 | "integrity": "sha512-b/tmngUfO02E00c1XnNTw/0DmloKjb6XQeqxaYuzGwHe0fHVgx5/D6CWi+XH1DvkszjBUkK9BX7n1ARTOst59w==",
1565 | "dev": true,
1566 | "optional": true
1567 | },
1568 | "@esbuild/linux-ppc64": {
1569 | "version": "0.18.15",
1570 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.15.tgz",
1571 | "integrity": "sha512-KXPY69MWw79QJkyvUYb2ex/OgnN/8N/Aw5UDPlgoRtoEfcBqfeLodPr42UojV3NdkoO4u10NXQdamWm1YEzSKw==",
1572 | "dev": true,
1573 | "optional": true
1574 | },
1575 | "@esbuild/linux-riscv64": {
1576 | "version": "0.18.15",
1577 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.15.tgz",
1578 | "integrity": "sha512-komK3NEAeeGRnvFEjX1SfVg6EmkfIi5aKzevdvJqMydYr9N+pRQK0PGJXk+bhoPZwOUgLO4l99FZmLGk/L1jWg==",
1579 | "dev": true,
1580 | "optional": true
1581 | },
1582 | "@esbuild/linux-s390x": {
1583 | "version": "0.18.15",
1584 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.15.tgz",
1585 | "integrity": "sha512-632T5Ts6gQ2WiMLWRRyeflPAm44u2E/s/TJvn+BP6M5mnHSk93cieaypj3VSMYO2ePTCRqAFXtuYi1yv8uZJNA==",
1586 | "dev": true,
1587 | "optional": true
1588 | },
1589 | "@esbuild/linux-x64": {
1590 | "version": "0.18.15",
1591 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.15.tgz",
1592 | "integrity": "sha512-MsHtX0NgvRHsoOtYkuxyk4Vkmvk3PLRWfA4okK7c+6dT0Fu4SUqXAr9y4Q3d8vUf1VWWb6YutpL4XNe400iQ1g==",
1593 | "dev": true,
1594 | "optional": true
1595 | },
1596 | "@esbuild/netbsd-x64": {
1597 | "version": "0.18.15",
1598 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.15.tgz",
1599 | "integrity": "sha512-djST6s+jQiwxMIVQ5rlt24JFIAr4uwUnzceuFL7BQT4CbrRtqBPueS4GjXSiIpmwVri1Icj/9pFRJ7/aScvT+A==",
1600 | "dev": true,
1601 | "optional": true
1602 | },
1603 | "@esbuild/openbsd-x64": {
1604 | "version": "0.18.15",
1605 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.15.tgz",
1606 | "integrity": "sha512-naeRhUIvhsgeounjkF5mvrNAVMGAm6EJWiabskeE5yOeBbLp7T89tAEw0j5Jm/CZAwyLe3c67zyCWH6fsBLCpw==",
1607 | "dev": true,
1608 | "optional": true
1609 | },
1610 | "@esbuild/sunos-x64": {
1611 | "version": "0.18.15",
1612 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.15.tgz",
1613 | "integrity": "sha512-qkT2+WxyKbNIKV1AEhI8QiSIgTHMcRctzSaa/I3kVgMS5dl3fOeoqkb7pW76KwxHoriImhx7Mg3TwN/auMDsyQ==",
1614 | "dev": true,
1615 | "optional": true
1616 | },
1617 | "@esbuild/win32-arm64": {
1618 | "version": "0.18.15",
1619 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.15.tgz",
1620 | "integrity": "sha512-HC4/feP+pB2Vb+cMPUjAnFyERs+HJN7E6KaeBlFdBv799MhD+aPJlfi/yk36SED58J9TPwI8MAcVpJgej4ud0A==",
1621 | "dev": true,
1622 | "optional": true
1623 | },
1624 | "@esbuild/win32-ia32": {
1625 | "version": "0.18.15",
1626 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.15.tgz",
1627 | "integrity": "sha512-ovjwoRXI+gf52EVF60u9sSDj7myPixPxqzD5CmkEUmvs+W9Xd0iqISVBQn8xcx4ciIaIVlWCuTbYDOXOnOL44Q==",
1628 | "dev": true,
1629 | "optional": true
1630 | },
1631 | "@esbuild/win32-x64": {
1632 | "version": "0.18.15",
1633 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.15.tgz",
1634 | "integrity": "sha512-imUxH9a3WJARyAvrG7srLyiK73XdX83NXQkjKvQ+7vPh3ZxoLrzvPkQKKw2DwZ+RV2ZB6vBfNHP8XScAmQC3aA==",
1635 | "dev": true,
1636 | "optional": true
1637 | },
1638 | "@jridgewell/gen-mapping": {
1639 | "version": "0.3.3",
1640 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
1641 | "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
1642 | "dev": true,
1643 | "requires": {
1644 | "@jridgewell/set-array": "^1.0.1",
1645 | "@jridgewell/sourcemap-codec": "^1.4.10",
1646 | "@jridgewell/trace-mapping": "^0.3.9"
1647 | }
1648 | },
1649 | "@jridgewell/resolve-uri": {
1650 | "version": "3.1.0",
1651 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
1652 | "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
1653 | "dev": true
1654 | },
1655 | "@jridgewell/set-array": {
1656 | "version": "1.1.2",
1657 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
1658 | "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
1659 | "dev": true
1660 | },
1661 | "@jridgewell/sourcemap-codec": {
1662 | "version": "1.4.15",
1663 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
1664 | "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
1665 | "dev": true
1666 | },
1667 | "@jridgewell/trace-mapping": {
1668 | "version": "0.3.18",
1669 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz",
1670 | "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==",
1671 | "dev": true,
1672 | "requires": {
1673 | "@jridgewell/resolve-uri": "3.1.0",
1674 | "@jridgewell/sourcemap-codec": "1.4.14"
1675 | },
1676 | "dependencies": {
1677 | "@jridgewell/sourcemap-codec": {
1678 | "version": "1.4.14",
1679 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
1680 | "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
1681 | "dev": true
1682 | }
1683 | }
1684 | },
1685 | "@nodelib/fs.scandir": {
1686 | "version": "2.1.5",
1687 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
1688 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
1689 | "dev": true,
1690 | "requires": {
1691 | "@nodelib/fs.stat": "2.0.5",
1692 | "run-parallel": "^1.1.9"
1693 | }
1694 | },
1695 | "@nodelib/fs.stat": {
1696 | "version": "2.0.5",
1697 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
1698 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
1699 | "dev": true
1700 | },
1701 | "@nodelib/fs.walk": {
1702 | "version": "1.2.8",
1703 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
1704 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
1705 | "dev": true,
1706 | "requires": {
1707 | "@nodelib/fs.scandir": "2.1.5",
1708 | "fastq": "^1.6.0"
1709 | }
1710 | },
1711 | "any-promise": {
1712 | "version": "1.3.0",
1713 | "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
1714 | "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
1715 | "dev": true
1716 | },
1717 | "anymatch": {
1718 | "version": "3.1.3",
1719 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
1720 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
1721 | "dev": true,
1722 | "requires": {
1723 | "normalize-path": "^3.0.0",
1724 | "picomatch": "^2.0.4"
1725 | }
1726 | },
1727 | "array-union": {
1728 | "version": "2.1.0",
1729 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
1730 | "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
1731 | "dev": true
1732 | },
1733 | "balanced-match": {
1734 | "version": "1.0.2",
1735 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
1736 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
1737 | "dev": true
1738 | },
1739 | "binary-extensions": {
1740 | "version": "2.2.0",
1741 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
1742 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
1743 | "dev": true
1744 | },
1745 | "brace-expansion": {
1746 | "version": "1.1.11",
1747 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
1748 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
1749 | "dev": true,
1750 | "requires": {
1751 | "balanced-match": "^1.0.0",
1752 | "concat-map": "0.0.1"
1753 | }
1754 | },
1755 | "braces": {
1756 | "version": "3.0.2",
1757 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
1758 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
1759 | "dev": true,
1760 | "requires": {
1761 | "fill-range": "^7.0.1"
1762 | }
1763 | },
1764 | "bundle-require": {
1765 | "version": "4.0.1",
1766 | "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-4.0.1.tgz",
1767 | "integrity": "sha512-9NQkRHlNdNpDBGmLpngF3EFDcwodhMUuLz9PaWYciVcQF9SE4LFjM2DB/xV1Li5JiuDMv7ZUWuC3rGbqR0MAXQ==",
1768 | "dev": true,
1769 | "requires": {
1770 | "load-tsconfig": "^0.2.3"
1771 | }
1772 | },
1773 | "cac": {
1774 | "version": "6.7.14",
1775 | "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
1776 | "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==",
1777 | "dev": true
1778 | },
1779 | "chokidar": {
1780 | "version": "3.5.3",
1781 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
1782 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
1783 | "dev": true,
1784 | "requires": {
1785 | "anymatch": "~3.1.2",
1786 | "braces": "~3.0.2",
1787 | "fsevents": "~2.3.2",
1788 | "glob-parent": "~5.1.2",
1789 | "is-binary-path": "~2.1.0",
1790 | "is-glob": "~4.0.1",
1791 | "normalize-path": "~3.0.0",
1792 | "readdirp": "~3.6.0"
1793 | }
1794 | },
1795 | "commander": {
1796 | "version": "4.1.1",
1797 | "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
1798 | "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
1799 | "dev": true
1800 | },
1801 | "concat-map": {
1802 | "version": "0.0.1",
1803 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
1804 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
1805 | "dev": true
1806 | },
1807 | "cross-spawn": {
1808 | "version": "7.0.3",
1809 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
1810 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
1811 | "dev": true,
1812 | "requires": {
1813 | "path-key": "^3.1.0",
1814 | "shebang-command": "^2.0.0",
1815 | "which": "^2.0.1"
1816 | }
1817 | },
1818 | "debug": {
1819 | "version": "4.3.4",
1820 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
1821 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
1822 | "dev": true,
1823 | "requires": {
1824 | "ms": "2.1.2"
1825 | }
1826 | },
1827 | "dir-glob": {
1828 | "version": "3.0.1",
1829 | "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
1830 | "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
1831 | "dev": true,
1832 | "requires": {
1833 | "path-type": "^4.0.0"
1834 | }
1835 | },
1836 | "esbuild": {
1837 | "version": "0.18.15",
1838 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.15.tgz",
1839 | "integrity": "sha512-3WOOLhrvuTGPRzQPU6waSDWrDTnQriia72McWcn6UCi43GhCHrXH4S59hKMeez+IITmdUuUyvbU9JIp+t3xlPQ==",
1840 | "dev": true,
1841 | "requires": {
1842 | "@esbuild/android-arm": "0.18.15",
1843 | "@esbuild/android-arm64": "0.18.15",
1844 | "@esbuild/android-x64": "0.18.15",
1845 | "@esbuild/darwin-arm64": "0.18.15",
1846 | "@esbuild/darwin-x64": "0.18.15",
1847 | "@esbuild/freebsd-arm64": "0.18.15",
1848 | "@esbuild/freebsd-x64": "0.18.15",
1849 | "@esbuild/linux-arm": "0.18.15",
1850 | "@esbuild/linux-arm64": "0.18.15",
1851 | "@esbuild/linux-ia32": "0.18.15",
1852 | "@esbuild/linux-loong64": "0.18.15",
1853 | "@esbuild/linux-mips64el": "0.18.15",
1854 | "@esbuild/linux-ppc64": "0.18.15",
1855 | "@esbuild/linux-riscv64": "0.18.15",
1856 | "@esbuild/linux-s390x": "0.18.15",
1857 | "@esbuild/linux-x64": "0.18.15",
1858 | "@esbuild/netbsd-x64": "0.18.15",
1859 | "@esbuild/openbsd-x64": "0.18.15",
1860 | "@esbuild/sunos-x64": "0.18.15",
1861 | "@esbuild/win32-arm64": "0.18.15",
1862 | "@esbuild/win32-ia32": "0.18.15",
1863 | "@esbuild/win32-x64": "0.18.15"
1864 | }
1865 | },
1866 | "execa": {
1867 | "version": "5.1.1",
1868 | "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
1869 | "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
1870 | "dev": true,
1871 | "requires": {
1872 | "cross-spawn": "^7.0.3",
1873 | "get-stream": "^6.0.0",
1874 | "human-signals": "^2.1.0",
1875 | "is-stream": "^2.0.0",
1876 | "merge-stream": "^2.0.0",
1877 | "npm-run-path": "^4.0.1",
1878 | "onetime": "^5.1.2",
1879 | "signal-exit": "^3.0.3",
1880 | "strip-final-newline": "^2.0.0"
1881 | }
1882 | },
1883 | "fast-glob": {
1884 | "version": "3.3.1",
1885 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz",
1886 | "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==",
1887 | "dev": true,
1888 | "requires": {
1889 | "@nodelib/fs.stat": "^2.0.2",
1890 | "@nodelib/fs.walk": "^1.2.3",
1891 | "glob-parent": "^5.1.2",
1892 | "merge2": "^1.3.0",
1893 | "micromatch": "^4.0.4"
1894 | }
1895 | },
1896 | "fastq": {
1897 | "version": "1.15.0",
1898 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
1899 | "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
1900 | "dev": true,
1901 | "requires": {
1902 | "reusify": "^1.0.4"
1903 | }
1904 | },
1905 | "fill-range": {
1906 | "version": "7.0.1",
1907 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
1908 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
1909 | "dev": true,
1910 | "requires": {
1911 | "to-regex-range": "^5.0.1"
1912 | }
1913 | },
1914 | "fs.realpath": {
1915 | "version": "1.0.0",
1916 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
1917 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
1918 | "dev": true
1919 | },
1920 | "fsevents": {
1921 | "version": "2.3.2",
1922 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
1923 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
1924 | "dev": true,
1925 | "optional": true
1926 | },
1927 | "get-stream": {
1928 | "version": "6.0.1",
1929 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
1930 | "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
1931 | "dev": true
1932 | },
1933 | "glob": {
1934 | "version": "7.1.6",
1935 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
1936 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
1937 | "dev": true,
1938 | "requires": {
1939 | "fs.realpath": "^1.0.0",
1940 | "inflight": "^1.0.4",
1941 | "inherits": "2",
1942 | "minimatch": "^3.0.4",
1943 | "once": "^1.3.0",
1944 | "path-is-absolute": "^1.0.0"
1945 | }
1946 | },
1947 | "glob-parent": {
1948 | "version": "5.1.2",
1949 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
1950 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
1951 | "dev": true,
1952 | "requires": {
1953 | "is-glob": "^4.0.1"
1954 | }
1955 | },
1956 | "globby": {
1957 | "version": "11.1.0",
1958 | "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
1959 | "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
1960 | "dev": true,
1961 | "requires": {
1962 | "array-union": "^2.1.0",
1963 | "dir-glob": "^3.0.1",
1964 | "fast-glob": "^3.2.9",
1965 | "ignore": "^5.2.0",
1966 | "merge2": "^1.4.1",
1967 | "slash": "^3.0.0"
1968 | }
1969 | },
1970 | "human-signals": {
1971 | "version": "2.1.0",
1972 | "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
1973 | "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
1974 | "dev": true
1975 | },
1976 | "ignore": {
1977 | "version": "5.2.4",
1978 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
1979 | "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==",
1980 | "dev": true
1981 | },
1982 | "inflight": {
1983 | "version": "1.0.6",
1984 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
1985 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
1986 | "dev": true,
1987 | "requires": {
1988 | "once": "^1.3.0",
1989 | "wrappy": "1"
1990 | }
1991 | },
1992 | "inherits": {
1993 | "version": "2.0.4",
1994 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
1995 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
1996 | "dev": true
1997 | },
1998 | "is-binary-path": {
1999 | "version": "2.1.0",
2000 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
2001 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
2002 | "dev": true,
2003 | "requires": {
2004 | "binary-extensions": "^2.0.0"
2005 | }
2006 | },
2007 | "is-extglob": {
2008 | "version": "2.1.1",
2009 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
2010 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
2011 | "dev": true
2012 | },
2013 | "is-glob": {
2014 | "version": "4.0.3",
2015 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
2016 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
2017 | "dev": true,
2018 | "requires": {
2019 | "is-extglob": "^2.1.1"
2020 | }
2021 | },
2022 | "is-number": {
2023 | "version": "7.0.0",
2024 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
2025 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
2026 | "dev": true
2027 | },
2028 | "is-stream": {
2029 | "version": "2.0.1",
2030 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
2031 | "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
2032 | "dev": true
2033 | },
2034 | "isexe": {
2035 | "version": "2.0.0",
2036 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
2037 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
2038 | "dev": true
2039 | },
2040 | "joycon": {
2041 | "version": "3.1.1",
2042 | "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz",
2043 | "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==",
2044 | "dev": true
2045 | },
2046 | "lilconfig": {
2047 | "version": "2.1.0",
2048 | "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",
2049 | "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
2050 | "dev": true
2051 | },
2052 | "lines-and-columns": {
2053 | "version": "1.2.4",
2054 | "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
2055 | "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
2056 | "dev": true
2057 | },
2058 | "load-tsconfig": {
2059 | "version": "0.2.5",
2060 | "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz",
2061 | "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==",
2062 | "dev": true
2063 | },
2064 | "lodash.sortby": {
2065 | "version": "4.7.0",
2066 | "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
2067 | "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==",
2068 | "dev": true
2069 | },
2070 | "merge-stream": {
2071 | "version": "2.0.0",
2072 | "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
2073 | "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
2074 | "dev": true
2075 | },
2076 | "merge2": {
2077 | "version": "1.4.1",
2078 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
2079 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
2080 | "dev": true
2081 | },
2082 | "micromatch": {
2083 | "version": "4.0.5",
2084 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
2085 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
2086 | "dev": true,
2087 | "requires": {
2088 | "braces": "^3.0.2",
2089 | "picomatch": "^2.3.1"
2090 | }
2091 | },
2092 | "mimic-fn": {
2093 | "version": "2.1.0",
2094 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
2095 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
2096 | "dev": true
2097 | },
2098 | "minimatch": {
2099 | "version": "3.1.2",
2100 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
2101 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
2102 | "dev": true,
2103 | "requires": {
2104 | "brace-expansion": "^1.1.7"
2105 | }
2106 | },
2107 | "ms": {
2108 | "version": "2.1.2",
2109 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
2110 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
2111 | "dev": true
2112 | },
2113 | "mz": {
2114 | "version": "2.7.0",
2115 | "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
2116 | "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
2117 | "dev": true,
2118 | "requires": {
2119 | "any-promise": "^1.0.0",
2120 | "object-assign": "^4.0.1",
2121 | "thenify-all": "^1.0.0"
2122 | }
2123 | },
2124 | "normalize-path": {
2125 | "version": "3.0.0",
2126 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
2127 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
2128 | "dev": true
2129 | },
2130 | "npm-run-path": {
2131 | "version": "4.0.1",
2132 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
2133 | "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
2134 | "dev": true,
2135 | "requires": {
2136 | "path-key": "^3.0.0"
2137 | }
2138 | },
2139 | "object-assign": {
2140 | "version": "4.1.1",
2141 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
2142 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
2143 | "dev": true
2144 | },
2145 | "once": {
2146 | "version": "1.4.0",
2147 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
2148 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
2149 | "dev": true,
2150 | "requires": {
2151 | "wrappy": "1"
2152 | }
2153 | },
2154 | "onetime": {
2155 | "version": "5.1.2",
2156 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
2157 | "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
2158 | "dev": true,
2159 | "requires": {
2160 | "mimic-fn": "^2.1.0"
2161 | }
2162 | },
2163 | "path-is-absolute": {
2164 | "version": "1.0.1",
2165 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
2166 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
2167 | "dev": true
2168 | },
2169 | "path-key": {
2170 | "version": "3.1.1",
2171 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
2172 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
2173 | "dev": true
2174 | },
2175 | "path-type": {
2176 | "version": "4.0.0",
2177 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
2178 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
2179 | "dev": true
2180 | },
2181 | "picomatch": {
2182 | "version": "2.3.1",
2183 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
2184 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
2185 | "dev": true
2186 | },
2187 | "pirates": {
2188 | "version": "4.0.6",
2189 | "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
2190 | "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
2191 | "dev": true
2192 | },
2193 | "postcss-load-config": {
2194 | "version": "4.0.1",
2195 | "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz",
2196 | "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==",
2197 | "dev": true,
2198 | "requires": {
2199 | "lilconfig": "^2.0.5",
2200 | "yaml": "^2.1.1"
2201 | }
2202 | },
2203 | "punycode": {
2204 | "version": "2.3.0",
2205 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
2206 | "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
2207 | "dev": true
2208 | },
2209 | "queue-microtask": {
2210 | "version": "1.2.3",
2211 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
2212 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
2213 | "dev": true
2214 | },
2215 | "readdirp": {
2216 | "version": "3.6.0",
2217 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
2218 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
2219 | "dev": true,
2220 | "requires": {
2221 | "picomatch": "^2.2.1"
2222 | }
2223 | },
2224 | "resolve-from": {
2225 | "version": "5.0.0",
2226 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
2227 | "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
2228 | "dev": true
2229 | },
2230 | "reusify": {
2231 | "version": "1.0.4",
2232 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
2233 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
2234 | "dev": true
2235 | },
2236 | "rollup": {
2237 | "version": "3.26.3",
2238 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.26.3.tgz",
2239 | "integrity": "sha512-7Tin0C8l86TkpcMtXvQu6saWH93nhG3dGQ1/+l5V2TDMceTxO7kDiK6GzbfLWNNxqJXm591PcEZUozZm51ogwQ==",
2240 | "dev": true,
2241 | "requires": {
2242 | "fsevents": "~2.3.2"
2243 | }
2244 | },
2245 | "run-parallel": {
2246 | "version": "1.2.0",
2247 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
2248 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
2249 | "dev": true,
2250 | "requires": {
2251 | "queue-microtask": "^1.2.2"
2252 | }
2253 | },
2254 | "shebang-command": {
2255 | "version": "2.0.0",
2256 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
2257 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
2258 | "dev": true,
2259 | "requires": {
2260 | "shebang-regex": "^3.0.0"
2261 | }
2262 | },
2263 | "shebang-regex": {
2264 | "version": "3.0.0",
2265 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
2266 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
2267 | "dev": true
2268 | },
2269 | "signal-exit": {
2270 | "version": "3.0.7",
2271 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
2272 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
2273 | "dev": true
2274 | },
2275 | "slash": {
2276 | "version": "3.0.0",
2277 | "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
2278 | "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
2279 | "dev": true
2280 | },
2281 | "source-map": {
2282 | "version": "0.8.0-beta.0",
2283 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz",
2284 | "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==",
2285 | "dev": true,
2286 | "requires": {
2287 | "whatwg-url": "^7.0.0"
2288 | }
2289 | },
2290 | "strip-final-newline": {
2291 | "version": "2.0.0",
2292 | "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
2293 | "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
2294 | "dev": true
2295 | },
2296 | "sucrase": {
2297 | "version": "3.34.0",
2298 | "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz",
2299 | "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==",
2300 | "dev": true,
2301 | "requires": {
2302 | "@jridgewell/gen-mapping": "^0.3.2",
2303 | "commander": "^4.0.0",
2304 | "glob": "7.1.6",
2305 | "lines-and-columns": "^1.1.6",
2306 | "mz": "^2.7.0",
2307 | "pirates": "^4.0.1",
2308 | "ts-interface-checker": "^0.1.9"
2309 | }
2310 | },
2311 | "thenify": {
2312 | "version": "3.3.1",
2313 | "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
2314 | "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
2315 | "dev": true,
2316 | "requires": {
2317 | "any-promise": "^1.0.0"
2318 | }
2319 | },
2320 | "thenify-all": {
2321 | "version": "1.6.0",
2322 | "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
2323 | "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
2324 | "dev": true,
2325 | "requires": {
2326 | "thenify": ">= 3.1.0 < 4"
2327 | }
2328 | },
2329 | "to-regex-range": {
2330 | "version": "5.0.1",
2331 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
2332 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
2333 | "dev": true,
2334 | "requires": {
2335 | "is-number": "^7.0.0"
2336 | }
2337 | },
2338 | "tr46": {
2339 | "version": "1.0.1",
2340 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
2341 | "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==",
2342 | "dev": true,
2343 | "requires": {
2344 | "punycode": "^2.1.0"
2345 | }
2346 | },
2347 | "tree-kill": {
2348 | "version": "1.2.2",
2349 | "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
2350 | "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
2351 | "dev": true
2352 | },
2353 | "ts-interface-checker": {
2354 | "version": "0.1.13",
2355 | "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
2356 | "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
2357 | "dev": true
2358 | },
2359 | "tsup": {
2360 | "version": "7.1.0",
2361 | "resolved": "https://registry.npmjs.org/tsup/-/tsup-7.1.0.tgz",
2362 | "integrity": "sha512-mazl/GRAk70j8S43/AbSYXGgvRP54oQeX8Un4iZxzATHt0roW0t6HYDVZIXMw0ZQIpvr1nFMniIVnN5186lW7w==",
2363 | "dev": true,
2364 | "requires": {
2365 | "bundle-require": "^4.0.0",
2366 | "cac": "^6.7.12",
2367 | "chokidar": "^3.5.1",
2368 | "debug": "^4.3.1",
2369 | "esbuild": "^0.18.2",
2370 | "execa": "^5.0.0",
2371 | "globby": "^11.0.3",
2372 | "joycon": "^3.0.1",
2373 | "postcss-load-config": "^4.0.1",
2374 | "resolve-from": "^5.0.0",
2375 | "rollup": "^3.2.5",
2376 | "source-map": "0.8.0-beta.0",
2377 | "sucrase": "^3.20.3",
2378 | "tree-kill": "^1.2.2"
2379 | }
2380 | },
2381 | "typescript": {
2382 | "version": "5.1.6",
2383 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz",
2384 | "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==",
2385 | "dev": true
2386 | },
2387 | "webidl-conversions": {
2388 | "version": "4.0.2",
2389 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
2390 | "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
2391 | "dev": true
2392 | },
2393 | "whatwg-url": {
2394 | "version": "7.1.0",
2395 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz",
2396 | "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==",
2397 | "dev": true,
2398 | "requires": {
2399 | "lodash.sortby": "^4.7.0",
2400 | "tr46": "^1.0.1",
2401 | "webidl-conversions": "^4.0.2"
2402 | }
2403 | },
2404 | "which": {
2405 | "version": "2.0.2",
2406 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
2407 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
2408 | "dev": true,
2409 | "requires": {
2410 | "isexe": "^2.0.0"
2411 | }
2412 | },
2413 | "wrappy": {
2414 | "version": "1.0.2",
2415 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
2416 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
2417 | "dev": true
2418 | },
2419 | "yaml": {
2420 | "version": "2.3.1",
2421 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz",
2422 | "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==",
2423 | "dev": true
2424 | }
2425 | }
2426 | }
2427 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "scratchable",
3 | "version": "0.0.4",
4 | "description": "A scratch card renderer using HTML Canvas",
5 | "main": "dist/index.js",
6 | "types": "dist/index.d.ts",
7 | "files": [
8 | "dist"
9 | ],
10 | "exports": {
11 | ".": {
12 | "require": {
13 | "types": "./dist/index.d.ts",
14 | "default": "./dist/index.js"
15 | },
16 | "import": {
17 | "types": "./dist/index.d.mts",
18 | "default": "./dist/index.mjs"
19 | }
20 | }
21 | },
22 | "scripts": {
23 | "build": "tsup src/index.ts --format cjs,esm --dts --minify"
24 | },
25 | "repository": {
26 | "type": "git",
27 | "url": "git+https://github.com/HoseungJang/scratchable.git"
28 | },
29 | "author": "HoseungJang",
30 | "license": "MIT",
31 | "bugs": {
32 | "url": "https://github.com/HoseungJang/scratchable/issues"
33 | },
34 | "homepage": "https://github.com/HoseungJang/scratchable#readme",
35 | "devDependencies": {
36 | "tsup": "^7.1.0",
37 | "typescript": "^5.1.6"
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/src/events.ts:
--------------------------------------------------------------------------------
1 | type Handler = (e: E) => void;
2 | type RegisteredHandlersByEvent = Map[]>;
3 |
4 | export class Events {
5 | private readonly registeredHandlersByEvent: RegisteredHandlersByEvent = new Map();
6 | private readonly createEvent: () => E;
7 |
8 | constructor(createEvent: () => E) {
9 | this.createEvent = createEvent;
10 | }
11 |
12 | public on(event: N, handler: Handler) {
13 | const handlers = this.registeredHandlersByEvent.get(event) ?? [];
14 | handlers.push(handler);
15 | this.registeredHandlersByEvent.set(event, handlers);
16 | }
17 |
18 | public off(event: N, handler: Handler) {
19 | const handlers = this.registeredHandlersByEvent.get(event) ?? [];
20 | this.registeredHandlersByEvent.set(
21 | event,
22 | handlers.filter((h) => h !== handler)
23 | );
24 | }
25 |
26 | public emit(event: N) {
27 | const handlers = this.registeredHandlersByEvent.get(event) ?? [];
28 | handlers.forEach((handler) => handler(this.createEvent()));
29 | }
30 |
31 | public purge(event?: N) {
32 | if (event != null) {
33 | this.registeredHandlersByEvent.delete(event);
34 | } else {
35 | this.registeredHandlersByEvent.clear();
36 | }
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/src/index.ts:
--------------------------------------------------------------------------------
1 | import {
2 | MouseScratcher,
3 | Scratcher,
4 | ScratcherEventName,
5 | ScratcherEvent,
6 | ScratcherEventHandler,
7 | ScratcherOptions,
8 | TouchScratcher,
9 | } from "./scratcher";
10 | import { RendererOptions } from "./renderer";
11 |
12 | export type ScratchableEventName = ScratcherEventName;
13 |
14 | export type ScratchableEvent = ScratcherEvent;
15 |
16 | export type ScratchableEventHandler = ScratcherEventHandler;
17 |
18 | export type ScratchableOptions = ScratcherOptions & RendererOptions;
19 |
20 | export class Scratchable {
21 | private readonly scratcher: Scratcher;
22 |
23 | constructor(options: ScratchableOptions) {
24 | this.scratcher = this.isTouchDevice ? new TouchScratcher(options) : new MouseScratcher(options);
25 | }
26 |
27 | private get isTouchDevice() {
28 | return "ontouchstart" in window || navigator.maxTouchPoints > 0;
29 | }
30 |
31 | public async render() {
32 | await this.scratcher.render();
33 | }
34 |
35 | public destroy() {
36 | this.scratcher.destroy();
37 | }
38 |
39 | public addEventListener(event: ScratcherEventName, handler: ScratcherEventHandler) {
40 | this.scratcher.events.on(event, handler);
41 | }
42 |
43 | public removeEventListener(event: ScratcherEventName, handler: ScratcherEventHandler) {
44 | this.scratcher.events.off(event, handler);
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/src/renderer.ts:
--------------------------------------------------------------------------------
1 | export interface RendererOptions {
2 | container: HTMLElement;
3 | background:
4 | | { type: "single"; color: string }
5 | | {
6 | type: "linear-gradient";
7 | gradients: { offset: number; color: string }[];
8 | }
9 | | { type: "image"; url: string };
10 | }
11 |
12 | export class Renderer {
13 | private readonly container: HTMLElement;
14 | private readonly canvas: HTMLCanvasElement;
15 | private readonly ctx: CanvasRenderingContext2D;
16 | private readonly background: RendererOptions["background"];
17 |
18 | constructor(options: RendererOptions) {
19 | this.container = options.container;
20 | this.canvas = document.createElement("canvas");
21 | this.ctx = this.canvas.getContext("2d")!;
22 | this.background = options.background;
23 | }
24 |
25 | public get dpr() {
26 | return window.devicePixelRatio;
27 | }
28 |
29 | public get percentage() {
30 | const { data } = this.ctx.getImageData(0, 0, this.canvas.width, this.canvas.height);
31 | const stride = 32;
32 | const totalPixels = data.length / stride;
33 | let scratchedPixels = 0;
34 |
35 | for (let i = 0; i < data.length; i += stride) {
36 | if (data[i] === 0) {
37 | scratchedPixels++;
38 | }
39 | }
40 | return scratchedPixels / totalPixels;
41 | }
42 |
43 | public async render() {
44 | this.container.style.position = "relative";
45 |
46 | const dpr = window.devicePixelRatio;
47 | const canvasWidth = this.container.offsetWidth * dpr;
48 | const canvasHeight = this.container.offsetHeight * dpr;
49 |
50 | this.canvas.width = canvasWidth;
51 | this.canvas.height = canvasHeight;
52 |
53 | this.canvas.style.width = "100%";
54 | this.canvas.style.height = "100%";
55 | this.canvas.style.position = "absolute";
56 | this.canvas.style.top = "0";
57 | this.canvas.style.left = "0";
58 | this.canvas.style.right = "0";
59 | this.canvas.style.bottom = "0";
60 |
61 | return new Promise((resolve) => {
62 | const renderCanvas = () => {
63 | this.ctx.globalCompositeOperation = "destination-out";
64 | this.container.appendChild(this.canvas);
65 | resolve();
66 | };
67 |
68 | switch (this.background.type) {
69 | case "single": {
70 | this.ctx.fillStyle = this.background.color;
71 | this.ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);
72 | renderCanvas();
73 | return;
74 | }
75 | case "linear-gradient": {
76 | const grd = this.ctx.createLinearGradient(0, 0, this.canvas.width, this.canvas.height);
77 |
78 | this.background.gradients.forEach((gradient) => {
79 | grd.addColorStop(gradient.offset, gradient.color);
80 | });
81 |
82 | this.ctx.fillStyle = grd;
83 | this.ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);
84 | renderCanvas();
85 | return;
86 | }
87 | case "image": {
88 | const image = new Image();
89 |
90 | image.onload = () => {
91 | this.ctx.drawImage(image, 0, 0, this.canvas.width, this.canvas.height);
92 | renderCanvas();
93 | };
94 |
95 | image.src = this.background.url;
96 | return;
97 | }
98 | }
99 | });
100 | }
101 |
102 | public circle(x: number, y: number, radius: number) {
103 | const dpr = this.dpr;
104 |
105 | this.ctx.beginPath();
106 | this.ctx.arc(x * dpr, y * dpr, radius * dpr, 0, 2 * Math.PI);
107 | this.ctx.fill();
108 | }
109 |
110 | public line(from: { x: number; y: number }, to: { x: number; y: number }, width: number) {
111 | const dpr = this.dpr;
112 |
113 | this.ctx.beginPath();
114 | this.ctx.moveTo(from.x * dpr, from.y * dpr);
115 | this.ctx.lineTo(to.x * dpr, to.y * dpr);
116 | this.ctx.lineWidth = width * dpr;
117 | this.ctx.stroke();
118 | }
119 |
120 | public destroy() {
121 | this.container.removeChild(this.canvas);
122 | }
123 | }
124 |
--------------------------------------------------------------------------------
/src/scratcher.ts:
--------------------------------------------------------------------------------
1 | import { Events } from "./events";
2 | import { Renderer, RendererOptions } from "./renderer";
3 |
4 | export type ScratcherEventName = "scratch";
5 |
6 | export interface ScratcherEvent {
7 | percentage: number;
8 | }
9 |
10 | export type ScratcherEventHandler = (e: ScratcherEvent) => void;
11 |
12 | export interface ScratcherOptions extends RendererOptions {
13 | container: HTMLElement;
14 | radius?: number;
15 | onScratch?: ScratcherEventHandler;
16 | }
17 |
18 | export class Scratcher {
19 | protected readonly container: HTMLElement;
20 | private readonly renderer: Renderer;
21 | private readonly radius: number;
22 | public readonly events: Events;
23 |
24 | private prevScratchPosition: { x: number; y: number } | null = null;
25 |
26 | constructor(options: ScratcherOptions) {
27 | this.container = options.container;
28 | this.renderer = new Renderer(options);
29 | this.radius = options.radius ?? 50;
30 | this.events = new Events(() => ({ percentage: this.renderer.percentage }));
31 |
32 | if (options.onScratch != null) {
33 | this.events.on("scratch", options.onScratch);
34 | }
35 | }
36 |
37 | protected move(x: number, y: number) {
38 | this.renderer.circle(x, y, this.radius);
39 |
40 | if (this.prevScratchPosition != null) {
41 | this.renderer.line(this.prevScratchPosition, { x, y }, this.radius * 2);
42 | }
43 |
44 | this.prevScratchPosition = { x, y };
45 | this.events.emit("scratch");
46 | }
47 |
48 | protected end() {
49 | this.prevScratchPosition = null;
50 | }
51 |
52 | public async render() {
53 | await this.renderer.render();
54 | }
55 |
56 | public destroy() {
57 | this.renderer.destroy();
58 | this.events.purge();
59 | }
60 | }
61 |
62 | export class TouchScratcher extends Scratcher {
63 | constructor(options: ScratcherOptions) {
64 | super(options);
65 | this.container.style.touchAction = "none";
66 | }
67 |
68 | private touchmove = (e: TouchEvent) => {
69 | const { left, top } = this.container.getBoundingClientRect();
70 | const { clientX, clientY } = e.changedTouches[0];
71 |
72 | const x = clientX - left;
73 | const y = clientY - top;
74 | this.move(x, y);
75 | };
76 |
77 | private touchend = () => {
78 | this.end();
79 | };
80 |
81 | public async render() {
82 | this.container.addEventListener("touchmove", this.touchmove);
83 | this.container.addEventListener("touchend", this.touchend);
84 | await super.render();
85 | }
86 |
87 | public destory() {
88 | this.container.removeEventListener("touchmove", this.touchmove);
89 | this.container.removeEventListener("touchend", this.touchend);
90 | super.destroy();
91 | }
92 | }
93 |
94 | export class MouseScratcher extends Scratcher {
95 | constructor(options: ScratcherOptions) {
96 | super(options);
97 | }
98 |
99 | private mousemove = (e: MouseEvent) => {
100 | if (e.buttons === 0) {
101 | this.end();
102 | return;
103 | }
104 |
105 | const { left, top } = this.container.getBoundingClientRect();
106 | const { clientX, clientY } = e;
107 |
108 | const x = clientX - left;
109 | const y = clientY - top;
110 | this.move(x, y);
111 | };
112 |
113 | public async render() {
114 | this.container.addEventListener("mousemove", this.mousemove);
115 | await super.render();
116 | }
117 |
118 | public destroy() {
119 | this.container.removeEventListener("mousemove", this.mousemove);
120 | super.destroy();
121 | }
122 | }
123 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "module": "commonjs",
4 | "moduleResolution": "nodenext",
5 | "lib": ["dom", "ESNext"],
6 | "declaration": true,
7 | "strict": true,
8 | "isolatedModules": true,
9 | "skipLibCheck": true
10 | },
11 | "include": ["src"]
12 | }
13 |
--------------------------------------------------------------------------------