├── .editorconfig ├── .gitignore ├── .npmignore ├── .npmrc ├── .travis.yml ├── LICENCE.md ├── README.md ├── assets ├── A_OR_B.png ├── A_XOR_B.png └── dataOrError-intellisense.gif ├── package-lock.json ├── package.json ├── scripts └── run-tests.sh ├── src ├── index.ts ├── types │ ├── evalIfNotUnknown.ts │ ├── prettify.ts │ ├── without.ts │ └── xor.ts └── xorFactory.js ├── test ├── control-std-union-without-xor │ ├── has-key-not-of-T-nor-of-U.spec.ts │ ├── has-key-of-T-and-extra-random-key.spec.ts │ ├── has-key-of-T-and-key-of-U.spec.ts │ ├── has-keys-of-T.spec.ts │ ├── has-keys-of-U.spec.ts │ ├── has-no-keys.spec.ts │ └── setup.ts ├── four-xored-types │ ├── has-keys-of-A-and-C.spec.ts │ ├── has-keys-of-A-and-D.spec.ts │ ├── has-keys-of-A.spec.ts │ ├── has-keys-of-B.spec.ts │ ├── has-keys-of-C-and-D.spec.ts │ ├── has-keys-of-C.spec.ts │ ├── has-keys-of-D.spec.ts │ ├── has-no-keys.spec.ts │ └── setup.ts ├── shared-and-xored-members │ ├── doesnt-have-rain-or-snow.spec.ts │ ├── has-rain-and-snow-with-correct-keys.spec.ts │ ├── has-rain-with-both-xored-keys.spec.ts │ ├── has-rain-with-corect-key-and-random-extra-key.spec.ts │ ├── has-rain-with-correct-key.spec.ts │ ├── has-rain-with-no-keys.spec.ts │ ├── has-rain-with-random-key.spec.ts │ └── setup.ts ├── single-member-objects │ ├── has-key-not-of-T-nor-of-U.spec.ts │ ├── has-key-of-T-and-extra-random-key.spec.ts │ ├── has-key-of-T-and-key-of-U.spec.ts │ ├── has-keys-of-T.spec.ts │ ├── has-keys-of-U.spec.ts │ ├── has-no-keys.spec.ts │ └── setup.ts └── two-hundred-xored-types │ ├── has-keys-of-first-and-keys-of-last.spec.ts │ ├── has-keys-of-first.spec.ts │ ├── has-keys-of-last-two.spec.ts │ ├── has-keys-of-last.spec.ts │ ├── has-two-hundred-one-params.spec.ts │ └── setup.ts └── tsconfig.json /.editorconfig: -------------------------------------------------------------------------------- 1 | # editorconfig.org 2 | root = true 3 | 4 | [*] 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | charset = utf-8 9 | trim_trailing_whitespace = true 10 | insert_final_newline = true 11 | 12 | [*.md] 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See http://help.github.com/ignore-files/ for more about ignoring files. 2 | 3 | # compiled output 4 | /dist 5 | /tmp 6 | /out-tsc 7 | 8 | # dependencies 9 | /node_modules 10 | 11 | # IDEs and editors 12 | /.idea 13 | .project 14 | .classpath 15 | .c9/ 16 | *.launch 17 | .settings/ 18 | *.sublime-workspace 19 | 20 | # IDE - VSCode 21 | .vscode/* 22 | !.vscode/settings.json 23 | !.vscode/tasks.json 24 | !.vscode/launch.json 25 | !.vscode/extensions.json 26 | 27 | # misc 28 | /.sass-cache 29 | /connect.lock 30 | /coverage 31 | /libpeerconnection.log 32 | npm-debug.log 33 | yarn-error.log 34 | testem.log 35 | /typings 36 | 37 | # ignore yarn, we use npm 38 | yarn.lock 39 | 40 | # System Files 41 | .DS_Store 42 | Thumbs.db -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | scripts 2 | src 3 | test 4 | tsconfig.json 5 | .gitignore 6 | .npmrc 7 | .travis.yml 8 | .editorconfig 9 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | loglevel=silent 2 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | 3 | install: 4 | - npm install 5 | 6 | script: 7 | npm test && npm build 8 | -------------------------------------------------------------------------------- /LICENCE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2019 Konstantinos Maninakis 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 6 | 7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 10 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![npm version](https://badgen.net/npm/v/ts-xor?color=green)](https://www.npmjs.com/package/ts-xor) 2 | [![Licence](https://badgen.net/badge/license/MIT/green)](LICENCE.md) 3 | 4 | [![Downloads per week](https://badgen.net/npm/dt/ts-xor?color=blue)](https://npm-stat.com/charts.html?package=ts-xor&from=2019-02-22) 5 | [![Downloads per week](https://badgen.net/npm/dw/ts-xor?color=blue)](https://npm-stat.com/charts.html?package=ts-xor&from=2019-02-22) 6 | [![Repos depending on ts-xor](https://badgen.net/github/dependents-repo/maninak/ts-xor?color=blue)](https://github.com/maninak/ts-xor/network/dependents) 7 | [![Github stars](https://badgen.net/github/stars/maninak/ts-xor)](https://github.com/maninak/ts-xor/stargazers) 8 | 9 | [![Minified and gzipped size](https://badgen.net/bundlephobia/minzip/ts-xor?color=orange)](https://bundlephobia.com/result?p=ts-xor) 10 | [![0 Dependencies](https://badgen.net/bundlephobia/dependency-count/ts-xor?color=orange)](https://github.com/maninak/ts-xor/blob/87aa237a1b246efa4e8028d89dc7168ba4c4fd84/package.json#L30) 11 | 12 | # ts-xor 13 | 14 | The npm package `ts-xor` introduces the new mapped type `XOR` that helps you compose your own custom TypeScript types containing mutually exclusive object keys. 15 | 16 | ## Description 17 | 18 | ### TL;DR 19 | 20 | `ts-xor` implements the well-known [exclusive or](https://en.wikipedia.org/wiki/Exclusive_or) (a.k.a. XOR) logical operator from boolean algebra: 21 | 22 | | A | B | XOR | union operator (`\|`) | `ts-xor` | 23 | | :-: | :-: | :-: | :-: | :-: | 24 | | 0 | 0 | 0 | 0 ✅ | 0 ✅ | 25 | | 0 | 1 | 1 | 1 ✅ | 1 ✅ | 26 | | 1 | 0 | 1 | 1 ✅ | 1 ✅ | 27 | | 1 | 1 | 0 | 1 ❌ | 0 ✅ | 28 | 29 | ### Why isn't TypeScript's built-in union operator (`|`) enough? 30 | 31 | Typescript's union operator allows combining two object types `A` and `B`, into a _superset_ type C which _can_ contain all the keys of both `A` and `B`. 32 | 33 | But sometimes the requirements dictate that we combine two types with _mutually exclusive_ keys. 34 | 35 | For example: assume two objects with with keys `A.a` and `B.b`. Given `type C = A | B` then we want to impose the restriction that we can set _either_ `C.a` _or_ `C.b` _but never both_ AND _always at least one of the two_! 36 | 37 | [Typescript does not have this feature built-in.](https://github.com/Microsoft/TypeScript/issues/14094) 38 | 39 | ### Explained by example 40 | 41 | If we use the union operator 42 | 43 | ```ts 44 | type A_OR_B = A | B 45 | ``` 46 | 47 | then the derived type is shown in VS Code like so: 48 | 49 | ![Resulting type when using the union operator](assets/A_OR_B.png) 50 | 51 | Whereas if we use `XOR`: 52 | 53 | ```ts 54 | type A_XOR_B = XOR 55 | ``` 56 | 57 | then the derived type is shown quite differently in VS Code: 58 | 59 | ![Resulting type when using the XOR mapped type](assets/A_XOR_B.png) 60 | 61 | ### How it works 62 | 63 | Notice in the example above, that when using `XOR`, each union branch of the resulting type contains all keys of one source type plus all keys of the other. At the same time, in each variant, those keys of the other type are defined as _optional_ while additionally they are also typed as _undefined_. 64 | 65 | This trick will not only forbid having keys of both source types defined at the same time (since the type of each key is explicitly `undefined`), but also _allow_ us to not need to define all keys all of the time since each set of keys is optional on each variant. 66 | 67 | >_Fun fact: The actual TypeScript code for `XOR` [is generated programmatically](https://github.com/maninak/ts-xor/pull/27) using the TypeScript Compiler API._ 🦾 68 | 69 | ## Installation 70 | 71 | In your typescript powered, npm project, run: 72 | 73 | ```sh 74 | npm install -D ts-xor 75 | ``` 76 | 77 | ## Usage 78 | 79 | ```typescript 80 | import type { XOR } from 'ts-xor' 81 | 82 | interface A { a: string } 83 | interface B { b: string } 84 | 85 | let test: XOR 86 | 87 | test = { a: '' } // OK 88 | test = { b: '' } // OK 89 | test = { a: '', b: '' } // error 90 | test = {} // error 91 | ``` 92 | 93 | ### XORing more than two types 94 | 95 | If you want to create a type as the product of the logical XOR operation between multiple types (more than two and even up to 200), then just pass them as additional comma-separated generic params. 96 | 97 | ```typescript 98 | let test: XOR 99 | ``` 100 | 101 | `ts-xor` can easily handle up to 200 generic params. 💯💯 102 | 103 | ### Pattern 1: Typing a fetcher returning either data or error 104 | 105 | Using `XOR` we can type a function that returns either the data requested from an API or a response object like so: 106 | 107 | ```ts 108 | type FetchResult

= XOR< 109 | { data: P }, 110 | { error: FetchError

}, 111 | > 112 | ``` 113 | 114 | Now TypeScript has all the necessary information to infer if `FetchResult` contains a `data` or an `error` key _at compile time_ which results in very clean, yet strictly typed handling code. 115 | 116 | ![data or error intellisense demo](./assets/dataOrError-intellisense.gif) 117 | 118 | ### Pattern 2: Typing an API's response shape 119 | 120 | Let's assume that we have the following spec for a weather forecast API's response: 121 | 122 | 1. A weather forecast object _always_ contains the `id` _and_ `station` members 123 | 2. A weather forecast object _always_ contains either a member `rain` _or_ a member `snow`, but _never_ both at the same time. 124 | 3. The rain, snow members are objects containing additional forecast accuracy data 125 | 4. The rain, snow members _always_ contain either a member `1h` or a member `3h` with a number value, but _never_ both keys at the same time. 126 | 127 | ```typescript 128 | type ForecastAccuracy = XOR<{ '1h': number }, { '3h': number }> 129 | 130 | interface WeatherForecastBase { 131 | id: number 132 | station: string 133 | } 134 | 135 | interface WeatherForecastWithRain extends WeatherForecastBase { 136 | rain: ForecastAccuracy 137 | } 138 | 139 | interface WeatherForecastWithSnow extends WeatherForecastBase { 140 | snow: ForecastAccuracy 141 | } 142 | 143 | type WeatherForecast = XOR 144 | 145 | const test: WeatherForecast = { 146 | id: 1, 147 | station: 'Acropolis', 148 | // rain: { '1h': 1 }, // OK 149 | // rain: { '2h': 1 }, // error 150 | // rain: { '3h': 1 }, // OK 151 | // rain: {}, // error 152 | // rain: { '1h': 1 , '3h': 3 }, // error 153 | // lel: { '3h': 1 }, // error 154 | // rain: { '3h': 1, lel: 1 }, // error 155 | // snow: { '3h': 1 }, // OK 156 | // error when BOTH `rain` AND `snow` keys are defined at the same time 157 | } 158 | ``` 159 | 160 | ## Tests and coverage 161 | 162 | The library `ts-xor` is fully covered with smoke, acceptance and mutation tests against the typescript compiler itself. The tests can be found inside the [`test`](https://github.com/maninak/ts-xor/tree/master/test) folder. 163 | 164 | To run all tests locally, execute the following command inside your git-cloned `ts-xor` folder: 165 | 166 | ```sh 167 | npm run test 168 | ``` 169 | 170 | ## Check Also 171 | 172 | - [maninak/eslint-config](https://github.com/maninak/eslint-config) - A batteries-included, plug-n-play, opinionated linter and formater aiming for maximum DX and minimum friction. Supports JS, TS, Vue, JSX, ... 173 | 174 | 🫶 Follow me on [X](https://twitter.com/maninak_). 175 | 176 | ## License 177 | 178 | [MIT](./LICENSE.md) License © 2019-PRESENT [Kostis Maninakis](https://maninak.github.io) 179 | -------------------------------------------------------------------------------- /assets/A_OR_B.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maninak/ts-xor/5642bd40b7e9ca68698e506dac53c36ff0329ab0/assets/A_OR_B.png -------------------------------------------------------------------------------- /assets/A_XOR_B.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maninak/ts-xor/5642bd40b7e9ca68698e506dac53c36ff0329ab0/assets/A_XOR_B.png -------------------------------------------------------------------------------- /assets/dataOrError-intellisense.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maninak/ts-xor/5642bd40b7e9ca68698e506dac53c36ff0329ab0/assets/dataOrError-intellisense.gif -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ts-xor", 3 | "version": "1.3.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "ts-xor", 9 | "version": "1.3.0", 10 | "license": "MIT", 11 | "devDependencies": { 12 | "publint": "^0.2.2", 13 | "tsup": "^7.2.0", 14 | "typescript": "^5.2.2" 15 | } 16 | }, 17 | "node_modules/@esbuild/android-arm": { 18 | "version": "0.18.20", 19 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", 20 | "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", 21 | "cpu": [ 22 | "arm" 23 | ], 24 | "dev": true, 25 | "optional": true, 26 | "os": [ 27 | "android" 28 | ], 29 | "engines": { 30 | "node": ">=12" 31 | } 32 | }, 33 | "node_modules/@esbuild/android-arm64": { 34 | "version": "0.18.20", 35 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", 36 | "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", 37 | "cpu": [ 38 | "arm64" 39 | ], 40 | "dev": true, 41 | "optional": true, 42 | "os": [ 43 | "android" 44 | ], 45 | "engines": { 46 | "node": ">=12" 47 | } 48 | }, 49 | "node_modules/@esbuild/android-x64": { 50 | "version": "0.18.20", 51 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", 52 | "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", 53 | "cpu": [ 54 | "x64" 55 | ], 56 | "dev": true, 57 | "optional": true, 58 | "os": [ 59 | "android" 60 | ], 61 | "engines": { 62 | "node": ">=12" 63 | } 64 | }, 65 | "node_modules/@esbuild/darwin-arm64": { 66 | "version": "0.18.20", 67 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", 68 | "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", 69 | "cpu": [ 70 | "arm64" 71 | ], 72 | "dev": true, 73 | "optional": true, 74 | "os": [ 75 | "darwin" 76 | ], 77 | "engines": { 78 | "node": ">=12" 79 | } 80 | }, 81 | "node_modules/@esbuild/darwin-x64": { 82 | "version": "0.18.20", 83 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", 84 | "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", 85 | "cpu": [ 86 | "x64" 87 | ], 88 | "dev": true, 89 | "optional": true, 90 | "os": [ 91 | "darwin" 92 | ], 93 | "engines": { 94 | "node": ">=12" 95 | } 96 | }, 97 | "node_modules/@esbuild/freebsd-arm64": { 98 | "version": "0.18.20", 99 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", 100 | "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", 101 | "cpu": [ 102 | "arm64" 103 | ], 104 | "dev": true, 105 | "optional": true, 106 | "os": [ 107 | "freebsd" 108 | ], 109 | "engines": { 110 | "node": ">=12" 111 | } 112 | }, 113 | "node_modules/@esbuild/freebsd-x64": { 114 | "version": "0.18.20", 115 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", 116 | "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", 117 | "cpu": [ 118 | "x64" 119 | ], 120 | "dev": true, 121 | "optional": true, 122 | "os": [ 123 | "freebsd" 124 | ], 125 | "engines": { 126 | "node": ">=12" 127 | } 128 | }, 129 | "node_modules/@esbuild/linux-arm": { 130 | "version": "0.18.20", 131 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", 132 | "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", 133 | "cpu": [ 134 | "arm" 135 | ], 136 | "dev": true, 137 | "optional": true, 138 | "os": [ 139 | "linux" 140 | ], 141 | "engines": { 142 | "node": ">=12" 143 | } 144 | }, 145 | "node_modules/@esbuild/linux-arm64": { 146 | "version": "0.18.20", 147 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", 148 | "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", 149 | "cpu": [ 150 | "arm64" 151 | ], 152 | "dev": true, 153 | "optional": true, 154 | "os": [ 155 | "linux" 156 | ], 157 | "engines": { 158 | "node": ">=12" 159 | } 160 | }, 161 | "node_modules/@esbuild/linux-ia32": { 162 | "version": "0.18.20", 163 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", 164 | "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", 165 | "cpu": [ 166 | "ia32" 167 | ], 168 | "dev": true, 169 | "optional": true, 170 | "os": [ 171 | "linux" 172 | ], 173 | "engines": { 174 | "node": ">=12" 175 | } 176 | }, 177 | "node_modules/@esbuild/linux-loong64": { 178 | "version": "0.18.20", 179 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", 180 | "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", 181 | "cpu": [ 182 | "loong64" 183 | ], 184 | "dev": true, 185 | "optional": true, 186 | "os": [ 187 | "linux" 188 | ], 189 | "engines": { 190 | "node": ">=12" 191 | } 192 | }, 193 | "node_modules/@esbuild/linux-mips64el": { 194 | "version": "0.18.20", 195 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", 196 | "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", 197 | "cpu": [ 198 | "mips64el" 199 | ], 200 | "dev": true, 201 | "optional": true, 202 | "os": [ 203 | "linux" 204 | ], 205 | "engines": { 206 | "node": ">=12" 207 | } 208 | }, 209 | "node_modules/@esbuild/linux-ppc64": { 210 | "version": "0.18.20", 211 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", 212 | "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", 213 | "cpu": [ 214 | "ppc64" 215 | ], 216 | "dev": true, 217 | "optional": true, 218 | "os": [ 219 | "linux" 220 | ], 221 | "engines": { 222 | "node": ">=12" 223 | } 224 | }, 225 | "node_modules/@esbuild/linux-riscv64": { 226 | "version": "0.18.20", 227 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", 228 | "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", 229 | "cpu": [ 230 | "riscv64" 231 | ], 232 | "dev": true, 233 | "optional": true, 234 | "os": [ 235 | "linux" 236 | ], 237 | "engines": { 238 | "node": ">=12" 239 | } 240 | }, 241 | "node_modules/@esbuild/linux-s390x": { 242 | "version": "0.18.20", 243 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", 244 | "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", 245 | "cpu": [ 246 | "s390x" 247 | ], 248 | "dev": true, 249 | "optional": true, 250 | "os": [ 251 | "linux" 252 | ], 253 | "engines": { 254 | "node": ">=12" 255 | } 256 | }, 257 | "node_modules/@esbuild/linux-x64": { 258 | "version": "0.18.20", 259 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", 260 | "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", 261 | "cpu": [ 262 | "x64" 263 | ], 264 | "dev": true, 265 | "optional": true, 266 | "os": [ 267 | "linux" 268 | ], 269 | "engines": { 270 | "node": ">=12" 271 | } 272 | }, 273 | "node_modules/@esbuild/netbsd-x64": { 274 | "version": "0.18.20", 275 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", 276 | "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", 277 | "cpu": [ 278 | "x64" 279 | ], 280 | "dev": true, 281 | "optional": true, 282 | "os": [ 283 | "netbsd" 284 | ], 285 | "engines": { 286 | "node": ">=12" 287 | } 288 | }, 289 | "node_modules/@esbuild/openbsd-x64": { 290 | "version": "0.18.20", 291 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", 292 | "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", 293 | "cpu": [ 294 | "x64" 295 | ], 296 | "dev": true, 297 | "optional": true, 298 | "os": [ 299 | "openbsd" 300 | ], 301 | "engines": { 302 | "node": ">=12" 303 | } 304 | }, 305 | "node_modules/@esbuild/sunos-x64": { 306 | "version": "0.18.20", 307 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", 308 | "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", 309 | "cpu": [ 310 | "x64" 311 | ], 312 | "dev": true, 313 | "optional": true, 314 | "os": [ 315 | "sunos" 316 | ], 317 | "engines": { 318 | "node": ">=12" 319 | } 320 | }, 321 | "node_modules/@esbuild/win32-arm64": { 322 | "version": "0.18.20", 323 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", 324 | "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", 325 | "cpu": [ 326 | "arm64" 327 | ], 328 | "dev": true, 329 | "optional": true, 330 | "os": [ 331 | "win32" 332 | ], 333 | "engines": { 334 | "node": ">=12" 335 | } 336 | }, 337 | "node_modules/@esbuild/win32-ia32": { 338 | "version": "0.18.20", 339 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", 340 | "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", 341 | "cpu": [ 342 | "ia32" 343 | ], 344 | "dev": true, 345 | "optional": true, 346 | "os": [ 347 | "win32" 348 | ], 349 | "engines": { 350 | "node": ">=12" 351 | } 352 | }, 353 | "node_modules/@esbuild/win32-x64": { 354 | "version": "0.18.20", 355 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", 356 | "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", 357 | "cpu": [ 358 | "x64" 359 | ], 360 | "dev": true, 361 | "optional": true, 362 | "os": [ 363 | "win32" 364 | ], 365 | "engines": { 366 | "node": ">=12" 367 | } 368 | }, 369 | "node_modules/@jridgewell/gen-mapping": { 370 | "version": "0.3.3", 371 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", 372 | "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", 373 | "dev": true, 374 | "dependencies": { 375 | "@jridgewell/set-array": "^1.0.1", 376 | "@jridgewell/sourcemap-codec": "^1.4.10", 377 | "@jridgewell/trace-mapping": "^0.3.9" 378 | }, 379 | "engines": { 380 | "node": ">=6.0.0" 381 | } 382 | }, 383 | "node_modules/@jridgewell/resolve-uri": { 384 | "version": "3.1.1", 385 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", 386 | "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", 387 | "dev": true, 388 | "engines": { 389 | "node": ">=6.0.0" 390 | } 391 | }, 392 | "node_modules/@jridgewell/set-array": { 393 | "version": "1.1.2", 394 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", 395 | "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", 396 | "dev": true, 397 | "engines": { 398 | "node": ">=6.0.0" 399 | } 400 | }, 401 | "node_modules/@jridgewell/sourcemap-codec": { 402 | "version": "1.4.15", 403 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", 404 | "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", 405 | "dev": true 406 | }, 407 | "node_modules/@jridgewell/trace-mapping": { 408 | "version": "0.3.19", 409 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", 410 | "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", 411 | "dev": true, 412 | "dependencies": { 413 | "@jridgewell/resolve-uri": "^3.1.0", 414 | "@jridgewell/sourcemap-codec": "^1.4.14" 415 | } 416 | }, 417 | "node_modules/@nodelib/fs.scandir": { 418 | "version": "2.1.5", 419 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 420 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 421 | "dev": true, 422 | "dependencies": { 423 | "@nodelib/fs.stat": "2.0.5", 424 | "run-parallel": "^1.1.9" 425 | }, 426 | "engines": { 427 | "node": ">= 8" 428 | } 429 | }, 430 | "node_modules/@nodelib/fs.stat": { 431 | "version": "2.0.5", 432 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 433 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 434 | "dev": true, 435 | "engines": { 436 | "node": ">= 8" 437 | } 438 | }, 439 | "node_modules/@nodelib/fs.walk": { 440 | "version": "1.2.8", 441 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 442 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 443 | "dev": true, 444 | "dependencies": { 445 | "@nodelib/fs.scandir": "2.1.5", 446 | "fastq": "^1.6.0" 447 | }, 448 | "engines": { 449 | "node": ">= 8" 450 | } 451 | }, 452 | "node_modules/any-promise": { 453 | "version": "1.3.0", 454 | "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", 455 | "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", 456 | "dev": true 457 | }, 458 | "node_modules/anymatch": { 459 | "version": "3.1.3", 460 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 461 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 462 | "dev": true, 463 | "dependencies": { 464 | "normalize-path": "^3.0.0", 465 | "picomatch": "^2.0.4" 466 | }, 467 | "engines": { 468 | "node": ">= 8" 469 | } 470 | }, 471 | "node_modules/array-union": { 472 | "version": "2.1.0", 473 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", 474 | "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", 475 | "dev": true, 476 | "engines": { 477 | "node": ">=8" 478 | } 479 | }, 480 | "node_modules/balanced-match": { 481 | "version": "1.0.2", 482 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 483 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 484 | "dev": true 485 | }, 486 | "node_modules/binary-extensions": { 487 | "version": "2.2.0", 488 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 489 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 490 | "dev": true, 491 | "engines": { 492 | "node": ">=8" 493 | } 494 | }, 495 | "node_modules/brace-expansion": { 496 | "version": "1.1.11", 497 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 498 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 499 | "dev": true, 500 | "dependencies": { 501 | "balanced-match": "^1.0.0", 502 | "concat-map": "0.0.1" 503 | } 504 | }, 505 | "node_modules/braces": { 506 | "version": "3.0.2", 507 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 508 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 509 | "dev": true, 510 | "dependencies": { 511 | "fill-range": "^7.0.1" 512 | }, 513 | "engines": { 514 | "node": ">=8" 515 | } 516 | }, 517 | "node_modules/bundle-require": { 518 | "version": "4.0.1", 519 | "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-4.0.1.tgz", 520 | "integrity": "sha512-9NQkRHlNdNpDBGmLpngF3EFDcwodhMUuLz9PaWYciVcQF9SE4LFjM2DB/xV1Li5JiuDMv7ZUWuC3rGbqR0MAXQ==", 521 | "dev": true, 522 | "dependencies": { 523 | "load-tsconfig": "^0.2.3" 524 | }, 525 | "engines": { 526 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 527 | }, 528 | "peerDependencies": { 529 | "esbuild": ">=0.17" 530 | } 531 | }, 532 | "node_modules/cac": { 533 | "version": "6.7.14", 534 | "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", 535 | "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", 536 | "dev": true, 537 | "engines": { 538 | "node": ">=8" 539 | } 540 | }, 541 | "node_modules/chokidar": { 542 | "version": "3.5.3", 543 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 544 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 545 | "dev": true, 546 | "funding": [ 547 | { 548 | "type": "individual", 549 | "url": "https://paulmillr.com/funding/" 550 | } 551 | ], 552 | "dependencies": { 553 | "anymatch": "~3.1.2", 554 | "braces": "~3.0.2", 555 | "glob-parent": "~5.1.2", 556 | "is-binary-path": "~2.1.0", 557 | "is-glob": "~4.0.1", 558 | "normalize-path": "~3.0.0", 559 | "readdirp": "~3.6.0" 560 | }, 561 | "engines": { 562 | "node": ">= 8.10.0" 563 | }, 564 | "optionalDependencies": { 565 | "fsevents": "~2.3.2" 566 | } 567 | }, 568 | "node_modules/commander": { 569 | "version": "4.1.1", 570 | "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", 571 | "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", 572 | "dev": true, 573 | "engines": { 574 | "node": ">= 6" 575 | } 576 | }, 577 | "node_modules/concat-map": { 578 | "version": "0.0.1", 579 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 580 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 581 | "dev": true 582 | }, 583 | "node_modules/cross-spawn": { 584 | "version": "7.0.3", 585 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 586 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 587 | "dev": true, 588 | "dependencies": { 589 | "path-key": "^3.1.0", 590 | "shebang-command": "^2.0.0", 591 | "which": "^2.0.1" 592 | }, 593 | "engines": { 594 | "node": ">= 8" 595 | } 596 | }, 597 | "node_modules/debug": { 598 | "version": "4.3.4", 599 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 600 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 601 | "dev": true, 602 | "dependencies": { 603 | "ms": "2.1.2" 604 | }, 605 | "engines": { 606 | "node": ">=6.0" 607 | }, 608 | "peerDependenciesMeta": { 609 | "supports-color": { 610 | "optional": true 611 | } 612 | } 613 | }, 614 | "node_modules/dir-glob": { 615 | "version": "3.0.1", 616 | "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", 617 | "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", 618 | "dev": true, 619 | "dependencies": { 620 | "path-type": "^4.0.0" 621 | }, 622 | "engines": { 623 | "node": ">=8" 624 | } 625 | }, 626 | "node_modules/esbuild": { 627 | "version": "0.18.20", 628 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", 629 | "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", 630 | "dev": true, 631 | "hasInstallScript": true, 632 | "bin": { 633 | "esbuild": "bin/esbuild" 634 | }, 635 | "engines": { 636 | "node": ">=12" 637 | }, 638 | "optionalDependencies": { 639 | "@esbuild/android-arm": "0.18.20", 640 | "@esbuild/android-arm64": "0.18.20", 641 | "@esbuild/android-x64": "0.18.20", 642 | "@esbuild/darwin-arm64": "0.18.20", 643 | "@esbuild/darwin-x64": "0.18.20", 644 | "@esbuild/freebsd-arm64": "0.18.20", 645 | "@esbuild/freebsd-x64": "0.18.20", 646 | "@esbuild/linux-arm": "0.18.20", 647 | "@esbuild/linux-arm64": "0.18.20", 648 | "@esbuild/linux-ia32": "0.18.20", 649 | "@esbuild/linux-loong64": "0.18.20", 650 | "@esbuild/linux-mips64el": "0.18.20", 651 | "@esbuild/linux-ppc64": "0.18.20", 652 | "@esbuild/linux-riscv64": "0.18.20", 653 | "@esbuild/linux-s390x": "0.18.20", 654 | "@esbuild/linux-x64": "0.18.20", 655 | "@esbuild/netbsd-x64": "0.18.20", 656 | "@esbuild/openbsd-x64": "0.18.20", 657 | "@esbuild/sunos-x64": "0.18.20", 658 | "@esbuild/win32-arm64": "0.18.20", 659 | "@esbuild/win32-ia32": "0.18.20", 660 | "@esbuild/win32-x64": "0.18.20" 661 | } 662 | }, 663 | "node_modules/execa": { 664 | "version": "5.1.1", 665 | "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", 666 | "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", 667 | "dev": true, 668 | "dependencies": { 669 | "cross-spawn": "^7.0.3", 670 | "get-stream": "^6.0.0", 671 | "human-signals": "^2.1.0", 672 | "is-stream": "^2.0.0", 673 | "merge-stream": "^2.0.0", 674 | "npm-run-path": "^4.0.1", 675 | "onetime": "^5.1.2", 676 | "signal-exit": "^3.0.3", 677 | "strip-final-newline": "^2.0.0" 678 | }, 679 | "engines": { 680 | "node": ">=10" 681 | }, 682 | "funding": { 683 | "url": "https://github.com/sindresorhus/execa?sponsor=1" 684 | } 685 | }, 686 | "node_modules/fast-glob": { 687 | "version": "3.3.1", 688 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", 689 | "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", 690 | "dev": true, 691 | "dependencies": { 692 | "@nodelib/fs.stat": "^2.0.2", 693 | "@nodelib/fs.walk": "^1.2.3", 694 | "glob-parent": "^5.1.2", 695 | "merge2": "^1.3.0", 696 | "micromatch": "^4.0.4" 697 | }, 698 | "engines": { 699 | "node": ">=8.6.0" 700 | } 701 | }, 702 | "node_modules/fastq": { 703 | "version": "1.15.0", 704 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", 705 | "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", 706 | "dev": true, 707 | "dependencies": { 708 | "reusify": "^1.0.4" 709 | } 710 | }, 711 | "node_modules/fill-range": { 712 | "version": "7.0.1", 713 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 714 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 715 | "dev": true, 716 | "dependencies": { 717 | "to-regex-range": "^5.0.1" 718 | }, 719 | "engines": { 720 | "node": ">=8" 721 | } 722 | }, 723 | "node_modules/fs.realpath": { 724 | "version": "1.0.0", 725 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 726 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 727 | "dev": true 728 | }, 729 | "node_modules/fsevents": { 730 | "version": "2.3.3", 731 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 732 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 733 | "dev": true, 734 | "hasInstallScript": true, 735 | "optional": true, 736 | "os": [ 737 | "darwin" 738 | ], 739 | "engines": { 740 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 741 | } 742 | }, 743 | "node_modules/get-stream": { 744 | "version": "6.0.1", 745 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", 746 | "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", 747 | "dev": true, 748 | "engines": { 749 | "node": ">=10" 750 | }, 751 | "funding": { 752 | "url": "https://github.com/sponsors/sindresorhus" 753 | } 754 | }, 755 | "node_modules/glob": { 756 | "version": "7.1.6", 757 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 758 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 759 | "dev": true, 760 | "dependencies": { 761 | "fs.realpath": "^1.0.0", 762 | "inflight": "^1.0.4", 763 | "inherits": "2", 764 | "minimatch": "^3.0.4", 765 | "once": "^1.3.0", 766 | "path-is-absolute": "^1.0.0" 767 | }, 768 | "engines": { 769 | "node": "*" 770 | }, 771 | "funding": { 772 | "url": "https://github.com/sponsors/isaacs" 773 | } 774 | }, 775 | "node_modules/glob-parent": { 776 | "version": "5.1.2", 777 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 778 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 779 | "dev": true, 780 | "dependencies": { 781 | "is-glob": "^4.0.1" 782 | }, 783 | "engines": { 784 | "node": ">= 6" 785 | } 786 | }, 787 | "node_modules/globby": { 788 | "version": "11.1.0", 789 | "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", 790 | "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", 791 | "dev": true, 792 | "dependencies": { 793 | "array-union": "^2.1.0", 794 | "dir-glob": "^3.0.1", 795 | "fast-glob": "^3.2.9", 796 | "ignore": "^5.2.0", 797 | "merge2": "^1.4.1", 798 | "slash": "^3.0.0" 799 | }, 800 | "engines": { 801 | "node": ">=10" 802 | }, 803 | "funding": { 804 | "url": "https://github.com/sponsors/sindresorhus" 805 | } 806 | }, 807 | "node_modules/human-signals": { 808 | "version": "2.1.0", 809 | "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", 810 | "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", 811 | "dev": true, 812 | "engines": { 813 | "node": ">=10.17.0" 814 | } 815 | }, 816 | "node_modules/ignore": { 817 | "version": "5.2.4", 818 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", 819 | "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", 820 | "dev": true, 821 | "engines": { 822 | "node": ">= 4" 823 | } 824 | }, 825 | "node_modules/ignore-walk": { 826 | "version": "5.0.1", 827 | "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-5.0.1.tgz", 828 | "integrity": "sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==", 829 | "dev": true, 830 | "dependencies": { 831 | "minimatch": "^5.0.1" 832 | }, 833 | "engines": { 834 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 835 | } 836 | }, 837 | "node_modules/ignore-walk/node_modules/brace-expansion": { 838 | "version": "2.0.1", 839 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 840 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 841 | "dev": true, 842 | "dependencies": { 843 | "balanced-match": "^1.0.0" 844 | } 845 | }, 846 | "node_modules/ignore-walk/node_modules/minimatch": { 847 | "version": "5.1.6", 848 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", 849 | "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", 850 | "dev": true, 851 | "dependencies": { 852 | "brace-expansion": "^2.0.1" 853 | }, 854 | "engines": { 855 | "node": ">=10" 856 | } 857 | }, 858 | "node_modules/inflight": { 859 | "version": "1.0.6", 860 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 861 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 862 | "dev": true, 863 | "dependencies": { 864 | "once": "^1.3.0", 865 | "wrappy": "1" 866 | } 867 | }, 868 | "node_modules/inherits": { 869 | "version": "2.0.4", 870 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 871 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 872 | "dev": true 873 | }, 874 | "node_modules/is-binary-path": { 875 | "version": "2.1.0", 876 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 877 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 878 | "dev": true, 879 | "dependencies": { 880 | "binary-extensions": "^2.0.0" 881 | }, 882 | "engines": { 883 | "node": ">=8" 884 | } 885 | }, 886 | "node_modules/is-extglob": { 887 | "version": "2.1.1", 888 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 889 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 890 | "dev": true, 891 | "engines": { 892 | "node": ">=0.10.0" 893 | } 894 | }, 895 | "node_modules/is-glob": { 896 | "version": "4.0.3", 897 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 898 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 899 | "dev": true, 900 | "dependencies": { 901 | "is-extglob": "^2.1.1" 902 | }, 903 | "engines": { 904 | "node": ">=0.10.0" 905 | } 906 | }, 907 | "node_modules/is-number": { 908 | "version": "7.0.0", 909 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 910 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 911 | "dev": true, 912 | "engines": { 913 | "node": ">=0.12.0" 914 | } 915 | }, 916 | "node_modules/is-stream": { 917 | "version": "2.0.1", 918 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", 919 | "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", 920 | "dev": true, 921 | "engines": { 922 | "node": ">=8" 923 | }, 924 | "funding": { 925 | "url": "https://github.com/sponsors/sindresorhus" 926 | } 927 | }, 928 | "node_modules/isexe": { 929 | "version": "2.0.0", 930 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 931 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 932 | "dev": true 933 | }, 934 | "node_modules/joycon": { 935 | "version": "3.1.1", 936 | "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", 937 | "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", 938 | "dev": true, 939 | "engines": { 940 | "node": ">=10" 941 | } 942 | }, 943 | "node_modules/lilconfig": { 944 | "version": "2.1.0", 945 | "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", 946 | "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", 947 | "dev": true, 948 | "engines": { 949 | "node": ">=10" 950 | } 951 | }, 952 | "node_modules/lines-and-columns": { 953 | "version": "1.2.4", 954 | "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", 955 | "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", 956 | "dev": true 957 | }, 958 | "node_modules/load-tsconfig": { 959 | "version": "0.2.5", 960 | "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", 961 | "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==", 962 | "dev": true, 963 | "engines": { 964 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 965 | } 966 | }, 967 | "node_modules/lodash.sortby": { 968 | "version": "4.7.0", 969 | "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", 970 | "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", 971 | "dev": true 972 | }, 973 | "node_modules/merge-stream": { 974 | "version": "2.0.0", 975 | "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", 976 | "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", 977 | "dev": true 978 | }, 979 | "node_modules/merge2": { 980 | "version": "1.4.1", 981 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 982 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 983 | "dev": true, 984 | "engines": { 985 | "node": ">= 8" 986 | } 987 | }, 988 | "node_modules/micromatch": { 989 | "version": "4.0.5", 990 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", 991 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 992 | "dev": true, 993 | "dependencies": { 994 | "braces": "^3.0.2", 995 | "picomatch": "^2.3.1" 996 | }, 997 | "engines": { 998 | "node": ">=8.6" 999 | } 1000 | }, 1001 | "node_modules/mimic-fn": { 1002 | "version": "2.1.0", 1003 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 1004 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", 1005 | "dev": true, 1006 | "engines": { 1007 | "node": ">=6" 1008 | } 1009 | }, 1010 | "node_modules/minimatch": { 1011 | "version": "3.1.2", 1012 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1013 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1014 | "dev": true, 1015 | "dependencies": { 1016 | "brace-expansion": "^1.1.7" 1017 | }, 1018 | "engines": { 1019 | "node": "*" 1020 | } 1021 | }, 1022 | "node_modules/mri": { 1023 | "version": "1.2.0", 1024 | "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", 1025 | "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", 1026 | "dev": true, 1027 | "engines": { 1028 | "node": ">=4" 1029 | } 1030 | }, 1031 | "node_modules/ms": { 1032 | "version": "2.1.2", 1033 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1034 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1035 | "dev": true 1036 | }, 1037 | "node_modules/mz": { 1038 | "version": "2.7.0", 1039 | "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", 1040 | "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", 1041 | "dev": true, 1042 | "dependencies": { 1043 | "any-promise": "^1.0.0", 1044 | "object-assign": "^4.0.1", 1045 | "thenify-all": "^1.0.0" 1046 | } 1047 | }, 1048 | "node_modules/normalize-path": { 1049 | "version": "3.0.0", 1050 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1051 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1052 | "dev": true, 1053 | "engines": { 1054 | "node": ">=0.10.0" 1055 | } 1056 | }, 1057 | "node_modules/npm-bundled": { 1058 | "version": "2.0.1", 1059 | "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-2.0.1.tgz", 1060 | "integrity": "sha512-gZLxXdjEzE/+mOstGDqR6b0EkhJ+kM6fxM6vUuckuctuVPh80Q6pw/rSZj9s4Gex9GxWtIicO1pc8DB9KZWudw==", 1061 | "dev": true, 1062 | "dependencies": { 1063 | "npm-normalize-package-bin": "^2.0.0" 1064 | }, 1065 | "engines": { 1066 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 1067 | } 1068 | }, 1069 | "node_modules/npm-normalize-package-bin": { 1070 | "version": "2.0.0", 1071 | "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", 1072 | "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", 1073 | "dev": true, 1074 | "engines": { 1075 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 1076 | } 1077 | }, 1078 | "node_modules/npm-packlist": { 1079 | "version": "5.1.3", 1080 | "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-5.1.3.tgz", 1081 | "integrity": "sha512-263/0NGrn32YFYi4J533qzrQ/krmmrWwhKkzwTuM4f/07ug51odoaNjUexxO4vxlzURHcmYMH1QjvHjsNDKLVg==", 1082 | "dev": true, 1083 | "dependencies": { 1084 | "glob": "^8.0.1", 1085 | "ignore-walk": "^5.0.1", 1086 | "npm-bundled": "^2.0.0", 1087 | "npm-normalize-package-bin": "^2.0.0" 1088 | }, 1089 | "bin": { 1090 | "npm-packlist": "bin/index.js" 1091 | }, 1092 | "engines": { 1093 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 1094 | } 1095 | }, 1096 | "node_modules/npm-packlist/node_modules/brace-expansion": { 1097 | "version": "2.0.1", 1098 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 1099 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 1100 | "dev": true, 1101 | "dependencies": { 1102 | "balanced-match": "^1.0.0" 1103 | } 1104 | }, 1105 | "node_modules/npm-packlist/node_modules/glob": { 1106 | "version": "8.1.0", 1107 | "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", 1108 | "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", 1109 | "dev": true, 1110 | "dependencies": { 1111 | "fs.realpath": "^1.0.0", 1112 | "inflight": "^1.0.4", 1113 | "inherits": "2", 1114 | "minimatch": "^5.0.1", 1115 | "once": "^1.3.0" 1116 | }, 1117 | "engines": { 1118 | "node": ">=12" 1119 | }, 1120 | "funding": { 1121 | "url": "https://github.com/sponsors/isaacs" 1122 | } 1123 | }, 1124 | "node_modules/npm-packlist/node_modules/minimatch": { 1125 | "version": "5.1.6", 1126 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", 1127 | "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", 1128 | "dev": true, 1129 | "dependencies": { 1130 | "brace-expansion": "^2.0.1" 1131 | }, 1132 | "engines": { 1133 | "node": ">=10" 1134 | } 1135 | }, 1136 | "node_modules/npm-run-path": { 1137 | "version": "4.0.1", 1138 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", 1139 | "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", 1140 | "dev": true, 1141 | "dependencies": { 1142 | "path-key": "^3.0.0" 1143 | }, 1144 | "engines": { 1145 | "node": ">=8" 1146 | } 1147 | }, 1148 | "node_modules/object-assign": { 1149 | "version": "4.1.1", 1150 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1151 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 1152 | "dev": true, 1153 | "engines": { 1154 | "node": ">=0.10.0" 1155 | } 1156 | }, 1157 | "node_modules/once": { 1158 | "version": "1.4.0", 1159 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1160 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1161 | "dev": true, 1162 | "dependencies": { 1163 | "wrappy": "1" 1164 | } 1165 | }, 1166 | "node_modules/onetime": { 1167 | "version": "5.1.2", 1168 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", 1169 | "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", 1170 | "dev": true, 1171 | "dependencies": { 1172 | "mimic-fn": "^2.1.0" 1173 | }, 1174 | "engines": { 1175 | "node": ">=6" 1176 | }, 1177 | "funding": { 1178 | "url": "https://github.com/sponsors/sindresorhus" 1179 | } 1180 | }, 1181 | "node_modules/path-is-absolute": { 1182 | "version": "1.0.1", 1183 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1184 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 1185 | "dev": true, 1186 | "engines": { 1187 | "node": ">=0.10.0" 1188 | } 1189 | }, 1190 | "node_modules/path-key": { 1191 | "version": "3.1.1", 1192 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 1193 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 1194 | "dev": true, 1195 | "engines": { 1196 | "node": ">=8" 1197 | } 1198 | }, 1199 | "node_modules/path-type": { 1200 | "version": "4.0.0", 1201 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", 1202 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", 1203 | "dev": true, 1204 | "engines": { 1205 | "node": ">=8" 1206 | } 1207 | }, 1208 | "node_modules/picocolors": { 1209 | "version": "1.0.0", 1210 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 1211 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", 1212 | "dev": true 1213 | }, 1214 | "node_modules/picomatch": { 1215 | "version": "2.3.1", 1216 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1217 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1218 | "dev": true, 1219 | "engines": { 1220 | "node": ">=8.6" 1221 | }, 1222 | "funding": { 1223 | "url": "https://github.com/sponsors/jonschlinkert" 1224 | } 1225 | }, 1226 | "node_modules/pirates": { 1227 | "version": "4.0.6", 1228 | "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", 1229 | "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", 1230 | "dev": true, 1231 | "engines": { 1232 | "node": ">= 6" 1233 | } 1234 | }, 1235 | "node_modules/postcss-load-config": { 1236 | "version": "4.0.1", 1237 | "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", 1238 | "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", 1239 | "dev": true, 1240 | "dependencies": { 1241 | "lilconfig": "^2.0.5", 1242 | "yaml": "^2.1.1" 1243 | }, 1244 | "engines": { 1245 | "node": ">= 14" 1246 | }, 1247 | "funding": { 1248 | "type": "opencollective", 1249 | "url": "https://opencollective.com/postcss/" 1250 | }, 1251 | "peerDependencies": { 1252 | "postcss": ">=8.0.9", 1253 | "ts-node": ">=9.0.0" 1254 | }, 1255 | "peerDependenciesMeta": { 1256 | "postcss": { 1257 | "optional": true 1258 | }, 1259 | "ts-node": { 1260 | "optional": true 1261 | } 1262 | } 1263 | }, 1264 | "node_modules/publint": { 1265 | "version": "0.2.2", 1266 | "resolved": "https://registry.npmjs.org/publint/-/publint-0.2.2.tgz", 1267 | "integrity": "sha512-2t2IO6Y8Z+QBNLG89bpRhTQH7Ifn/83Kr0dVVdmOybq7GAT6+M4YGZd5AhtfMJbYPmbT7YD469pDKLCK94Q2+Q==", 1268 | "dev": true, 1269 | "dependencies": { 1270 | "npm-packlist": "^5.1.3", 1271 | "picocolors": "^1.0.0", 1272 | "sade": "^1.8.1" 1273 | }, 1274 | "bin": { 1275 | "publint": "lib/cli.js" 1276 | }, 1277 | "engines": { 1278 | "node": ">=16" 1279 | }, 1280 | "funding": { 1281 | "url": "https://bjornlu.com/sponsor" 1282 | } 1283 | }, 1284 | "node_modules/punycode": { 1285 | "version": "2.3.0", 1286 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", 1287 | "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", 1288 | "dev": true, 1289 | "engines": { 1290 | "node": ">=6" 1291 | } 1292 | }, 1293 | "node_modules/queue-microtask": { 1294 | "version": "1.2.3", 1295 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 1296 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 1297 | "dev": true, 1298 | "funding": [ 1299 | { 1300 | "type": "github", 1301 | "url": "https://github.com/sponsors/feross" 1302 | }, 1303 | { 1304 | "type": "patreon", 1305 | "url": "https://www.patreon.com/feross" 1306 | }, 1307 | { 1308 | "type": "consulting", 1309 | "url": "https://feross.org/support" 1310 | } 1311 | ] 1312 | }, 1313 | "node_modules/readdirp": { 1314 | "version": "3.6.0", 1315 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 1316 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 1317 | "dev": true, 1318 | "dependencies": { 1319 | "picomatch": "^2.2.1" 1320 | }, 1321 | "engines": { 1322 | "node": ">=8.10.0" 1323 | } 1324 | }, 1325 | "node_modules/resolve-from": { 1326 | "version": "5.0.0", 1327 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", 1328 | "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", 1329 | "dev": true, 1330 | "engines": { 1331 | "node": ">=8" 1332 | } 1333 | }, 1334 | "node_modules/reusify": { 1335 | "version": "1.0.4", 1336 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 1337 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 1338 | "dev": true, 1339 | "engines": { 1340 | "iojs": ">=1.0.0", 1341 | "node": ">=0.10.0" 1342 | } 1343 | }, 1344 | "node_modules/rollup": { 1345 | "version": "3.29.1", 1346 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.1.tgz", 1347 | "integrity": "sha512-c+ebvQz0VIH4KhhCpDsI+Bik0eT8ZFEVZEYw0cGMVqIP8zc+gnwl7iXCamTw7vzv2MeuZFZfdx5JJIq+ehzDlg==", 1348 | "dev": true, 1349 | "bin": { 1350 | "rollup": "dist/bin/rollup" 1351 | }, 1352 | "engines": { 1353 | "node": ">=14.18.0", 1354 | "npm": ">=8.0.0" 1355 | }, 1356 | "optionalDependencies": { 1357 | "fsevents": "~2.3.2" 1358 | } 1359 | }, 1360 | "node_modules/run-parallel": { 1361 | "version": "1.2.0", 1362 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 1363 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 1364 | "dev": true, 1365 | "funding": [ 1366 | { 1367 | "type": "github", 1368 | "url": "https://github.com/sponsors/feross" 1369 | }, 1370 | { 1371 | "type": "patreon", 1372 | "url": "https://www.patreon.com/feross" 1373 | }, 1374 | { 1375 | "type": "consulting", 1376 | "url": "https://feross.org/support" 1377 | } 1378 | ], 1379 | "dependencies": { 1380 | "queue-microtask": "^1.2.2" 1381 | } 1382 | }, 1383 | "node_modules/sade": { 1384 | "version": "1.8.1", 1385 | "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", 1386 | "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", 1387 | "dev": true, 1388 | "dependencies": { 1389 | "mri": "^1.1.0" 1390 | }, 1391 | "engines": { 1392 | "node": ">=6" 1393 | } 1394 | }, 1395 | "node_modules/shebang-command": { 1396 | "version": "2.0.0", 1397 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 1398 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1399 | "dev": true, 1400 | "dependencies": { 1401 | "shebang-regex": "^3.0.0" 1402 | }, 1403 | "engines": { 1404 | "node": ">=8" 1405 | } 1406 | }, 1407 | "node_modules/shebang-regex": { 1408 | "version": "3.0.0", 1409 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 1410 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 1411 | "dev": true, 1412 | "engines": { 1413 | "node": ">=8" 1414 | } 1415 | }, 1416 | "node_modules/signal-exit": { 1417 | "version": "3.0.7", 1418 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 1419 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", 1420 | "dev": true 1421 | }, 1422 | "node_modules/slash": { 1423 | "version": "3.0.0", 1424 | "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", 1425 | "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", 1426 | "dev": true, 1427 | "engines": { 1428 | "node": ">=8" 1429 | } 1430 | }, 1431 | "node_modules/source-map": { 1432 | "version": "0.8.0-beta.0", 1433 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", 1434 | "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", 1435 | "dev": true, 1436 | "dependencies": { 1437 | "whatwg-url": "^7.0.0" 1438 | }, 1439 | "engines": { 1440 | "node": ">= 8" 1441 | } 1442 | }, 1443 | "node_modules/strip-final-newline": { 1444 | "version": "2.0.0", 1445 | "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", 1446 | "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", 1447 | "dev": true, 1448 | "engines": { 1449 | "node": ">=6" 1450 | } 1451 | }, 1452 | "node_modules/sucrase": { 1453 | "version": "3.34.0", 1454 | "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", 1455 | "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", 1456 | "dev": true, 1457 | "dependencies": { 1458 | "@jridgewell/gen-mapping": "^0.3.2", 1459 | "commander": "^4.0.0", 1460 | "glob": "7.1.6", 1461 | "lines-and-columns": "^1.1.6", 1462 | "mz": "^2.7.0", 1463 | "pirates": "^4.0.1", 1464 | "ts-interface-checker": "^0.1.9" 1465 | }, 1466 | "bin": { 1467 | "sucrase": "bin/sucrase", 1468 | "sucrase-node": "bin/sucrase-node" 1469 | }, 1470 | "engines": { 1471 | "node": ">=8" 1472 | } 1473 | }, 1474 | "node_modules/thenify": { 1475 | "version": "3.3.1", 1476 | "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", 1477 | "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", 1478 | "dev": true, 1479 | "dependencies": { 1480 | "any-promise": "^1.0.0" 1481 | } 1482 | }, 1483 | "node_modules/thenify-all": { 1484 | "version": "1.6.0", 1485 | "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", 1486 | "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", 1487 | "dev": true, 1488 | "dependencies": { 1489 | "thenify": ">= 3.1.0 < 4" 1490 | }, 1491 | "engines": { 1492 | "node": ">=0.8" 1493 | } 1494 | }, 1495 | "node_modules/to-regex-range": { 1496 | "version": "5.0.1", 1497 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1498 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1499 | "dev": true, 1500 | "dependencies": { 1501 | "is-number": "^7.0.0" 1502 | }, 1503 | "engines": { 1504 | "node": ">=8.0" 1505 | } 1506 | }, 1507 | "node_modules/tr46": { 1508 | "version": "1.0.1", 1509 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", 1510 | "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", 1511 | "dev": true, 1512 | "dependencies": { 1513 | "punycode": "^2.1.0" 1514 | } 1515 | }, 1516 | "node_modules/tree-kill": { 1517 | "version": "1.2.2", 1518 | "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", 1519 | "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", 1520 | "dev": true, 1521 | "bin": { 1522 | "tree-kill": "cli.js" 1523 | } 1524 | }, 1525 | "node_modules/ts-interface-checker": { 1526 | "version": "0.1.13", 1527 | "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", 1528 | "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", 1529 | "dev": true 1530 | }, 1531 | "node_modules/tsup": { 1532 | "version": "7.2.0", 1533 | "resolved": "https://registry.npmjs.org/tsup/-/tsup-7.2.0.tgz", 1534 | "integrity": "sha512-vDHlczXbgUvY3rWvqFEbSqmC1L7woozbzngMqTtL2PGBODTtWlRwGDDawhvWzr5c1QjKe4OAKqJGfE1xeXUvtQ==", 1535 | "dev": true, 1536 | "dependencies": { 1537 | "bundle-require": "^4.0.0", 1538 | "cac": "^6.7.12", 1539 | "chokidar": "^3.5.1", 1540 | "debug": "^4.3.1", 1541 | "esbuild": "^0.18.2", 1542 | "execa": "^5.0.0", 1543 | "globby": "^11.0.3", 1544 | "joycon": "^3.0.1", 1545 | "postcss-load-config": "^4.0.1", 1546 | "resolve-from": "^5.0.0", 1547 | "rollup": "^3.2.5", 1548 | "source-map": "0.8.0-beta.0", 1549 | "sucrase": "^3.20.3", 1550 | "tree-kill": "^1.2.2" 1551 | }, 1552 | "bin": { 1553 | "tsup": "dist/cli-default.js", 1554 | "tsup-node": "dist/cli-node.js" 1555 | }, 1556 | "engines": { 1557 | "node": ">=16.14" 1558 | }, 1559 | "peerDependencies": { 1560 | "@swc/core": "^1", 1561 | "postcss": "^8.4.12", 1562 | "typescript": ">=4.1.0" 1563 | }, 1564 | "peerDependenciesMeta": { 1565 | "@swc/core": { 1566 | "optional": true 1567 | }, 1568 | "postcss": { 1569 | "optional": true 1570 | }, 1571 | "typescript": { 1572 | "optional": true 1573 | } 1574 | } 1575 | }, 1576 | "node_modules/typescript": { 1577 | "version": "5.2.2", 1578 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", 1579 | "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", 1580 | "dev": true, 1581 | "bin": { 1582 | "tsc": "bin/tsc", 1583 | "tsserver": "bin/tsserver" 1584 | }, 1585 | "engines": { 1586 | "node": ">=14.17" 1587 | } 1588 | }, 1589 | "node_modules/webidl-conversions": { 1590 | "version": "4.0.2", 1591 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", 1592 | "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", 1593 | "dev": true 1594 | }, 1595 | "node_modules/whatwg-url": { 1596 | "version": "7.1.0", 1597 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", 1598 | "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", 1599 | "dev": true, 1600 | "dependencies": { 1601 | "lodash.sortby": "^4.7.0", 1602 | "tr46": "^1.0.1", 1603 | "webidl-conversions": "^4.0.2" 1604 | } 1605 | }, 1606 | "node_modules/which": { 1607 | "version": "2.0.2", 1608 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1609 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1610 | "dev": true, 1611 | "dependencies": { 1612 | "isexe": "^2.0.0" 1613 | }, 1614 | "bin": { 1615 | "node-which": "bin/node-which" 1616 | }, 1617 | "engines": { 1618 | "node": ">= 8" 1619 | } 1620 | }, 1621 | "node_modules/wrappy": { 1622 | "version": "1.0.2", 1623 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1624 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 1625 | "dev": true 1626 | }, 1627 | "node_modules/yaml": { 1628 | "version": "2.3.2", 1629 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", 1630 | "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", 1631 | "dev": true, 1632 | "engines": { 1633 | "node": ">= 14" 1634 | } 1635 | } 1636 | } 1637 | } 1638 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ts-xor", 3 | "version": "1.3.0", 4 | "description": "Compose custom types containing mutually exclusive keys, using this generic Typescript helper type.", 5 | "main": "./dist/index.js", 6 | "module": "./dist/index.mjs", 7 | "types": "./dist/index.d.ts", 8 | "exports": { 9 | ".": { 10 | "import": { 11 | "types": "./dist/index.d.mts", 12 | "node": "./dist/index.mjs" 13 | }, 14 | "require": { 15 | "types": "./dist/index.d.ts", 16 | "node": "./dist/index.js" 17 | } 18 | } 19 | }, 20 | "sideEffects": false, 21 | "scripts": { 22 | "codegen": "node ./src/xorFactory.js > ./src/types/xor.ts", 23 | "prebuild": "npm run codegen", 24 | "build": "tsup src/index.ts --format esm,cjs --dts --sourcemap --clean", 25 | "pretest": "npm run codegen", 26 | "test": "npm run test:smoke && npm run test:unit && npm run test:package", 27 | "test:smoke": "tsc -p . --noEmit", 28 | "test:unit": "sh scripts/run-tests.sh", 29 | "test:package": "publint", 30 | "preversion": "npm run build && npm test", 31 | "postpublish": "git push --tags" 32 | }, 33 | "repository": { 34 | "type": "git", 35 | "url": "git+https://github.com/maninak/ts-xor.git" 36 | }, 37 | "keywords": [ 38 | "typescript", 39 | "custom types", 40 | "mutually exlusive keys", 41 | "xor", 42 | "maninak" 43 | ], 44 | "author": "Kostis Maninakis (https://maninak.github.io)", 45 | "license": "MIT", 46 | "bugs": { 47 | "url": "https://github.com/maninak/ts-xor/issues" 48 | }, 49 | "homepage": "https://github.com/maninak/ts-xor#README.md", 50 | "devDependencies": { 51 | "publint": "^0.2.2", 52 | "tsup": "^7.2.0", 53 | "typescript": "^5.2.2" 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /scripts/run-tests.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | printFileFailedTest () { 4 | printf "\e[38;5;196m\e[48;5;0mTest \e[1;38m$1\e[0m\e[38;5;196m\e[48;5;0m failed!\e[0m\n" 5 | } 6 | 7 | TESTS_FAILED=false 8 | 9 | # all these tests must pass compilation 10 | for FILE in $(ls test/**/*.spec.ts) 11 | do 12 | tsc --noEmit $FILE > /dev/null 13 | if [ $? -ne 0 ]; then 14 | TESTS_FAILED=true 15 | printFileFailedTest $FILE 16 | fi 17 | done 18 | 19 | if $TESTS_FAILED; then 20 | exit 1 21 | else 22 | printf "\e[0;32m\e[48;5;0mAll tests passed.\e[0m\n" 23 | exit 0 24 | fi 25 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | export type * from './types/xor.js' 2 | -------------------------------------------------------------------------------- /src/types/evalIfNotUnknown.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Skip evaluating `U` if `T` is `unknown`. 3 | */ 4 | export type EvalIfNotUnknown = unknown extends T ? never : U; 5 | -------------------------------------------------------------------------------- /src/types/prettify.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Resolve mapped types and show the derived keys and their types when hovering in 3 | * VS Code, instead of just showing the names those mapped types are defined with. 4 | */ 5 | export type Prettify = { 6 | [K in keyof T]: T[K] 7 | } & {} 8 | -------------------------------------------------------------------------------- /src/types/without.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Get the keys of T without any keys of U. 3 | */ 4 | export type Without = { 5 | [P in Exclude]?: never 6 | } 7 | -------------------------------------------------------------------------------- /src/xorFactory.js: -------------------------------------------------------------------------------- 1 | const ts = require('typescript') 2 | 3 | const xorParamCount = 200 4 | const countOfUniqueLetters = 20 5 | /** 6 | * Contains ['A', 'B', ..., ] 7 | */ 8 | const uniqueLetters = [...Array(countOfUniqueLetters).keys()] 9 | .map(i => String.fromCharCode(i + 65)) 10 | const allParamNames = getUniqueSymbolPermutationsGivenPool(uniqueLetters, xorParamCount) 11 | const [,, ...paramNamesExcludingANorB] = allParamNames 12 | 13 | function createXor() { 14 | const modifiers = [ts.factory.createToken(ts.SyntaxKind.ExportKeyword)] 15 | const name = ts.factory.createIdentifier('XOR') 16 | const typeParams = createXorParams() 17 | const type = createXorType() 18 | 19 | return ts.factory.createTypeAliasDeclaration(modifiers, name, typeParams, type) 20 | } 21 | 22 | function createXorParams() { 23 | const xorParams = [ 24 | ts.factory.createTypeParameterDeclaration(undefined, ts.factory.createIdentifier('A')), 25 | ts.factory.createTypeParameterDeclaration(undefined, ts.factory.createIdentifier('B')), 26 | ...paramNamesExcludingANorB.map((letter) => ts.factory.createTypeParameterDeclaration( 27 | undefined, 28 | ts.factory.createIdentifier(letter), 29 | undefined, 30 | ts.factory.createTypeReferenceNode('unknown') 31 | )) 32 | ] 33 | 34 | return xorParams 35 | } 36 | 37 | function createXorType() { 38 | const unionOfWithouts = ts.factory.createUnionTypeNode([ 39 | createWithoutLettersIntersectingLetter( 40 | allParamNames.filter((letterToExclude) => letterToExclude !== 'A'), 41 | 'A', 42 | ), 43 | createWithoutLettersIntersectingLetter( 44 | allParamNames.filter((letterToExclude) => letterToExclude !== 'B'), 45 | 'B', 46 | ), 47 | ...paramNamesExcludingANorB.map( 48 | (letter) => ts.factory.createTypeReferenceNode( 49 | 'EvalIfNotUnknown', 50 | [ 51 | ts.factory.createTypeReferenceNode(letter), 52 | createWithoutLettersIntersectingLetter( 53 | allParamNames.filter((letterToExclude) => letterToExclude !== letter), 54 | letter, 55 | ), 56 | ] 57 | ) 58 | ) 59 | ]) 60 | 61 | const type = ts.factory.createTypeReferenceNode('Prettify', [unionOfWithouts]) 62 | 63 | return type 64 | } 65 | 66 | /** 67 | * @param {string[]} lettersExcludingLetter 68 | * @param {string} excludedLetter 69 | */ 70 | function createWithoutLettersIntersectingLetter(lettersExcludingLetter, excludedLetter) { 71 | const withoutLettersIntersectingLetter = ts.factory.createIntersectionTypeNode([ 72 | createWithout(lettersExcludingLetter, excludedLetter), 73 | ts.factory.createTypeReferenceNode(excludedLetter) 74 | ]) 75 | 76 | return withoutLettersIntersectingLetter 77 | } 78 | 79 | /** 80 | * @param {string[]} lettersExcludingLetter 81 | * @param {string} excludedLetter 82 | */ 83 | function createWithout(lettersExcludingLetter, excludedLetter) { 84 | const type = ts.factory.createTypeReferenceNode('Without', [ 85 | ts.factory.createIntersectionTypeNode( 86 | lettersExcludingLetter.map((letter) => ts.factory.createTypeReferenceNode(letter)) 87 | ), 88 | ts.factory.createTypeReferenceNode(excludedLetter) 89 | ]) 90 | 91 | return type 92 | } 93 | 94 | /** 95 | * Takes a `symbolPool` and uses them solo and then matches them in pairs until 96 | * the provided count of unique symbols is reached. 97 | * If all possible pairs with the available symbols are already created and the 98 | * `countPermsToGenerate` is still not reached, then triplets will start to be generated, 99 | * then quadruplets, etc. 100 | * 101 | * @example 102 | * ```ts 103 | * getUniqueSymbolPermutationsGivenPool(['A', 'B'], 8) 104 | * // ['A', 'B', 'AA', 'AB', 'BA', 'BB', 'AAA', 'AAB'] 105 | * ``` 106 | * 107 | * @param {string[]} symbolPool 108 | * @param {number} countPermsToGenerate 109 | */ 110 | function getUniqueSymbolPermutationsGivenPool(symbolPool, countPermsToGenerate) { 111 | const generateItem = (index) => { 112 | if (index < 0) { 113 | return '' 114 | } 115 | const remainder = index % 20 116 | return generateItem(Math.floor(index / 20) - 1) + symbolPool[remainder] 117 | } 118 | 119 | const result = Array.from({ length: countPermsToGenerate }, (_, i) => generateItem(i)) 120 | 121 | return result 122 | } 123 | 124 | const tempFile = ts.createSourceFile( 125 | 'temp.ts', 126 | '', 127 | ts.ScriptTarget.ESNext, 128 | false, ts.ScriptKind.TS, 129 | ) 130 | const printer = ts.createPrinter({ 131 | newLine: ts.NewLineKind.LineFeed, 132 | omitTrailingSemicolon: true, 133 | }) 134 | 135 | const xorTsFileContents = ` 136 | import type { EvalIfNotUnknown } from './evalIfNotUnknown.js' 137 | import type { Prettify } from './prettify.js' 138 | import type { Without } from './without.js' 139 | 140 | ${ 141 | printer.printNode( 142 | ts.EmitHint.Unspecified, 143 | ts.factory.createJSDocComment( 144 | `Restrict using either exclusively the keys of \`T\` or \ 145 | exclusively the keys of \`U\`.\n\n\ 146 | No unique keys of \`T\` can be used simultaneously with \ 147 | any unique keys of \`U\`.\n\n@example\n\ 148 | \`\`\`ts\nconst myVar: XOR<{ data: object }, { error: object }>\n\`\`\`\n\n\ 149 | Supports from 2 up to ${xorParamCount} generic parameters.\n\n\ 150 | More: https://github.com/maninak/ts-xor/tree/master#description\n` 151 | ), 152 | tempFile, 153 | ) 154 | } 155 | ${ 156 | printer.printNode(ts.EmitHint.Unspecified, createXor(), tempFile) 157 | }` 158 | 159 | console.log(xorTsFileContents) 160 | -------------------------------------------------------------------------------- /test/control-std-union-without-xor/has-key-not-of-T-nor-of-U.spec.ts: -------------------------------------------------------------------------------- 1 | import { A_OR_B } from './setup' 2 | 3 | // @ts-expect-error 4 | const test: A_OR_B = { lel: '' } -------------------------------------------------------------------------------- /test/control-std-union-without-xor/has-key-of-T-and-extra-random-key.spec.ts: -------------------------------------------------------------------------------- 1 | import { A_OR_B } from './setup' 2 | 3 | // @ts-expect-error 4 | const test: A_OR_B = {a: '', lel: '' } 5 | -------------------------------------------------------------------------------- /test/control-std-union-without-xor/has-key-of-T-and-key-of-U.spec.ts: -------------------------------------------------------------------------------- 1 | import { A_OR_B } from './setup' 2 | 3 | const test: A_OR_B = { a: '', b: '' } // OK 4 | -------------------------------------------------------------------------------- /test/control-std-union-without-xor/has-keys-of-T.spec.ts: -------------------------------------------------------------------------------- 1 | import { A_OR_B } from './setup' 2 | 3 | const test: A_OR_B = { a: '' } // OK 4 | -------------------------------------------------------------------------------- /test/control-std-union-without-xor/has-keys-of-U.spec.ts: -------------------------------------------------------------------------------- 1 | import { A_OR_B } from './setup' 2 | 3 | const test: A_OR_B = { b: '' } // OK 4 | -------------------------------------------------------------------------------- /test/control-std-union-without-xor/has-no-keys.spec.ts: -------------------------------------------------------------------------------- 1 | import { A_OR_B } from './setup' 2 | 3 | // @ts-expect-error 4 | const test: A_OR_B = {} 5 | -------------------------------------------------------------------------------- /test/control-std-union-without-xor/setup.ts: -------------------------------------------------------------------------------- 1 | interface A { a: string } 2 | interface B { b: string } 3 | 4 | export type A_OR_B = A | B 5 | -------------------------------------------------------------------------------- /test/four-xored-types/has-keys-of-A-and-C.spec.ts: -------------------------------------------------------------------------------- 1 | import { XOR_A_B_C_D, XOR_A_B_C_D_Nested } from './setup' 2 | 3 | // @ts-expect-error 4 | const test: XOR_A_B_C_D = { a: '', c: '' } 5 | // @ts-expect-error 6 | const testNested: XOR_A_B_C_D_Nested = { a: '', c: '' } 7 | -------------------------------------------------------------------------------- /test/four-xored-types/has-keys-of-A-and-D.spec.ts: -------------------------------------------------------------------------------- 1 | import { XOR_A_B_C_D, XOR_A_B_C_D_Nested } from './setup' 2 | 3 | // @ts-expect-error 4 | const test: XOR_A_B_C_D = { a: '', d: '' } 5 | // @ts-expect-error 6 | const testNested: XOR_A_B_C_D_Nested = { a: '', d: '' } 7 | -------------------------------------------------------------------------------- /test/four-xored-types/has-keys-of-A.spec.ts: -------------------------------------------------------------------------------- 1 | import { XOR_A_B_C_D, XOR_A_B_C_D_Nested } from './setup' 2 | 3 | const test: XOR_A_B_C_D = { a: '' } // OK 4 | const testNested: XOR_A_B_C_D_Nested = { a: '' } // OK 5 | -------------------------------------------------------------------------------- /test/four-xored-types/has-keys-of-B.spec.ts: -------------------------------------------------------------------------------- 1 | import { XOR_A_B_C_D, XOR_A_B_C_D_Nested } from './setup' 2 | 3 | const test: XOR_A_B_C_D = { b: '' } // OK 4 | const testNested: XOR_A_B_C_D_Nested = { b: '' } // OK 5 | -------------------------------------------------------------------------------- /test/four-xored-types/has-keys-of-C-and-D.spec.ts: -------------------------------------------------------------------------------- 1 | import { XOR_A_B_C_D, XOR_A_B_C_D_Nested } from './setup' 2 | 3 | // @ts-expect-error 4 | const test: XOR_A_B_C_D = { c: '', d: '' } 5 | // @ts-expect-error 6 | const testNested: XOR_A_B_C_D_Nested = { c: '', d: '' } 7 | -------------------------------------------------------------------------------- /test/four-xored-types/has-keys-of-C.spec.ts: -------------------------------------------------------------------------------- 1 | import { XOR_A_B_C_D, XOR_A_B_C_D_Nested } from './setup' 2 | 3 | const test: XOR_A_B_C_D = { c: '' } // OK 4 | const testNested: XOR_A_B_C_D_Nested = { c: '' } // OK 5 | -------------------------------------------------------------------------------- /test/four-xored-types/has-keys-of-D.spec.ts: -------------------------------------------------------------------------------- 1 | import { XOR_A_B_C_D, XOR_A_B_C_D_Nested } from './setup' 2 | 3 | const test: XOR_A_B_C_D = { d: '' } // OK 4 | const testNested: XOR_A_B_C_D_Nested = { d: '' } // OK 5 | -------------------------------------------------------------------------------- /test/four-xored-types/has-no-keys.spec.ts: -------------------------------------------------------------------------------- 1 | import { XOR_A_B_C_D, XOR_A_B_C_D_Nested } from './setup' 2 | 3 | // @ts-expect-error 4 | const test: XOR_A_B_C_D = {} 5 | // @ts-expect-error 6 | const testNested: XOR_A_B_C_D_Nested = {} 7 | -------------------------------------------------------------------------------- /test/four-xored-types/setup.ts: -------------------------------------------------------------------------------- 1 | import type { XOR } from '../../src' 2 | 3 | interface A { a: string } 4 | interface B { b: string } 5 | interface C { c: string } 6 | interface D { d: string } 7 | 8 | export type XOR_A_B_C_D = XOR 9 | export type XOR_A_B_C_D_Nested = XOR>> 10 | -------------------------------------------------------------------------------- /test/shared-and-xored-members/doesnt-have-rain-or-snow.spec.ts: -------------------------------------------------------------------------------- 1 | import { WeatherForecast } from './setup' 2 | 3 | const test: WeatherForecast = { 4 | id: 123456, 5 | station: 'Acropolis Weather Reporter', 6 | // @ts-expect-error 7 | lel: { '1h': 1 }, 8 | } 9 | -------------------------------------------------------------------------------- /test/shared-and-xored-members/has-rain-and-snow-with-correct-keys.spec.ts: -------------------------------------------------------------------------------- 1 | import { WeatherForecast } from './setup' 2 | 3 | // @ts-expect-error 4 | const test: WeatherForecast = { 5 | id: 123456, 6 | station: 'Acropolis Weather Reporter', 7 | rain: { '1h': 1 }, 8 | snow: { '3h': 3 }, 9 | } 10 | -------------------------------------------------------------------------------- /test/shared-and-xored-members/has-rain-with-both-xored-keys.spec.ts: -------------------------------------------------------------------------------- 1 | import { WeatherForecast } from './setup' 2 | 3 | const test: WeatherForecast = { 4 | station: 'Acropolis Weather Reporter', 5 | id: 123456, 6 | // @ts-expect-error 7 | rain: { '1h': 1, '3h': 3 }, 8 | } 9 | -------------------------------------------------------------------------------- /test/shared-and-xored-members/has-rain-with-corect-key-and-random-extra-key.spec.ts: -------------------------------------------------------------------------------- 1 | import { WeatherForecast } from './setup' 2 | 3 | const test: WeatherForecast = { 4 | id: 123456, 5 | station: 'Acropolis Weather Reporter', 6 | // @ts-expect-error 7 | rain: { '1h': 1, lel: 'rofl' }, 8 | } 9 | -------------------------------------------------------------------------------- /test/shared-and-xored-members/has-rain-with-correct-key.spec.ts: -------------------------------------------------------------------------------- 1 | import { WeatherForecast } from './setup' 2 | 3 | const test: WeatherForecast = { 4 | id: 123456, 5 | station: 'Acropolis Weather Reporter', 6 | rain: { '1h': 1 }, // OK 7 | } 8 | -------------------------------------------------------------------------------- /test/shared-and-xored-members/has-rain-with-no-keys.spec.ts: -------------------------------------------------------------------------------- 1 | import { WeatherForecast } from './setup' 2 | 3 | const test: WeatherForecast = { 4 | id: 123456, 5 | station: 'Acropolis Weather Reporter', 6 | // @ts-expect-error 7 | rain: {}, 8 | } 9 | -------------------------------------------------------------------------------- /test/shared-and-xored-members/has-rain-with-random-key.spec.ts: -------------------------------------------------------------------------------- 1 | import { WeatherForecast } from './setup' 2 | 3 | const test: WeatherForecast = { 4 | id: 123456, 5 | station: 'Acropolis Weather Reporter', 6 | // @ts-expect-error 7 | rain: { '2h': 1 }, 8 | } 9 | -------------------------------------------------------------------------------- /test/shared-and-xored-members/setup.ts: -------------------------------------------------------------------------------- 1 | import type { XOR } from './../../src' 2 | 3 | type ForecastAccuracy = XOR<{ '1h': number }, { '3h': number }> 4 | 5 | interface WeatherForecastBase { 6 | id: number 7 | station: string 8 | } 9 | 10 | interface WeatherForecastWithRain extends WeatherForecastBase { 11 | rain: ForecastAccuracy 12 | } 13 | 14 | interface WeatherForecastWithSnow extends WeatherForecastBase { 15 | snow: ForecastAccuracy 16 | } 17 | 18 | export type WeatherForecast = XOR 19 | -------------------------------------------------------------------------------- /test/single-member-objects/has-key-not-of-T-nor-of-U.spec.ts: -------------------------------------------------------------------------------- 1 | import { A_XOR_B } from './setup' 2 | 3 | // @ts-expect-error 4 | const test: A_XOR_B = { lel: '' } 5 | -------------------------------------------------------------------------------- /test/single-member-objects/has-key-of-T-and-extra-random-key.spec.ts: -------------------------------------------------------------------------------- 1 | import { A_XOR_B } from './setup' 2 | 3 | // @ts-expect-error 4 | const test: A_XOR_B = {a: '', lel: '' } 5 | -------------------------------------------------------------------------------- /test/single-member-objects/has-key-of-T-and-key-of-U.spec.ts: -------------------------------------------------------------------------------- 1 | import { A_XOR_B } from './setup' 2 | 3 | // @ts-expect-error 4 | const test: A_XOR_B = { a: '', b: '' } 5 | -------------------------------------------------------------------------------- /test/single-member-objects/has-keys-of-T.spec.ts: -------------------------------------------------------------------------------- 1 | import { A_XOR_B } from './setup' 2 | 3 | const test: A_XOR_B = { a: '' } // OK 4 | -------------------------------------------------------------------------------- /test/single-member-objects/has-keys-of-U.spec.ts: -------------------------------------------------------------------------------- 1 | import { A_XOR_B } from './setup' 2 | 3 | const test: A_XOR_B = { b: '' } // OK 4 | -------------------------------------------------------------------------------- /test/single-member-objects/has-no-keys.spec.ts: -------------------------------------------------------------------------------- 1 | import { A_XOR_B } from './setup' 2 | 3 | // @ts-expect-error 4 | const test: A_XOR_B = {} 5 | -------------------------------------------------------------------------------- /test/single-member-objects/setup.ts: -------------------------------------------------------------------------------- 1 | import type { XOR } from './../../src' 2 | 3 | interface A { a: string } 4 | interface B { b: string } 5 | 6 | export type A_XOR_B = XOR 7 | -------------------------------------------------------------------------------- /test/two-hundred-xored-types/has-keys-of-first-and-keys-of-last.spec.ts: -------------------------------------------------------------------------------- 1 | import { XOR_200 } from './setup'; 2 | 3 | // @ts-expect-error 4 | const test: XOR_200 = { a: 0, zdt: 0 } 5 | -------------------------------------------------------------------------------- /test/two-hundred-xored-types/has-keys-of-first.spec.ts: -------------------------------------------------------------------------------- 1 | import { XOR_200 } from './setup'; 2 | 3 | const test: XOR_200 = { a: 0 } // OK 4 | -------------------------------------------------------------------------------- /test/two-hundred-xored-types/has-keys-of-last-two.spec.ts: -------------------------------------------------------------------------------- 1 | import { XOR_200 } from './setup'; 2 | 3 | // @ts-expect-error 4 | const test: XOR_200 = { zds: 0, zdt: 0 } 5 | -------------------------------------------------------------------------------- /test/two-hundred-xored-types/has-keys-of-last.spec.ts: -------------------------------------------------------------------------------- 1 | import { XOR_200 } from './setup'; 2 | 3 | const test: XOR_200 = { zdt: 0 } // OK 4 | -------------------------------------------------------------------------------- /test/two-hundred-xored-types/has-two-hundred-one-params.spec.ts: -------------------------------------------------------------------------------- 1 | import type { XOR } from '../../src' 2 | 3 | // @ts-expect-error 4 | export type XOR_200 = XOR< 5 | {EXTRANEOUS: 0}, 6 | {a: 0}, {b: 0}, {c: 0}, {d: 0}, {e: 0}, {f: 0}, {g: 0}, {h: 0}, {i: 0}, {j: 0}, 7 | {k: 0}, {l: 0}, {m: 0}, {n: 0}, {o: 0}, {p: 0}, {q: 0}, {r: 0}, {s: 0}, {t: 0}, 8 | {aa: 0}, {ab: 0}, {ac: 0}, {ad: 0}, {ae: 0}, {af: 0}, {ag: 0}, {ah: 0}, {ai: 0}, {aj: 0}, 9 | {ak: 0}, {al: 0}, {am: 0}, {an: 0}, {ao: 0}, {ap: 0}, {aq: 0}, {ar: 0}, {as: 0}, {at: 0}, 10 | {ba: 0}, {bb: 0}, {bc: 0}, {bd: 0}, {be: 0}, {bf: 0}, {bg: 0}, {bh: 0}, {bi: 0}, {bj: 0}, 11 | {bk: 0}, {bl: 0}, {bm: 0}, {bn: 0}, {bo: 0}, {bp: 0}, {bq: 0}, {br: 0}, {bs: 0}, {bt: 0}, 12 | {ca: 0}, {cb: 0}, {cc: 0}, {cd: 0}, {ce: 0}, {cf: 0}, {cg: 0}, {ch: 0}, {ci: 0}, {cj: 0}, 13 | {ck: 0}, {cl: 0}, {cm: 0}, {cn: 0}, {co: 0}, {cp: 0}, {cq: 0}, {cr: 0}, {cs: 0}, {ct: 0}, 14 | {da: 0}, {db: 0}, {dc: 0}, {dd: 0}, {de: 0}, {df: 0}, {dg: 0}, {dh: 0}, {di: 0}, {dj: 0}, 15 | {dk: 0}, {dl: 0}, {dm: 0}, {dn: 0}, {do: 0}, {dp: 0}, {dq: 0}, {dr: 0}, {ds: 0}, {dt: 0}, 16 | {za: 0}, {zb: 0}, {zc: 0}, {zd: 0}, {ze: 0}, {zf: 0}, {zg: 0}, {zh: 0}, {zi: 0}, {zj: 0}, 17 | {zk: 0}, {zl: 0}, {zm: 0}, {zn: 0}, {zo: 0}, {zp: 0}, {zq: 0}, {zr: 0}, {zs: 0}, {zt: 0}, 18 | {zaa: 0}, {zab: 0}, {zac: 0}, {zad: 0}, {zae: 0}, {zaf: 0}, {zag: 0}, {zah: 0}, {zai: 0}, {zaj: 0}, 19 | {zak: 0}, {zal: 0}, {zam: 0}, {zan: 0}, {zao: 0}, {zap: 0}, {zaq: 0}, {zar: 0}, {zas: 0}, {zat: 0}, 20 | {zba: 0}, {zbb: 0}, {zbc: 0}, {zbd: 0}, {zbe: 0}, {zbf: 0}, {zbg: 0}, {zbh: 0}, {zbi: 0}, {zbj: 0}, 21 | {zbk: 0}, {zbl: 0}, {zbm: 0}, {zbn: 0}, {zbo: 0}, {zbp: 0}, {zbq: 0}, {zbr: 0}, {zbs: 0}, {zbt: 0}, 22 | {zca: 0}, {zcb: 0}, {zcc: 0}, {zcd: 0}, {zce: 0}, {zcf: 0}, {zcg: 0}, {zch: 0}, {zci: 0}, {zcj: 0}, 23 | {zck: 0}, {zcl: 0}, {zcm: 0}, {zcn: 0}, {zco: 0}, {zcp: 0}, {zcq: 0}, {zcr: 0}, {zcs: 0}, {zct: 0}, 24 | {zda: 0}, {zdb: 0}, {zdc: 0}, {zdd: 0}, {zde: 0}, {zdf: 0}, {zdg: 0}, {zdh: 0}, {zdi: 0}, {zdj: 0}, 25 | {zdk: 0}, {zdl: 0}, {zdm: 0}, {zdn: 0}, {zdo: 0}, {zdp: 0}, {zdq: 0}, {zdr: 0}, {zds: 0}, {zdt: 0} 26 | > 27 | -------------------------------------------------------------------------------- /test/two-hundred-xored-types/setup.ts: -------------------------------------------------------------------------------- 1 | import type { XOR } from '../../src' 2 | 3 | export type XOR_200 = XOR< 4 | {a: 0}, {b: 0}, {c: 0}, {d: 0}, {e: 0}, {f: 0}, {g: 0}, {h: 0}, {i: 0}, {j: 0}, 5 | {k: 0}, {l: 0}, {m: 0}, {n: 0}, {o: 0}, {p: 0}, {q: 0}, {r: 0}, {s: 0}, {t: 0}, 6 | {aa: 0}, {ab: 0}, {ac: 0}, {ad: 0}, {ae: 0}, {af: 0}, {ag: 0}, {ah: 0}, {ai: 0}, {aj: 0}, 7 | {ak: 0}, {al: 0}, {am: 0}, {an: 0}, {ao: 0}, {ap: 0}, {aq: 0}, {ar: 0}, {as: 0}, {at: 0}, 8 | {ba: 0}, {bb: 0}, {bc: 0}, {bd: 0}, {be: 0}, {bf: 0}, {bg: 0}, {bh: 0}, {bi: 0}, {bj: 0}, 9 | {bk: 0}, {bl: 0}, {bm: 0}, {bn: 0}, {bo: 0}, {bp: 0}, {bq: 0}, {br: 0}, {bs: 0}, {bt: 0}, 10 | {ca: 0}, {cb: 0}, {cc: 0}, {cd: 0}, {ce: 0}, {cf: 0}, {cg: 0}, {ch: 0}, {ci: 0}, {cj: 0}, 11 | {ck: 0}, {cl: 0}, {cm: 0}, {cn: 0}, {co: 0}, {cp: 0}, {cq: 0}, {cr: 0}, {cs: 0}, {ct: 0}, 12 | {da: 0}, {db: 0}, {dc: 0}, {dd: 0}, {de: 0}, {df: 0}, {dg: 0}, {dh: 0}, {di: 0}, {dj: 0}, 13 | {dk: 0}, {dl: 0}, {dm: 0}, {dn: 0}, {do: 0}, {dp: 0}, {dq: 0}, {dr: 0}, {ds: 0}, {dt: 0}, 14 | {za: 0}, {zb: 0}, {zc: 0}, {zd: 0}, {ze: 0}, {zf: 0}, {zg: 0}, {zh: 0}, {zi: 0}, {zj: 0}, 15 | {zk: 0}, {zl: 0}, {zm: 0}, {zn: 0}, {zo: 0}, {zp: 0}, {zq: 0}, {zr: 0}, {zs: 0}, {zt: 0}, 16 | {zaa: 0}, {zab: 0}, {zac: 0}, {zad: 0}, {zae: 0}, {zaf: 0}, {zag: 0}, {zah: 0}, {zai: 0}, {zaj: 0}, 17 | {zak: 0}, {zal: 0}, {zam: 0}, {zan: 0}, {zao: 0}, {zap: 0}, {zaq: 0}, {zar: 0}, {zas: 0}, {zat: 0}, 18 | {zba: 0}, {zbb: 0}, {zbc: 0}, {zbd: 0}, {zbe: 0}, {zbf: 0}, {zbg: 0}, {zbh: 0}, {zbi: 0}, {zbj: 0}, 19 | {zbk: 0}, {zbl: 0}, {zbm: 0}, {zbn: 0}, {zbo: 0}, {zbp: 0}, {zbq: 0}, {zbr: 0}, {zbs: 0}, {zbt: 0}, 20 | {zca: 0}, {zcb: 0}, {zcc: 0}, {zcd: 0}, {zce: 0}, {zcf: 0}, {zcg: 0}, {zch: 0}, {zci: 0}, {zcj: 0}, 21 | {zck: 0}, {zcl: 0}, {zcm: 0}, {zcn: 0}, {zco: 0}, {zcp: 0}, {zcq: 0}, {zcr: 0}, {zcs: 0}, {zct: 0}, 22 | {zda: 0}, {zdb: 0}, {zdc: 0}, {zdd: 0}, {zde: 0}, {zdf: 0}, {zdg: 0}, {zdh: 0}, {zdi: 0}, {zdj: 0}, 23 | {zdk: 0}, {zdl: 0}, {zdm: 0}, {zdn: 0}, {zdo: 0}, {zdp: 0}, {zdq: 0}, {zdr: 0}, {zds: 0}, {zdt: 0} 24 | > 25 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "strict": true, 4 | "module": "Node16", 5 | "moduleResolution": "Node16", 6 | "target": "esnext", 7 | "declaration": true, 8 | "sourceMap": true, 9 | "declarationMap": true, 10 | "outDir": "./dist", 11 | }, 12 | "include": [ 13 | "src/**/*.ts" 14 | ] 15 | } 16 | --------------------------------------------------------------------------------