├── .editorconfig ├── .github └── workflows │ └── test.yml ├── .gitignore ├── .prettierrc ├── LICENSE ├── README.md ├── aico.jpg ├── package.json ├── pnpm-lock.yaml ├── src ├── AbortError.ts ├── AbortInCoroutines.ts ├── abortify.ts ├── aico.ts ├── cast.ts ├── combinators.ts └── index.ts ├── tests ├── aico.ts └── combinators.ts ├── tsconfig.json └── vitest.config.ts /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_size = 4 5 | indent_style = space 6 | insert_final_newline = true 7 | trim_trailing_whitespace = true -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: test 2 | 3 | on: 4 | - push 5 | - pull_request 6 | 7 | jobs: 8 | run-tests: 9 | runs-on: ubuntu-latest 10 | strategy: 11 | matrix: 12 | node: ['16', '20'] 13 | steps: 14 | - uses: actions/checkout@v4 15 | - uses: pnpm/action-setup@v2 16 | with: 17 | version: 8 18 | - uses: actions/setup-node@v3 19 | with: 20 | node-version: ${{ matrix.node }} 21 | cache: 'pnpm' 22 | - run: pnpm install 23 | - run: pnpm test 24 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | *.lock 3 | *.log 4 | dist 5 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "arrowParens": "avoid", 3 | "semi": false, 4 | "singleQuote": true, 5 | "tabWidth": 4, 6 | "printWidth": 120 7 | } 8 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | ----------- 3 | 4 | Copyright (c) 2020 skt-t1-byungi 5 | Permission is hereby granted, free of charge, to any person 6 | obtaining a copy of this software and associated documentation 7 | files (the "Software"), to deal in the Software without 8 | restriction, including without limitation the rights to use, 9 | copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the 11 | Software is furnished to do so, subject to the following 12 | conditions: 13 | 14 | The above copyright notice and this permission notice shall be 15 | included in all copies or substantial portions of the Software. 16 | 17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 18 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 19 | OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 20 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 21 | HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 22 | WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 23 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 24 | OTHER DEALINGS IN THE SOFTWARE. 25 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # A.I.C.O 🦄 2 | 3 | > **A**bort **I**n **CO**routines (promise) 4 | 5 | [![npm](https://flat.badgen.net/npm/v/aico)](https://www.npmjs.com/package/aico) 6 | [![npm](https://flat.badgen.net/npm/license/aico)](https://github.com/skt-t1-byungi/aico/blob/master/LICENSE) 7 | 8 | Inspired by Redux-Saga's [Task cancellation](https://redux-saga.js.org/docs/advanced/TaskCancellation.html), aico is designed to make promise cancellation simpler and more efficient. With a minimalist API, it integrates seamlessly with [AbortController](https://developer.mozilla.org/docs/Web/API/AbortController) and TypeScript. 9 | 10 | ![aico](./aico.jpg) 11 | 12 | (Title inspired by the Netflix series [A.I.C.O](https://www.netflix.com/title/80161848) on Netflix)) 13 | 14 | ## Example 15 | 16 | ```js 17 | import { aico } from 'aico' 18 | 19 | const promise = aico(function* (signal) { 20 | try { 21 | yield fetch('/delay/100', { signal }) // <= This api takes 100ms. 22 | console.log('1. This is printed.') 23 | 24 | yield fetch('/delay/100', { signal }) // <= This api takes 100ms. 25 | console.log('2. This is not printed.') 26 | } finally { 27 | if (signal.aborted) { 28 | console.log('3. aborted!') 29 | } 30 | } 31 | }) 32 | 33 | promise.catch(err => { 34 | console.log(`4. message: ${err.name}`) 35 | console.log(`5. isAborted: ${err.isAborted}`) 36 | }) 37 | 38 | setTimeout(() => { 39 | promise.abort() // <= After 150ms 40 | }, 150) 41 | ``` 42 | 43 | ``` 44 | > output 45 | 1. This is printed. 46 | 3. aborted! 47 | 4. message: AbortError 48 | 5. isAborted: true 49 | ``` 50 | 51 | ## Install 52 | 53 | ```sh 54 | npm install aico 55 | ``` 56 | 57 | ## API 58 | 59 | ### new AbortInCoroutines(generator, options?) 60 | 61 | Creates an abortable promise. Within the generator function, the `yield` statement behaves like `await` in an async function. 62 | 63 | ```js 64 | import { AbortInCoroutines } from 'aico' 65 | 66 | const promise = new AbortInCoroutines(function* (signal) { 67 | const result = yield Promise.resolve('hello') 68 | return result 69 | }) 70 | ``` 71 | 72 | `signal` parameter is [AbortSignal](https://developer.mozilla.org/docs/Web/API/AbortSignal) that can cancel DOM requests such as fetch. 73 | 74 | ```js 75 | const promise = new AbortInCoroutines(function* (signal) { 76 | const response = yield fetch('/api/request', { signal }) 77 | // ... 78 | }) 79 | 80 | promise.abort() // <= Abort `/api/request` request. 81 | ``` 82 | 83 | `signal` has an `aborted` property that indicates whether the promise was aborted or not. 84 | 85 | ```js 86 | const promise = new AbortInCoroutines(function* (signal) { 87 | try { 88 | /* ... */ 89 | } finally { 90 | if (signal.aborted) { 91 | console.log('aborted!') 92 | } 93 | } 94 | }) 95 | 96 | promise.abort() // => "aborted!" 97 | ``` 98 | 99 | If the yielded promise was created with `AbortInCoroutines`, the cancellation is propagated. 100 | 101 | ```js 102 | const subTask = () => 103 | new AbortInCoroutines(function* (signal) { 104 | try { 105 | /* ... */ 106 | } finally { 107 | if (signal.aborted) { 108 | console.log('subTask is aborted!') 109 | } 110 | } 111 | }) 112 | 113 | const promise = new AbortInCoroutines(function* () { 114 | yield subTask() 115 | }) 116 | 117 | promise.abort() // => "subTask is aborted!" 118 | ``` 119 | 120 | #### options 121 | 122 | ##### signal 123 | 124 | Allows for aborting the promise using an external AbortController signal. 125 | 126 | ```js 127 | const controller = new AbortController() 128 | 129 | const promise = new AbortInCoroutines( 130 | function* (signal) { 131 | /* ... */ 132 | }, 133 | { 134 | signal: controller.signal, 135 | }, 136 | ) 137 | 138 | controller.abort() 139 | ``` 140 | 141 | ##### unhandledRejection 142 | 143 | If set to `true`, an unhandledRejection occurs. Default is `false`. 144 | 145 | ```js 146 | new AbortInCoroutines( 147 | function* () { 148 | /* ... */ 149 | }, 150 | { 151 | unhandledRejection: true, 152 | }, 153 | ).abort() 154 | ``` 155 | 156 | #### promise.isAborted 157 | 158 | Checks if the promise has been aborted. 159 | 160 | ```js 161 | console.log(promise.isAborted) // => false 162 | 163 | promise.abort() 164 | 165 | console.log(promise.isAborted) // => true 166 | ``` 167 | 168 | #### promise.abort() 169 | 170 | Abort the promise manually. 171 | 172 | ### aico(generator, options?) 173 | 174 | A shorthand function as an alternative to `new AbortInCoroutines()`. 175 | 176 | ```js 177 | import { aico } from 'aico' 178 | 179 | const promise = aico(function* (signal) { 180 | /* ... */ 181 | }) 182 | ``` 183 | 184 | ### Combinators 185 | 186 | #### all(values) 187 | 188 | An abortable version of [`Promise.all()`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Promise/all). If one promise rejects, all other promises are automatically aborted. 189 | 190 | #### race(values) 191 | 192 | An abortable version of [`Promise.race()`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Promise/race). If one promise rejects, all other promises are automatically aborted. 193 | 194 | #### any(values) 195 | 196 | An abortable version of [`Promise.any()`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Promise/any). 197 | 198 | #### allSettled(values) 199 | 200 | An abortable version of [`Promise.allSettled()`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Promise/allSettled). 201 | 202 | ### cast(promise) 203 | 204 | When working with TypeScript, you may find type inference challenging for yielded promises. 205 | 206 | ```ts 207 | import { aico, cast } from 'aico' 208 | 209 | const promise = aico(function* () { 210 | const data = (yield fetchData()) as { value: string } 211 | 212 | // or 213 | const data = (yield fetchData()) as Awaited> 214 | }) 215 | ``` 216 | 217 | Use `cast` for better type inference. 218 | 219 | ```ts 220 | import { aico, cast } from 'aico' 221 | 222 | const promise = aico(function* () { 223 | const data = yield* cast(fetchData()) 224 | }) 225 | ``` 226 | 227 | ## License 228 | 229 | MIT © [skt-t1-byungi](https://github.com/) 230 | -------------------------------------------------------------------------------- /aico.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/skt-t1-byungi/aico/b20ce1073e95c21604e51105462f020b2fc64d20/aico.jpg -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "aico", 3 | "description": "abort in coroutines (promise)", 4 | "version": "1.0.1", 5 | "repository": { 6 | "type": "git", 7 | "url": "https://github.com/skt-t1-byungi/aico.git" 8 | }, 9 | "homepage": "https://github.com/skt-t1-byungi/aico.git", 10 | "author": "skt-t1-byungi ", 11 | "engines": { 12 | "node": ">=15.0.0" 13 | }, 14 | "keywords": [ 15 | "coroutine", 16 | "generator", 17 | "async", 18 | "promise", 19 | "abort", 20 | "AbortController", 21 | "AbortSignal", 22 | "abortable", 23 | "cancelable", 24 | "cancellation" 25 | ], 26 | "license": "MIT", 27 | "main": "./dist/index.js", 28 | "types": "./dist/index.d.ts", 29 | "files": [ 30 | "dist" 31 | ], 32 | "exports": { 33 | "require": "./dist/index.js", 34 | "import": "./dist/index.mjs" 35 | }, 36 | "scripts": { 37 | "build": "tsup src/index.ts --format esm,cjs --dts --clean", 38 | "test": "vitest run", 39 | "prepublishOnly": "npm run test && npm run build" 40 | }, 41 | "devDependencies": { 42 | "@types/node": "^20.12.7", 43 | "prettier": "^3.2.5", 44 | "tsup": "^8.0.2", 45 | "typescript": "^5.4.5", 46 | "vitest": "^1.5.0" 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | .: 9 | devDependencies: 10 | '@types/node': 11 | specifier: ^20.12.7 12 | version: 20.12.7 13 | prettier: 14 | specifier: ^3.2.5 15 | version: 3.2.5 16 | tsup: 17 | specifier: ^8.0.2 18 | version: 8.0.2(postcss@8.4.38)(typescript@5.4.5) 19 | typescript: 20 | specifier: ^5.4.5 21 | version: 5.4.5 22 | vitest: 23 | specifier: ^1.5.0 24 | version: 1.5.0(@types/node@20.12.7) 25 | 26 | packages: 27 | '@esbuild/aix-ppc64@0.19.12': 28 | resolution: 29 | { 30 | integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==, 31 | } 32 | engines: { node: '>=12' } 33 | cpu: [ppc64] 34 | os: [aix] 35 | 36 | '@esbuild/aix-ppc64@0.20.2': 37 | resolution: 38 | { 39 | integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==, 40 | } 41 | engines: { node: '>=12' } 42 | cpu: [ppc64] 43 | os: [aix] 44 | 45 | '@esbuild/android-arm64@0.19.12': 46 | resolution: 47 | { 48 | integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==, 49 | } 50 | engines: { node: '>=12' } 51 | cpu: [arm64] 52 | os: [android] 53 | 54 | '@esbuild/android-arm64@0.20.2': 55 | resolution: 56 | { 57 | integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==, 58 | } 59 | engines: { node: '>=12' } 60 | cpu: [arm64] 61 | os: [android] 62 | 63 | '@esbuild/android-arm@0.19.12': 64 | resolution: 65 | { 66 | integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==, 67 | } 68 | engines: { node: '>=12' } 69 | cpu: [arm] 70 | os: [android] 71 | 72 | '@esbuild/android-arm@0.20.2': 73 | resolution: 74 | { 75 | integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==, 76 | } 77 | engines: { node: '>=12' } 78 | cpu: [arm] 79 | os: [android] 80 | 81 | '@esbuild/android-x64@0.19.12': 82 | resolution: 83 | { 84 | integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==, 85 | } 86 | engines: { node: '>=12' } 87 | cpu: [x64] 88 | os: [android] 89 | 90 | '@esbuild/android-x64@0.20.2': 91 | resolution: 92 | { 93 | integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==, 94 | } 95 | engines: { node: '>=12' } 96 | cpu: [x64] 97 | os: [android] 98 | 99 | '@esbuild/darwin-arm64@0.19.12': 100 | resolution: 101 | { 102 | integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==, 103 | } 104 | engines: { node: '>=12' } 105 | cpu: [arm64] 106 | os: [darwin] 107 | 108 | '@esbuild/darwin-arm64@0.20.2': 109 | resolution: 110 | { 111 | integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==, 112 | } 113 | engines: { node: '>=12' } 114 | cpu: [arm64] 115 | os: [darwin] 116 | 117 | '@esbuild/darwin-x64@0.19.12': 118 | resolution: 119 | { 120 | integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==, 121 | } 122 | engines: { node: '>=12' } 123 | cpu: [x64] 124 | os: [darwin] 125 | 126 | '@esbuild/darwin-x64@0.20.2': 127 | resolution: 128 | { 129 | integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==, 130 | } 131 | engines: { node: '>=12' } 132 | cpu: [x64] 133 | os: [darwin] 134 | 135 | '@esbuild/freebsd-arm64@0.19.12': 136 | resolution: 137 | { 138 | integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==, 139 | } 140 | engines: { node: '>=12' } 141 | cpu: [arm64] 142 | os: [freebsd] 143 | 144 | '@esbuild/freebsd-arm64@0.20.2': 145 | resolution: 146 | { 147 | integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==, 148 | } 149 | engines: { node: '>=12' } 150 | cpu: [arm64] 151 | os: [freebsd] 152 | 153 | '@esbuild/freebsd-x64@0.19.12': 154 | resolution: 155 | { 156 | integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==, 157 | } 158 | engines: { node: '>=12' } 159 | cpu: [x64] 160 | os: [freebsd] 161 | 162 | '@esbuild/freebsd-x64@0.20.2': 163 | resolution: 164 | { 165 | integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==, 166 | } 167 | engines: { node: '>=12' } 168 | cpu: [x64] 169 | os: [freebsd] 170 | 171 | '@esbuild/linux-arm64@0.19.12': 172 | resolution: 173 | { 174 | integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==, 175 | } 176 | engines: { node: '>=12' } 177 | cpu: [arm64] 178 | os: [linux] 179 | 180 | '@esbuild/linux-arm64@0.20.2': 181 | resolution: 182 | { 183 | integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==, 184 | } 185 | engines: { node: '>=12' } 186 | cpu: [arm64] 187 | os: [linux] 188 | 189 | '@esbuild/linux-arm@0.19.12': 190 | resolution: 191 | { 192 | integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==, 193 | } 194 | engines: { node: '>=12' } 195 | cpu: [arm] 196 | os: [linux] 197 | 198 | '@esbuild/linux-arm@0.20.2': 199 | resolution: 200 | { 201 | integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==, 202 | } 203 | engines: { node: '>=12' } 204 | cpu: [arm] 205 | os: [linux] 206 | 207 | '@esbuild/linux-ia32@0.19.12': 208 | resolution: 209 | { 210 | integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==, 211 | } 212 | engines: { node: '>=12' } 213 | cpu: [ia32] 214 | os: [linux] 215 | 216 | '@esbuild/linux-ia32@0.20.2': 217 | resolution: 218 | { 219 | integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==, 220 | } 221 | engines: { node: '>=12' } 222 | cpu: [ia32] 223 | os: [linux] 224 | 225 | '@esbuild/linux-loong64@0.19.12': 226 | resolution: 227 | { 228 | integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==, 229 | } 230 | engines: { node: '>=12' } 231 | cpu: [loong64] 232 | os: [linux] 233 | 234 | '@esbuild/linux-loong64@0.20.2': 235 | resolution: 236 | { 237 | integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==, 238 | } 239 | engines: { node: '>=12' } 240 | cpu: [loong64] 241 | os: [linux] 242 | 243 | '@esbuild/linux-mips64el@0.19.12': 244 | resolution: 245 | { 246 | integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==, 247 | } 248 | engines: { node: '>=12' } 249 | cpu: [mips64el] 250 | os: [linux] 251 | 252 | '@esbuild/linux-mips64el@0.20.2': 253 | resolution: 254 | { 255 | integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==, 256 | } 257 | engines: { node: '>=12' } 258 | cpu: [mips64el] 259 | os: [linux] 260 | 261 | '@esbuild/linux-ppc64@0.19.12': 262 | resolution: 263 | { 264 | integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==, 265 | } 266 | engines: { node: '>=12' } 267 | cpu: [ppc64] 268 | os: [linux] 269 | 270 | '@esbuild/linux-ppc64@0.20.2': 271 | resolution: 272 | { 273 | integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==, 274 | } 275 | engines: { node: '>=12' } 276 | cpu: [ppc64] 277 | os: [linux] 278 | 279 | '@esbuild/linux-riscv64@0.19.12': 280 | resolution: 281 | { 282 | integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==, 283 | } 284 | engines: { node: '>=12' } 285 | cpu: [riscv64] 286 | os: [linux] 287 | 288 | '@esbuild/linux-riscv64@0.20.2': 289 | resolution: 290 | { 291 | integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==, 292 | } 293 | engines: { node: '>=12' } 294 | cpu: [riscv64] 295 | os: [linux] 296 | 297 | '@esbuild/linux-s390x@0.19.12': 298 | resolution: 299 | { 300 | integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==, 301 | } 302 | engines: { node: '>=12' } 303 | cpu: [s390x] 304 | os: [linux] 305 | 306 | '@esbuild/linux-s390x@0.20.2': 307 | resolution: 308 | { 309 | integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==, 310 | } 311 | engines: { node: '>=12' } 312 | cpu: [s390x] 313 | os: [linux] 314 | 315 | '@esbuild/linux-x64@0.19.12': 316 | resolution: 317 | { 318 | integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==, 319 | } 320 | engines: { node: '>=12' } 321 | cpu: [x64] 322 | os: [linux] 323 | 324 | '@esbuild/linux-x64@0.20.2': 325 | resolution: 326 | { 327 | integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==, 328 | } 329 | engines: { node: '>=12' } 330 | cpu: [x64] 331 | os: [linux] 332 | 333 | '@esbuild/netbsd-x64@0.19.12': 334 | resolution: 335 | { 336 | integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==, 337 | } 338 | engines: { node: '>=12' } 339 | cpu: [x64] 340 | os: [netbsd] 341 | 342 | '@esbuild/netbsd-x64@0.20.2': 343 | resolution: 344 | { 345 | integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==, 346 | } 347 | engines: { node: '>=12' } 348 | cpu: [x64] 349 | os: [netbsd] 350 | 351 | '@esbuild/openbsd-x64@0.19.12': 352 | resolution: 353 | { 354 | integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==, 355 | } 356 | engines: { node: '>=12' } 357 | cpu: [x64] 358 | os: [openbsd] 359 | 360 | '@esbuild/openbsd-x64@0.20.2': 361 | resolution: 362 | { 363 | integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==, 364 | } 365 | engines: { node: '>=12' } 366 | cpu: [x64] 367 | os: [openbsd] 368 | 369 | '@esbuild/sunos-x64@0.19.12': 370 | resolution: 371 | { 372 | integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==, 373 | } 374 | engines: { node: '>=12' } 375 | cpu: [x64] 376 | os: [sunos] 377 | 378 | '@esbuild/sunos-x64@0.20.2': 379 | resolution: 380 | { 381 | integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==, 382 | } 383 | engines: { node: '>=12' } 384 | cpu: [x64] 385 | os: [sunos] 386 | 387 | '@esbuild/win32-arm64@0.19.12': 388 | resolution: 389 | { 390 | integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==, 391 | } 392 | engines: { node: '>=12' } 393 | cpu: [arm64] 394 | os: [win32] 395 | 396 | '@esbuild/win32-arm64@0.20.2': 397 | resolution: 398 | { 399 | integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==, 400 | } 401 | engines: { node: '>=12' } 402 | cpu: [arm64] 403 | os: [win32] 404 | 405 | '@esbuild/win32-ia32@0.19.12': 406 | resolution: 407 | { 408 | integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==, 409 | } 410 | engines: { node: '>=12' } 411 | cpu: [ia32] 412 | os: [win32] 413 | 414 | '@esbuild/win32-ia32@0.20.2': 415 | resolution: 416 | { 417 | integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==, 418 | } 419 | engines: { node: '>=12' } 420 | cpu: [ia32] 421 | os: [win32] 422 | 423 | '@esbuild/win32-x64@0.19.12': 424 | resolution: 425 | { 426 | integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==, 427 | } 428 | engines: { node: '>=12' } 429 | cpu: [x64] 430 | os: [win32] 431 | 432 | '@esbuild/win32-x64@0.20.2': 433 | resolution: 434 | { 435 | integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==, 436 | } 437 | engines: { node: '>=12' } 438 | cpu: [x64] 439 | os: [win32] 440 | 441 | '@isaacs/cliui@8.0.2': 442 | resolution: 443 | { 444 | integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==, 445 | } 446 | engines: { node: '>=12' } 447 | 448 | '@jest/schemas@29.6.3': 449 | resolution: 450 | { 451 | integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==, 452 | } 453 | engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } 454 | 455 | '@jridgewell/gen-mapping@0.3.5': 456 | resolution: 457 | { 458 | integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==, 459 | } 460 | engines: { node: '>=6.0.0' } 461 | 462 | '@jridgewell/resolve-uri@3.1.2': 463 | resolution: 464 | { 465 | integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==, 466 | } 467 | engines: { node: '>=6.0.0' } 468 | 469 | '@jridgewell/set-array@1.2.1': 470 | resolution: 471 | { 472 | integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==, 473 | } 474 | engines: { node: '>=6.0.0' } 475 | 476 | '@jridgewell/sourcemap-codec@1.4.15': 477 | resolution: 478 | { 479 | integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==, 480 | } 481 | 482 | '@jridgewell/trace-mapping@0.3.25': 483 | resolution: 484 | { 485 | integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==, 486 | } 487 | 488 | '@nodelib/fs.scandir@2.1.5': 489 | resolution: 490 | { 491 | integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, 492 | } 493 | engines: { node: '>= 8' } 494 | 495 | '@nodelib/fs.stat@2.0.5': 496 | resolution: 497 | { 498 | integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, 499 | } 500 | engines: { node: '>= 8' } 501 | 502 | '@nodelib/fs.walk@1.2.8': 503 | resolution: 504 | { 505 | integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, 506 | } 507 | engines: { node: '>= 8' } 508 | 509 | '@pkgjs/parseargs@0.11.0': 510 | resolution: 511 | { 512 | integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==, 513 | } 514 | engines: { node: '>=14' } 515 | 516 | '@rollup/rollup-android-arm-eabi@4.16.1': 517 | resolution: 518 | { 519 | integrity: sha512-92/y0TqNLRYOTXpm6Z7mnpvKAG9P7qmK7yJeRJSdzElNCUnsgbpAsGqerUboYRIQKzgfq4pWu9xVkgpWLfmNsw==, 520 | } 521 | cpu: [arm] 522 | os: [android] 523 | 524 | '@rollup/rollup-android-arm64@4.16.1': 525 | resolution: 526 | { 527 | integrity: sha512-ttWB6ZCfRLuDIUiE0yiu5gcqOsYjA5F7kEV1ggHMj20FwLZ8A1FMeahZJFl/pnOmcnD2QL0z4AcDuo27utGU8A==, 528 | } 529 | cpu: [arm64] 530 | os: [android] 531 | 532 | '@rollup/rollup-darwin-arm64@4.16.1': 533 | resolution: 534 | { 535 | integrity: sha512-QLDvPLetbqjHojTGFw9+nuSP3YY/iz2k1cep6crYlr97sS+ZJ0W43b8Z0zC00+lnFZj6JSNxiA4DjboNQMuh1A==, 536 | } 537 | cpu: [arm64] 538 | os: [darwin] 539 | 540 | '@rollup/rollup-darwin-x64@4.16.1': 541 | resolution: 542 | { 543 | integrity: sha512-TAUK/D8khRrRIa1KwRzo8JNKk3tcqaeXWdtsiLgA8zmACWwlWLjPCJ4DULGHQrMkeBjp1Cd3Yuwx04lZgFx5Vg==, 544 | } 545 | cpu: [x64] 546 | os: [darwin] 547 | 548 | '@rollup/rollup-linux-arm-gnueabihf@4.16.1': 549 | resolution: 550 | { 551 | integrity: sha512-KO+WGZjrh6zyFTD1alIFkfdtxf8B4BC+hqd3kBZHscPLvE5FR/6QKsyuCT0JlERxxYBSUKNUQ/UHyX5uwO1x2A==, 552 | } 553 | cpu: [arm] 554 | os: [linux] 555 | 556 | '@rollup/rollup-linux-arm-musleabihf@4.16.1': 557 | resolution: 558 | { 559 | integrity: sha512-NqxbllzIB1WoAo4ThUXVtd21iiM5IHMTTXmXySKBLVcZvkU0HIZmatlP7hLzb5yQubcmdIeWmncd2NdsjocEiw==, 560 | } 561 | cpu: [arm] 562 | os: [linux] 563 | 564 | '@rollup/rollup-linux-arm64-gnu@4.16.1': 565 | resolution: 566 | { 567 | integrity: sha512-snma5NvV8y7IECQ5rq0sr0f3UUu+92NVmG/913JXJMcXo84h9ak9TA5UI9Cl2XRM9j3m37QwDBtEYnJzRkSmxA==, 568 | } 569 | cpu: [arm64] 570 | os: [linux] 571 | 572 | '@rollup/rollup-linux-arm64-musl@4.16.1': 573 | resolution: 574 | { 575 | integrity: sha512-KOvqGprlD84ueivhCi2flvcUwDRD20mAsE3vxQNVEI2Di9tnPGAfEu6UcrSPZbM+jG2w1oSr43hrPo0RNg6GGg==, 576 | } 577 | cpu: [arm64] 578 | os: [linux] 579 | 580 | '@rollup/rollup-linux-powerpc64le-gnu@4.16.1': 581 | resolution: 582 | { 583 | integrity: sha512-/gsNwtiGLqYwN4vP+EIdUC6Q6LTlpupWqokqIndvZcjn9ig/5P01WyaYCU2wvfL/2Z82jp5kX8c1mDBOvCP3zg==, 584 | } 585 | cpu: [ppc64] 586 | os: [linux] 587 | 588 | '@rollup/rollup-linux-riscv64-gnu@4.16.1': 589 | resolution: 590 | { 591 | integrity: sha512-uU8zuGkQfGqfD9w6VRJZI4IuG4JIfNxxJgEmLMAmPVHREKGsxFVfgHy5c6CexQF2vOfgjB33OsET3Vdn2lln9A==, 592 | } 593 | cpu: [riscv64] 594 | os: [linux] 595 | 596 | '@rollup/rollup-linux-s390x-gnu@4.16.1': 597 | resolution: 598 | { 599 | integrity: sha512-lsjLtDgtcGFEuBP6yrXwkRN5/wKlvUZtfbKZZu0yaoNpiBL4epgnO21osAALIspVRnl4qZgyLFd8xjCYYWgwfw==, 600 | } 601 | cpu: [s390x] 602 | os: [linux] 603 | 604 | '@rollup/rollup-linux-x64-gnu@4.16.1': 605 | resolution: 606 | { 607 | integrity: sha512-N2ZizKhUryqqrMfdCnjhJhZRgv61C6gK+hwVtCIKC8ts8J+go+vqENnGexwg21nHIOvLN5mBM8a7DI2vlyIOPg==, 608 | } 609 | cpu: [x64] 610 | os: [linux] 611 | 612 | '@rollup/rollup-linux-x64-musl@4.16.1': 613 | resolution: 614 | { 615 | integrity: sha512-5ICeMxqg66FrOA2AbnBQ2TJVxfvZsKLxmof0ibvPLaYtbsJqnTUtJOofgWb46Gjd4uZcA4rdsp4JCxegzQPqCg==, 616 | } 617 | cpu: [x64] 618 | os: [linux] 619 | 620 | '@rollup/rollup-win32-arm64-msvc@4.16.1': 621 | resolution: 622 | { 623 | integrity: sha512-1vIP6Ce02L+qWD7uZYRiFiuAJo3m9kARatWmFSnss0gZnVj2Id7OPUU9gm49JPGasgcR3xMqiH3fqBJ8t00yVg==, 624 | } 625 | cpu: [arm64] 626 | os: [win32] 627 | 628 | '@rollup/rollup-win32-ia32-msvc@4.16.1': 629 | resolution: 630 | { 631 | integrity: sha512-Y3M92DcVsT6LoP+wrKpoUWPaazaP1fzbNkp0a0ZSj5Y//+pQVfVe/tQdsYQQy7dwXR30ZfALUIc9PCh9Izir6w==, 632 | } 633 | cpu: [ia32] 634 | os: [win32] 635 | 636 | '@rollup/rollup-win32-x64-msvc@4.16.1': 637 | resolution: 638 | { 639 | integrity: sha512-x0fvpHMuF7fK5r8oZxSi8VYXkrVmRgubXpO/wcf15Lk3xZ4Jvvh5oG+u7Su1776A7XzVKZhD2eRc4t7H50gL3w==, 640 | } 641 | cpu: [x64] 642 | os: [win32] 643 | 644 | '@sinclair/typebox@0.27.8': 645 | resolution: 646 | { 647 | integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==, 648 | } 649 | 650 | '@types/estree@1.0.5': 651 | resolution: 652 | { 653 | integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==, 654 | } 655 | 656 | '@types/node@20.12.7': 657 | resolution: 658 | { 659 | integrity: sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==, 660 | } 661 | 662 | '@vitest/expect@1.5.0': 663 | resolution: 664 | { 665 | integrity: sha512-0pzuCI6KYi2SIC3LQezmxujU9RK/vwC1U9R0rLuGlNGcOuDWxqWKu6nUdFsX9tH1WU0SXtAxToOsEjeUn1s3hA==, 666 | } 667 | 668 | '@vitest/runner@1.5.0': 669 | resolution: 670 | { 671 | integrity: sha512-7HWwdxXP5yDoe7DTpbif9l6ZmDwCzcSIK38kTSIt6CFEpMjX4EpCgT6wUmS0xTXqMI6E/ONmfgRKmaujpabjZQ==, 672 | } 673 | 674 | '@vitest/snapshot@1.5.0': 675 | resolution: 676 | { 677 | integrity: sha512-qpv3fSEuNrhAO3FpH6YYRdaECnnRjg9VxbhdtPwPRnzSfHVXnNzzrpX4cJxqiwgRMo7uRMWDFBlsBq4Cr+rO3A==, 678 | } 679 | 680 | '@vitest/spy@1.5.0': 681 | resolution: 682 | { 683 | integrity: sha512-vu6vi6ew5N5MMHJjD5PoakMRKYdmIrNJmyfkhRpQt5d9Ewhw9nZ5Aqynbi3N61bvk9UvZ5UysMT6ayIrZ8GA9w==, 684 | } 685 | 686 | '@vitest/utils@1.5.0': 687 | resolution: 688 | { 689 | integrity: sha512-BDU0GNL8MWkRkSRdNFvCUCAVOeHaUlVJ9Tx0TYBZyXaaOTmGtUFObzchCivIBrIwKzvZA7A9sCejVhXM2aY98A==, 690 | } 691 | 692 | acorn-walk@8.3.2: 693 | resolution: 694 | { 695 | integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==, 696 | } 697 | engines: { node: '>=0.4.0' } 698 | 699 | acorn@8.11.3: 700 | resolution: 701 | { 702 | integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==, 703 | } 704 | engines: { node: '>=0.4.0' } 705 | hasBin: true 706 | 707 | ansi-regex@5.0.1: 708 | resolution: 709 | { 710 | integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, 711 | } 712 | engines: { node: '>=8' } 713 | 714 | ansi-regex@6.0.1: 715 | resolution: 716 | { 717 | integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==, 718 | } 719 | engines: { node: '>=12' } 720 | 721 | ansi-styles@4.3.0: 722 | resolution: 723 | { 724 | integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, 725 | } 726 | engines: { node: '>=8' } 727 | 728 | ansi-styles@5.2.0: 729 | resolution: 730 | { 731 | integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==, 732 | } 733 | engines: { node: '>=10' } 734 | 735 | ansi-styles@6.2.1: 736 | resolution: 737 | { 738 | integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==, 739 | } 740 | engines: { node: '>=12' } 741 | 742 | any-promise@1.3.0: 743 | resolution: 744 | { 745 | integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==, 746 | } 747 | 748 | anymatch@3.1.3: 749 | resolution: 750 | { 751 | integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, 752 | } 753 | engines: { node: '>= 8' } 754 | 755 | array-union@2.1.0: 756 | resolution: 757 | { 758 | integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==, 759 | } 760 | engines: { node: '>=8' } 761 | 762 | assertion-error@1.1.0: 763 | resolution: 764 | { 765 | integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==, 766 | } 767 | 768 | balanced-match@1.0.2: 769 | resolution: 770 | { 771 | integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, 772 | } 773 | 774 | binary-extensions@2.3.0: 775 | resolution: 776 | { 777 | integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==, 778 | } 779 | engines: { node: '>=8' } 780 | 781 | brace-expansion@2.0.1: 782 | resolution: 783 | { 784 | integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==, 785 | } 786 | 787 | braces@3.0.2: 788 | resolution: 789 | { 790 | integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==, 791 | } 792 | engines: { node: '>=8' } 793 | 794 | bundle-require@4.0.3: 795 | resolution: 796 | { 797 | integrity: sha512-2iscZ3fcthP2vka4Y7j277YJevwmsby/FpFDwjgw34Nl7dtCpt7zz/4TexmHMzY6KZEih7En9ImlbbgUNNQGtA==, 798 | } 799 | engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } 800 | peerDependencies: 801 | esbuild: '>=0.17' 802 | 803 | cac@6.7.14: 804 | resolution: 805 | { 806 | integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==, 807 | } 808 | engines: { node: '>=8' } 809 | 810 | chai@4.4.1: 811 | resolution: 812 | { 813 | integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==, 814 | } 815 | engines: { node: '>=4' } 816 | 817 | check-error@1.0.3: 818 | resolution: 819 | { 820 | integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==, 821 | } 822 | 823 | chokidar@3.6.0: 824 | resolution: 825 | { 826 | integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==, 827 | } 828 | engines: { node: '>= 8.10.0' } 829 | 830 | color-convert@2.0.1: 831 | resolution: 832 | { 833 | integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, 834 | } 835 | engines: { node: '>=7.0.0' } 836 | 837 | color-name@1.1.4: 838 | resolution: 839 | { 840 | integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, 841 | } 842 | 843 | commander@4.1.1: 844 | resolution: 845 | { 846 | integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==, 847 | } 848 | engines: { node: '>= 6' } 849 | 850 | confbox@0.1.7: 851 | resolution: 852 | { 853 | integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==, 854 | } 855 | 856 | cross-spawn@7.0.3: 857 | resolution: 858 | { 859 | integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==, 860 | } 861 | engines: { node: '>= 8' } 862 | 863 | debug@4.3.4: 864 | resolution: 865 | { 866 | integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, 867 | } 868 | engines: { node: '>=6.0' } 869 | peerDependencies: 870 | supports-color: '*' 871 | peerDependenciesMeta: 872 | supports-color: 873 | optional: true 874 | 875 | deep-eql@4.1.3: 876 | resolution: 877 | { 878 | integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==, 879 | } 880 | engines: { node: '>=6' } 881 | 882 | diff-sequences@29.6.3: 883 | resolution: 884 | { 885 | integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==, 886 | } 887 | engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } 888 | 889 | dir-glob@3.0.1: 890 | resolution: 891 | { 892 | integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==, 893 | } 894 | engines: { node: '>=8' } 895 | 896 | eastasianwidth@0.2.0: 897 | resolution: 898 | { 899 | integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==, 900 | } 901 | 902 | emoji-regex@8.0.0: 903 | resolution: 904 | { 905 | integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, 906 | } 907 | 908 | emoji-regex@9.2.2: 909 | resolution: 910 | { 911 | integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==, 912 | } 913 | 914 | esbuild@0.19.12: 915 | resolution: 916 | { 917 | integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==, 918 | } 919 | engines: { node: '>=12' } 920 | hasBin: true 921 | 922 | esbuild@0.20.2: 923 | resolution: 924 | { 925 | integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==, 926 | } 927 | engines: { node: '>=12' } 928 | hasBin: true 929 | 930 | estree-walker@3.0.3: 931 | resolution: 932 | { 933 | integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==, 934 | } 935 | 936 | execa@5.1.1: 937 | resolution: 938 | { 939 | integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==, 940 | } 941 | engines: { node: '>=10' } 942 | 943 | execa@8.0.1: 944 | resolution: 945 | { 946 | integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==, 947 | } 948 | engines: { node: '>=16.17' } 949 | 950 | fast-glob@3.3.2: 951 | resolution: 952 | { 953 | integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==, 954 | } 955 | engines: { node: '>=8.6.0' } 956 | 957 | fastq@1.17.1: 958 | resolution: 959 | { 960 | integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==, 961 | } 962 | 963 | fill-range@7.0.1: 964 | resolution: 965 | { 966 | integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==, 967 | } 968 | engines: { node: '>=8' } 969 | 970 | foreground-child@3.1.1: 971 | resolution: 972 | { 973 | integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==, 974 | } 975 | engines: { node: '>=14' } 976 | 977 | fsevents@2.3.3: 978 | resolution: 979 | { 980 | integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, 981 | } 982 | engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } 983 | os: [darwin] 984 | 985 | get-func-name@2.0.2: 986 | resolution: 987 | { 988 | integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==, 989 | } 990 | 991 | get-stream@6.0.1: 992 | resolution: 993 | { 994 | integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==, 995 | } 996 | engines: { node: '>=10' } 997 | 998 | get-stream@8.0.1: 999 | resolution: 1000 | { 1001 | integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==, 1002 | } 1003 | engines: { node: '>=16' } 1004 | 1005 | glob-parent@5.1.2: 1006 | resolution: 1007 | { 1008 | integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, 1009 | } 1010 | engines: { node: '>= 6' } 1011 | 1012 | glob@10.3.12: 1013 | resolution: 1014 | { 1015 | integrity: sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==, 1016 | } 1017 | engines: { node: '>=16 || 14 >=14.17' } 1018 | hasBin: true 1019 | 1020 | globby@11.1.0: 1021 | resolution: 1022 | { 1023 | integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==, 1024 | } 1025 | engines: { node: '>=10' } 1026 | 1027 | human-signals@2.1.0: 1028 | resolution: 1029 | { 1030 | integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==, 1031 | } 1032 | engines: { node: '>=10.17.0' } 1033 | 1034 | human-signals@5.0.0: 1035 | resolution: 1036 | { 1037 | integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==, 1038 | } 1039 | engines: { node: '>=16.17.0' } 1040 | 1041 | ignore@5.3.1: 1042 | resolution: 1043 | { 1044 | integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==, 1045 | } 1046 | engines: { node: '>= 4' } 1047 | 1048 | is-binary-path@2.1.0: 1049 | resolution: 1050 | { 1051 | integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, 1052 | } 1053 | engines: { node: '>=8' } 1054 | 1055 | is-extglob@2.1.1: 1056 | resolution: 1057 | { 1058 | integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, 1059 | } 1060 | engines: { node: '>=0.10.0' } 1061 | 1062 | is-fullwidth-code-point@3.0.0: 1063 | resolution: 1064 | { 1065 | integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, 1066 | } 1067 | engines: { node: '>=8' } 1068 | 1069 | is-glob@4.0.3: 1070 | resolution: 1071 | { 1072 | integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, 1073 | } 1074 | engines: { node: '>=0.10.0' } 1075 | 1076 | is-number@7.0.0: 1077 | resolution: 1078 | { 1079 | integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, 1080 | } 1081 | engines: { node: '>=0.12.0' } 1082 | 1083 | is-stream@2.0.1: 1084 | resolution: 1085 | { 1086 | integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==, 1087 | } 1088 | engines: { node: '>=8' } 1089 | 1090 | is-stream@3.0.0: 1091 | resolution: 1092 | { 1093 | integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==, 1094 | } 1095 | engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } 1096 | 1097 | isexe@2.0.0: 1098 | resolution: 1099 | { 1100 | integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, 1101 | } 1102 | 1103 | jackspeak@2.3.6: 1104 | resolution: 1105 | { 1106 | integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==, 1107 | } 1108 | engines: { node: '>=14' } 1109 | 1110 | joycon@3.1.1: 1111 | resolution: 1112 | { 1113 | integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==, 1114 | } 1115 | engines: { node: '>=10' } 1116 | 1117 | js-tokens@9.0.0: 1118 | resolution: 1119 | { 1120 | integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==, 1121 | } 1122 | 1123 | lilconfig@3.1.1: 1124 | resolution: 1125 | { 1126 | integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==, 1127 | } 1128 | engines: { node: '>=14' } 1129 | 1130 | lines-and-columns@1.2.4: 1131 | resolution: 1132 | { 1133 | integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==, 1134 | } 1135 | 1136 | load-tsconfig@0.2.5: 1137 | resolution: 1138 | { 1139 | integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==, 1140 | } 1141 | engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } 1142 | 1143 | local-pkg@0.5.0: 1144 | resolution: 1145 | { 1146 | integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==, 1147 | } 1148 | engines: { node: '>=14' } 1149 | 1150 | lodash.sortby@4.7.0: 1151 | resolution: 1152 | { 1153 | integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==, 1154 | } 1155 | 1156 | loupe@2.3.7: 1157 | resolution: 1158 | { 1159 | integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==, 1160 | } 1161 | 1162 | lru-cache@10.2.0: 1163 | resolution: 1164 | { 1165 | integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==, 1166 | } 1167 | engines: { node: 14 || >=16.14 } 1168 | 1169 | magic-string@0.30.10: 1170 | resolution: 1171 | { 1172 | integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==, 1173 | } 1174 | 1175 | merge-stream@2.0.0: 1176 | resolution: 1177 | { 1178 | integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==, 1179 | } 1180 | 1181 | merge2@1.4.1: 1182 | resolution: 1183 | { 1184 | integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, 1185 | } 1186 | engines: { node: '>= 8' } 1187 | 1188 | micromatch@4.0.5: 1189 | resolution: 1190 | { 1191 | integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==, 1192 | } 1193 | engines: { node: '>=8.6' } 1194 | 1195 | mimic-fn@2.1.0: 1196 | resolution: 1197 | { 1198 | integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==, 1199 | } 1200 | engines: { node: '>=6' } 1201 | 1202 | mimic-fn@4.0.0: 1203 | resolution: 1204 | { 1205 | integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==, 1206 | } 1207 | engines: { node: '>=12' } 1208 | 1209 | minimatch@9.0.4: 1210 | resolution: 1211 | { 1212 | integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==, 1213 | } 1214 | engines: { node: '>=16 || 14 >=14.17' } 1215 | 1216 | minipass@7.0.4: 1217 | resolution: 1218 | { 1219 | integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==, 1220 | } 1221 | engines: { node: '>=16 || 14 >=14.17' } 1222 | 1223 | mlly@1.6.1: 1224 | resolution: 1225 | { 1226 | integrity: sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==, 1227 | } 1228 | 1229 | ms@2.1.2: 1230 | resolution: 1231 | { 1232 | integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, 1233 | } 1234 | 1235 | mz@2.7.0: 1236 | resolution: 1237 | { 1238 | integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==, 1239 | } 1240 | 1241 | nanoid@3.3.7: 1242 | resolution: 1243 | { 1244 | integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==, 1245 | } 1246 | engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } 1247 | hasBin: true 1248 | 1249 | normalize-path@3.0.0: 1250 | resolution: 1251 | { 1252 | integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, 1253 | } 1254 | engines: { node: '>=0.10.0' } 1255 | 1256 | npm-run-path@4.0.1: 1257 | resolution: 1258 | { 1259 | integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==, 1260 | } 1261 | engines: { node: '>=8' } 1262 | 1263 | npm-run-path@5.3.0: 1264 | resolution: 1265 | { 1266 | integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==, 1267 | } 1268 | engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } 1269 | 1270 | object-assign@4.1.1: 1271 | resolution: 1272 | { 1273 | integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==, 1274 | } 1275 | engines: { node: '>=0.10.0' } 1276 | 1277 | onetime@5.1.2: 1278 | resolution: 1279 | { 1280 | integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==, 1281 | } 1282 | engines: { node: '>=6' } 1283 | 1284 | onetime@6.0.0: 1285 | resolution: 1286 | { 1287 | integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==, 1288 | } 1289 | engines: { node: '>=12' } 1290 | 1291 | p-limit@5.0.0: 1292 | resolution: 1293 | { 1294 | integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==, 1295 | } 1296 | engines: { node: '>=18' } 1297 | 1298 | path-key@3.1.1: 1299 | resolution: 1300 | { 1301 | integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, 1302 | } 1303 | engines: { node: '>=8' } 1304 | 1305 | path-key@4.0.0: 1306 | resolution: 1307 | { 1308 | integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==, 1309 | } 1310 | engines: { node: '>=12' } 1311 | 1312 | path-scurry@1.10.2: 1313 | resolution: 1314 | { 1315 | integrity: sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==, 1316 | } 1317 | engines: { node: '>=16 || 14 >=14.17' } 1318 | 1319 | path-type@4.0.0: 1320 | resolution: 1321 | { 1322 | integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==, 1323 | } 1324 | engines: { node: '>=8' } 1325 | 1326 | pathe@1.1.2: 1327 | resolution: 1328 | { 1329 | integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==, 1330 | } 1331 | 1332 | pathval@1.1.1: 1333 | resolution: 1334 | { 1335 | integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==, 1336 | } 1337 | 1338 | picocolors@1.0.0: 1339 | resolution: 1340 | { 1341 | integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==, 1342 | } 1343 | 1344 | picomatch@2.3.1: 1345 | resolution: 1346 | { 1347 | integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, 1348 | } 1349 | engines: { node: '>=8.6' } 1350 | 1351 | pirates@4.0.6: 1352 | resolution: 1353 | { 1354 | integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==, 1355 | } 1356 | engines: { node: '>= 6' } 1357 | 1358 | pkg-types@1.1.0: 1359 | resolution: 1360 | { 1361 | integrity: sha512-/RpmvKdxKf8uILTtoOhAgf30wYbP2Qw+L9p3Rvshx1JZVX+XQNZQFjlbmGHEGIm4CkVPlSn+NXmIM8+9oWQaSA==, 1362 | } 1363 | 1364 | postcss-load-config@4.0.2: 1365 | resolution: 1366 | { 1367 | integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==, 1368 | } 1369 | engines: { node: '>= 14' } 1370 | peerDependencies: 1371 | postcss: '>=8.0.9' 1372 | ts-node: '>=9.0.0' 1373 | peerDependenciesMeta: 1374 | postcss: 1375 | optional: true 1376 | ts-node: 1377 | optional: true 1378 | 1379 | postcss@8.4.38: 1380 | resolution: 1381 | { 1382 | integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==, 1383 | } 1384 | engines: { node: ^10 || ^12 || >=14 } 1385 | 1386 | prettier@3.2.5: 1387 | resolution: 1388 | { 1389 | integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==, 1390 | } 1391 | engines: { node: '>=14' } 1392 | hasBin: true 1393 | 1394 | pretty-format@29.7.0: 1395 | resolution: 1396 | { 1397 | integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==, 1398 | } 1399 | engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } 1400 | 1401 | punycode@2.3.1: 1402 | resolution: 1403 | { 1404 | integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==, 1405 | } 1406 | engines: { node: '>=6' } 1407 | 1408 | queue-microtask@1.2.3: 1409 | resolution: 1410 | { 1411 | integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, 1412 | } 1413 | 1414 | react-is@18.2.0: 1415 | resolution: 1416 | { 1417 | integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==, 1418 | } 1419 | 1420 | readdirp@3.6.0: 1421 | resolution: 1422 | { 1423 | integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, 1424 | } 1425 | engines: { node: '>=8.10.0' } 1426 | 1427 | resolve-from@5.0.0: 1428 | resolution: 1429 | { 1430 | integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==, 1431 | } 1432 | engines: { node: '>=8' } 1433 | 1434 | reusify@1.0.4: 1435 | resolution: 1436 | { 1437 | integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==, 1438 | } 1439 | engines: { iojs: '>=1.0.0', node: '>=0.10.0' } 1440 | 1441 | rollup@4.16.1: 1442 | resolution: 1443 | { 1444 | integrity: sha512-5CaD3MPDlPKfhqzRvWXK96G6ELJfPZNb3LHiZxTHgDdC6jvwfGz2E8nY+9g1ONk4ttHsK1WaFP19Js4PSr1E3g==, 1445 | } 1446 | engines: { node: '>=18.0.0', npm: '>=8.0.0' } 1447 | hasBin: true 1448 | 1449 | run-parallel@1.2.0: 1450 | resolution: 1451 | { 1452 | integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, 1453 | } 1454 | 1455 | shebang-command@2.0.0: 1456 | resolution: 1457 | { 1458 | integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, 1459 | } 1460 | engines: { node: '>=8' } 1461 | 1462 | shebang-regex@3.0.0: 1463 | resolution: 1464 | { 1465 | integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, 1466 | } 1467 | engines: { node: '>=8' } 1468 | 1469 | siginfo@2.0.0: 1470 | resolution: 1471 | { 1472 | integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==, 1473 | } 1474 | 1475 | signal-exit@3.0.7: 1476 | resolution: 1477 | { 1478 | integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, 1479 | } 1480 | 1481 | signal-exit@4.1.0: 1482 | resolution: 1483 | { 1484 | integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==, 1485 | } 1486 | engines: { node: '>=14' } 1487 | 1488 | slash@3.0.0: 1489 | resolution: 1490 | { 1491 | integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==, 1492 | } 1493 | engines: { node: '>=8' } 1494 | 1495 | source-map-js@1.2.0: 1496 | resolution: 1497 | { 1498 | integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==, 1499 | } 1500 | engines: { node: '>=0.10.0' } 1501 | 1502 | source-map@0.8.0-beta.0: 1503 | resolution: 1504 | { 1505 | integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==, 1506 | } 1507 | engines: { node: '>= 8' } 1508 | 1509 | stackback@0.0.2: 1510 | resolution: 1511 | { 1512 | integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==, 1513 | } 1514 | 1515 | std-env@3.7.0: 1516 | resolution: 1517 | { 1518 | integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==, 1519 | } 1520 | 1521 | string-width@4.2.3: 1522 | resolution: 1523 | { 1524 | integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==, 1525 | } 1526 | engines: { node: '>=8' } 1527 | 1528 | string-width@5.1.2: 1529 | resolution: 1530 | { 1531 | integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==, 1532 | } 1533 | engines: { node: '>=12' } 1534 | 1535 | strip-ansi@6.0.1: 1536 | resolution: 1537 | { 1538 | integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, 1539 | } 1540 | engines: { node: '>=8' } 1541 | 1542 | strip-ansi@7.1.0: 1543 | resolution: 1544 | { 1545 | integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==, 1546 | } 1547 | engines: { node: '>=12' } 1548 | 1549 | strip-final-newline@2.0.0: 1550 | resolution: 1551 | { 1552 | integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==, 1553 | } 1554 | engines: { node: '>=6' } 1555 | 1556 | strip-final-newline@3.0.0: 1557 | resolution: 1558 | { 1559 | integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==, 1560 | } 1561 | engines: { node: '>=12' } 1562 | 1563 | strip-literal@2.1.0: 1564 | resolution: 1565 | { 1566 | integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==, 1567 | } 1568 | 1569 | sucrase@3.35.0: 1570 | resolution: 1571 | { 1572 | integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==, 1573 | } 1574 | engines: { node: '>=16 || 14 >=14.17' } 1575 | hasBin: true 1576 | 1577 | thenify-all@1.6.0: 1578 | resolution: 1579 | { 1580 | integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==, 1581 | } 1582 | engines: { node: '>=0.8' } 1583 | 1584 | thenify@3.3.1: 1585 | resolution: 1586 | { 1587 | integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==, 1588 | } 1589 | 1590 | tinybench@2.8.0: 1591 | resolution: 1592 | { 1593 | integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==, 1594 | } 1595 | 1596 | tinypool@0.8.4: 1597 | resolution: 1598 | { 1599 | integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==, 1600 | } 1601 | engines: { node: '>=14.0.0' } 1602 | 1603 | tinyspy@2.2.1: 1604 | resolution: 1605 | { 1606 | integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==, 1607 | } 1608 | engines: { node: '>=14.0.0' } 1609 | 1610 | to-regex-range@5.0.1: 1611 | resolution: 1612 | { 1613 | integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, 1614 | } 1615 | engines: { node: '>=8.0' } 1616 | 1617 | tr46@1.0.1: 1618 | resolution: 1619 | { 1620 | integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==, 1621 | } 1622 | 1623 | tree-kill@1.2.2: 1624 | resolution: 1625 | { 1626 | integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==, 1627 | } 1628 | hasBin: true 1629 | 1630 | ts-interface-checker@0.1.13: 1631 | resolution: 1632 | { 1633 | integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==, 1634 | } 1635 | 1636 | tsup@8.0.2: 1637 | resolution: 1638 | { 1639 | integrity: sha512-NY8xtQXdH7hDUAZwcQdY/Vzlw9johQsaqf7iwZ6g1DOUlFYQ5/AtVAjTvihhEyeRlGo4dLRVHtrRaL35M1daqQ==, 1640 | } 1641 | engines: { node: '>=18' } 1642 | hasBin: true 1643 | peerDependencies: 1644 | '@microsoft/api-extractor': ^7.36.0 1645 | '@swc/core': ^1 1646 | postcss: ^8.4.12 1647 | typescript: '>=4.5.0' 1648 | peerDependenciesMeta: 1649 | '@microsoft/api-extractor': 1650 | optional: true 1651 | '@swc/core': 1652 | optional: true 1653 | postcss: 1654 | optional: true 1655 | typescript: 1656 | optional: true 1657 | 1658 | type-detect@4.0.8: 1659 | resolution: 1660 | { 1661 | integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==, 1662 | } 1663 | engines: { node: '>=4' } 1664 | 1665 | typescript@5.4.5: 1666 | resolution: 1667 | { 1668 | integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==, 1669 | } 1670 | engines: { node: '>=14.17' } 1671 | hasBin: true 1672 | 1673 | ufo@1.5.3: 1674 | resolution: 1675 | { 1676 | integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==, 1677 | } 1678 | 1679 | undici-types@5.26.5: 1680 | resolution: 1681 | { 1682 | integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==, 1683 | } 1684 | 1685 | vite-node@1.5.0: 1686 | resolution: 1687 | { 1688 | integrity: sha512-tV8h6gMj6vPzVCa7l+VGq9lwoJjW8Y79vst8QZZGiuRAfijU+EEWuc0kFpmndQrWhMMhet1jdSF+40KSZUqIIw==, 1689 | } 1690 | engines: { node: ^18.0.0 || >=20.0.0 } 1691 | hasBin: true 1692 | 1693 | vite@5.2.10: 1694 | resolution: 1695 | { 1696 | integrity: sha512-PAzgUZbP7msvQvqdSD+ErD5qGnSFiGOoWmV5yAKUEI0kdhjbH6nMWVyZQC/hSc4aXwc0oJ9aEdIiF9Oje0JFCw==, 1697 | } 1698 | engines: { node: ^18.0.0 || >=20.0.0 } 1699 | hasBin: true 1700 | peerDependencies: 1701 | '@types/node': ^18.0.0 || >=20.0.0 1702 | less: '*' 1703 | lightningcss: ^1.21.0 1704 | sass: '*' 1705 | stylus: '*' 1706 | sugarss: '*' 1707 | terser: ^5.4.0 1708 | peerDependenciesMeta: 1709 | '@types/node': 1710 | optional: true 1711 | less: 1712 | optional: true 1713 | lightningcss: 1714 | optional: true 1715 | sass: 1716 | optional: true 1717 | stylus: 1718 | optional: true 1719 | sugarss: 1720 | optional: true 1721 | terser: 1722 | optional: true 1723 | 1724 | vitest@1.5.0: 1725 | resolution: 1726 | { 1727 | integrity: sha512-d8UKgR0m2kjdxDWX6911uwxout6GHS0XaGH1cksSIVVG8kRlE7G7aBw7myKQCvDI5dT4j7ZMa+l706BIORMDLw==, 1728 | } 1729 | engines: { node: ^18.0.0 || >=20.0.0 } 1730 | hasBin: true 1731 | peerDependencies: 1732 | '@edge-runtime/vm': '*' 1733 | '@types/node': ^18.0.0 || >=20.0.0 1734 | '@vitest/browser': 1.5.0 1735 | '@vitest/ui': 1.5.0 1736 | happy-dom: '*' 1737 | jsdom: '*' 1738 | peerDependenciesMeta: 1739 | '@edge-runtime/vm': 1740 | optional: true 1741 | '@types/node': 1742 | optional: true 1743 | '@vitest/browser': 1744 | optional: true 1745 | '@vitest/ui': 1746 | optional: true 1747 | happy-dom: 1748 | optional: true 1749 | jsdom: 1750 | optional: true 1751 | 1752 | webidl-conversions@4.0.2: 1753 | resolution: 1754 | { 1755 | integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==, 1756 | } 1757 | 1758 | whatwg-url@7.1.0: 1759 | resolution: 1760 | { 1761 | integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==, 1762 | } 1763 | 1764 | which@2.0.2: 1765 | resolution: 1766 | { 1767 | integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, 1768 | } 1769 | engines: { node: '>= 8' } 1770 | hasBin: true 1771 | 1772 | why-is-node-running@2.2.2: 1773 | resolution: 1774 | { 1775 | integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==, 1776 | } 1777 | engines: { node: '>=8' } 1778 | hasBin: true 1779 | 1780 | wrap-ansi@7.0.0: 1781 | resolution: 1782 | { 1783 | integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==, 1784 | } 1785 | engines: { node: '>=10' } 1786 | 1787 | wrap-ansi@8.1.0: 1788 | resolution: 1789 | { 1790 | integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==, 1791 | } 1792 | engines: { node: '>=12' } 1793 | 1794 | yaml@2.4.1: 1795 | resolution: 1796 | { 1797 | integrity: sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==, 1798 | } 1799 | engines: { node: '>= 14' } 1800 | hasBin: true 1801 | 1802 | yocto-queue@1.0.0: 1803 | resolution: 1804 | { 1805 | integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==, 1806 | } 1807 | engines: { node: '>=12.20' } 1808 | 1809 | snapshots: 1810 | '@esbuild/aix-ppc64@0.19.12': 1811 | optional: true 1812 | 1813 | '@esbuild/aix-ppc64@0.20.2': 1814 | optional: true 1815 | 1816 | '@esbuild/android-arm64@0.19.12': 1817 | optional: true 1818 | 1819 | '@esbuild/android-arm64@0.20.2': 1820 | optional: true 1821 | 1822 | '@esbuild/android-arm@0.19.12': 1823 | optional: true 1824 | 1825 | '@esbuild/android-arm@0.20.2': 1826 | optional: true 1827 | 1828 | '@esbuild/android-x64@0.19.12': 1829 | optional: true 1830 | 1831 | '@esbuild/android-x64@0.20.2': 1832 | optional: true 1833 | 1834 | '@esbuild/darwin-arm64@0.19.12': 1835 | optional: true 1836 | 1837 | '@esbuild/darwin-arm64@0.20.2': 1838 | optional: true 1839 | 1840 | '@esbuild/darwin-x64@0.19.12': 1841 | optional: true 1842 | 1843 | '@esbuild/darwin-x64@0.20.2': 1844 | optional: true 1845 | 1846 | '@esbuild/freebsd-arm64@0.19.12': 1847 | optional: true 1848 | 1849 | '@esbuild/freebsd-arm64@0.20.2': 1850 | optional: true 1851 | 1852 | '@esbuild/freebsd-x64@0.19.12': 1853 | optional: true 1854 | 1855 | '@esbuild/freebsd-x64@0.20.2': 1856 | optional: true 1857 | 1858 | '@esbuild/linux-arm64@0.19.12': 1859 | optional: true 1860 | 1861 | '@esbuild/linux-arm64@0.20.2': 1862 | optional: true 1863 | 1864 | '@esbuild/linux-arm@0.19.12': 1865 | optional: true 1866 | 1867 | '@esbuild/linux-arm@0.20.2': 1868 | optional: true 1869 | 1870 | '@esbuild/linux-ia32@0.19.12': 1871 | optional: true 1872 | 1873 | '@esbuild/linux-ia32@0.20.2': 1874 | optional: true 1875 | 1876 | '@esbuild/linux-loong64@0.19.12': 1877 | optional: true 1878 | 1879 | '@esbuild/linux-loong64@0.20.2': 1880 | optional: true 1881 | 1882 | '@esbuild/linux-mips64el@0.19.12': 1883 | optional: true 1884 | 1885 | '@esbuild/linux-mips64el@0.20.2': 1886 | optional: true 1887 | 1888 | '@esbuild/linux-ppc64@0.19.12': 1889 | optional: true 1890 | 1891 | '@esbuild/linux-ppc64@0.20.2': 1892 | optional: true 1893 | 1894 | '@esbuild/linux-riscv64@0.19.12': 1895 | optional: true 1896 | 1897 | '@esbuild/linux-riscv64@0.20.2': 1898 | optional: true 1899 | 1900 | '@esbuild/linux-s390x@0.19.12': 1901 | optional: true 1902 | 1903 | '@esbuild/linux-s390x@0.20.2': 1904 | optional: true 1905 | 1906 | '@esbuild/linux-x64@0.19.12': 1907 | optional: true 1908 | 1909 | '@esbuild/linux-x64@0.20.2': 1910 | optional: true 1911 | 1912 | '@esbuild/netbsd-x64@0.19.12': 1913 | optional: true 1914 | 1915 | '@esbuild/netbsd-x64@0.20.2': 1916 | optional: true 1917 | 1918 | '@esbuild/openbsd-x64@0.19.12': 1919 | optional: true 1920 | 1921 | '@esbuild/openbsd-x64@0.20.2': 1922 | optional: true 1923 | 1924 | '@esbuild/sunos-x64@0.19.12': 1925 | optional: true 1926 | 1927 | '@esbuild/sunos-x64@0.20.2': 1928 | optional: true 1929 | 1930 | '@esbuild/win32-arm64@0.19.12': 1931 | optional: true 1932 | 1933 | '@esbuild/win32-arm64@0.20.2': 1934 | optional: true 1935 | 1936 | '@esbuild/win32-ia32@0.19.12': 1937 | optional: true 1938 | 1939 | '@esbuild/win32-ia32@0.20.2': 1940 | optional: true 1941 | 1942 | '@esbuild/win32-x64@0.19.12': 1943 | optional: true 1944 | 1945 | '@esbuild/win32-x64@0.20.2': 1946 | optional: true 1947 | 1948 | '@isaacs/cliui@8.0.2': 1949 | dependencies: 1950 | string-width: 5.1.2 1951 | string-width-cjs: string-width@4.2.3 1952 | strip-ansi: 7.1.0 1953 | strip-ansi-cjs: strip-ansi@6.0.1 1954 | wrap-ansi: 8.1.0 1955 | wrap-ansi-cjs: wrap-ansi@7.0.0 1956 | 1957 | '@jest/schemas@29.6.3': 1958 | dependencies: 1959 | '@sinclair/typebox': 0.27.8 1960 | 1961 | '@jridgewell/gen-mapping@0.3.5': 1962 | dependencies: 1963 | '@jridgewell/set-array': 1.2.1 1964 | '@jridgewell/sourcemap-codec': 1.4.15 1965 | '@jridgewell/trace-mapping': 0.3.25 1966 | 1967 | '@jridgewell/resolve-uri@3.1.2': {} 1968 | 1969 | '@jridgewell/set-array@1.2.1': {} 1970 | 1971 | '@jridgewell/sourcemap-codec@1.4.15': {} 1972 | 1973 | '@jridgewell/trace-mapping@0.3.25': 1974 | dependencies: 1975 | '@jridgewell/resolve-uri': 3.1.2 1976 | '@jridgewell/sourcemap-codec': 1.4.15 1977 | 1978 | '@nodelib/fs.scandir@2.1.5': 1979 | dependencies: 1980 | '@nodelib/fs.stat': 2.0.5 1981 | run-parallel: 1.2.0 1982 | 1983 | '@nodelib/fs.stat@2.0.5': {} 1984 | 1985 | '@nodelib/fs.walk@1.2.8': 1986 | dependencies: 1987 | '@nodelib/fs.scandir': 2.1.5 1988 | fastq: 1.17.1 1989 | 1990 | '@pkgjs/parseargs@0.11.0': 1991 | optional: true 1992 | 1993 | '@rollup/rollup-android-arm-eabi@4.16.1': 1994 | optional: true 1995 | 1996 | '@rollup/rollup-android-arm64@4.16.1': 1997 | optional: true 1998 | 1999 | '@rollup/rollup-darwin-arm64@4.16.1': 2000 | optional: true 2001 | 2002 | '@rollup/rollup-darwin-x64@4.16.1': 2003 | optional: true 2004 | 2005 | '@rollup/rollup-linux-arm-gnueabihf@4.16.1': 2006 | optional: true 2007 | 2008 | '@rollup/rollup-linux-arm-musleabihf@4.16.1': 2009 | optional: true 2010 | 2011 | '@rollup/rollup-linux-arm64-gnu@4.16.1': 2012 | optional: true 2013 | 2014 | '@rollup/rollup-linux-arm64-musl@4.16.1': 2015 | optional: true 2016 | 2017 | '@rollup/rollup-linux-powerpc64le-gnu@4.16.1': 2018 | optional: true 2019 | 2020 | '@rollup/rollup-linux-riscv64-gnu@4.16.1': 2021 | optional: true 2022 | 2023 | '@rollup/rollup-linux-s390x-gnu@4.16.1': 2024 | optional: true 2025 | 2026 | '@rollup/rollup-linux-x64-gnu@4.16.1': 2027 | optional: true 2028 | 2029 | '@rollup/rollup-linux-x64-musl@4.16.1': 2030 | optional: true 2031 | 2032 | '@rollup/rollup-win32-arm64-msvc@4.16.1': 2033 | optional: true 2034 | 2035 | '@rollup/rollup-win32-ia32-msvc@4.16.1': 2036 | optional: true 2037 | 2038 | '@rollup/rollup-win32-x64-msvc@4.16.1': 2039 | optional: true 2040 | 2041 | '@sinclair/typebox@0.27.8': {} 2042 | 2043 | '@types/estree@1.0.5': {} 2044 | 2045 | '@types/node@20.12.7': 2046 | dependencies: 2047 | undici-types: 5.26.5 2048 | 2049 | '@vitest/expect@1.5.0': 2050 | dependencies: 2051 | '@vitest/spy': 1.5.0 2052 | '@vitest/utils': 1.5.0 2053 | chai: 4.4.1 2054 | 2055 | '@vitest/runner@1.5.0': 2056 | dependencies: 2057 | '@vitest/utils': 1.5.0 2058 | p-limit: 5.0.0 2059 | pathe: 1.1.2 2060 | 2061 | '@vitest/snapshot@1.5.0': 2062 | dependencies: 2063 | magic-string: 0.30.10 2064 | pathe: 1.1.2 2065 | pretty-format: 29.7.0 2066 | 2067 | '@vitest/spy@1.5.0': 2068 | dependencies: 2069 | tinyspy: 2.2.1 2070 | 2071 | '@vitest/utils@1.5.0': 2072 | dependencies: 2073 | diff-sequences: 29.6.3 2074 | estree-walker: 3.0.3 2075 | loupe: 2.3.7 2076 | pretty-format: 29.7.0 2077 | 2078 | acorn-walk@8.3.2: {} 2079 | 2080 | acorn@8.11.3: {} 2081 | 2082 | ansi-regex@5.0.1: {} 2083 | 2084 | ansi-regex@6.0.1: {} 2085 | 2086 | ansi-styles@4.3.0: 2087 | dependencies: 2088 | color-convert: 2.0.1 2089 | 2090 | ansi-styles@5.2.0: {} 2091 | 2092 | ansi-styles@6.2.1: {} 2093 | 2094 | any-promise@1.3.0: {} 2095 | 2096 | anymatch@3.1.3: 2097 | dependencies: 2098 | normalize-path: 3.0.0 2099 | picomatch: 2.3.1 2100 | 2101 | array-union@2.1.0: {} 2102 | 2103 | assertion-error@1.1.0: {} 2104 | 2105 | balanced-match@1.0.2: {} 2106 | 2107 | binary-extensions@2.3.0: {} 2108 | 2109 | brace-expansion@2.0.1: 2110 | dependencies: 2111 | balanced-match: 1.0.2 2112 | 2113 | braces@3.0.2: 2114 | dependencies: 2115 | fill-range: 7.0.1 2116 | 2117 | bundle-require@4.0.3(esbuild@0.19.12): 2118 | dependencies: 2119 | esbuild: 0.19.12 2120 | load-tsconfig: 0.2.5 2121 | 2122 | cac@6.7.14: {} 2123 | 2124 | chai@4.4.1: 2125 | dependencies: 2126 | assertion-error: 1.1.0 2127 | check-error: 1.0.3 2128 | deep-eql: 4.1.3 2129 | get-func-name: 2.0.2 2130 | loupe: 2.3.7 2131 | pathval: 1.1.1 2132 | type-detect: 4.0.8 2133 | 2134 | check-error@1.0.3: 2135 | dependencies: 2136 | get-func-name: 2.0.2 2137 | 2138 | chokidar@3.6.0: 2139 | dependencies: 2140 | anymatch: 3.1.3 2141 | braces: 3.0.2 2142 | glob-parent: 5.1.2 2143 | is-binary-path: 2.1.0 2144 | is-glob: 4.0.3 2145 | normalize-path: 3.0.0 2146 | readdirp: 3.6.0 2147 | optionalDependencies: 2148 | fsevents: 2.3.3 2149 | 2150 | color-convert@2.0.1: 2151 | dependencies: 2152 | color-name: 1.1.4 2153 | 2154 | color-name@1.1.4: {} 2155 | 2156 | commander@4.1.1: {} 2157 | 2158 | confbox@0.1.7: {} 2159 | 2160 | cross-spawn@7.0.3: 2161 | dependencies: 2162 | path-key: 3.1.1 2163 | shebang-command: 2.0.0 2164 | which: 2.0.2 2165 | 2166 | debug@4.3.4: 2167 | dependencies: 2168 | ms: 2.1.2 2169 | 2170 | deep-eql@4.1.3: 2171 | dependencies: 2172 | type-detect: 4.0.8 2173 | 2174 | diff-sequences@29.6.3: {} 2175 | 2176 | dir-glob@3.0.1: 2177 | dependencies: 2178 | path-type: 4.0.0 2179 | 2180 | eastasianwidth@0.2.0: {} 2181 | 2182 | emoji-regex@8.0.0: {} 2183 | 2184 | emoji-regex@9.2.2: {} 2185 | 2186 | esbuild@0.19.12: 2187 | optionalDependencies: 2188 | '@esbuild/aix-ppc64': 0.19.12 2189 | '@esbuild/android-arm': 0.19.12 2190 | '@esbuild/android-arm64': 0.19.12 2191 | '@esbuild/android-x64': 0.19.12 2192 | '@esbuild/darwin-arm64': 0.19.12 2193 | '@esbuild/darwin-x64': 0.19.12 2194 | '@esbuild/freebsd-arm64': 0.19.12 2195 | '@esbuild/freebsd-x64': 0.19.12 2196 | '@esbuild/linux-arm': 0.19.12 2197 | '@esbuild/linux-arm64': 0.19.12 2198 | '@esbuild/linux-ia32': 0.19.12 2199 | '@esbuild/linux-loong64': 0.19.12 2200 | '@esbuild/linux-mips64el': 0.19.12 2201 | '@esbuild/linux-ppc64': 0.19.12 2202 | '@esbuild/linux-riscv64': 0.19.12 2203 | '@esbuild/linux-s390x': 0.19.12 2204 | '@esbuild/linux-x64': 0.19.12 2205 | '@esbuild/netbsd-x64': 0.19.12 2206 | '@esbuild/openbsd-x64': 0.19.12 2207 | '@esbuild/sunos-x64': 0.19.12 2208 | '@esbuild/win32-arm64': 0.19.12 2209 | '@esbuild/win32-ia32': 0.19.12 2210 | '@esbuild/win32-x64': 0.19.12 2211 | 2212 | esbuild@0.20.2: 2213 | optionalDependencies: 2214 | '@esbuild/aix-ppc64': 0.20.2 2215 | '@esbuild/android-arm': 0.20.2 2216 | '@esbuild/android-arm64': 0.20.2 2217 | '@esbuild/android-x64': 0.20.2 2218 | '@esbuild/darwin-arm64': 0.20.2 2219 | '@esbuild/darwin-x64': 0.20.2 2220 | '@esbuild/freebsd-arm64': 0.20.2 2221 | '@esbuild/freebsd-x64': 0.20.2 2222 | '@esbuild/linux-arm': 0.20.2 2223 | '@esbuild/linux-arm64': 0.20.2 2224 | '@esbuild/linux-ia32': 0.20.2 2225 | '@esbuild/linux-loong64': 0.20.2 2226 | '@esbuild/linux-mips64el': 0.20.2 2227 | '@esbuild/linux-ppc64': 0.20.2 2228 | '@esbuild/linux-riscv64': 0.20.2 2229 | '@esbuild/linux-s390x': 0.20.2 2230 | '@esbuild/linux-x64': 0.20.2 2231 | '@esbuild/netbsd-x64': 0.20.2 2232 | '@esbuild/openbsd-x64': 0.20.2 2233 | '@esbuild/sunos-x64': 0.20.2 2234 | '@esbuild/win32-arm64': 0.20.2 2235 | '@esbuild/win32-ia32': 0.20.2 2236 | '@esbuild/win32-x64': 0.20.2 2237 | 2238 | estree-walker@3.0.3: 2239 | dependencies: 2240 | '@types/estree': 1.0.5 2241 | 2242 | execa@5.1.1: 2243 | dependencies: 2244 | cross-spawn: 7.0.3 2245 | get-stream: 6.0.1 2246 | human-signals: 2.1.0 2247 | is-stream: 2.0.1 2248 | merge-stream: 2.0.0 2249 | npm-run-path: 4.0.1 2250 | onetime: 5.1.2 2251 | signal-exit: 3.0.7 2252 | strip-final-newline: 2.0.0 2253 | 2254 | execa@8.0.1: 2255 | dependencies: 2256 | cross-spawn: 7.0.3 2257 | get-stream: 8.0.1 2258 | human-signals: 5.0.0 2259 | is-stream: 3.0.0 2260 | merge-stream: 2.0.0 2261 | npm-run-path: 5.3.0 2262 | onetime: 6.0.0 2263 | signal-exit: 4.1.0 2264 | strip-final-newline: 3.0.0 2265 | 2266 | fast-glob@3.3.2: 2267 | dependencies: 2268 | '@nodelib/fs.stat': 2.0.5 2269 | '@nodelib/fs.walk': 1.2.8 2270 | glob-parent: 5.1.2 2271 | merge2: 1.4.1 2272 | micromatch: 4.0.5 2273 | 2274 | fastq@1.17.1: 2275 | dependencies: 2276 | reusify: 1.0.4 2277 | 2278 | fill-range@7.0.1: 2279 | dependencies: 2280 | to-regex-range: 5.0.1 2281 | 2282 | foreground-child@3.1.1: 2283 | dependencies: 2284 | cross-spawn: 7.0.3 2285 | signal-exit: 4.1.0 2286 | 2287 | fsevents@2.3.3: 2288 | optional: true 2289 | 2290 | get-func-name@2.0.2: {} 2291 | 2292 | get-stream@6.0.1: {} 2293 | 2294 | get-stream@8.0.1: {} 2295 | 2296 | glob-parent@5.1.2: 2297 | dependencies: 2298 | is-glob: 4.0.3 2299 | 2300 | glob@10.3.12: 2301 | dependencies: 2302 | foreground-child: 3.1.1 2303 | jackspeak: 2.3.6 2304 | minimatch: 9.0.4 2305 | minipass: 7.0.4 2306 | path-scurry: 1.10.2 2307 | 2308 | globby@11.1.0: 2309 | dependencies: 2310 | array-union: 2.1.0 2311 | dir-glob: 3.0.1 2312 | fast-glob: 3.3.2 2313 | ignore: 5.3.1 2314 | merge2: 1.4.1 2315 | slash: 3.0.0 2316 | 2317 | human-signals@2.1.0: {} 2318 | 2319 | human-signals@5.0.0: {} 2320 | 2321 | ignore@5.3.1: {} 2322 | 2323 | is-binary-path@2.1.0: 2324 | dependencies: 2325 | binary-extensions: 2.3.0 2326 | 2327 | is-extglob@2.1.1: {} 2328 | 2329 | is-fullwidth-code-point@3.0.0: {} 2330 | 2331 | is-glob@4.0.3: 2332 | dependencies: 2333 | is-extglob: 2.1.1 2334 | 2335 | is-number@7.0.0: {} 2336 | 2337 | is-stream@2.0.1: {} 2338 | 2339 | is-stream@3.0.0: {} 2340 | 2341 | isexe@2.0.0: {} 2342 | 2343 | jackspeak@2.3.6: 2344 | dependencies: 2345 | '@isaacs/cliui': 8.0.2 2346 | optionalDependencies: 2347 | '@pkgjs/parseargs': 0.11.0 2348 | 2349 | joycon@3.1.1: {} 2350 | 2351 | js-tokens@9.0.0: {} 2352 | 2353 | lilconfig@3.1.1: {} 2354 | 2355 | lines-and-columns@1.2.4: {} 2356 | 2357 | load-tsconfig@0.2.5: {} 2358 | 2359 | local-pkg@0.5.0: 2360 | dependencies: 2361 | mlly: 1.6.1 2362 | pkg-types: 1.1.0 2363 | 2364 | lodash.sortby@4.7.0: {} 2365 | 2366 | loupe@2.3.7: 2367 | dependencies: 2368 | get-func-name: 2.0.2 2369 | 2370 | lru-cache@10.2.0: {} 2371 | 2372 | magic-string@0.30.10: 2373 | dependencies: 2374 | '@jridgewell/sourcemap-codec': 1.4.15 2375 | 2376 | merge-stream@2.0.0: {} 2377 | 2378 | merge2@1.4.1: {} 2379 | 2380 | micromatch@4.0.5: 2381 | dependencies: 2382 | braces: 3.0.2 2383 | picomatch: 2.3.1 2384 | 2385 | mimic-fn@2.1.0: {} 2386 | 2387 | mimic-fn@4.0.0: {} 2388 | 2389 | minimatch@9.0.4: 2390 | dependencies: 2391 | brace-expansion: 2.0.1 2392 | 2393 | minipass@7.0.4: {} 2394 | 2395 | mlly@1.6.1: 2396 | dependencies: 2397 | acorn: 8.11.3 2398 | pathe: 1.1.2 2399 | pkg-types: 1.1.0 2400 | ufo: 1.5.3 2401 | 2402 | ms@2.1.2: {} 2403 | 2404 | mz@2.7.0: 2405 | dependencies: 2406 | any-promise: 1.3.0 2407 | object-assign: 4.1.1 2408 | thenify-all: 1.6.0 2409 | 2410 | nanoid@3.3.7: {} 2411 | 2412 | normalize-path@3.0.0: {} 2413 | 2414 | npm-run-path@4.0.1: 2415 | dependencies: 2416 | path-key: 3.1.1 2417 | 2418 | npm-run-path@5.3.0: 2419 | dependencies: 2420 | path-key: 4.0.0 2421 | 2422 | object-assign@4.1.1: {} 2423 | 2424 | onetime@5.1.2: 2425 | dependencies: 2426 | mimic-fn: 2.1.0 2427 | 2428 | onetime@6.0.0: 2429 | dependencies: 2430 | mimic-fn: 4.0.0 2431 | 2432 | p-limit@5.0.0: 2433 | dependencies: 2434 | yocto-queue: 1.0.0 2435 | 2436 | path-key@3.1.1: {} 2437 | 2438 | path-key@4.0.0: {} 2439 | 2440 | path-scurry@1.10.2: 2441 | dependencies: 2442 | lru-cache: 10.2.0 2443 | minipass: 7.0.4 2444 | 2445 | path-type@4.0.0: {} 2446 | 2447 | pathe@1.1.2: {} 2448 | 2449 | pathval@1.1.1: {} 2450 | 2451 | picocolors@1.0.0: {} 2452 | 2453 | picomatch@2.3.1: {} 2454 | 2455 | pirates@4.0.6: {} 2456 | 2457 | pkg-types@1.1.0: 2458 | dependencies: 2459 | confbox: 0.1.7 2460 | mlly: 1.6.1 2461 | pathe: 1.1.2 2462 | 2463 | postcss-load-config@4.0.2(postcss@8.4.38): 2464 | dependencies: 2465 | lilconfig: 3.1.1 2466 | yaml: 2.4.1 2467 | optionalDependencies: 2468 | postcss: 8.4.38 2469 | 2470 | postcss@8.4.38: 2471 | dependencies: 2472 | nanoid: 3.3.7 2473 | picocolors: 1.0.0 2474 | source-map-js: 1.2.0 2475 | 2476 | prettier@3.2.5: {} 2477 | 2478 | pretty-format@29.7.0: 2479 | dependencies: 2480 | '@jest/schemas': 29.6.3 2481 | ansi-styles: 5.2.0 2482 | react-is: 18.2.0 2483 | 2484 | punycode@2.3.1: {} 2485 | 2486 | queue-microtask@1.2.3: {} 2487 | 2488 | react-is@18.2.0: {} 2489 | 2490 | readdirp@3.6.0: 2491 | dependencies: 2492 | picomatch: 2.3.1 2493 | 2494 | resolve-from@5.0.0: {} 2495 | 2496 | reusify@1.0.4: {} 2497 | 2498 | rollup@4.16.1: 2499 | dependencies: 2500 | '@types/estree': 1.0.5 2501 | optionalDependencies: 2502 | '@rollup/rollup-android-arm-eabi': 4.16.1 2503 | '@rollup/rollup-android-arm64': 4.16.1 2504 | '@rollup/rollup-darwin-arm64': 4.16.1 2505 | '@rollup/rollup-darwin-x64': 4.16.1 2506 | '@rollup/rollup-linux-arm-gnueabihf': 4.16.1 2507 | '@rollup/rollup-linux-arm-musleabihf': 4.16.1 2508 | '@rollup/rollup-linux-arm64-gnu': 4.16.1 2509 | '@rollup/rollup-linux-arm64-musl': 4.16.1 2510 | '@rollup/rollup-linux-powerpc64le-gnu': 4.16.1 2511 | '@rollup/rollup-linux-riscv64-gnu': 4.16.1 2512 | '@rollup/rollup-linux-s390x-gnu': 4.16.1 2513 | '@rollup/rollup-linux-x64-gnu': 4.16.1 2514 | '@rollup/rollup-linux-x64-musl': 4.16.1 2515 | '@rollup/rollup-win32-arm64-msvc': 4.16.1 2516 | '@rollup/rollup-win32-ia32-msvc': 4.16.1 2517 | '@rollup/rollup-win32-x64-msvc': 4.16.1 2518 | fsevents: 2.3.3 2519 | 2520 | run-parallel@1.2.0: 2521 | dependencies: 2522 | queue-microtask: 1.2.3 2523 | 2524 | shebang-command@2.0.0: 2525 | dependencies: 2526 | shebang-regex: 3.0.0 2527 | 2528 | shebang-regex@3.0.0: {} 2529 | 2530 | siginfo@2.0.0: {} 2531 | 2532 | signal-exit@3.0.7: {} 2533 | 2534 | signal-exit@4.1.0: {} 2535 | 2536 | slash@3.0.0: {} 2537 | 2538 | source-map-js@1.2.0: {} 2539 | 2540 | source-map@0.8.0-beta.0: 2541 | dependencies: 2542 | whatwg-url: 7.1.0 2543 | 2544 | stackback@0.0.2: {} 2545 | 2546 | std-env@3.7.0: {} 2547 | 2548 | string-width@4.2.3: 2549 | dependencies: 2550 | emoji-regex: 8.0.0 2551 | is-fullwidth-code-point: 3.0.0 2552 | strip-ansi: 6.0.1 2553 | 2554 | string-width@5.1.2: 2555 | dependencies: 2556 | eastasianwidth: 0.2.0 2557 | emoji-regex: 9.2.2 2558 | strip-ansi: 7.1.0 2559 | 2560 | strip-ansi@6.0.1: 2561 | dependencies: 2562 | ansi-regex: 5.0.1 2563 | 2564 | strip-ansi@7.1.0: 2565 | dependencies: 2566 | ansi-regex: 6.0.1 2567 | 2568 | strip-final-newline@2.0.0: {} 2569 | 2570 | strip-final-newline@3.0.0: {} 2571 | 2572 | strip-literal@2.1.0: 2573 | dependencies: 2574 | js-tokens: 9.0.0 2575 | 2576 | sucrase@3.35.0: 2577 | dependencies: 2578 | '@jridgewell/gen-mapping': 0.3.5 2579 | commander: 4.1.1 2580 | glob: 10.3.12 2581 | lines-and-columns: 1.2.4 2582 | mz: 2.7.0 2583 | pirates: 4.0.6 2584 | ts-interface-checker: 0.1.13 2585 | 2586 | thenify-all@1.6.0: 2587 | dependencies: 2588 | thenify: 3.3.1 2589 | 2590 | thenify@3.3.1: 2591 | dependencies: 2592 | any-promise: 1.3.0 2593 | 2594 | tinybench@2.8.0: {} 2595 | 2596 | tinypool@0.8.4: {} 2597 | 2598 | tinyspy@2.2.1: {} 2599 | 2600 | to-regex-range@5.0.1: 2601 | dependencies: 2602 | is-number: 7.0.0 2603 | 2604 | tr46@1.0.1: 2605 | dependencies: 2606 | punycode: 2.3.1 2607 | 2608 | tree-kill@1.2.2: {} 2609 | 2610 | ts-interface-checker@0.1.13: {} 2611 | 2612 | tsup@8.0.2(postcss@8.4.38)(typescript@5.4.5): 2613 | dependencies: 2614 | bundle-require: 4.0.3(esbuild@0.19.12) 2615 | cac: 6.7.14 2616 | chokidar: 3.6.0 2617 | debug: 4.3.4 2618 | esbuild: 0.19.12 2619 | execa: 5.1.1 2620 | globby: 11.1.0 2621 | joycon: 3.1.1 2622 | postcss-load-config: 4.0.2(postcss@8.4.38) 2623 | resolve-from: 5.0.0 2624 | rollup: 4.16.1 2625 | source-map: 0.8.0-beta.0 2626 | sucrase: 3.35.0 2627 | tree-kill: 1.2.2 2628 | optionalDependencies: 2629 | postcss: 8.4.38 2630 | typescript: 5.4.5 2631 | transitivePeerDependencies: 2632 | - supports-color 2633 | - ts-node 2634 | 2635 | type-detect@4.0.8: {} 2636 | 2637 | typescript@5.4.5: {} 2638 | 2639 | ufo@1.5.3: {} 2640 | 2641 | undici-types@5.26.5: {} 2642 | 2643 | vite-node@1.5.0(@types/node@20.12.7): 2644 | dependencies: 2645 | cac: 6.7.14 2646 | debug: 4.3.4 2647 | pathe: 1.1.2 2648 | picocolors: 1.0.0 2649 | vite: 5.2.10(@types/node@20.12.7) 2650 | transitivePeerDependencies: 2651 | - '@types/node' 2652 | - less 2653 | - lightningcss 2654 | - sass 2655 | - stylus 2656 | - sugarss 2657 | - supports-color 2658 | - terser 2659 | 2660 | vite@5.2.10(@types/node@20.12.7): 2661 | dependencies: 2662 | esbuild: 0.20.2 2663 | postcss: 8.4.38 2664 | rollup: 4.16.1 2665 | optionalDependencies: 2666 | '@types/node': 20.12.7 2667 | fsevents: 2.3.3 2668 | 2669 | vitest@1.5.0(@types/node@20.12.7): 2670 | dependencies: 2671 | '@vitest/expect': 1.5.0 2672 | '@vitest/runner': 1.5.0 2673 | '@vitest/snapshot': 1.5.0 2674 | '@vitest/spy': 1.5.0 2675 | '@vitest/utils': 1.5.0 2676 | acorn-walk: 8.3.2 2677 | chai: 4.4.1 2678 | debug: 4.3.4 2679 | execa: 8.0.1 2680 | local-pkg: 0.5.0 2681 | magic-string: 0.30.10 2682 | pathe: 1.1.2 2683 | picocolors: 1.0.0 2684 | std-env: 3.7.0 2685 | strip-literal: 2.1.0 2686 | tinybench: 2.8.0 2687 | tinypool: 0.8.4 2688 | vite: 5.2.10(@types/node@20.12.7) 2689 | vite-node: 1.5.0(@types/node@20.12.7) 2690 | why-is-node-running: 2.2.2 2691 | optionalDependencies: 2692 | '@types/node': 20.12.7 2693 | transitivePeerDependencies: 2694 | - less 2695 | - lightningcss 2696 | - sass 2697 | - stylus 2698 | - sugarss 2699 | - supports-color 2700 | - terser 2701 | 2702 | webidl-conversions@4.0.2: {} 2703 | 2704 | whatwg-url@7.1.0: 2705 | dependencies: 2706 | lodash.sortby: 4.7.0 2707 | tr46: 1.0.1 2708 | webidl-conversions: 4.0.2 2709 | 2710 | which@2.0.2: 2711 | dependencies: 2712 | isexe: 2.0.0 2713 | 2714 | why-is-node-running@2.2.2: 2715 | dependencies: 2716 | siginfo: 2.0.0 2717 | stackback: 0.0.2 2718 | 2719 | wrap-ansi@7.0.0: 2720 | dependencies: 2721 | ansi-styles: 4.3.0 2722 | string-width: 4.2.3 2723 | strip-ansi: 6.0.1 2724 | 2725 | wrap-ansi@8.1.0: 2726 | dependencies: 2727 | ansi-styles: 6.2.1 2728 | string-width: 5.1.2 2729 | strip-ansi: 7.1.0 2730 | 2731 | yaml@2.4.1: {} 2732 | 2733 | yocto-queue@1.0.0: {} 2734 | -------------------------------------------------------------------------------- /src/AbortError.ts: -------------------------------------------------------------------------------- 1 | export default class AbortError extends Error { 2 | constructor(msg = 'Aborted') { 3 | super(msg) 4 | this.name = 'AbortError' 5 | } 6 | 7 | get isAborted() { 8 | return true 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/AbortInCoroutines.ts: -------------------------------------------------------------------------------- 1 | import AbortError from './AbortError' 2 | 3 | export type GeneratorExecutor = (signal: AbortSignal) => Generator 4 | export type AbortInCoroutinesOptions = { signal?: AbortSignal; unhandledRejection?: boolean } 5 | 6 | type OnFulfilled = (value: T) => R | PromiseLike 7 | type OnRejected = (reason: any) => T | PromiseLike 8 | 9 | export default class AbortInCoroutines implements PromiseLike { 10 | private _ctrl: AbortController | null = null 11 | private _promise: Promise 12 | private _isAborted = false 13 | 14 | constructor( 15 | gen: GeneratorExecutor, 16 | { signal: optSig, unhandledRejection = false }: AbortInCoroutinesOptions = {}, 17 | ) { 18 | const p = (this._promise = new Promise((_resolve, _reject) => { 19 | let cleaners: (() => void)[] | null = [] 20 | 21 | function onAbort(sig: AbortSignal, cb: () => void) { 22 | sig.addEventListener('abort', cb) 23 | cleaners!.push(() => sig.removeEventListener('abort', cb)) 24 | } 25 | 26 | const cleanup = () => { 27 | cleaners!.forEach(f => f()) 28 | this._ctrl = cleaners = null 29 | } 30 | const resolve = (val: T) => (_resolve(val), cleanup()) 31 | const reject = (err: any) => (_reject(err), cleanup()) 32 | const rejectWithAbort = (msg?: string) => { 33 | this._isAborted = true 34 | reject(new AbortError(msg)) 35 | } 36 | 37 | if (optSig) { 38 | if (optSig.aborted) { 39 | return rejectWithAbort('`options.signal` is already aborted.') 40 | } 41 | onAbort(optSig, () => this.abort()) 42 | } 43 | 44 | const { signal } = (this._ctrl = new AbortController()) 45 | const iter = gen(signal) 46 | 47 | let pRunning: PromiseLike | null = null 48 | let done = resolve 49 | 50 | onAbort(signal, () => { 51 | if (pRunning && pRunning instanceof AbortInCoroutines) pRunning.abort() 52 | pRunning = null 53 | 54 | done = (val: any) => { 55 | if (val === undefined) { 56 | rejectWithAbort() 57 | } else { 58 | resolve(val) 59 | } 60 | } 61 | 62 | const res = iter.return(undefined as any) 63 | if (res.done) { 64 | done(res.value) 65 | } else { 66 | handle(res) 67 | } 68 | }) 69 | 70 | function nextIter(arg?: any) { 71 | let res: IteratorResult 72 | try { 73 | res = iter.next(arg) 74 | } catch (err) { 75 | return reject(err) 76 | } 77 | handle(res) 78 | } 79 | 80 | function throwIter(arg?: any) { 81 | let res: IteratorResult 82 | try { 83 | res = iter.throw(arg) 84 | } catch (err) { 85 | return reject(err) 86 | } 87 | handle(res) 88 | } 89 | 90 | function handle(res: IteratorResult) { 91 | if (res.done) { 92 | return done(res.value) 93 | } 94 | if (isThenable(res.value)) { 95 | ;(pRunning = res.value).then( 96 | val => pRunning === res.value && nextIter(val), 97 | err => pRunning === res.value && throwIter(err), 98 | ) 99 | } else { 100 | nextIter(res.value) 101 | } 102 | } 103 | 104 | nextIter() 105 | })) 106 | 107 | if (!unhandledRejection) { 108 | p.catch(noop) 109 | } 110 | } 111 | 112 | then(onfulfilled?: OnFulfilled | null, onrejected?: OnRejected | null) { 113 | return this._promise.then(onfulfilled, onrejected) 114 | } 115 | 116 | catch(onrejected?: OnRejected | null) { 117 | return this._promise.catch(onrejected) 118 | } 119 | 120 | finally(onfinally?: (() => void) | null) { 121 | return this._promise.finally(onfinally) 122 | } 123 | 124 | get isAborted() { 125 | return this._isAborted 126 | } 127 | 128 | abort(): void { 129 | this._ctrl?.abort() 130 | } 131 | } 132 | 133 | function isThenable(p: any): p is PromiseLike { 134 | return p && typeof p.then === 'function' 135 | } 136 | 137 | function noop() {} 138 | -------------------------------------------------------------------------------- /src/abortify.ts: -------------------------------------------------------------------------------- 1 | import AbortInCoroutines from './AbortInCoroutines' 2 | 3 | export default function abortify( 4 | combinator: (values: Iterable>) => PromiseLike, 5 | ) { 6 | return (values: Iterable>) => 7 | new AbortInCoroutines(function* (signal) { 8 | let isErr = false 9 | try { 10 | return (yield combinator(values).then( 11 | v => v, 12 | err => { 13 | isErr = true 14 | throw err 15 | }, 16 | )) as R 17 | } finally { 18 | if (isErr || signal.aborted) { 19 | for (const p of values) { 20 | if (p instanceof AbortInCoroutines && !p.isAborted) { 21 | p.abort() 22 | } 23 | } 24 | } 25 | } 26 | }) 27 | } 28 | -------------------------------------------------------------------------------- /src/aico.ts: -------------------------------------------------------------------------------- 1 | import AbortInCoroutines, { AbortInCoroutinesOptions, GeneratorExecutor } from './AbortInCoroutines' 2 | 3 | export default function aico(gen: GeneratorExecutor, opts?: AbortInCoroutinesOptions) { 4 | return new AbortInCoroutines(gen, opts) 5 | } 6 | -------------------------------------------------------------------------------- /src/cast.ts: -------------------------------------------------------------------------------- 1 | export default function* cast(p: PromiseLike): Generator, T> { 2 | return (yield p) as any 3 | } 4 | -------------------------------------------------------------------------------- /src/combinators.ts: -------------------------------------------------------------------------------- 1 | import abortify from './abortify' 2 | import AbortInCoroutines from './AbortInCoroutines' 3 | 4 | export const all = abortify(Promise.all.bind(Promise)) as ( 5 | values: T, 6 | ) => AbortInCoroutines<{ -readonly [P in keyof T]: Awaited }> 7 | 8 | export const race = abortify(Promise.race.bind(Promise)) as ( 9 | values: T, 10 | ) => AbortInCoroutines> 11 | 12 | export const any = abortify(Promise.any.bind(Promise)) as ( 13 | values: T, 14 | ) => AbortInCoroutines> 15 | 16 | export const allSettled = abortify(Promise.allSettled.bind(Promise)) as ( 17 | values: T, 18 | ) => AbortInCoroutines<{ -readonly [P in keyof T]: PromiseSettledResult> }> 19 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | export { default as AbortError } from './AbortError' 2 | export { default as AbortInCoroutines, AbortInCoroutinesOptions, GeneratorExecutor } from './AbortInCoroutines' 3 | export { default as abortify } from './abortify' 4 | export { default as aico } from './aico' 5 | export { default as cast } from './cast' 6 | export * from './combinators' 7 | -------------------------------------------------------------------------------- /tests/aico.ts: -------------------------------------------------------------------------------- 1 | import { test, expect } from 'vitest' 2 | import { aico, cast } from '../src' 3 | import { setTimeout } from 'node:timers/promises' 4 | 5 | test('promiseLike', async () => { 6 | await expect( 7 | aico(function* () { 8 | return 1 9 | }), 10 | ).resolves.toBe(1) 11 | await expect( 12 | aico(function* () { 13 | throw new Error('err') 14 | }), 15 | ).rejects.toThrow() 16 | }) 17 | 18 | test('yield primitive', async () => { 19 | await expect( 20 | aico(function* () { 21 | return ((yield 1) as any) + 1 22 | }), 23 | ).resolves.toBe(2) 24 | }) 25 | 26 | test('yield resolved promise', async () => { 27 | await expect( 28 | aico(function* () { 29 | return (yield* cast(Promise.resolve(1))) + 1 30 | }), 31 | ).resolves.toBe(2) 32 | }) 33 | 34 | test('yield rejected promise', async () => { 35 | const inputErr = new Error() 36 | await expect( 37 | aico(function* () { 38 | yield Promise.reject(inputErr) 39 | }), 40 | ).rejects.toThrow(inputErr) 41 | }) 42 | 43 | test('catch rejected promise', async () => { 44 | const inputErr = new Error() 45 | await expect( 46 | aico(function* () { 47 | try { 48 | yield Promise.reject(inputErr) 49 | } catch (err) { 50 | return err 51 | } 52 | expect.fail() 53 | }), 54 | ).resolves.toBe(inputErr) 55 | }) 56 | 57 | test('yield*', async () => { 58 | expect.assertions(3) 59 | function* sub() { 60 | expect(yield 1).toBe(1) 61 | expect(yield Promise.resolve(2)).toBe(2) 62 | return 3 63 | } 64 | await expect( 65 | aico(function* () { 66 | return yield* sub() 67 | }), 68 | ).resolves.toBe(3) // 3 69 | }) 70 | 71 | test('abort, isAborted', async () => { 72 | const p = aico(function* () { 73 | yield setTimeout(0) 74 | }) 75 | expect(p.isAborted).toBe(false) 76 | p.abort() 77 | expect(p.isAborted).toBe(true) 78 | await expect(p).rejects.toThrow('Aborted') 79 | }) 80 | 81 | test('aborted finally', async () => { 82 | expect.assertions(2) 83 | const p = aico(function* (signal) { 84 | try { 85 | yield setTimeout(0) 86 | expect.fail() 87 | } catch { 88 | expect.fail() 89 | } finally { 90 | expect(signal.aborted).toBe(true) 91 | } 92 | }) 93 | p.abort() 94 | await expect(p).rejects.toThrow('Aborted') 95 | }) 96 | 97 | test('yield after abort', async () => { 98 | expect.assertions(2) 99 | const p = aico(function* () { 100 | try { 101 | yield setTimeout(0) 102 | } finally { 103 | expect(yield 1).toBe(1) // 1 104 | } 105 | }) 106 | p.abort() 107 | await expect(p).rejects.toThrow('Aborted') // 2 108 | }) 109 | 110 | test('return after abort', async () => { 111 | const p = aico(function* () { 112 | try { 113 | yield setTimeout(0) 114 | expect.fail() 115 | } finally { 116 | // eslint-disable-next-line no-unsafe-finally 117 | return 1 118 | } 119 | }) 120 | p.abort() 121 | await expect(p).resolves.toBe(1) 122 | }) 123 | test('yield and return after abort', async () => { 124 | const p = aico(function* () { 125 | try { 126 | yield setTimeout(0) 127 | expect.fail() 128 | } finally { 129 | expect(yield 1).toBe(1) 130 | expect(yield* cast(Promise.resolve(2))).toBe(2) 131 | // eslint-disable-next-line no-unsafe-finally 132 | return 3 133 | } 134 | }) 135 | p.abort() 136 | await expect(p).resolves.toBe(3) 137 | }) 138 | 139 | test('abort with `opts.signal`', async () => { 140 | const ctrl = new AbortController() 141 | const p = aico( 142 | function* () { 143 | yield setTimeout(0) 144 | }, 145 | { signal: ctrl.signal }, 146 | ) 147 | expect(p.isAborted).toBe(false) 148 | ctrl.abort() 149 | expect(p.isAborted).toBe(true) 150 | await expect(p).rejects.toThrow('Aborted') 151 | }) 152 | 153 | test('abort with aborted `opts.signal`', async () => { 154 | const ctrl = new AbortController() 155 | ctrl.abort() 156 | const p = aico( 157 | function* () { 158 | expect.fail() 159 | }, 160 | { signal: ctrl.signal }, 161 | ) 162 | await expect(p).rejects.toThrow('`options.signal` is already abort') 163 | }) 164 | 165 | test('abort propagation', async () => { 166 | expect.assertions(5) 167 | const child = aico(function* (signal) { 168 | try { 169 | expect(signal.aborted).toBe(false) // 1 170 | yield setTimeout(0) 171 | expect.fail() 172 | } finally { 173 | expect(signal.aborted).toBe(true) // 2 174 | } 175 | }) 176 | const parent = aico(function* (signal) { 177 | try { 178 | expect(signal.aborted).toBe(false) // 3 179 | yield child 180 | expect.fail() 181 | } finally { 182 | expect(signal.aborted).toBe(true) // 4 183 | } 184 | }) 185 | parent.abort() 186 | await expect(parent).rejects.toThrow('Aborted') // 5 187 | }) 188 | -------------------------------------------------------------------------------- /tests/combinators.ts: -------------------------------------------------------------------------------- 1 | import { describe, it, expect, vi } from 'vitest' 2 | import { aico, all, any, race } from '../src' 3 | import { setTimeout } from 'node:timers/promises' 4 | 5 | describe('all', () => { 6 | it('resolve', async () => { 7 | const p = all([Promise.resolve(1), Promise.resolve('2')]) 8 | await expect(p).resolves.toEqual([1, '2']) 9 | }) 10 | it('reject', async () => { 11 | const p = all([Promise.resolve(1), Promise.resolve('2'), Promise.reject(new Error('fail'))]) 12 | await expect(p).rejects.toThrow('fail') 13 | }) 14 | it('propagation by abort', async () => { 15 | const onAbort = vi.fn() 16 | const p = all([aicoForAbort(onAbort), aicoForAbort(onAbort)]) 17 | p.abort() 18 | await expect(p).rejects.toThrow('Aborted') 19 | expect(onAbort.mock.calls.length).toBe(2) 20 | }) 21 | it('propagation by reject', async () => { 22 | const onAbort = vi.fn() 23 | const p = all([aicoForAbort(onAbort), aicoForAbort(onAbort), Promise.reject(new Error('fail'))]) 24 | await expect(p).rejects.toThrow('fail') 25 | expect(onAbort.mock.calls.length).toBe(2) 26 | }) 27 | }) 28 | 29 | describe('race', () => { 30 | it('resolve', async () => { 31 | const p = race([setTimeout(10).then(() => 1), setTimeout(1).then(() => '2')]) 32 | await expect(p).resolves.toBe('2') 33 | }) 34 | it('reject', async () => { 35 | const p = race([setTimeout(10).then(() => 1), setTimeout(1).then(() => '2'), Promise.reject(new Error('fail'))]) 36 | await expect(p).rejects.toThrow('fail') 37 | }) 38 | it('propagation by abort', async () => { 39 | const onAbort = vi.fn() 40 | const p = race([aicoForAbort(onAbort), aicoForAbort(onAbort)]) 41 | p.abort() 42 | await expect(p).rejects.toThrow('Aborted') 43 | expect(onAbort.mock.calls.length).toBe(2) 44 | }) 45 | it('propagation by reject', async () => { 46 | const onAbort = vi.fn() 47 | const p = race([aicoForAbort(onAbort), aicoForAbort(onAbort), Promise.reject(new Error('fail'))]) 48 | await expect(p).rejects.toThrow('fail') 49 | expect(onAbort.mock.calls.length).toBe(2) 50 | }) 51 | }) 52 | 53 | describe('any', () => { 54 | it('resolve', async () => { 55 | const p = any([setTimeout(10).then(() => 1), setTimeout(1).then(() => '2')]) 56 | await expect(p).resolves.toBe('2') 57 | }) 58 | it('reject', async () => { 59 | const p = any([setTimeout(10).then(() => 1), setTimeout(1).then(() => '2'), Promise.reject(new Error('fail'))]) 60 | await expect(p).resolves.toBe('2') 61 | }) 62 | it('propagation by abort', async () => { 63 | const onAbort = vi.fn() 64 | const p = any([aicoForAbort(onAbort), aicoForAbort(onAbort)]) 65 | p.abort() 66 | await expect(p).rejects.toThrow('Aborted') 67 | expect(onAbort.mock.calls.length).toBe(2) 68 | }) 69 | }) 70 | 71 | function aicoForAbort(onAbort: () => void) { 72 | return aico(function* (signal) { 73 | let resolve: () => void 74 | try { 75 | yield new Promise(r => (resolve = r)) 76 | } finally { 77 | if (signal.aborted) onAbort() 78 | resolve!() 79 | } 80 | }) 81 | } 82 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ESNext", 4 | "module": "ESNext", 5 | "lib": ["DOM", "ESNext"], 6 | "strict": true 7 | }, 8 | "include": ["./src/"] 9 | } 10 | -------------------------------------------------------------------------------- /vitest.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vitest/config' 2 | 3 | export default defineConfig({ 4 | test: { 5 | include: ['tests/*.ts'], 6 | exclude: ['tests/_helpers.ts'], 7 | }, 8 | }) 9 | --------------------------------------------------------------------------------