├── vitest.config.ts ├── README.md ├── package.json ├── src ├── fsm.test.ts └── fsm.ts ├── .gitignore ├── LICENSE └── pnpm-lock.yaml /vitest.config.ts: -------------------------------------------------------------------------------- 1 | /// 2 | import { defineConfig } from 'vitest/config' 3 | 4 | export default defineConfig({ 5 | test: { 6 | typecheck: { 7 | checker: "tsc", 8 | include: ["src/**/*.test.ts"], 9 | } 10 | }, 11 | }) -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # tstate 2 | 3 | A strongly-typed, pure Typescript state library. 4 | 5 | ## Usage 6 | 7 | This library is highly experimental and not yet published to npm. It's a developing alternative to XState that strives for stronger modularity, minimalism, and especially simpler, stronger typings without code generation. 8 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "tstate", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "vitest --typecheck" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "devDependencies": { 13 | "typescript": "^5.2.2", 14 | "vitest": "1.0.0-beta.4" 15 | }, 16 | "dependencies": {} 17 | } 18 | -------------------------------------------------------------------------------- /src/fsm.test.ts: -------------------------------------------------------------------------------- 1 | import { 2 | StateDefinition_Events, 3 | createStateDefinition, 4 | createStateMachine, 5 | } from "./fsm"; 6 | import { test, expectTypeOf, expect } from "vitest"; 7 | 8 | test("state definition typings", () => { 9 | const def = createStateDefinition({ 10 | on: { 11 | foo: { 12 | target: "bar", 13 | }, 14 | bar: { 15 | target: "init", 16 | }, 17 | }, 18 | }); 19 | 20 | const x: StateDefinition_Events = "foo"; 21 | expectTypeOf(x).toEqualTypeOf<"foo" | "bar">; 22 | }); 23 | 24 | test("a basic machine transitions", () => { 25 | const machine = createStateMachine( 26 | { 27 | init: createStateDefinition({ 28 | on: { 29 | foo: { 30 | target: "bar", 31 | }, 32 | bar: { 33 | target: "init", 34 | }, 35 | }, 36 | }), 37 | bar: createStateDefinition({ 38 | on: { 39 | baz: { 40 | target: "init", 41 | }, 42 | }, 43 | }), 44 | }, 45 | "init" 46 | ); 47 | 48 | const res = machine.send("foo"); 49 | expect(res.value).toEqual("bar"); 50 | 51 | const res2 = res.send("baz"); 52 | expect(res2.value).toEqual("init"); 53 | }); 54 | -------------------------------------------------------------------------------- /src/fsm.ts: -------------------------------------------------------------------------------- 1 | type TSError = never; 2 | 3 | type StateDefinition< 4 | State extends string, 5 | Events extends string, 6 | Context extends unknown, 7 | EventTargetMap extends { [K in Events]: { target: State } } 8 | > = { 9 | _ctx: Context; 10 | on: EventTargetMap; 11 | }; 12 | 13 | export type StateDefinition_Events = Definition extends { 14 | on: { [K in infer Events]: unknown }; 15 | } 16 | ? Events extends string 17 | ? Events 18 | : TSError<"StateDefinition events did not extend string"> 19 | : TSError<"could not infer StateDefinition events">; 20 | 21 | type MachineDefinition = { 22 | [State in string]: StateDefinition< 23 | States, 24 | string, 25 | unknown, 26 | { [key: string]: { target: States } } 27 | >; 28 | }; 29 | 30 | type StateValue< 31 | State extends string, 32 | Machine extends MachineDefinition 33 | > = { 34 | value: State; 35 | send: >( 36 | event: Event 37 | ) => StateValue; 38 | }; 39 | 40 | export const createStateMachine = < 41 | const Definition extends MachineDefinition, 42 | const States extends keyof Definition & string, 43 | const InitialState extends States 44 | >( 45 | definition: Definition, 46 | initialState: InitialState 47 | ): StateValue => { 48 | return { 49 | value: initialState, 50 | send(event) { 51 | return createStateMachine( 52 | definition, 53 | definition[initialState].on[event].target 54 | ); 55 | }, 56 | } as StateValue; 57 | }; 58 | 59 | export const createStateDefinition = < 60 | Context, 61 | const Definition extends Omit< 62 | StateDefinition< 63 | string, 64 | string, 65 | Context, 66 | { [key: string]: { target: string } } 67 | >, 68 | "_ctx" 69 | > 70 | >( 71 | definition: Definition 72 | ): StateDefinition< 73 | Definition["on"][keyof Definition["on"]]["target"], 74 | StateDefinition_Events, 75 | Context, 76 | Definition["on"] 77 | > => 78 | ({ 79 | ...definition, 80 | _ctx: undefined as unknown as Context, 81 | } as StateDefinition< 82 | Definition["on"][StateDefinition_Events]["target"], 83 | StateDefinition_Events, 84 | Context, 85 | Definition["on"] 86 | >); 87 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by https://www.toptal.com/developers/gitignore/api/node 2 | # Edit at https://www.toptal.com/developers/gitignore?templates=node 3 | 4 | ### Node ### 5 | # Logs 6 | logs 7 | *.log 8 | npm-debug.log* 9 | yarn-debug.log* 10 | yarn-error.log* 11 | lerna-debug.log* 12 | .pnpm-debug.log* 13 | 14 | # Diagnostic reports (https://nodejs.org/api/report.html) 15 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 16 | 17 | # Runtime data 18 | pids 19 | *.pid 20 | *.seed 21 | *.pid.lock 22 | 23 | # Directory for instrumented libs generated by jscoverage/JSCover 24 | lib-cov 25 | 26 | # Coverage directory used by tools like istanbul 27 | coverage 28 | *.lcov 29 | 30 | # nyc test coverage 31 | .nyc_output 32 | 33 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 34 | .grunt 35 | 36 | # Bower dependency directory (https://bower.io/) 37 | bower_components 38 | 39 | # node-waf configuration 40 | .lock-wscript 41 | 42 | # Compiled binary addons (https://nodejs.org/api/addons.html) 43 | build/Release 44 | 45 | # Dependency directories 46 | node_modules/ 47 | jspm_packages/ 48 | 49 | # Snowpack dependency directory (https://snowpack.dev/) 50 | web_modules/ 51 | 52 | # TypeScript cache 53 | *.tsbuildinfo 54 | 55 | # Optional npm cache directory 56 | .npm 57 | 58 | # Optional eslint cache 59 | .eslintcache 60 | 61 | # Optional stylelint cache 62 | .stylelintcache 63 | 64 | # Microbundle cache 65 | .rpt2_cache/ 66 | .rts2_cache_cjs/ 67 | .rts2_cache_es/ 68 | .rts2_cache_umd/ 69 | 70 | # Optional REPL history 71 | .node_repl_history 72 | 73 | # Output of 'npm pack' 74 | *.tgz 75 | 76 | # Yarn Integrity file 77 | .yarn-integrity 78 | 79 | # dotenv environment variable files 80 | .env 81 | .env.development.local 82 | .env.test.local 83 | .env.production.local 84 | .env.local 85 | 86 | # parcel-bundler cache (https://parceljs.org/) 87 | .cache 88 | .parcel-cache 89 | 90 | # Next.js build output 91 | .next 92 | out 93 | 94 | # Nuxt.js build / generate output 95 | .nuxt 96 | dist 97 | 98 | # Gatsby files 99 | .cache/ 100 | # Comment in the public line in if your project uses Gatsby and not Next.js 101 | # https://nextjs.org/blog/next-9-1#public-directory-support 102 | # public 103 | 104 | # vuepress build output 105 | .vuepress/dist 106 | 107 | # vuepress v2.x temp and cache directory 108 | .temp 109 | 110 | # Docusaurus cache and generated files 111 | .docusaurus 112 | 113 | # Serverless directories 114 | .serverless/ 115 | 116 | # FuseBox cache 117 | .fusebox/ 118 | 119 | # DynamoDB Local files 120 | .dynamodb/ 121 | 122 | # TernJS port file 123 | .tern-port 124 | 125 | # Stores VSCode versions used for testing VSCode extensions 126 | .vscode-test 127 | 128 | # yarn v2 129 | .yarn/cache 130 | .yarn/unplugged 131 | .yarn/build-state.yml 132 | .yarn/install-state.gz 133 | .pnp.* 134 | 135 | ### Node Patch ### 136 | # Serverless Webpack directories 137 | .webpack/ 138 | 139 | # Optional stylelint cache 140 | 141 | # SvelteKit build / generate output 142 | .svelte-kit 143 | 144 | # End of https://www.toptal.com/developers/gitignore/api/node 145 | 146 | .DS_Store 147 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | EUROPEAN UNION PUBLIC LICENCE v. 1.2 2 | EUPL © the European Union 2007, 2016 3 | 4 | This European Union Public Licence (the ‘EUPL’) applies to the Work (as defined 5 | below) which is provided under the terms of this Licence. Any use of the Work, 6 | other than as authorised under this Licence is prohibited (to the extent such 7 | use is covered by a right of the copyright holder of the Work). 8 | 9 | The Work is provided under the terms of this Licence when the Licensor (as 10 | defined below) has placed the following notice immediately following the 11 | copyright notice for the Work: 12 | 13 | Licensed under the EUPL 14 | 15 | or has expressed by any other means his willingness to license under the EUPL. 16 | 17 | 1. Definitions 18 | 19 | In this Licence, the following terms have the following meaning: 20 | 21 | - ‘The Licence’: this Licence. 22 | 23 | - ‘The Original Work’: the work or software distributed or communicated by the 24 | Licensor under this Licence, available as Source Code and also as Executable 25 | Code as the case may be. 26 | 27 | - ‘Derivative Works’: the works or software that could be created by the 28 | Licensee, based upon the Original Work or modifications thereof. This Licence 29 | does not define the extent of modification or dependence on the Original Work 30 | required in order to classify a work as a Derivative Work; this extent is 31 | determined by copyright law applicable in the country mentioned in Article 15. 32 | 33 | - ‘The Work’: the Original Work or its Derivative Works. 34 | 35 | - ‘The Source Code’: the human-readable form of the Work which is the most 36 | convenient for people to study and modify. 37 | 38 | - ‘The Executable Code’: any code which has generally been compiled and which is 39 | meant to be interpreted by a computer as a program. 40 | 41 | - ‘The Licensor’: the natural or legal person that distributes or communicates 42 | the Work under the Licence. 43 | 44 | - ‘Contributor(s)’: any natural or legal person who modifies the Work under the 45 | Licence, or otherwise contributes to the creation of a Derivative Work. 46 | 47 | - ‘The Licensee’ or ‘You’: any natural or legal person who makes any usage of 48 | the Work under the terms of the Licence. 49 | 50 | - ‘Distribution’ or ‘Communication’: any act of selling, giving, lending, 51 | renting, distributing, communicating, transmitting, or otherwise making 52 | available, online or offline, copies of the Work or providing access to its 53 | essential functionalities at the disposal of any other natural or legal 54 | person. 55 | 56 | 2. Scope of the rights granted by the Licence 57 | 58 | The Licensor hereby grants You a worldwide, royalty-free, non-exclusive, 59 | sublicensable licence to do the following, for the duration of copyright vested 60 | in the Original Work: 61 | 62 | - use the Work in any circumstance and for all usage, 63 | - reproduce the Work, 64 | - modify the Work, and make Derivative Works based upon the Work, 65 | - communicate to the public, including the right to make available or display 66 | the Work or copies thereof to the public and perform publicly, as the case may 67 | be, the Work, 68 | - distribute the Work or copies thereof, 69 | - lend and rent the Work or copies thereof, 70 | - sublicense rights in the Work or copies thereof. 71 | 72 | Those rights can be exercised on any media, supports and formats, whether now 73 | known or later invented, as far as the applicable law permits so. 74 | 75 | In the countries where moral rights apply, the Licensor waives his right to 76 | exercise his moral right to the extent allowed by law in order to make effective 77 | the licence of the economic rights here above listed. 78 | 79 | The Licensor grants to the Licensee royalty-free, non-exclusive usage rights to 80 | any patents held by the Licensor, to the extent necessary to make use of the 81 | rights granted on the Work under this Licence. 82 | 83 | 3. Communication of the Source Code 84 | 85 | The Licensor may provide the Work either in its Source Code form, or as 86 | Executable Code. If the Work is provided as Executable Code, the Licensor 87 | provides in addition a machine-readable copy of the Source Code of the Work 88 | along with each copy of the Work that the Licensor distributes or indicates, in 89 | a notice following the copyright notice attached to the Work, a repository where 90 | the Source Code is easily and freely accessible for as long as the Licensor 91 | continues to distribute or communicate the Work. 92 | 93 | 4. Limitations on copyright 94 | 95 | Nothing in this Licence is intended to deprive the Licensee of the benefits from 96 | any exception or limitation to the exclusive rights of the rights owners in the 97 | Work, of the exhaustion of those rights or of other applicable limitations 98 | thereto. 99 | 100 | 5. Obligations of the Licensee 101 | 102 | The grant of the rights mentioned above is subject to some restrictions and 103 | obligations imposed on the Licensee. Those obligations are the following: 104 | 105 | Attribution right: The Licensee shall keep intact all copyright, patent or 106 | trademarks notices and all notices that refer to the Licence and to the 107 | disclaimer of warranties. The Licensee must include a copy of such notices and a 108 | copy of the Licence with every copy of the Work he/she distributes or 109 | communicates. The Licensee must cause any Derivative Work to carry prominent 110 | notices stating that the Work has been modified and the date of modification. 111 | 112 | Copyleft clause: If the Licensee distributes or communicates copies of the 113 | Original Works or Derivative Works, this Distribution or Communication will be 114 | done under the terms of this Licence or of a later version of this Licence 115 | unless the Original Work is expressly distributed only under this version of the 116 | Licence — for example by communicating ‘EUPL v. 1.2 only’. The Licensee 117 | (becoming Licensor) cannot offer or impose any additional terms or conditions on 118 | the Work or Derivative Work that alter or restrict the terms of the Licence. 119 | 120 | Compatibility clause: If the Licensee Distributes or Communicates Derivative 121 | Works or copies thereof based upon both the Work and another work licensed under 122 | a Compatible Licence, this Distribution or Communication can be done under the 123 | terms of this Compatible Licence. For the sake of this clause, ‘Compatible 124 | Licence’ refers to the licences listed in the appendix attached to this Licence. 125 | Should the Licensee's obligations under the Compatible Licence conflict with 126 | his/her obligations under this Licence, the obligations of the Compatible 127 | Licence shall prevail. 128 | 129 | Provision of Source Code: When distributing or communicating copies of the Work, 130 | the Licensee will provide a machine-readable copy of the Source Code or indicate 131 | a repository where this Source will be easily and freely available for as long 132 | as the Licensee continues to distribute or communicate the Work. 133 | 134 | Legal Protection: This Licence does not grant permission to use the trade names, 135 | trademarks, service marks, or names of the Licensor, except as required for 136 | reasonable and customary use in describing the origin of the Work and 137 | reproducing the content of the copyright notice. 138 | 139 | 6. Chain of Authorship 140 | 141 | The original Licensor warrants that the copyright in the Original Work granted 142 | hereunder is owned by him/her or licensed to him/her and that he/she has the 143 | power and authority to grant the Licence. 144 | 145 | Each Contributor warrants that the copyright in the modifications he/she brings 146 | to the Work are owned by him/her or licensed to him/her and that he/she has the 147 | power and authority to grant the Licence. 148 | 149 | Each time You accept the Licence, the original Licensor and subsequent 150 | Contributors grant You a licence to their contributions to the Work, under the 151 | terms of this Licence. 152 | 153 | 7. Disclaimer of Warranty 154 | 155 | The Work is a work in progress, which is continuously improved by numerous 156 | Contributors. It is not a finished work and may therefore contain defects or 157 | ‘bugs’ inherent to this type of development. 158 | 159 | For the above reason, the Work is provided under the Licence on an ‘as is’ basis 160 | and without warranties of any kind concerning the Work, including without 161 | limitation merchantability, fitness for a particular purpose, absence of defects 162 | or errors, accuracy, non-infringement of intellectual property rights other than 163 | copyright as stated in Article 6 of this Licence. 164 | 165 | This disclaimer of warranty is an essential part of the Licence and a condition 166 | for the grant of any rights to the Work. 167 | 168 | 8. Disclaimer of Liability 169 | 170 | Except in the cases of wilful misconduct or damages directly caused to natural 171 | persons, the Licensor will in no event be liable for any direct or indirect, 172 | material or moral, damages of any kind, arising out of the Licence or of the use 173 | of the Work, including without limitation, damages for loss of goodwill, work 174 | stoppage, computer failure or malfunction, loss of data or any commercial 175 | damage, even if the Licensor has been advised of the possibility of such damage. 176 | However, the Licensor will be liable under statutory product liability laws as 177 | far such laws apply to the Work. 178 | 179 | 9. Additional agreements 180 | 181 | While distributing the Work, You may choose to conclude an additional agreement, 182 | defining obligations or services consistent with this Licence. However, if 183 | accepting obligations, You may act only on your own behalf and on your sole 184 | responsibility, not on behalf of the original Licensor or any other Contributor, 185 | and only if You agree to indemnify, defend, and hold each Contributor harmless 186 | for any liability incurred by, or claims asserted against such Contributor by 187 | the fact You have accepted any warranty or additional liability. 188 | 189 | 10. Acceptance of the Licence 190 | 191 | The provisions of this Licence can be accepted by clicking on an icon ‘I agree’ 192 | placed under the bottom of a window displaying the text of this Licence or by 193 | affirming consent in any other similar way, in accordance with the rules of 194 | applicable law. Clicking on that icon indicates your clear and irrevocable 195 | acceptance of this Licence and all of its terms and conditions. 196 | 197 | Similarly, you irrevocably accept this Licence and all of its terms and 198 | conditions by exercising any rights granted to You by Article 2 of this Licence, 199 | such as the use of the Work, the creation by You of a Derivative Work or the 200 | Distribution or Communication by You of the Work or copies thereof. 201 | 202 | 11. Information to the public 203 | 204 | In case of any Distribution or Communication of the Work by means of electronic 205 | communication by You (for example, by offering to download the Work from a 206 | remote location) the distribution channel or media (for example, a website) must 207 | at least provide to the public the information requested by the applicable law 208 | regarding the Licensor, the Licence and the way it may be accessible, concluded, 209 | stored and reproduced by the Licensee. 210 | 211 | 12. Termination of the Licence 212 | 213 | The Licence and the rights granted hereunder will terminate automatically upon 214 | any breach by the Licensee of the terms of the Licence. 215 | 216 | Such a termination will not terminate the licences of any person who has 217 | received the Work from the Licensee under the Licence, provided such persons 218 | remain in full compliance with the Licence. 219 | 220 | 13. Miscellaneous 221 | 222 | Without prejudice of Article 9 above, the Licence represents the complete 223 | agreement between the Parties as to the Work. 224 | 225 | If any provision of the Licence is invalid or unenforceable under applicable 226 | law, this will not affect the validity or enforceability of the Licence as a 227 | whole. Such provision will be construed or reformed so as necessary to make it 228 | valid and enforceable. 229 | 230 | The European Commission may publish other linguistic versions or new versions of 231 | this Licence or updated versions of the Appendix, so far this is required and 232 | reasonable, without reducing the scope of the rights granted by the Licence. New 233 | versions of the Licence will be published with a unique version number. 234 | 235 | All linguistic versions of this Licence, approved by the European Commission, 236 | have identical value. Parties can take advantage of the linguistic version of 237 | their choice. 238 | 239 | 14. Jurisdiction 240 | 241 | Without prejudice to specific agreement between parties, 242 | 243 | - any litigation resulting from the interpretation of this License, arising 244 | between the European Union institutions, bodies, offices or agencies, as a 245 | Licensor, and any Licensee, will be subject to the jurisdiction of the Court 246 | of Justice of the European Union, as laid down in article 272 of the Treaty on 247 | the Functioning of the European Union, 248 | 249 | - any litigation arising between other parties and resulting from the 250 | interpretation of this License, will be subject to the exclusive jurisdiction 251 | of the competent court where the Licensor resides or conducts its primary 252 | business. 253 | 254 | 15. Applicable Law 255 | 256 | Without prejudice to specific agreement between parties, 257 | 258 | - this Licence shall be governed by the law of the European Union Member State 259 | where the Licensor has his seat, resides or has his registered office, 260 | 261 | - this licence shall be governed by Belgian law if the Licensor has no seat, 262 | residence or registered office inside a European Union Member State. 263 | 264 | Appendix 265 | 266 | ‘Compatible Licences’ according to Article 5 EUPL are: 267 | 268 | - GNU General Public License (GPL) v. 2, v. 3 269 | - GNU Affero General Public License (AGPL) v. 3 270 | - Open Software License (OSL) v. 2.1, v. 3.0 271 | - Eclipse Public License (EPL) v. 1.0 272 | - CeCILL v. 2.0, v. 2.1 273 | - Mozilla Public Licence (MPL) v. 2 274 | - GNU Lesser General Public Licence (LGPL) v. 2.1, v. 3 275 | - Creative Commons Attribution-ShareAlike v. 3.0 Unported (CC BY-SA 3.0) for 276 | works other than software 277 | - European Union Public Licence (EUPL) v. 1.1, v. 1.2 278 | - Québec Free and Open-Source Licence — Reciprocity (LiLiQ-R) or Strong 279 | Reciprocity (LiLiQ-R+). 280 | 281 | The European Commission may update this Appendix to later versions of the above 282 | licences without producing a new version of the EUPL, as long as they provide 283 | the rights granted in Article 2 of this Licence and protect the covered Source 284 | Code from exclusive appropriation. 285 | 286 | All other changes or additions to this Appendix require the production of a new 287 | EUPL version. -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | devDependencies: 8 | typescript: 9 | specifier: ^5.2.2 10 | version: 5.2.2 11 | vitest: 12 | specifier: 1.0.0-beta.4 13 | version: 1.0.0-beta.4 14 | 15 | packages: 16 | 17 | /@esbuild/android-arm64@0.18.20: 18 | resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} 19 | engines: {node: '>=12'} 20 | cpu: [arm64] 21 | os: [android] 22 | requiresBuild: true 23 | dev: true 24 | optional: true 25 | 26 | /@esbuild/android-arm@0.18.20: 27 | resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} 28 | engines: {node: '>=12'} 29 | cpu: [arm] 30 | os: [android] 31 | requiresBuild: true 32 | dev: true 33 | optional: true 34 | 35 | /@esbuild/android-x64@0.18.20: 36 | resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} 37 | engines: {node: '>=12'} 38 | cpu: [x64] 39 | os: [android] 40 | requiresBuild: true 41 | dev: true 42 | optional: true 43 | 44 | /@esbuild/darwin-arm64@0.18.20: 45 | resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} 46 | engines: {node: '>=12'} 47 | cpu: [arm64] 48 | os: [darwin] 49 | requiresBuild: true 50 | dev: true 51 | optional: true 52 | 53 | /@esbuild/darwin-x64@0.18.20: 54 | resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} 55 | engines: {node: '>=12'} 56 | cpu: [x64] 57 | os: [darwin] 58 | requiresBuild: true 59 | dev: true 60 | optional: true 61 | 62 | /@esbuild/freebsd-arm64@0.18.20: 63 | resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} 64 | engines: {node: '>=12'} 65 | cpu: [arm64] 66 | os: [freebsd] 67 | requiresBuild: true 68 | dev: true 69 | optional: true 70 | 71 | /@esbuild/freebsd-x64@0.18.20: 72 | resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} 73 | engines: {node: '>=12'} 74 | cpu: [x64] 75 | os: [freebsd] 76 | requiresBuild: true 77 | dev: true 78 | optional: true 79 | 80 | /@esbuild/linux-arm64@0.18.20: 81 | resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} 82 | engines: {node: '>=12'} 83 | cpu: [arm64] 84 | os: [linux] 85 | requiresBuild: true 86 | dev: true 87 | optional: true 88 | 89 | /@esbuild/linux-arm@0.18.20: 90 | resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} 91 | engines: {node: '>=12'} 92 | cpu: [arm] 93 | os: [linux] 94 | requiresBuild: true 95 | dev: true 96 | optional: true 97 | 98 | /@esbuild/linux-ia32@0.18.20: 99 | resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} 100 | engines: {node: '>=12'} 101 | cpu: [ia32] 102 | os: [linux] 103 | requiresBuild: true 104 | dev: true 105 | optional: true 106 | 107 | /@esbuild/linux-loong64@0.18.20: 108 | resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} 109 | engines: {node: '>=12'} 110 | cpu: [loong64] 111 | os: [linux] 112 | requiresBuild: true 113 | dev: true 114 | optional: true 115 | 116 | /@esbuild/linux-mips64el@0.18.20: 117 | resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} 118 | engines: {node: '>=12'} 119 | cpu: [mips64el] 120 | os: [linux] 121 | requiresBuild: true 122 | dev: true 123 | optional: true 124 | 125 | /@esbuild/linux-ppc64@0.18.20: 126 | resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} 127 | engines: {node: '>=12'} 128 | cpu: [ppc64] 129 | os: [linux] 130 | requiresBuild: true 131 | dev: true 132 | optional: true 133 | 134 | /@esbuild/linux-riscv64@0.18.20: 135 | resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} 136 | engines: {node: '>=12'} 137 | cpu: [riscv64] 138 | os: [linux] 139 | requiresBuild: true 140 | dev: true 141 | optional: true 142 | 143 | /@esbuild/linux-s390x@0.18.20: 144 | resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} 145 | engines: {node: '>=12'} 146 | cpu: [s390x] 147 | os: [linux] 148 | requiresBuild: true 149 | dev: true 150 | optional: true 151 | 152 | /@esbuild/linux-x64@0.18.20: 153 | resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} 154 | engines: {node: '>=12'} 155 | cpu: [x64] 156 | os: [linux] 157 | requiresBuild: true 158 | dev: true 159 | optional: true 160 | 161 | /@esbuild/netbsd-x64@0.18.20: 162 | resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} 163 | engines: {node: '>=12'} 164 | cpu: [x64] 165 | os: [netbsd] 166 | requiresBuild: true 167 | dev: true 168 | optional: true 169 | 170 | /@esbuild/openbsd-x64@0.18.20: 171 | resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} 172 | engines: {node: '>=12'} 173 | cpu: [x64] 174 | os: [openbsd] 175 | requiresBuild: true 176 | dev: true 177 | optional: true 178 | 179 | /@esbuild/sunos-x64@0.18.20: 180 | resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} 181 | engines: {node: '>=12'} 182 | cpu: [x64] 183 | os: [sunos] 184 | requiresBuild: true 185 | dev: true 186 | optional: true 187 | 188 | /@esbuild/win32-arm64@0.18.20: 189 | resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} 190 | engines: {node: '>=12'} 191 | cpu: [arm64] 192 | os: [win32] 193 | requiresBuild: true 194 | dev: true 195 | optional: true 196 | 197 | /@esbuild/win32-ia32@0.18.20: 198 | resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} 199 | engines: {node: '>=12'} 200 | cpu: [ia32] 201 | os: [win32] 202 | requiresBuild: true 203 | dev: true 204 | optional: true 205 | 206 | /@esbuild/win32-x64@0.18.20: 207 | resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} 208 | engines: {node: '>=12'} 209 | cpu: [x64] 210 | os: [win32] 211 | requiresBuild: true 212 | dev: true 213 | optional: true 214 | 215 | /@jest/schemas@29.6.3: 216 | resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} 217 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 218 | dependencies: 219 | '@sinclair/typebox': 0.27.8 220 | dev: true 221 | 222 | /@jridgewell/sourcemap-codec@1.4.15: 223 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} 224 | dev: true 225 | 226 | /@sinclair/typebox@0.27.8: 227 | resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} 228 | dev: true 229 | 230 | /@vitest/expect@1.0.0-beta.4: 231 | resolution: {integrity: sha512-JOpNEva2AFxfySH3F+X+hT52Kq/ZdIrGtzWYbj6yRuBuxFqM55n/7/jV4XtQG+XkmehP3OUZGx5zISOU8KHPQw==} 232 | dependencies: 233 | '@vitest/spy': 1.0.0-beta.4 234 | '@vitest/utils': 1.0.0-beta.4 235 | chai: 4.3.10 236 | dev: true 237 | 238 | /@vitest/runner@1.0.0-beta.4: 239 | resolution: {integrity: sha512-rlXCMp5MxMVVVN5hdhzPL9NpIkfZC0EXwAtN5gwBbCBoVRv9dBQiZ5qTw+LaNmugPl8gm76U4e4/nMZS9s6wyw==} 240 | dependencies: 241 | '@vitest/utils': 1.0.0-beta.4 242 | p-limit: 4.0.0 243 | pathe: 1.1.1 244 | dev: true 245 | 246 | /@vitest/snapshot@1.0.0-beta.4: 247 | resolution: {integrity: sha512-CzmHLGo4RNEQUojYtuEz8wWKp9/p3hvXskejRRJB1iCRH48uWROmoyb2iEQUhgpQw/+WwI4wRP7jek5lp48pRA==} 248 | dependencies: 249 | magic-string: 0.30.5 250 | pathe: 1.1.1 251 | pretty-format: 29.7.0 252 | dev: true 253 | 254 | /@vitest/spy@1.0.0-beta.4: 255 | resolution: {integrity: sha512-YvKUUl7KucKzLJb8+RTd8H3G24EVPGk+CVMFawwtD/KuYjBzM8RCh3oJTTba6ktLpB8JLVy8NVTNL4Oeigqs8A==} 256 | dependencies: 257 | tinyspy: 2.2.0 258 | dev: true 259 | 260 | /@vitest/utils@1.0.0-beta.4: 261 | resolution: {integrity: sha512-YY4bhhVqyTxuNwuZJXiCM4/D0Z7Z3H3JDHNM8gXty7EyRUf4iPDQtXzIWe1r4zdTtoFnzFAeMr+891pWlv4SPA==} 262 | dependencies: 263 | diff-sequences: 29.6.3 264 | loupe: 2.3.7 265 | pretty-format: 29.7.0 266 | dev: true 267 | 268 | /acorn-walk@8.3.0: 269 | resolution: {integrity: sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==} 270 | engines: {node: '>=0.4.0'} 271 | dev: true 272 | 273 | /acorn@8.11.2: 274 | resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} 275 | engines: {node: '>=0.4.0'} 276 | hasBin: true 277 | dev: true 278 | 279 | /ansi-styles@5.2.0: 280 | resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} 281 | engines: {node: '>=10'} 282 | dev: true 283 | 284 | /assertion-error@1.1.0: 285 | resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} 286 | dev: true 287 | 288 | /cac@6.7.14: 289 | resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 290 | engines: {node: '>=8'} 291 | dev: true 292 | 293 | /chai@4.3.10: 294 | resolution: {integrity: sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==} 295 | engines: {node: '>=4'} 296 | dependencies: 297 | assertion-error: 1.1.0 298 | check-error: 1.0.3 299 | deep-eql: 4.1.3 300 | get-func-name: 2.0.2 301 | loupe: 2.3.7 302 | pathval: 1.1.1 303 | type-detect: 4.0.8 304 | dev: true 305 | 306 | /check-error@1.0.3: 307 | resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} 308 | dependencies: 309 | get-func-name: 2.0.2 310 | dev: true 311 | 312 | /debug@4.3.4: 313 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 314 | engines: {node: '>=6.0'} 315 | peerDependencies: 316 | supports-color: '*' 317 | peerDependenciesMeta: 318 | supports-color: 319 | optional: true 320 | dependencies: 321 | ms: 2.1.2 322 | dev: true 323 | 324 | /deep-eql@4.1.3: 325 | resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} 326 | engines: {node: '>=6'} 327 | dependencies: 328 | type-detect: 4.0.8 329 | dev: true 330 | 331 | /diff-sequences@29.6.3: 332 | resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} 333 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 334 | dev: true 335 | 336 | /esbuild@0.18.20: 337 | resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} 338 | engines: {node: '>=12'} 339 | hasBin: true 340 | requiresBuild: true 341 | optionalDependencies: 342 | '@esbuild/android-arm': 0.18.20 343 | '@esbuild/android-arm64': 0.18.20 344 | '@esbuild/android-x64': 0.18.20 345 | '@esbuild/darwin-arm64': 0.18.20 346 | '@esbuild/darwin-x64': 0.18.20 347 | '@esbuild/freebsd-arm64': 0.18.20 348 | '@esbuild/freebsd-x64': 0.18.20 349 | '@esbuild/linux-arm': 0.18.20 350 | '@esbuild/linux-arm64': 0.18.20 351 | '@esbuild/linux-ia32': 0.18.20 352 | '@esbuild/linux-loong64': 0.18.20 353 | '@esbuild/linux-mips64el': 0.18.20 354 | '@esbuild/linux-ppc64': 0.18.20 355 | '@esbuild/linux-riscv64': 0.18.20 356 | '@esbuild/linux-s390x': 0.18.20 357 | '@esbuild/linux-x64': 0.18.20 358 | '@esbuild/netbsd-x64': 0.18.20 359 | '@esbuild/openbsd-x64': 0.18.20 360 | '@esbuild/sunos-x64': 0.18.20 361 | '@esbuild/win32-arm64': 0.18.20 362 | '@esbuild/win32-ia32': 0.18.20 363 | '@esbuild/win32-x64': 0.18.20 364 | dev: true 365 | 366 | /fsevents@2.3.3: 367 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 368 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 369 | os: [darwin] 370 | requiresBuild: true 371 | dev: true 372 | optional: true 373 | 374 | /get-func-name@2.0.2: 375 | resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} 376 | dev: true 377 | 378 | /jsonc-parser@3.2.0: 379 | resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} 380 | dev: true 381 | 382 | /local-pkg@0.4.3: 383 | resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} 384 | engines: {node: '>=14'} 385 | dev: true 386 | 387 | /loupe@2.3.7: 388 | resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} 389 | dependencies: 390 | get-func-name: 2.0.2 391 | dev: true 392 | 393 | /magic-string@0.30.5: 394 | resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} 395 | engines: {node: '>=12'} 396 | dependencies: 397 | '@jridgewell/sourcemap-codec': 1.4.15 398 | dev: true 399 | 400 | /mlly@1.4.2: 401 | resolution: {integrity: sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==} 402 | dependencies: 403 | acorn: 8.11.2 404 | pathe: 1.1.1 405 | pkg-types: 1.0.3 406 | ufo: 1.3.1 407 | dev: true 408 | 409 | /ms@2.1.2: 410 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 411 | dev: true 412 | 413 | /nanoid@3.3.7: 414 | resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} 415 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 416 | hasBin: true 417 | dev: true 418 | 419 | /p-limit@4.0.0: 420 | resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} 421 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 422 | dependencies: 423 | yocto-queue: 1.0.0 424 | dev: true 425 | 426 | /pathe@1.1.1: 427 | resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} 428 | dev: true 429 | 430 | /pathval@1.1.1: 431 | resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} 432 | dev: true 433 | 434 | /picocolors@1.0.0: 435 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 436 | dev: true 437 | 438 | /pkg-types@1.0.3: 439 | resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} 440 | dependencies: 441 | jsonc-parser: 3.2.0 442 | mlly: 1.4.2 443 | pathe: 1.1.1 444 | dev: true 445 | 446 | /postcss@8.4.31: 447 | resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} 448 | engines: {node: ^10 || ^12 || >=14} 449 | dependencies: 450 | nanoid: 3.3.7 451 | picocolors: 1.0.0 452 | source-map-js: 1.0.2 453 | dev: true 454 | 455 | /pretty-format@29.7.0: 456 | resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} 457 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 458 | dependencies: 459 | '@jest/schemas': 29.6.3 460 | ansi-styles: 5.2.0 461 | react-is: 18.2.0 462 | dev: true 463 | 464 | /react-is@18.2.0: 465 | resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} 466 | dev: true 467 | 468 | /rollup@3.29.4: 469 | resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==} 470 | engines: {node: '>=14.18.0', npm: '>=8.0.0'} 471 | hasBin: true 472 | optionalDependencies: 473 | fsevents: 2.3.3 474 | dev: true 475 | 476 | /siginfo@2.0.0: 477 | resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} 478 | dev: true 479 | 480 | /source-map-js@1.0.2: 481 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} 482 | engines: {node: '>=0.10.0'} 483 | dev: true 484 | 485 | /stackback@0.0.2: 486 | resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} 487 | dev: true 488 | 489 | /std-env@3.4.3: 490 | resolution: {integrity: sha512-f9aPhy8fYBuMN+sNfakZV18U39PbalgjXG3lLB9WkaYTxijru61wb57V9wxxNthXM5Sd88ETBWi29qLAsHO52Q==} 491 | dev: true 492 | 493 | /strip-literal@1.3.0: 494 | resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} 495 | dependencies: 496 | acorn: 8.11.2 497 | dev: true 498 | 499 | /tinybench@2.5.1: 500 | resolution: {integrity: sha512-65NKvSuAVDP/n4CqH+a9w2kTlLReS9vhsAP06MWx+/89nMinJyB2icyl58RIcqCmIggpojIGeuJGhjU1aGMBSg==} 501 | dev: true 502 | 503 | /tinypool@0.8.1: 504 | resolution: {integrity: sha512-zBTCK0cCgRROxvs9c0CGK838sPkeokNGdQVUUwHAbynHFlmyJYj825f/oRs528HaIJ97lo0pLIlDUzwN+IorWg==} 505 | engines: {node: '>=14.0.0'} 506 | dev: true 507 | 508 | /tinyspy@2.2.0: 509 | resolution: {integrity: sha512-d2eda04AN/cPOR89F7Xv5bK/jrQEhmcLFe6HFldoeO9AJtps+fqEnh486vnT/8y4bw38pSyxDcTCAq+Ks2aJTg==} 510 | engines: {node: '>=14.0.0'} 511 | dev: true 512 | 513 | /type-detect@4.0.8: 514 | resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} 515 | engines: {node: '>=4'} 516 | dev: true 517 | 518 | /typescript@5.2.2: 519 | resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} 520 | engines: {node: '>=14.17'} 521 | hasBin: true 522 | dev: true 523 | 524 | /ufo@1.3.1: 525 | resolution: {integrity: sha512-uY/99gMLIOlJPwATcMVYfqDSxUR9//AUcgZMzwfSTJPDKzA1S8mX4VLqa+fiAtveraQUBCz4FFcwVZBGbwBXIw==} 526 | dev: true 527 | 528 | /vite-node@1.0.0-beta.4: 529 | resolution: {integrity: sha512-YODjVvHd2Jih+TGMG3B99ktSyvET9w2cMevorAjcuQ3KKiPhDxEf2bRia2KsDHfnUGIfSpwoUdbcDdJ5xR7epg==} 530 | engines: {node: ^18.0.0 || >=20.0.0} 531 | hasBin: true 532 | dependencies: 533 | cac: 6.7.14 534 | debug: 4.3.4 535 | mlly: 1.4.2 536 | pathe: 1.1.1 537 | picocolors: 1.0.0 538 | vite: 4.5.0 539 | transitivePeerDependencies: 540 | - '@types/node' 541 | - less 542 | - lightningcss 543 | - sass 544 | - stylus 545 | - sugarss 546 | - supports-color 547 | - terser 548 | dev: true 549 | 550 | /vite@4.5.0: 551 | resolution: {integrity: sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==} 552 | engines: {node: ^14.18.0 || >=16.0.0} 553 | hasBin: true 554 | peerDependencies: 555 | '@types/node': '>= 14' 556 | less: '*' 557 | lightningcss: ^1.21.0 558 | sass: '*' 559 | stylus: '*' 560 | sugarss: '*' 561 | terser: ^5.4.0 562 | peerDependenciesMeta: 563 | '@types/node': 564 | optional: true 565 | less: 566 | optional: true 567 | lightningcss: 568 | optional: true 569 | sass: 570 | optional: true 571 | stylus: 572 | optional: true 573 | sugarss: 574 | optional: true 575 | terser: 576 | optional: true 577 | dependencies: 578 | esbuild: 0.18.20 579 | postcss: 8.4.31 580 | rollup: 3.29.4 581 | optionalDependencies: 582 | fsevents: 2.3.3 583 | dev: true 584 | 585 | /vitest@1.0.0-beta.4: 586 | resolution: {integrity: sha512-WOJTqxY3hWqn4yy26SK+cx+BlPBeK/KtY9ALWkD6FLWLhSGY0QFEmarc8sdb/UGZQ8xs5pOvcQQS9JJSV8HH8g==} 587 | engines: {node: ^18.0.0 || >=20.0.0} 588 | hasBin: true 589 | peerDependencies: 590 | '@edge-runtime/vm': '*' 591 | '@types/node': ^18.0.0 || >=20.0.0 592 | '@vitest/browser': '*' 593 | '@vitest/ui': '*' 594 | happy-dom: '*' 595 | jsdom: '*' 596 | peerDependenciesMeta: 597 | '@edge-runtime/vm': 598 | optional: true 599 | '@types/node': 600 | optional: true 601 | '@vitest/browser': 602 | optional: true 603 | '@vitest/ui': 604 | optional: true 605 | happy-dom: 606 | optional: true 607 | jsdom: 608 | optional: true 609 | dependencies: 610 | '@vitest/expect': 1.0.0-beta.4 611 | '@vitest/runner': 1.0.0-beta.4 612 | '@vitest/snapshot': 1.0.0-beta.4 613 | '@vitest/spy': 1.0.0-beta.4 614 | '@vitest/utils': 1.0.0-beta.4 615 | acorn: 8.11.2 616 | acorn-walk: 8.3.0 617 | cac: 6.7.14 618 | chai: 4.3.10 619 | debug: 4.3.4 620 | local-pkg: 0.4.3 621 | magic-string: 0.30.5 622 | pathe: 1.1.1 623 | picocolors: 1.0.0 624 | std-env: 3.4.3 625 | strip-literal: 1.3.0 626 | tinybench: 2.5.1 627 | tinypool: 0.8.1 628 | vite: 4.5.0 629 | vite-node: 1.0.0-beta.4 630 | why-is-node-running: 2.2.2 631 | transitivePeerDependencies: 632 | - less 633 | - lightningcss 634 | - sass 635 | - stylus 636 | - sugarss 637 | - supports-color 638 | - terser 639 | dev: true 640 | 641 | /why-is-node-running@2.2.2: 642 | resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} 643 | engines: {node: '>=8'} 644 | hasBin: true 645 | dependencies: 646 | siginfo: 2.0.0 647 | stackback: 0.0.2 648 | dev: true 649 | 650 | /yocto-queue@1.0.0: 651 | resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} 652 | engines: {node: '>=12.20'} 653 | dev: true 654 | --------------------------------------------------------------------------------