├── .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 | --------------------------------------------------------------------------------