├── .github └── workflows │ └── ci.yml ├── .gitignore ├── LICENSE ├── README.md ├── index.ts ├── package-lock.json ├── package.json ├── test ├── plugin.test.ts └── testproject │ ├── build.sbt │ ├── other-project │ └── src │ │ └── main │ │ └── scala │ │ └── otherproject │ │ └── OtherProject.scala │ ├── project │ ├── build.properties │ └── plugins.sbt │ └── src │ └── main │ └── scala │ └── testproject │ └── TestProject.scala └── tsconfig.json /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: Node.js test and Build 2 | 3 | on: 4 | push: 5 | branches: [ main ] 6 | pull_request: 7 | branches: [ main ] 8 | 9 | jobs: 10 | build: 11 | strategy: 12 | matrix: 13 | os: [ubuntu-latest, windows-latest] 14 | node-version: ['16'] 15 | java: ['8'] 16 | 17 | runs-on: ${{ matrix.os }} 18 | 19 | steps: 20 | - uses: actions/checkout@v3 21 | - name: Use Node.js ${{ matrix.node-version }} 22 | uses: actions/setup-node@v3 23 | with: 24 | node-version: ${{ matrix.node-version }} 25 | - name: Set up JDK ${{ matrix.java }} 26 | uses: actions/setup-java@v3 27 | with: 28 | distribution: 'adopt' 29 | java-version: ${{ matrix.java }} 30 | cache: 'sbt' 31 | 32 | - name: Cache dependencies 33 | uses: actions/cache@v3 34 | with: 35 | path: | 36 | **/node_modules 37 | key: ${{ runner.os }}-${{ hashFiles('**/package-lock.json') }} 38 | 39 | - name: Install dependencies 40 | run: npm install 41 | - name: Run sbt once in the test project to make sure sbt is downloaded 42 | run: sbt projects 43 | working-directory: ./test/testproject 44 | - name: Perform unit test 45 | run: npm test 46 | - name: Build 47 | run: npm run build 48 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules/ 2 | /dist/ 3 | target/ 4 | 5 | .bloop/ 6 | .bsp/ 7 | .idea/ 8 | .metals/ 9 | .vscode/ 10 | metals.sbt 11 | 12 | .DS_Store 13 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | 2 | Apache License 3 | Version 2.0, January 2004 4 | http://www.apache.org/licenses/ 5 | 6 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 7 | 8 | 1. Definitions. 9 | 10 | "License" shall mean the terms and conditions for use, reproduction, 11 | and distribution as defined by Sections 1 through 9 of this document. 12 | 13 | "Licensor" shall mean the copyright owner or entity authorized by 14 | the copyright owner that is granting the License. 15 | 16 | "Legal Entity" shall mean the union of the acting entity and all 17 | other entities that control, are controlled by, or are under common 18 | control with that entity. For the purposes of this definition, 19 | "control" means (i) the power, direct or indirect, to cause the 20 | direction or management of such entity, whether by contract or 21 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 22 | outstanding shares, or (iii) beneficial ownership of such entity. 23 | 24 | "You" (or "Your") shall mean an individual or Legal Entity 25 | exercising permissions granted by this License. 26 | 27 | "Source" form shall mean the preferred form for making modifications, 28 | including but not limited to software source code, documentation 29 | source, and configuration files. 30 | 31 | "Object" form shall mean any form resulting from mechanical 32 | transformation or translation of a Source form, including but 33 | not limited to compiled object code, generated documentation, 34 | and conversions to other media types. 35 | 36 | "Work" shall mean the work of authorship, whether in Source or 37 | Object form, made available under the License, as indicated by a 38 | copyright notice that is included in or attached to the work 39 | (an example is provided in the Appendix below). 40 | 41 | "Derivative Works" shall mean any work, whether in Source or Object 42 | form, that is based on (or derived from) the Work and for which the 43 | editorial revisions, annotations, elaborations, or other modifications 44 | represent, as a whole, an original work of authorship. For the purposes 45 | of this License, Derivative Works shall not include works that remain 46 | separable from, or merely link (or bind by name) to the interfaces of, 47 | the Work and Derivative Works thereof. 48 | 49 | "Contribution" shall mean any work of authorship, including 50 | the original version of the Work and any modifications or additions 51 | to that Work or Derivative Works thereof, that is intentionally 52 | submitted to Licensor for inclusion in the Work by the copyright owner 53 | or by an individual or Legal Entity authorized to submit on behalf of 54 | the copyright owner. For the purposes of this definition, "submitted" 55 | means any form of electronic, verbal, or written communication sent 56 | to the Licensor or its representatives, including but not limited to 57 | communication on electronic mailing lists, source code control systems, 58 | and issue tracking systems that are managed by, or on behalf of, the 59 | Licensor for the purpose of discussing and improving the Work, but 60 | excluding communication that is conspicuously marked or otherwise 61 | designated in writing by the copyright owner as "Not a Contribution." 62 | 63 | "Contributor" shall mean Licensor and any individual or Legal Entity 64 | on behalf of whom a Contribution has been received by Licensor and 65 | subsequently incorporated within the Work. 66 | 67 | 2. Grant of Copyright License. Subject to the terms and conditions of 68 | this License, each Contributor hereby grants to You a perpetual, 69 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 70 | copyright license to reproduce, prepare Derivative Works of, 71 | publicly display, publicly perform, sublicense, and distribute the 72 | Work and such Derivative Works in Source or Object form. 73 | 74 | 3. Grant of Patent License. Subject to the terms and conditions of 75 | this License, each Contributor hereby grants to You a perpetual, 76 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 77 | (except as stated in this section) patent license to make, have made, 78 | use, offer to sell, sell, import, and otherwise transfer the Work, 79 | where such license applies only to those patent claims licensable 80 | by such Contributor that are necessarily infringed by their 81 | Contribution(s) alone or by combination of their Contribution(s) 82 | with the Work to which such Contribution(s) was submitted. If You 83 | institute patent litigation against any entity (including a 84 | cross-claim or counterclaim in a lawsuit) alleging that the Work 85 | or a Contribution incorporated within the Work constitutes direct 86 | or contributory patent infringement, then any patent licenses 87 | granted to You under this License for that Work shall terminate 88 | as of the date such litigation is filed. 89 | 90 | 4. Redistribution. You may reproduce and distribute copies of the 91 | Work or Derivative Works thereof in any medium, with or without 92 | modifications, and in Source or Object form, provided that You 93 | meet the following conditions: 94 | 95 | (a) You must give any other recipients of the Work or 96 | Derivative Works a copy of this License; and 97 | 98 | (b) You must cause any modified files to carry prominent notices 99 | stating that You changed the files; and 100 | 101 | (c) You must retain, in the Source form of any Derivative Works 102 | that You distribute, all copyright, patent, trademark, and 103 | attribution notices from the Source form of the Work, 104 | excluding those notices that do not pertain to any part of 105 | the Derivative Works; and 106 | 107 | (d) If the Work includes a "NOTICE" text file as part of its 108 | distribution, then any Derivative Works that You distribute must 109 | include a readable copy of the attribution notices contained 110 | within such NOTICE file, excluding those notices that do not 111 | pertain to any part of the Derivative Works, in at least one 112 | of the following places: within a NOTICE text file distributed 113 | as part of the Derivative Works; within the Source form or 114 | documentation, if provided along with the Derivative Works; or, 115 | within a display generated by the Derivative Works, if and 116 | wherever such third-party notices normally appear. The contents 117 | of the NOTICE file are for informational purposes only and 118 | do not modify the License. You may add Your own attribution 119 | notices within Derivative Works that You distribute, alongside 120 | or as an addendum to the NOTICE text from the Work, provided 121 | that such additional attribution notices cannot be construed 122 | as modifying the License. 123 | 124 | You may add Your own copyright statement to Your modifications and 125 | may provide additional or different license terms and conditions 126 | for use, reproduction, or distribution of Your modifications, or 127 | for any such Derivative Works as a whole, provided Your use, 128 | reproduction, and distribution of the Work otherwise complies with 129 | the conditions stated in this License. 130 | 131 | 5. Submission of Contributions. Unless You explicitly state otherwise, 132 | any Contribution intentionally submitted for inclusion in the Work 133 | by You to the Licensor shall be under the terms and conditions of 134 | this License, without any additional terms or conditions. 135 | Notwithstanding the above, nothing herein shall supersede or modify 136 | the terms of any separate license agreement you may have executed 137 | with Licensor regarding such Contributions. 138 | 139 | 6. Trademarks. This License does not grant permission to use the trade 140 | names, trademarks, service marks, or product names of the Licensor, 141 | except as required for reasonable and customary use in describing the 142 | origin of the Work and reproducing the content of the NOTICE file. 143 | 144 | 7. Disclaimer of Warranty. Unless required by applicable law or 145 | agreed to in writing, Licensor provides the Work (and each 146 | Contributor provides its Contributions) on an "AS IS" BASIS, 147 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 148 | implied, including, without limitation, any warranties or conditions 149 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 150 | PARTICULAR PURPOSE. You are solely responsible for determining the 151 | appropriateness of using or redistributing the Work and assume any 152 | risks associated with Your exercise of permissions under this License. 153 | 154 | 8. Limitation of Liability. In no event and under no legal theory, 155 | whether in tort (including negligence), contract, or otherwise, 156 | unless required by applicable law (such as deliberate and grossly 157 | negligent acts) or agreed to in writing, shall any Contributor be 158 | liable to You for damages, including any direct, indirect, special, 159 | incidental, or consequential damages of any character arising as a 160 | result of this License or out of the use or inability to use the 161 | Work (including but not limited to damages for loss of goodwill, 162 | work stoppage, computer failure or malfunction, or any and all 163 | other commercial damages or losses), even if such Contributor 164 | has been advised of the possibility of such damages. 165 | 166 | 9. Accepting Warranty or Additional Liability. While redistributing 167 | the Work or Derivative Works thereof, You may choose to offer, 168 | and charge a fee for, acceptance of support, warranty, indemnity, 169 | or other liability obligations and/or rights consistent with this 170 | License. However, in accepting such obligations, You may act only 171 | on Your own behalf and on Your sole responsibility, not on behalf 172 | of any other Contributor, and only if You agree to indemnify, 173 | defend, and hold each Contributor harmless for any liability 174 | incurred by, or claims asserted against, such Contributor by reason 175 | of your accepting any such warranty or additional liability. 176 | 177 | END OF TERMS AND CONDITIONS 178 | 179 | APPENDIX: How to apply the Apache License to your work. 180 | 181 | To apply the Apache License to your work, attach the following 182 | boilerplate notice, with the fields enclosed by brackets "[]" 183 | replaced with your own identifying information. (Don't include 184 | the brackets!) The text should be enclosed in the appropriate 185 | comment syntax for the file format. We also recommend that a 186 | file or class name and description of purpose be included on the 187 | same "printed page" as the copyright notice for easier 188 | identification within third-party archives. 189 | 190 | Copyright (c) 2013-2018 EPFL 191 | 192 | Licensed under the Apache License, Version 2.0 (the "License"); 193 | you may not use this file except in compliance with the License. 194 | You may obtain a copy of the License at 195 | 196 | http://www.apache.org/licenses/LICENSE-2.0 197 | 198 | Unless required by applicable law or agreed to in writing, software 199 | distributed under the License is distributed on an "AS IS" BASIS, 200 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 201 | See the License for the specific language governing permissions and 202 | limitations under the License. 203 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # vite-plugin-scalajs 2 | 3 | A [Vite](https://vitejs.dev/) plugin for [Scala.js](https://www.scala-js.org/). 4 | 5 | ## Usage 6 | 7 | We assume that you have an existing Vite and Scala.js sbt project. 8 | If not, [follow the accompanying tutorial](https://www.scala-js.org/doc/tutorial/scalajs-vite.html). 9 | 10 | Install the plugin as a development dependency: 11 | 12 | ```shell 13 | $ npm install -D @scala-js/vite-plugin-scalajs 14 | ``` 15 | 16 | Tell Vite to use the plugin in `vite.config.js`: 17 | 18 | ```javascript 19 | import { defineConfig } from "vite"; 20 | import scalaJSPlugin from "@scala-js/vite-plugin-scalajs"; 21 | 22 | export default defineConfig({ 23 | plugins: [scalaJSPlugin()], 24 | }); 25 | ``` 26 | 27 | Finally, import the Scala.js output from a `.js` or `.ts` file with 28 | 29 | ```javascript 30 | import 'scalajs:main.js'; 31 | ``` 32 | 33 | which will execute the main method of the Scala.js application. 34 | 35 | The sbt project must at least be configured to use ES modules. 36 | For the best feedback loop with Vite, we recommend to emit small modules for application code. 37 | If your application lives in the `my.app` package, configure the sbt project with the following settings: 38 | 39 | ```scala 40 | scalaJSLinkerConfig ~= { 41 | _.withModuleKind(ModuleKind.ESModule) 42 | .withModuleSplitStyle( 43 | ModuleSplitStyle.SmallModulesFor(List("my.app"))) 44 | }, 45 | ``` 46 | 47 | In development mode, use two terminals in parallel: 48 | 49 | * One with `$ npm run dev`. 50 | * One with `$ sbt '~fastLinkJS'` (or a more precise version such as `$ sbt '~theJSProject/fastLinkJS`). 51 | 52 | For the production build, `$ npm run build` is enough. 53 | 54 | ## Configuration 55 | 56 | The plugin supports the following configuration options: 57 | 58 | ```javascript 59 | export default defineConfig({ 60 | plugins: [ 61 | scalaJSPlugin({ 62 | // path to the directory containing the sbt build 63 | // default: '.' 64 | cwd: '.', 65 | 66 | // sbt project ID from within the sbt build to get fast/fullLinkJS from 67 | // default: the root project of the sbt build 68 | projectID: 'client', 69 | 70 | // URI prefix of imports that this plugin catches (without the trailing ':') 71 | // default: 'scalajs' (so the plugin recognizes URIs starting with 'scalajs:') 72 | uriPrefix: 'scalajs', 73 | }), 74 | ], 75 | }); 76 | ``` 77 | 78 | ## Importing `@JSExportTopLevel` Scala.js members 79 | 80 | `@JSExportTopLevel("foo")` members in the Scala.js code are exported from the modules that Scala.js generates. 81 | They can be imported in `.js` and `.ts` files with the usual JavaScript `import` syntax. 82 | 83 | For example, given the following Scala.js definition: 84 | 85 | ```scala 86 | import scala.scalajs.js 87 | import scala.scalajs.js.annotation._ 88 | 89 | @JSExportTopLevel("ScalaJSLib") 90 | class ScalaJSLib extends js.Object { 91 | def square(x: Double): Double = x * x 92 | } 93 | ``` 94 | 95 | we can import and use it as 96 | 97 | ```javascript 98 | import { ScalaJSLib } from 'scalajs:main.js'; 99 | 100 | const lib = new ScalaJSLib(); 101 | console.log(lib.square(5)); // 25 102 | ``` 103 | 104 | ### Exports in other modules 105 | 106 | By default, `@JSExportTopLevel("Foo")` exports `Foo` from the `main` module, which is why we import from `scalajs:main.js`. 107 | We can also split the Scala.js exports into several modules. 108 | For example, 109 | 110 | ```scala 111 | import scala.scalajs.js 112 | import scala.scalajs.js.annotation._ 113 | 114 | @JSExportTopLevel("ScalaJSLib", "library") 115 | class ScalaJSLib extends js.Object { 116 | def square(x: Double): Double = x * x 117 | } 118 | ``` 119 | 120 | can be imported with 121 | 122 | ```javascript 123 | import { ScalaJSLib } from 'scalajs:library.js'; 124 | ``` 125 | 126 | The Scala.js documentation contains [more information about module splitting](https://www.scala-js.org/doc/project/module.html). 127 | -------------------------------------------------------------------------------- /index.ts: -------------------------------------------------------------------------------- 1 | import { spawn, SpawnOptions } from "child_process"; 2 | import type { Plugin as VitePlugin } from "vite"; 3 | 4 | // Utility to invoke a given sbt task and fetch its output 5 | function printSbtTask(task: string, cwd?: string): Promise { 6 | const args = ["--batch", "-no-colors", "-Dsbt.supershell=false", `print ${task}`]; 7 | const options: SpawnOptions = { 8 | cwd: cwd, 9 | stdio: ['ignore', 'pipe', 'inherit'], 10 | }; 11 | const child = process.platform === 'win32' 12 | ? spawn("sbt.bat", args.map(x => `"${x}"`), {shell: true, ...options}) 13 | : spawn("sbt", args, options); 14 | 15 | let fullOutput: string = ''; 16 | 17 | child.stdout!.setEncoding('utf-8'); 18 | child.stdout!.on('data', data => { 19 | fullOutput += data; 20 | process.stdout.write(data); // tee on my own stdout 21 | }); 22 | 23 | return new Promise((resolve, reject) => { 24 | child.on('error', err => { 25 | reject(new Error(`sbt invocation for Scala.js compilation could not start. Is it installed?\n${err}`)); 26 | }); 27 | child.on('close', code => { 28 | if (code !== 0) { 29 | let errorMessage = `sbt invocation for Scala.js compilation failed with exit code ${code}.`; 30 | if (fullOutput.includes("Not a valid command: --")) { 31 | errorMessage += "\nCause: Your sbt launcher script version is too old (<1.3.3)." 32 | errorMessage += "\nFix: Re-install the latest version of sbt launcher script from https://www.scala-sbt.org/" 33 | } 34 | reject(new Error(errorMessage)); 35 | } else { 36 | resolve(fullOutput.trimEnd().split('\n').at(-1)!); 37 | } 38 | }); 39 | }); 40 | } 41 | 42 | export interface ScalaJSPluginOptions { 43 | cwd?: string, 44 | projectID?: string, 45 | uriPrefix?: string, 46 | } 47 | 48 | export default function scalaJSPlugin(options: ScalaJSPluginOptions = {}): VitePlugin { 49 | const { cwd, projectID, uriPrefix } = options; 50 | 51 | const fullURIPrefix = uriPrefix ? (uriPrefix + ':') : 'scalajs:'; 52 | 53 | let isDev: boolean | undefined = undefined; 54 | let scalaJSOutputDir: string | undefined = undefined; 55 | 56 | return { 57 | name: "scalajs:sbt-scalajs-plugin", 58 | 59 | // Vite-specific 60 | configResolved(resolvedConfig) { 61 | isDev = resolvedConfig.mode === 'development'; 62 | }, 63 | 64 | // standard Rollup 65 | async buildStart(options) { 66 | if (isDev === undefined) 67 | throw new Error("configResolved must be called before buildStart"); 68 | 69 | const task = isDev ? "fastLinkJSOutput" : "fullLinkJSOutput"; 70 | const projectTask = projectID ? `${projectID}/${task}` : task; 71 | scalaJSOutputDir = await printSbtTask(projectTask, cwd); 72 | }, 73 | 74 | // standard Rollup 75 | resolveId(source, importer, options) { 76 | if (scalaJSOutputDir === undefined) 77 | throw new Error("buildStart must be called before resolveId"); 78 | 79 | if (!source.startsWith(fullURIPrefix)) 80 | return null; 81 | const path = source.substring(fullURIPrefix.length); 82 | 83 | return `${scalaJSOutputDir}/${path}`; 84 | }, 85 | }; 86 | } 87 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@scala-js/vite-plugin-scalajs", 3 | "version": "1.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "@scala-js/vite-plugin-scalajs", 9 | "version": "1.0.0", 10 | "license": "Apache-2.0", 11 | "dependencies": { 12 | "vite": "^4.1.4" 13 | }, 14 | "devDependencies": { 15 | "@types/node": "^18.14.2", 16 | "typescript": "4.9.5", 17 | "vitest": "^0.29.2" 18 | } 19 | }, 20 | "node_modules/@esbuild/android-arm": { 21 | "version": "0.18.20", 22 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", 23 | "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", 24 | "cpu": [ 25 | "arm" 26 | ], 27 | "optional": true, 28 | "os": [ 29 | "android" 30 | ], 31 | "engines": { 32 | "node": ">=12" 33 | } 34 | }, 35 | "node_modules/@esbuild/android-arm64": { 36 | "version": "0.18.20", 37 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", 38 | "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", 39 | "cpu": [ 40 | "arm64" 41 | ], 42 | "optional": true, 43 | "os": [ 44 | "android" 45 | ], 46 | "engines": { 47 | "node": ">=12" 48 | } 49 | }, 50 | "node_modules/@esbuild/android-x64": { 51 | "version": "0.18.20", 52 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", 53 | "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", 54 | "cpu": [ 55 | "x64" 56 | ], 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 | "optional": true, 73 | "os": [ 74 | "darwin" 75 | ], 76 | "engines": { 77 | "node": ">=12" 78 | } 79 | }, 80 | "node_modules/@esbuild/darwin-x64": { 81 | "version": "0.18.20", 82 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", 83 | "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", 84 | "cpu": [ 85 | "x64" 86 | ], 87 | "optional": true, 88 | "os": [ 89 | "darwin" 90 | ], 91 | "engines": { 92 | "node": ">=12" 93 | } 94 | }, 95 | "node_modules/@esbuild/freebsd-arm64": { 96 | "version": "0.18.20", 97 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", 98 | "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", 99 | "cpu": [ 100 | "arm64" 101 | ], 102 | "optional": true, 103 | "os": [ 104 | "freebsd" 105 | ], 106 | "engines": { 107 | "node": ">=12" 108 | } 109 | }, 110 | "node_modules/@esbuild/freebsd-x64": { 111 | "version": "0.18.20", 112 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", 113 | "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", 114 | "cpu": [ 115 | "x64" 116 | ], 117 | "optional": true, 118 | "os": [ 119 | "freebsd" 120 | ], 121 | "engines": { 122 | "node": ">=12" 123 | } 124 | }, 125 | "node_modules/@esbuild/linux-arm": { 126 | "version": "0.18.20", 127 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", 128 | "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", 129 | "cpu": [ 130 | "arm" 131 | ], 132 | "optional": true, 133 | "os": [ 134 | "linux" 135 | ], 136 | "engines": { 137 | "node": ">=12" 138 | } 139 | }, 140 | "node_modules/@esbuild/linux-arm64": { 141 | "version": "0.18.20", 142 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", 143 | "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", 144 | "cpu": [ 145 | "arm64" 146 | ], 147 | "optional": true, 148 | "os": [ 149 | "linux" 150 | ], 151 | "engines": { 152 | "node": ">=12" 153 | } 154 | }, 155 | "node_modules/@esbuild/linux-ia32": { 156 | "version": "0.18.20", 157 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", 158 | "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", 159 | "cpu": [ 160 | "ia32" 161 | ], 162 | "optional": true, 163 | "os": [ 164 | "linux" 165 | ], 166 | "engines": { 167 | "node": ">=12" 168 | } 169 | }, 170 | "node_modules/@esbuild/linux-loong64": { 171 | "version": "0.18.20", 172 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", 173 | "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", 174 | "cpu": [ 175 | "loong64" 176 | ], 177 | "optional": true, 178 | "os": [ 179 | "linux" 180 | ], 181 | "engines": { 182 | "node": ">=12" 183 | } 184 | }, 185 | "node_modules/@esbuild/linux-mips64el": { 186 | "version": "0.18.20", 187 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", 188 | "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", 189 | "cpu": [ 190 | "mips64el" 191 | ], 192 | "optional": true, 193 | "os": [ 194 | "linux" 195 | ], 196 | "engines": { 197 | "node": ">=12" 198 | } 199 | }, 200 | "node_modules/@esbuild/linux-ppc64": { 201 | "version": "0.18.20", 202 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", 203 | "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", 204 | "cpu": [ 205 | "ppc64" 206 | ], 207 | "optional": true, 208 | "os": [ 209 | "linux" 210 | ], 211 | "engines": { 212 | "node": ">=12" 213 | } 214 | }, 215 | "node_modules/@esbuild/linux-riscv64": { 216 | "version": "0.18.20", 217 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", 218 | "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", 219 | "cpu": [ 220 | "riscv64" 221 | ], 222 | "optional": true, 223 | "os": [ 224 | "linux" 225 | ], 226 | "engines": { 227 | "node": ">=12" 228 | } 229 | }, 230 | "node_modules/@esbuild/linux-s390x": { 231 | "version": "0.18.20", 232 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", 233 | "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", 234 | "cpu": [ 235 | "s390x" 236 | ], 237 | "optional": true, 238 | "os": [ 239 | "linux" 240 | ], 241 | "engines": { 242 | "node": ">=12" 243 | } 244 | }, 245 | "node_modules/@esbuild/linux-x64": { 246 | "version": "0.18.20", 247 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", 248 | "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", 249 | "cpu": [ 250 | "x64" 251 | ], 252 | "optional": true, 253 | "os": [ 254 | "linux" 255 | ], 256 | "engines": { 257 | "node": ">=12" 258 | } 259 | }, 260 | "node_modules/@esbuild/netbsd-x64": { 261 | "version": "0.18.20", 262 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", 263 | "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", 264 | "cpu": [ 265 | "x64" 266 | ], 267 | "optional": true, 268 | "os": [ 269 | "netbsd" 270 | ], 271 | "engines": { 272 | "node": ">=12" 273 | } 274 | }, 275 | "node_modules/@esbuild/openbsd-x64": { 276 | "version": "0.18.20", 277 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", 278 | "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", 279 | "cpu": [ 280 | "x64" 281 | ], 282 | "optional": true, 283 | "os": [ 284 | "openbsd" 285 | ], 286 | "engines": { 287 | "node": ">=12" 288 | } 289 | }, 290 | "node_modules/@esbuild/sunos-x64": { 291 | "version": "0.18.20", 292 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", 293 | "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", 294 | "cpu": [ 295 | "x64" 296 | ], 297 | "optional": true, 298 | "os": [ 299 | "sunos" 300 | ], 301 | "engines": { 302 | "node": ">=12" 303 | } 304 | }, 305 | "node_modules/@esbuild/win32-arm64": { 306 | "version": "0.18.20", 307 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", 308 | "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", 309 | "cpu": [ 310 | "arm64" 311 | ], 312 | "optional": true, 313 | "os": [ 314 | "win32" 315 | ], 316 | "engines": { 317 | "node": ">=12" 318 | } 319 | }, 320 | "node_modules/@esbuild/win32-ia32": { 321 | "version": "0.18.20", 322 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", 323 | "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", 324 | "cpu": [ 325 | "ia32" 326 | ], 327 | "optional": true, 328 | "os": [ 329 | "win32" 330 | ], 331 | "engines": { 332 | "node": ">=12" 333 | } 334 | }, 335 | "node_modules/@esbuild/win32-x64": { 336 | "version": "0.18.20", 337 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", 338 | "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", 339 | "cpu": [ 340 | "x64" 341 | ], 342 | "optional": true, 343 | "os": [ 344 | "win32" 345 | ], 346 | "engines": { 347 | "node": ">=12" 348 | } 349 | }, 350 | "node_modules/@types/chai": { 351 | "version": "4.3.4", 352 | "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", 353 | "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==", 354 | "dev": true 355 | }, 356 | "node_modules/@types/chai-subset": { 357 | "version": "1.3.3", 358 | "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", 359 | "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", 360 | "dev": true, 361 | "dependencies": { 362 | "@types/chai": "*" 363 | } 364 | }, 365 | "node_modules/@types/node": { 366 | "version": "18.15.0", 367 | "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.0.tgz", 368 | "integrity": "sha512-z6nr0TTEOBGkzLGmbypWOGnpSpSIBorEhC4L+4HeQ2iezKCi4f77kyslRwvHeNitymGQ+oFyIWGP96l/DPSV9w==", 369 | "devOptional": true 370 | }, 371 | "node_modules/@vitest/expect": { 372 | "version": "0.29.2", 373 | "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.29.2.tgz", 374 | "integrity": "sha512-wjrdHB2ANTch3XKRhjWZN0UueFocH0cQbi2tR5Jtq60Nb3YOSmakjdAvUa2JFBu/o8Vjhj5cYbcMXkZxn1NzmA==", 375 | "dev": true, 376 | "dependencies": { 377 | "@vitest/spy": "0.29.2", 378 | "@vitest/utils": "0.29.2", 379 | "chai": "^4.3.7" 380 | } 381 | }, 382 | "node_modules/@vitest/runner": { 383 | "version": "0.29.2", 384 | "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.29.2.tgz", 385 | "integrity": "sha512-A1P65f5+6ru36AyHWORhuQBJrOOcmDuhzl5RsaMNFe2jEkoj0faEszQS4CtPU/LxUYVIazlUtZTY0OEZmyZBnA==", 386 | "dev": true, 387 | "dependencies": { 388 | "@vitest/utils": "0.29.2", 389 | "p-limit": "^4.0.0", 390 | "pathe": "^1.1.0" 391 | } 392 | }, 393 | "node_modules/@vitest/spy": { 394 | "version": "0.29.2", 395 | "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.29.2.tgz", 396 | "integrity": "sha512-Hc44ft5kaAytlGL2PyFwdAsufjbdOvHklwjNy/gy/saRbg9Kfkxfh+PklLm1H2Ib/p586RkQeNFKYuJInUssyw==", 397 | "dev": true, 398 | "dependencies": { 399 | "tinyspy": "^1.0.2" 400 | } 401 | }, 402 | "node_modules/@vitest/utils": { 403 | "version": "0.29.2", 404 | "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.29.2.tgz", 405 | "integrity": "sha512-F14/Uc+vCdclStS2KEoXJlOLAEyqRhnw0gM27iXw9bMTcyKRPJrQ+rlC6XZ125GIPvvKYMPpVxNhiou6PsEeYQ==", 406 | "dev": true, 407 | "dependencies": { 408 | "cli-truncate": "^3.1.0", 409 | "diff": "^5.1.0", 410 | "loupe": "^2.3.6", 411 | "picocolors": "^1.0.0", 412 | "pretty-format": "^27.5.1" 413 | } 414 | }, 415 | "node_modules/acorn": { 416 | "version": "8.8.2", 417 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", 418 | "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", 419 | "dev": true, 420 | "bin": { 421 | "acorn": "bin/acorn" 422 | }, 423 | "engines": { 424 | "node": ">=0.4.0" 425 | } 426 | }, 427 | "node_modules/acorn-walk": { 428 | "version": "8.2.0", 429 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", 430 | "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", 431 | "dev": true, 432 | "engines": { 433 | "node": ">=0.4.0" 434 | } 435 | }, 436 | "node_modules/ansi-regex": { 437 | "version": "5.0.1", 438 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 439 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 440 | "dev": true, 441 | "engines": { 442 | "node": ">=8" 443 | } 444 | }, 445 | "node_modules/ansi-styles": { 446 | "version": "5.2.0", 447 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", 448 | "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", 449 | "dev": true, 450 | "engines": { 451 | "node": ">=10" 452 | }, 453 | "funding": { 454 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 455 | } 456 | }, 457 | "node_modules/assertion-error": { 458 | "version": "1.1.0", 459 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", 460 | "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", 461 | "dev": true, 462 | "engines": { 463 | "node": "*" 464 | } 465 | }, 466 | "node_modules/cac": { 467 | "version": "6.7.14", 468 | "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", 469 | "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", 470 | "dev": true, 471 | "engines": { 472 | "node": ">=8" 473 | } 474 | }, 475 | "node_modules/chai": { 476 | "version": "4.3.7", 477 | "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", 478 | "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", 479 | "dev": true, 480 | "dependencies": { 481 | "assertion-error": "^1.1.0", 482 | "check-error": "^1.0.2", 483 | "deep-eql": "^4.1.2", 484 | "get-func-name": "^2.0.0", 485 | "loupe": "^2.3.1", 486 | "pathval": "^1.1.1", 487 | "type-detect": "^4.0.5" 488 | }, 489 | "engines": { 490 | "node": ">=4" 491 | } 492 | }, 493 | "node_modules/check-error": { 494 | "version": "1.0.2", 495 | "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", 496 | "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", 497 | "dev": true, 498 | "engines": { 499 | "node": "*" 500 | } 501 | }, 502 | "node_modules/cli-truncate": { 503 | "version": "3.1.0", 504 | "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", 505 | "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", 506 | "dev": true, 507 | "dependencies": { 508 | "slice-ansi": "^5.0.0", 509 | "string-width": "^5.0.0" 510 | }, 511 | "engines": { 512 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 513 | }, 514 | "funding": { 515 | "url": "https://github.com/sponsors/sindresorhus" 516 | } 517 | }, 518 | "node_modules/debug": { 519 | "version": "4.3.4", 520 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 521 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 522 | "dev": true, 523 | "dependencies": { 524 | "ms": "2.1.2" 525 | }, 526 | "engines": { 527 | "node": ">=6.0" 528 | }, 529 | "peerDependenciesMeta": { 530 | "supports-color": { 531 | "optional": true 532 | } 533 | } 534 | }, 535 | "node_modules/deep-eql": { 536 | "version": "4.1.3", 537 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", 538 | "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", 539 | "dev": true, 540 | "dependencies": { 541 | "type-detect": "^4.0.0" 542 | }, 543 | "engines": { 544 | "node": ">=6" 545 | } 546 | }, 547 | "node_modules/diff": { 548 | "version": "5.1.0", 549 | "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", 550 | "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", 551 | "dev": true, 552 | "engines": { 553 | "node": ">=0.3.1" 554 | } 555 | }, 556 | "node_modules/eastasianwidth": { 557 | "version": "0.2.0", 558 | "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", 559 | "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", 560 | "dev": true 561 | }, 562 | "node_modules/emoji-regex": { 563 | "version": "9.2.2", 564 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", 565 | "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", 566 | "dev": true 567 | }, 568 | "node_modules/esbuild": { 569 | "version": "0.18.20", 570 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", 571 | "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", 572 | "hasInstallScript": true, 573 | "bin": { 574 | "esbuild": "bin/esbuild" 575 | }, 576 | "engines": { 577 | "node": ">=12" 578 | }, 579 | "optionalDependencies": { 580 | "@esbuild/android-arm": "0.18.20", 581 | "@esbuild/android-arm64": "0.18.20", 582 | "@esbuild/android-x64": "0.18.20", 583 | "@esbuild/darwin-arm64": "0.18.20", 584 | "@esbuild/darwin-x64": "0.18.20", 585 | "@esbuild/freebsd-arm64": "0.18.20", 586 | "@esbuild/freebsd-x64": "0.18.20", 587 | "@esbuild/linux-arm": "0.18.20", 588 | "@esbuild/linux-arm64": "0.18.20", 589 | "@esbuild/linux-ia32": "0.18.20", 590 | "@esbuild/linux-loong64": "0.18.20", 591 | "@esbuild/linux-mips64el": "0.18.20", 592 | "@esbuild/linux-ppc64": "0.18.20", 593 | "@esbuild/linux-riscv64": "0.18.20", 594 | "@esbuild/linux-s390x": "0.18.20", 595 | "@esbuild/linux-x64": "0.18.20", 596 | "@esbuild/netbsd-x64": "0.18.20", 597 | "@esbuild/openbsd-x64": "0.18.20", 598 | "@esbuild/sunos-x64": "0.18.20", 599 | "@esbuild/win32-arm64": "0.18.20", 600 | "@esbuild/win32-ia32": "0.18.20", 601 | "@esbuild/win32-x64": "0.18.20" 602 | } 603 | }, 604 | "node_modules/fsevents": { 605 | "version": "2.3.3", 606 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 607 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 608 | "hasInstallScript": true, 609 | "optional": true, 610 | "os": [ 611 | "darwin" 612 | ], 613 | "engines": { 614 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 615 | } 616 | }, 617 | "node_modules/get-func-name": { 618 | "version": "2.0.2", 619 | "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", 620 | "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", 621 | "dev": true, 622 | "engines": { 623 | "node": "*" 624 | } 625 | }, 626 | "node_modules/is-fullwidth-code-point": { 627 | "version": "4.0.0", 628 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", 629 | "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", 630 | "dev": true, 631 | "engines": { 632 | "node": ">=12" 633 | }, 634 | "funding": { 635 | "url": "https://github.com/sponsors/sindresorhus" 636 | } 637 | }, 638 | "node_modules/jsonc-parser": { 639 | "version": "3.2.0", 640 | "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", 641 | "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", 642 | "dev": true 643 | }, 644 | "node_modules/local-pkg": { 645 | "version": "0.4.3", 646 | "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", 647 | "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", 648 | "dev": true, 649 | "engines": { 650 | "node": ">=14" 651 | }, 652 | "funding": { 653 | "url": "https://github.com/sponsors/antfu" 654 | } 655 | }, 656 | "node_modules/loupe": { 657 | "version": "2.3.6", 658 | "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", 659 | "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", 660 | "dev": true, 661 | "dependencies": { 662 | "get-func-name": "^2.0.0" 663 | } 664 | }, 665 | "node_modules/mlly": { 666 | "version": "1.2.0", 667 | "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.2.0.tgz", 668 | "integrity": "sha512-+c7A3CV0KGdKcylsI6khWyts/CYrGTrRVo4R/I7u/cUsy0Conxa6LUhiEzVKIw14lc2L5aiO4+SeVe4TeGRKww==", 669 | "dev": true, 670 | "dependencies": { 671 | "acorn": "^8.8.2", 672 | "pathe": "^1.1.0", 673 | "pkg-types": "^1.0.2", 674 | "ufo": "^1.1.1" 675 | } 676 | }, 677 | "node_modules/ms": { 678 | "version": "2.1.2", 679 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 680 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 681 | "dev": true 682 | }, 683 | "node_modules/nanoid": { 684 | "version": "3.3.7", 685 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", 686 | "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", 687 | "funding": [ 688 | { 689 | "type": "github", 690 | "url": "https://github.com/sponsors/ai" 691 | } 692 | ], 693 | "bin": { 694 | "nanoid": "bin/nanoid.cjs" 695 | }, 696 | "engines": { 697 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 698 | } 699 | }, 700 | "node_modules/p-limit": { 701 | "version": "4.0.0", 702 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", 703 | "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", 704 | "dev": true, 705 | "dependencies": { 706 | "yocto-queue": "^1.0.0" 707 | }, 708 | "engines": { 709 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 710 | }, 711 | "funding": { 712 | "url": "https://github.com/sponsors/sindresorhus" 713 | } 714 | }, 715 | "node_modules/pathe": { 716 | "version": "1.1.0", 717 | "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.0.tgz", 718 | "integrity": "sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==", 719 | "dev": true 720 | }, 721 | "node_modules/pathval": { 722 | "version": "1.1.1", 723 | "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", 724 | "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", 725 | "dev": true, 726 | "engines": { 727 | "node": "*" 728 | } 729 | }, 730 | "node_modules/picocolors": { 731 | "version": "1.0.0", 732 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 733 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" 734 | }, 735 | "node_modules/pkg-types": { 736 | "version": "1.0.2", 737 | "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.2.tgz", 738 | "integrity": "sha512-hM58GKXOcj8WTqUXnsQyJYXdeAPbythQgEF3nTcEo+nkD49chjQ9IKm/QJy9xf6JakXptz86h7ecP2024rrLaQ==", 739 | "dev": true, 740 | "dependencies": { 741 | "jsonc-parser": "^3.2.0", 742 | "mlly": "^1.1.1", 743 | "pathe": "^1.1.0" 744 | } 745 | }, 746 | "node_modules/postcss": { 747 | "version": "8.4.31", 748 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", 749 | "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", 750 | "funding": [ 751 | { 752 | "type": "opencollective", 753 | "url": "https://opencollective.com/postcss/" 754 | }, 755 | { 756 | "type": "tidelift", 757 | "url": "https://tidelift.com/funding/github/npm/postcss" 758 | }, 759 | { 760 | "type": "github", 761 | "url": "https://github.com/sponsors/ai" 762 | } 763 | ], 764 | "dependencies": { 765 | "nanoid": "^3.3.6", 766 | "picocolors": "^1.0.0", 767 | "source-map-js": "^1.0.2" 768 | }, 769 | "engines": { 770 | "node": "^10 || ^12 || >=14" 771 | } 772 | }, 773 | "node_modules/pretty-format": { 774 | "version": "27.5.1", 775 | "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", 776 | "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", 777 | "dev": true, 778 | "dependencies": { 779 | "ansi-regex": "^5.0.1", 780 | "ansi-styles": "^5.0.0", 781 | "react-is": "^17.0.1" 782 | }, 783 | "engines": { 784 | "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" 785 | } 786 | }, 787 | "node_modules/react-is": { 788 | "version": "17.0.2", 789 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", 790 | "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", 791 | "dev": true 792 | }, 793 | "node_modules/rollup": { 794 | "version": "3.29.4", 795 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", 796 | "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", 797 | "bin": { 798 | "rollup": "dist/bin/rollup" 799 | }, 800 | "engines": { 801 | "node": ">=14.18.0", 802 | "npm": ">=8.0.0" 803 | }, 804 | "optionalDependencies": { 805 | "fsevents": "~2.3.2" 806 | } 807 | }, 808 | "node_modules/siginfo": { 809 | "version": "2.0.0", 810 | "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", 811 | "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", 812 | "dev": true 813 | }, 814 | "node_modules/slice-ansi": { 815 | "version": "5.0.0", 816 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", 817 | "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", 818 | "dev": true, 819 | "dependencies": { 820 | "ansi-styles": "^6.0.0", 821 | "is-fullwidth-code-point": "^4.0.0" 822 | }, 823 | "engines": { 824 | "node": ">=12" 825 | }, 826 | "funding": { 827 | "url": "https://github.com/chalk/slice-ansi?sponsor=1" 828 | } 829 | }, 830 | "node_modules/slice-ansi/node_modules/ansi-styles": { 831 | "version": "6.2.1", 832 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", 833 | "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", 834 | "dev": true, 835 | "engines": { 836 | "node": ">=12" 837 | }, 838 | "funding": { 839 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 840 | } 841 | }, 842 | "node_modules/source-map": { 843 | "version": "0.6.1", 844 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 845 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 846 | "dev": true, 847 | "engines": { 848 | "node": ">=0.10.0" 849 | } 850 | }, 851 | "node_modules/source-map-js": { 852 | "version": "1.0.2", 853 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 854 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", 855 | "engines": { 856 | "node": ">=0.10.0" 857 | } 858 | }, 859 | "node_modules/stackback": { 860 | "version": "0.0.2", 861 | "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", 862 | "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", 863 | "dev": true 864 | }, 865 | "node_modules/std-env": { 866 | "version": "3.3.2", 867 | "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.2.tgz", 868 | "integrity": "sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA==", 869 | "dev": true 870 | }, 871 | "node_modules/string-width": { 872 | "version": "5.1.2", 873 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", 874 | "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", 875 | "dev": true, 876 | "dependencies": { 877 | "eastasianwidth": "^0.2.0", 878 | "emoji-regex": "^9.2.2", 879 | "strip-ansi": "^7.0.1" 880 | }, 881 | "engines": { 882 | "node": ">=12" 883 | }, 884 | "funding": { 885 | "url": "https://github.com/sponsors/sindresorhus" 886 | } 887 | }, 888 | "node_modules/strip-ansi": { 889 | "version": "7.0.1", 890 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", 891 | "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", 892 | "dev": true, 893 | "dependencies": { 894 | "ansi-regex": "^6.0.1" 895 | }, 896 | "engines": { 897 | "node": ">=12" 898 | }, 899 | "funding": { 900 | "url": "https://github.com/chalk/strip-ansi?sponsor=1" 901 | } 902 | }, 903 | "node_modules/strip-ansi/node_modules/ansi-regex": { 904 | "version": "6.0.1", 905 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", 906 | "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", 907 | "dev": true, 908 | "engines": { 909 | "node": ">=12" 910 | }, 911 | "funding": { 912 | "url": "https://github.com/chalk/ansi-regex?sponsor=1" 913 | } 914 | }, 915 | "node_modules/strip-literal": { 916 | "version": "1.0.1", 917 | "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.0.1.tgz", 918 | "integrity": "sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==", 919 | "dev": true, 920 | "dependencies": { 921 | "acorn": "^8.8.2" 922 | }, 923 | "funding": { 924 | "url": "https://github.com/sponsors/antfu" 925 | } 926 | }, 927 | "node_modules/tinybench": { 928 | "version": "2.4.0", 929 | "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.4.0.tgz", 930 | "integrity": "sha512-iyziEiyFxX4kyxSp+MtY1oCH/lvjH3PxFN8PGCDeqcZWAJ/i+9y+nL85w99PxVzrIvew/GSkSbDYtiGVa85Afg==", 931 | "dev": true 932 | }, 933 | "node_modules/tinypool": { 934 | "version": "0.3.1", 935 | "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.3.1.tgz", 936 | "integrity": "sha512-zLA1ZXlstbU2rlpA4CIeVaqvWq41MTWqLY3FfsAXgC8+f7Pk7zroaJQxDgxn1xNudKW6Kmj4808rPFShUlIRmQ==", 937 | "dev": true, 938 | "engines": { 939 | "node": ">=14.0.0" 940 | } 941 | }, 942 | "node_modules/tinyspy": { 943 | "version": "1.1.1", 944 | "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-1.1.1.tgz", 945 | "integrity": "sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g==", 946 | "dev": true, 947 | "engines": { 948 | "node": ">=14.0.0" 949 | } 950 | }, 951 | "node_modules/type-detect": { 952 | "version": "4.0.8", 953 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", 954 | "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", 955 | "dev": true, 956 | "engines": { 957 | "node": ">=4" 958 | } 959 | }, 960 | "node_modules/typescript": { 961 | "version": "4.9.5", 962 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", 963 | "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", 964 | "dev": true, 965 | "bin": { 966 | "tsc": "bin/tsc", 967 | "tsserver": "bin/tsserver" 968 | }, 969 | "engines": { 970 | "node": ">=4.2.0" 971 | } 972 | }, 973 | "node_modules/ufo": { 974 | "version": "1.1.1", 975 | "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.1.1.tgz", 976 | "integrity": "sha512-MvlCc4GHrmZdAllBc0iUDowff36Q9Ndw/UzqmEKyrfSzokTd9ZCy1i+IIk5hrYKkjoYVQyNbrw7/F8XJ2rEwTg==", 977 | "dev": true 978 | }, 979 | "node_modules/vite": { 980 | "version": "4.5.0", 981 | "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.0.tgz", 982 | "integrity": "sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==", 983 | "dependencies": { 984 | "esbuild": "^0.18.10", 985 | "postcss": "^8.4.27", 986 | "rollup": "^3.27.1" 987 | }, 988 | "bin": { 989 | "vite": "bin/vite.js" 990 | }, 991 | "engines": { 992 | "node": "^14.18.0 || >=16.0.0" 993 | }, 994 | "funding": { 995 | "url": "https://github.com/vitejs/vite?sponsor=1" 996 | }, 997 | "optionalDependencies": { 998 | "fsevents": "~2.3.2" 999 | }, 1000 | "peerDependencies": { 1001 | "@types/node": ">= 14", 1002 | "less": "*", 1003 | "lightningcss": "^1.21.0", 1004 | "sass": "*", 1005 | "stylus": "*", 1006 | "sugarss": "*", 1007 | "terser": "^5.4.0" 1008 | }, 1009 | "peerDependenciesMeta": { 1010 | "@types/node": { 1011 | "optional": true 1012 | }, 1013 | "less": { 1014 | "optional": true 1015 | }, 1016 | "lightningcss": { 1017 | "optional": true 1018 | }, 1019 | "sass": { 1020 | "optional": true 1021 | }, 1022 | "stylus": { 1023 | "optional": true 1024 | }, 1025 | "sugarss": { 1026 | "optional": true 1027 | }, 1028 | "terser": { 1029 | "optional": true 1030 | } 1031 | } 1032 | }, 1033 | "node_modules/vite-node": { 1034 | "version": "0.29.2", 1035 | "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.29.2.tgz", 1036 | "integrity": "sha512-5oe1z6wzI3gkvc4yOBbDBbgpiWiApvuN4P55E8OI131JGrSuo4X3SOZrNmZYo4R8Zkze/dhi572blX0zc+6SdA==", 1037 | "dev": true, 1038 | "dependencies": { 1039 | "cac": "^6.7.14", 1040 | "debug": "^4.3.4", 1041 | "mlly": "^1.1.0", 1042 | "pathe": "^1.1.0", 1043 | "picocolors": "^1.0.0", 1044 | "vite": "^3.0.0 || ^4.0.0" 1045 | }, 1046 | "bin": { 1047 | "vite-node": "vite-node.mjs" 1048 | }, 1049 | "engines": { 1050 | "node": ">=v14.16.0" 1051 | }, 1052 | "funding": { 1053 | "url": "https://github.com/sponsors/antfu" 1054 | } 1055 | }, 1056 | "node_modules/vitest": { 1057 | "version": "0.29.2", 1058 | "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.29.2.tgz", 1059 | "integrity": "sha512-ydK9IGbAvoY8wkg29DQ4ivcVviCaUi3ivuPKfZEVddMTenFHUfB8EEDXQV8+RasEk1ACFLgMUqAaDuQ/Nk+mQA==", 1060 | "dev": true, 1061 | "dependencies": { 1062 | "@types/chai": "^4.3.4", 1063 | "@types/chai-subset": "^1.3.3", 1064 | "@types/node": "*", 1065 | "@vitest/expect": "0.29.2", 1066 | "@vitest/runner": "0.29.2", 1067 | "@vitest/spy": "0.29.2", 1068 | "@vitest/utils": "0.29.2", 1069 | "acorn": "^8.8.1", 1070 | "acorn-walk": "^8.2.0", 1071 | "cac": "^6.7.14", 1072 | "chai": "^4.3.7", 1073 | "debug": "^4.3.4", 1074 | "local-pkg": "^0.4.2", 1075 | "pathe": "^1.1.0", 1076 | "picocolors": "^1.0.0", 1077 | "source-map": "^0.6.1", 1078 | "std-env": "^3.3.1", 1079 | "strip-literal": "^1.0.0", 1080 | "tinybench": "^2.3.1", 1081 | "tinypool": "^0.3.1", 1082 | "tinyspy": "^1.0.2", 1083 | "vite": "^3.0.0 || ^4.0.0", 1084 | "vite-node": "0.29.2", 1085 | "why-is-node-running": "^2.2.2" 1086 | }, 1087 | "bin": { 1088 | "vitest": "vitest.mjs" 1089 | }, 1090 | "engines": { 1091 | "node": ">=v14.16.0" 1092 | }, 1093 | "funding": { 1094 | "url": "https://github.com/sponsors/antfu" 1095 | }, 1096 | "peerDependencies": { 1097 | "@edge-runtime/vm": "*", 1098 | "@vitest/browser": "*", 1099 | "@vitest/ui": "*", 1100 | "happy-dom": "*", 1101 | "jsdom": "*" 1102 | }, 1103 | "peerDependenciesMeta": { 1104 | "@edge-runtime/vm": { 1105 | "optional": true 1106 | }, 1107 | "@vitest/browser": { 1108 | "optional": true 1109 | }, 1110 | "@vitest/ui": { 1111 | "optional": true 1112 | }, 1113 | "happy-dom": { 1114 | "optional": true 1115 | }, 1116 | "jsdom": { 1117 | "optional": true 1118 | } 1119 | } 1120 | }, 1121 | "node_modules/why-is-node-running": { 1122 | "version": "2.2.2", 1123 | "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", 1124 | "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", 1125 | "dev": true, 1126 | "dependencies": { 1127 | "siginfo": "^2.0.0", 1128 | "stackback": "0.0.2" 1129 | }, 1130 | "bin": { 1131 | "why-is-node-running": "cli.js" 1132 | }, 1133 | "engines": { 1134 | "node": ">=8" 1135 | } 1136 | }, 1137 | "node_modules/yocto-queue": { 1138 | "version": "1.0.0", 1139 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", 1140 | "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", 1141 | "dev": true, 1142 | "engines": { 1143 | "node": ">=12.20" 1144 | }, 1145 | "funding": { 1146 | "url": "https://github.com/sponsors/sindresorhus" 1147 | } 1148 | } 1149 | }, 1150 | "dependencies": { 1151 | "@esbuild/android-arm": { 1152 | "version": "0.18.20", 1153 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", 1154 | "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", 1155 | "optional": true 1156 | }, 1157 | "@esbuild/android-arm64": { 1158 | "version": "0.18.20", 1159 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", 1160 | "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", 1161 | "optional": true 1162 | }, 1163 | "@esbuild/android-x64": { 1164 | "version": "0.18.20", 1165 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", 1166 | "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", 1167 | "optional": true 1168 | }, 1169 | "@esbuild/darwin-arm64": { 1170 | "version": "0.18.20", 1171 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", 1172 | "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", 1173 | "optional": true 1174 | }, 1175 | "@esbuild/darwin-x64": { 1176 | "version": "0.18.20", 1177 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", 1178 | "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", 1179 | "optional": true 1180 | }, 1181 | "@esbuild/freebsd-arm64": { 1182 | "version": "0.18.20", 1183 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", 1184 | "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", 1185 | "optional": true 1186 | }, 1187 | "@esbuild/freebsd-x64": { 1188 | "version": "0.18.20", 1189 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", 1190 | "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", 1191 | "optional": true 1192 | }, 1193 | "@esbuild/linux-arm": { 1194 | "version": "0.18.20", 1195 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", 1196 | "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", 1197 | "optional": true 1198 | }, 1199 | "@esbuild/linux-arm64": { 1200 | "version": "0.18.20", 1201 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", 1202 | "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", 1203 | "optional": true 1204 | }, 1205 | "@esbuild/linux-ia32": { 1206 | "version": "0.18.20", 1207 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", 1208 | "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", 1209 | "optional": true 1210 | }, 1211 | "@esbuild/linux-loong64": { 1212 | "version": "0.18.20", 1213 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", 1214 | "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", 1215 | "optional": true 1216 | }, 1217 | "@esbuild/linux-mips64el": { 1218 | "version": "0.18.20", 1219 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", 1220 | "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", 1221 | "optional": true 1222 | }, 1223 | "@esbuild/linux-ppc64": { 1224 | "version": "0.18.20", 1225 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", 1226 | "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", 1227 | "optional": true 1228 | }, 1229 | "@esbuild/linux-riscv64": { 1230 | "version": "0.18.20", 1231 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", 1232 | "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", 1233 | "optional": true 1234 | }, 1235 | "@esbuild/linux-s390x": { 1236 | "version": "0.18.20", 1237 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", 1238 | "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", 1239 | "optional": true 1240 | }, 1241 | "@esbuild/linux-x64": { 1242 | "version": "0.18.20", 1243 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", 1244 | "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", 1245 | "optional": true 1246 | }, 1247 | "@esbuild/netbsd-x64": { 1248 | "version": "0.18.20", 1249 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", 1250 | "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", 1251 | "optional": true 1252 | }, 1253 | "@esbuild/openbsd-x64": { 1254 | "version": "0.18.20", 1255 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", 1256 | "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", 1257 | "optional": true 1258 | }, 1259 | "@esbuild/sunos-x64": { 1260 | "version": "0.18.20", 1261 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", 1262 | "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", 1263 | "optional": true 1264 | }, 1265 | "@esbuild/win32-arm64": { 1266 | "version": "0.18.20", 1267 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", 1268 | "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", 1269 | "optional": true 1270 | }, 1271 | "@esbuild/win32-ia32": { 1272 | "version": "0.18.20", 1273 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", 1274 | "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", 1275 | "optional": true 1276 | }, 1277 | "@esbuild/win32-x64": { 1278 | "version": "0.18.20", 1279 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", 1280 | "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", 1281 | "optional": true 1282 | }, 1283 | "@types/chai": { 1284 | "version": "4.3.4", 1285 | "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", 1286 | "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==", 1287 | "dev": true 1288 | }, 1289 | "@types/chai-subset": { 1290 | "version": "1.3.3", 1291 | "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", 1292 | "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", 1293 | "dev": true, 1294 | "requires": { 1295 | "@types/chai": "*" 1296 | } 1297 | }, 1298 | "@types/node": { 1299 | "version": "18.15.0", 1300 | "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.0.tgz", 1301 | "integrity": "sha512-z6nr0TTEOBGkzLGmbypWOGnpSpSIBorEhC4L+4HeQ2iezKCi4f77kyslRwvHeNitymGQ+oFyIWGP96l/DPSV9w==", 1302 | "devOptional": true 1303 | }, 1304 | "@vitest/expect": { 1305 | "version": "0.29.2", 1306 | "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.29.2.tgz", 1307 | "integrity": "sha512-wjrdHB2ANTch3XKRhjWZN0UueFocH0cQbi2tR5Jtq60Nb3YOSmakjdAvUa2JFBu/o8Vjhj5cYbcMXkZxn1NzmA==", 1308 | "dev": true, 1309 | "requires": { 1310 | "@vitest/spy": "0.29.2", 1311 | "@vitest/utils": "0.29.2", 1312 | "chai": "^4.3.7" 1313 | } 1314 | }, 1315 | "@vitest/runner": { 1316 | "version": "0.29.2", 1317 | "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.29.2.tgz", 1318 | "integrity": "sha512-A1P65f5+6ru36AyHWORhuQBJrOOcmDuhzl5RsaMNFe2jEkoj0faEszQS4CtPU/LxUYVIazlUtZTY0OEZmyZBnA==", 1319 | "dev": true, 1320 | "requires": { 1321 | "@vitest/utils": "0.29.2", 1322 | "p-limit": "^4.0.0", 1323 | "pathe": "^1.1.0" 1324 | } 1325 | }, 1326 | "@vitest/spy": { 1327 | "version": "0.29.2", 1328 | "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.29.2.tgz", 1329 | "integrity": "sha512-Hc44ft5kaAytlGL2PyFwdAsufjbdOvHklwjNy/gy/saRbg9Kfkxfh+PklLm1H2Ib/p586RkQeNFKYuJInUssyw==", 1330 | "dev": true, 1331 | "requires": { 1332 | "tinyspy": "^1.0.2" 1333 | } 1334 | }, 1335 | "@vitest/utils": { 1336 | "version": "0.29.2", 1337 | "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.29.2.tgz", 1338 | "integrity": "sha512-F14/Uc+vCdclStS2KEoXJlOLAEyqRhnw0gM27iXw9bMTcyKRPJrQ+rlC6XZ125GIPvvKYMPpVxNhiou6PsEeYQ==", 1339 | "dev": true, 1340 | "requires": { 1341 | "cli-truncate": "^3.1.0", 1342 | "diff": "^5.1.0", 1343 | "loupe": "^2.3.6", 1344 | "picocolors": "^1.0.0", 1345 | "pretty-format": "^27.5.1" 1346 | } 1347 | }, 1348 | "acorn": { 1349 | "version": "8.8.2", 1350 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", 1351 | "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", 1352 | "dev": true 1353 | }, 1354 | "acorn-walk": { 1355 | "version": "8.2.0", 1356 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", 1357 | "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", 1358 | "dev": true 1359 | }, 1360 | "ansi-regex": { 1361 | "version": "5.0.1", 1362 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1363 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1364 | "dev": true 1365 | }, 1366 | "ansi-styles": { 1367 | "version": "5.2.0", 1368 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", 1369 | "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", 1370 | "dev": true 1371 | }, 1372 | "assertion-error": { 1373 | "version": "1.1.0", 1374 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", 1375 | "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", 1376 | "dev": true 1377 | }, 1378 | "cac": { 1379 | "version": "6.7.14", 1380 | "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", 1381 | "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", 1382 | "dev": true 1383 | }, 1384 | "chai": { 1385 | "version": "4.3.7", 1386 | "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", 1387 | "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", 1388 | "dev": true, 1389 | "requires": { 1390 | "assertion-error": "^1.1.0", 1391 | "check-error": "^1.0.2", 1392 | "deep-eql": "^4.1.2", 1393 | "get-func-name": "^2.0.0", 1394 | "loupe": "^2.3.1", 1395 | "pathval": "^1.1.1", 1396 | "type-detect": "^4.0.5" 1397 | } 1398 | }, 1399 | "check-error": { 1400 | "version": "1.0.2", 1401 | "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", 1402 | "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", 1403 | "dev": true 1404 | }, 1405 | "cli-truncate": { 1406 | "version": "3.1.0", 1407 | "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", 1408 | "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", 1409 | "dev": true, 1410 | "requires": { 1411 | "slice-ansi": "^5.0.0", 1412 | "string-width": "^5.0.0" 1413 | } 1414 | }, 1415 | "debug": { 1416 | "version": "4.3.4", 1417 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 1418 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 1419 | "dev": true, 1420 | "requires": { 1421 | "ms": "2.1.2" 1422 | } 1423 | }, 1424 | "deep-eql": { 1425 | "version": "4.1.3", 1426 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", 1427 | "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", 1428 | "dev": true, 1429 | "requires": { 1430 | "type-detect": "^4.0.0" 1431 | } 1432 | }, 1433 | "diff": { 1434 | "version": "5.1.0", 1435 | "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", 1436 | "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", 1437 | "dev": true 1438 | }, 1439 | "eastasianwidth": { 1440 | "version": "0.2.0", 1441 | "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", 1442 | "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", 1443 | "dev": true 1444 | }, 1445 | "emoji-regex": { 1446 | "version": "9.2.2", 1447 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", 1448 | "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", 1449 | "dev": true 1450 | }, 1451 | "esbuild": { 1452 | "version": "0.18.20", 1453 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", 1454 | "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", 1455 | "requires": { 1456 | "@esbuild/android-arm": "0.18.20", 1457 | "@esbuild/android-arm64": "0.18.20", 1458 | "@esbuild/android-x64": "0.18.20", 1459 | "@esbuild/darwin-arm64": "0.18.20", 1460 | "@esbuild/darwin-x64": "0.18.20", 1461 | "@esbuild/freebsd-arm64": "0.18.20", 1462 | "@esbuild/freebsd-x64": "0.18.20", 1463 | "@esbuild/linux-arm": "0.18.20", 1464 | "@esbuild/linux-arm64": "0.18.20", 1465 | "@esbuild/linux-ia32": "0.18.20", 1466 | "@esbuild/linux-loong64": "0.18.20", 1467 | "@esbuild/linux-mips64el": "0.18.20", 1468 | "@esbuild/linux-ppc64": "0.18.20", 1469 | "@esbuild/linux-riscv64": "0.18.20", 1470 | "@esbuild/linux-s390x": "0.18.20", 1471 | "@esbuild/linux-x64": "0.18.20", 1472 | "@esbuild/netbsd-x64": "0.18.20", 1473 | "@esbuild/openbsd-x64": "0.18.20", 1474 | "@esbuild/sunos-x64": "0.18.20", 1475 | "@esbuild/win32-arm64": "0.18.20", 1476 | "@esbuild/win32-ia32": "0.18.20", 1477 | "@esbuild/win32-x64": "0.18.20" 1478 | } 1479 | }, 1480 | "fsevents": { 1481 | "version": "2.3.3", 1482 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 1483 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 1484 | "optional": true 1485 | }, 1486 | "get-func-name": { 1487 | "version": "2.0.2", 1488 | "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", 1489 | "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", 1490 | "dev": true 1491 | }, 1492 | "is-fullwidth-code-point": { 1493 | "version": "4.0.0", 1494 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", 1495 | "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", 1496 | "dev": true 1497 | }, 1498 | "jsonc-parser": { 1499 | "version": "3.2.0", 1500 | "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", 1501 | "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", 1502 | "dev": true 1503 | }, 1504 | "local-pkg": { 1505 | "version": "0.4.3", 1506 | "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", 1507 | "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", 1508 | "dev": true 1509 | }, 1510 | "loupe": { 1511 | "version": "2.3.6", 1512 | "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", 1513 | "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", 1514 | "dev": true, 1515 | "requires": { 1516 | "get-func-name": "^2.0.0" 1517 | } 1518 | }, 1519 | "mlly": { 1520 | "version": "1.2.0", 1521 | "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.2.0.tgz", 1522 | "integrity": "sha512-+c7A3CV0KGdKcylsI6khWyts/CYrGTrRVo4R/I7u/cUsy0Conxa6LUhiEzVKIw14lc2L5aiO4+SeVe4TeGRKww==", 1523 | "dev": true, 1524 | "requires": { 1525 | "acorn": "^8.8.2", 1526 | "pathe": "^1.1.0", 1527 | "pkg-types": "^1.0.2", 1528 | "ufo": "^1.1.1" 1529 | } 1530 | }, 1531 | "ms": { 1532 | "version": "2.1.2", 1533 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1534 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1535 | "dev": true 1536 | }, 1537 | "nanoid": { 1538 | "version": "3.3.7", 1539 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", 1540 | "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==" 1541 | }, 1542 | "p-limit": { 1543 | "version": "4.0.0", 1544 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", 1545 | "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", 1546 | "dev": true, 1547 | "requires": { 1548 | "yocto-queue": "^1.0.0" 1549 | } 1550 | }, 1551 | "pathe": { 1552 | "version": "1.1.0", 1553 | "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.0.tgz", 1554 | "integrity": "sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==", 1555 | "dev": true 1556 | }, 1557 | "pathval": { 1558 | "version": "1.1.1", 1559 | "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", 1560 | "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", 1561 | "dev": true 1562 | }, 1563 | "picocolors": { 1564 | "version": "1.0.0", 1565 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 1566 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" 1567 | }, 1568 | "pkg-types": { 1569 | "version": "1.0.2", 1570 | "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.2.tgz", 1571 | "integrity": "sha512-hM58GKXOcj8WTqUXnsQyJYXdeAPbythQgEF3nTcEo+nkD49chjQ9IKm/QJy9xf6JakXptz86h7ecP2024rrLaQ==", 1572 | "dev": true, 1573 | "requires": { 1574 | "jsonc-parser": "^3.2.0", 1575 | "mlly": "^1.1.1", 1576 | "pathe": "^1.1.0" 1577 | } 1578 | }, 1579 | "postcss": { 1580 | "version": "8.4.31", 1581 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", 1582 | "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", 1583 | "requires": { 1584 | "nanoid": "^3.3.6", 1585 | "picocolors": "^1.0.0", 1586 | "source-map-js": "^1.0.2" 1587 | } 1588 | }, 1589 | "pretty-format": { 1590 | "version": "27.5.1", 1591 | "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", 1592 | "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", 1593 | "dev": true, 1594 | "requires": { 1595 | "ansi-regex": "^5.0.1", 1596 | "ansi-styles": "^5.0.0", 1597 | "react-is": "^17.0.1" 1598 | } 1599 | }, 1600 | "react-is": { 1601 | "version": "17.0.2", 1602 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", 1603 | "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", 1604 | "dev": true 1605 | }, 1606 | "rollup": { 1607 | "version": "3.29.4", 1608 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", 1609 | "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", 1610 | "requires": { 1611 | "fsevents": "~2.3.2" 1612 | } 1613 | }, 1614 | "siginfo": { 1615 | "version": "2.0.0", 1616 | "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", 1617 | "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", 1618 | "dev": true 1619 | }, 1620 | "slice-ansi": { 1621 | "version": "5.0.0", 1622 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", 1623 | "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", 1624 | "dev": true, 1625 | "requires": { 1626 | "ansi-styles": "^6.0.0", 1627 | "is-fullwidth-code-point": "^4.0.0" 1628 | }, 1629 | "dependencies": { 1630 | "ansi-styles": { 1631 | "version": "6.2.1", 1632 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", 1633 | "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", 1634 | "dev": true 1635 | } 1636 | } 1637 | }, 1638 | "source-map": { 1639 | "version": "0.6.1", 1640 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1641 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1642 | "dev": true 1643 | }, 1644 | "source-map-js": { 1645 | "version": "1.0.2", 1646 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 1647 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" 1648 | }, 1649 | "stackback": { 1650 | "version": "0.0.2", 1651 | "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", 1652 | "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", 1653 | "dev": true 1654 | }, 1655 | "std-env": { 1656 | "version": "3.3.2", 1657 | "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.2.tgz", 1658 | "integrity": "sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA==", 1659 | "dev": true 1660 | }, 1661 | "string-width": { 1662 | "version": "5.1.2", 1663 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", 1664 | "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", 1665 | "dev": true, 1666 | "requires": { 1667 | "eastasianwidth": "^0.2.0", 1668 | "emoji-regex": "^9.2.2", 1669 | "strip-ansi": "^7.0.1" 1670 | } 1671 | }, 1672 | "strip-ansi": { 1673 | "version": "7.0.1", 1674 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", 1675 | "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", 1676 | "dev": true, 1677 | "requires": { 1678 | "ansi-regex": "^6.0.1" 1679 | }, 1680 | "dependencies": { 1681 | "ansi-regex": { 1682 | "version": "6.0.1", 1683 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", 1684 | "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", 1685 | "dev": true 1686 | } 1687 | } 1688 | }, 1689 | "strip-literal": { 1690 | "version": "1.0.1", 1691 | "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.0.1.tgz", 1692 | "integrity": "sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==", 1693 | "dev": true, 1694 | "requires": { 1695 | "acorn": "^8.8.2" 1696 | } 1697 | }, 1698 | "tinybench": { 1699 | "version": "2.4.0", 1700 | "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.4.0.tgz", 1701 | "integrity": "sha512-iyziEiyFxX4kyxSp+MtY1oCH/lvjH3PxFN8PGCDeqcZWAJ/i+9y+nL85w99PxVzrIvew/GSkSbDYtiGVa85Afg==", 1702 | "dev": true 1703 | }, 1704 | "tinypool": { 1705 | "version": "0.3.1", 1706 | "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.3.1.tgz", 1707 | "integrity": "sha512-zLA1ZXlstbU2rlpA4CIeVaqvWq41MTWqLY3FfsAXgC8+f7Pk7zroaJQxDgxn1xNudKW6Kmj4808rPFShUlIRmQ==", 1708 | "dev": true 1709 | }, 1710 | "tinyspy": { 1711 | "version": "1.1.1", 1712 | "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-1.1.1.tgz", 1713 | "integrity": "sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g==", 1714 | "dev": true 1715 | }, 1716 | "type-detect": { 1717 | "version": "4.0.8", 1718 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", 1719 | "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", 1720 | "dev": true 1721 | }, 1722 | "typescript": { 1723 | "version": "4.9.5", 1724 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", 1725 | "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", 1726 | "dev": true 1727 | }, 1728 | "ufo": { 1729 | "version": "1.1.1", 1730 | "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.1.1.tgz", 1731 | "integrity": "sha512-MvlCc4GHrmZdAllBc0iUDowff36Q9Ndw/UzqmEKyrfSzokTd9ZCy1i+IIk5hrYKkjoYVQyNbrw7/F8XJ2rEwTg==", 1732 | "dev": true 1733 | }, 1734 | "vite": { 1735 | "version": "4.5.0", 1736 | "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.0.tgz", 1737 | "integrity": "sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==", 1738 | "requires": { 1739 | "esbuild": "^0.18.10", 1740 | "fsevents": "~2.3.2", 1741 | "postcss": "^8.4.27", 1742 | "rollup": "^3.27.1" 1743 | } 1744 | }, 1745 | "vite-node": { 1746 | "version": "0.29.2", 1747 | "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.29.2.tgz", 1748 | "integrity": "sha512-5oe1z6wzI3gkvc4yOBbDBbgpiWiApvuN4P55E8OI131JGrSuo4X3SOZrNmZYo4R8Zkze/dhi572blX0zc+6SdA==", 1749 | "dev": true, 1750 | "requires": { 1751 | "cac": "^6.7.14", 1752 | "debug": "^4.3.4", 1753 | "mlly": "^1.1.0", 1754 | "pathe": "^1.1.0", 1755 | "picocolors": "^1.0.0", 1756 | "vite": "^3.0.0 || ^4.0.0" 1757 | } 1758 | }, 1759 | "vitest": { 1760 | "version": "0.29.2", 1761 | "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.29.2.tgz", 1762 | "integrity": "sha512-ydK9IGbAvoY8wkg29DQ4ivcVviCaUi3ivuPKfZEVddMTenFHUfB8EEDXQV8+RasEk1ACFLgMUqAaDuQ/Nk+mQA==", 1763 | "dev": true, 1764 | "requires": { 1765 | "@types/chai": "^4.3.4", 1766 | "@types/chai-subset": "^1.3.3", 1767 | "@types/node": "*", 1768 | "@vitest/expect": "0.29.2", 1769 | "@vitest/runner": "0.29.2", 1770 | "@vitest/spy": "0.29.2", 1771 | "@vitest/utils": "0.29.2", 1772 | "acorn": "^8.8.1", 1773 | "acorn-walk": "^8.2.0", 1774 | "cac": "^6.7.14", 1775 | "chai": "^4.3.7", 1776 | "debug": "^4.3.4", 1777 | "local-pkg": "^0.4.2", 1778 | "pathe": "^1.1.0", 1779 | "picocolors": "^1.0.0", 1780 | "source-map": "^0.6.1", 1781 | "std-env": "^3.3.1", 1782 | "strip-literal": "^1.0.0", 1783 | "tinybench": "^2.3.1", 1784 | "tinypool": "^0.3.1", 1785 | "tinyspy": "^1.0.2", 1786 | "vite": "^3.0.0 || ^4.0.0", 1787 | "vite-node": "0.29.2", 1788 | "why-is-node-running": "^2.2.2" 1789 | } 1790 | }, 1791 | "why-is-node-running": { 1792 | "version": "2.2.2", 1793 | "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", 1794 | "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", 1795 | "dev": true, 1796 | "requires": { 1797 | "siginfo": "^2.0.0", 1798 | "stackback": "0.0.2" 1799 | } 1800 | }, 1801 | "yocto-queue": { 1802 | "version": "1.0.0", 1803 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", 1804 | "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", 1805 | "dev": true 1806 | } 1807 | } 1808 | } 1809 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@scala-js/vite-plugin-scalajs", 3 | "version": "1.0.0", 4 | "description": "Vite plugin for integration of Scala.js", 5 | "main": "dist/index.js", 6 | "types": "dist/index.d.ts", 7 | "scripts": { 8 | "build": "tsc", 9 | "test": "vitest run" 10 | }, 11 | "repository": { 12 | "type": "git", 13 | "url": "git+https://github.com/scala-js/vite-plugin-scalajs.git" 14 | }, 15 | "keywords": [ 16 | "vite", 17 | "vite-plugin", 18 | "scala", 19 | "scala-js" 20 | ], 21 | "contributors": [ 22 | { 23 | "name": "Sébastien Doeraene", 24 | "url": "https://github.com/sjrd" 25 | }, 26 | { 27 | "name": "Tobias Schlatter", 28 | "url": "https://github.com/gzm0" 29 | } 30 | ], 31 | "license": "Apache-2.0", 32 | "bugs": { 33 | "url": "https://github.com/scala-js/vite-plugin-scalajs/issues" 34 | }, 35 | "homepage": "https://github.com/scala-js/vite-plugin-scalajs#readme", 36 | "devDependencies": { 37 | "@types/node": "^18.14.2", 38 | "typescript": "4.9.5", 39 | "vitest": "^0.29.2" 40 | }, 41 | "dependencies": { 42 | "vite": "^4.1.4" 43 | }, 44 | "type": "module", 45 | "files": ["dist", "LICENSE", "README.md", "package.json"] 46 | } 47 | -------------------------------------------------------------------------------- /test/plugin.test.ts: -------------------------------------------------------------------------------- 1 | import { beforeEach, describe, expect, it, TestOptions } from 'vitest'; 2 | import scalaJSPlugin, { ScalaJSPluginOptions } from "../index"; 3 | import type { PluginContext } from 'rollup'; 4 | import type { Plugin as VitePlugin } from "vite"; 5 | 6 | /* This interface refines the VitePlugin with some knowledge about our 7 | * particular implementation, for easier testing. If we define here something 8 | * that is incompatible with what's in VitePlugin, the compiler complains, so 9 | * we do get some safety that we adhere to VitePlugin's API. 10 | */ 11 | interface RefinedPlugin extends VitePlugin { 12 | configResolved: (this: void, resolvedConfig: { mode: string }) => void | Promise; 13 | buildStart: (this: PluginContext, options: {}) => void | Promise; 14 | resolveId: (this: PluginContext, source: string) => string | Promise; 15 | } 16 | 17 | function normalizeSlashes(path: string | null): string | null { 18 | return path === null ? null : path.replace(/\\/g, '/'); 19 | } 20 | 21 | const MODE_DEVELOPMENT = 'development'; 22 | const MODE_PRODUCTION = 'production'; 23 | 24 | describe("scalaJSPlugin", () => { 25 | const cwd = process.cwd() + "/test/testproject"; 26 | 27 | const testOptions: TestOptions = { 28 | timeout: 60000, // running sbt takes time 29 | }; 30 | 31 | const setup: (options: ScalaJSPluginOptions) => [RefinedPlugin, PluginContext] = (options) => { 32 | const plugin = scalaJSPlugin({ cwd: cwd, ...options }) as RefinedPlugin; 33 | const fakePluginContext = {} as PluginContext; 34 | return [plugin, fakePluginContext]; 35 | } 36 | 37 | /* Wait for 2 seconds between tests to let sbt close its server. 38 | * Without this, we get spurious failures with 39 | * > sbt thinks that server is already booting because of this exception: 40 | * > sbt.internal.ServerAlreadyBootingException: java.io.IOException: 41 | * Could not create lock for \\.\pipe\sbt-load3101661995253037154_lock, error 5 42 | */ 43 | beforeEach(() => { 44 | return new Promise(resolve => { 45 | setTimeout(resolve, 2000); 46 | }); 47 | }); 48 | 49 | it("works without a specific projectID (production)", async () => { 50 | const [plugin, fakePluginContext] = setup({}); 51 | 52 | await plugin.configResolved.call(undefined, { mode: MODE_PRODUCTION }); 53 | await plugin.buildStart.call(fakePluginContext, {}); 54 | 55 | expect(normalizeSlashes(await plugin.resolveId.call(fakePluginContext, 'scalajs:main.js'))) 56 | .toContain('/testproject/target/scala-3.2.2/testproject-opt/main.js'); 57 | 58 | expect(await plugin.resolveId.call(fakePluginContext, 'scalajs/main.js')) 59 | .toBeNull(); 60 | }, testOptions); 61 | 62 | it("works without a specific projectID (development)", async () => { 63 | const [plugin, fakePluginContext] = setup({}); 64 | 65 | await plugin.configResolved.call(undefined, { mode: MODE_DEVELOPMENT }); 66 | await plugin.buildStart.call(fakePluginContext, {}); 67 | 68 | expect(normalizeSlashes(await plugin.resolveId.call(fakePluginContext, 'scalajs:main.js'))) 69 | .toContain('/testproject/target/scala-3.2.2/testproject-fastopt/main.js'); 70 | 71 | expect(await plugin.resolveId.call(fakePluginContext, 'scalajs/main.js')) 72 | .toBeNull(); 73 | }, testOptions); 74 | 75 | it("works with a specific projectID (production)", async () => { 76 | const [plugin, fakePluginContext] = setup({ 77 | projectID: "otherProject", 78 | }); 79 | 80 | await plugin.configResolved.call(undefined, { mode: MODE_PRODUCTION }); 81 | await plugin.buildStart.call(fakePluginContext, {}); 82 | 83 | expect(normalizeSlashes(await plugin.resolveId.call(fakePluginContext, 'scalajs:main.js'))) 84 | .toContain('/testproject/other-project/target/scala-3.2.2/otherproject-opt/main.js'); 85 | 86 | expect(await plugin.resolveId.call(fakePluginContext, 'scalajs/main.js')) 87 | .toBeNull(); 88 | }, testOptions); 89 | 90 | it("works with a custom URI prefix (development)", async () => { 91 | const [plugin, fakePluginContext] = setup({ 92 | uriPrefix: "customsjs", 93 | }); 94 | 95 | await plugin.configResolved.call(undefined, { mode: MODE_DEVELOPMENT }); 96 | await plugin.buildStart.call(fakePluginContext, {}); 97 | 98 | expect(normalizeSlashes(await plugin.resolveId.call(fakePluginContext, 'customsjs:main.js'))) 99 | .toContain('/testproject/target/scala-3.2.2/testproject-fastopt/main.js'); 100 | 101 | expect(await plugin.resolveId.call(fakePluginContext, 'scalajs:main.js')) 102 | .toBeNull(); 103 | }, testOptions); 104 | 105 | it("does not work with a project that does not link", async () => { 106 | const [plugin, fakePluginContext] = setup({ 107 | projectID: "invalidProject", 108 | }); 109 | 110 | await plugin.configResolved.call(undefined, { mode: MODE_PRODUCTION }); 111 | 112 | const buildStartResult = plugin.buildStart.call(fakePluginContext, {}); 113 | expect(buildStartResult).rejects.toContain('sbt invocation'); 114 | }, testOptions); 115 | }); 116 | -------------------------------------------------------------------------------- /test/testproject/build.sbt: -------------------------------------------------------------------------------- 1 | lazy val commonSettings = Def.settings( 2 | scalaVersion := "3.2.2", 3 | scalaJSUseMainModuleInitializer := true, 4 | ) 5 | 6 | lazy val testproject = project.in(file(".")) 7 | .enablePlugins(ScalaJSPlugin) 8 | .settings(commonSettings) 9 | 10 | lazy val otherProject = project.in(file("other-project")) 11 | .enablePlugins(ScalaJSPlugin) 12 | .settings(commonSettings) 13 | 14 | // This project does not link because it has no main method 15 | lazy val invalidProject = project.in(file("invalid-project")) 16 | .enablePlugins(ScalaJSPlugin) 17 | .settings(commonSettings) 18 | -------------------------------------------------------------------------------- /test/testproject/other-project/src/main/scala/otherproject/OtherProject.scala: -------------------------------------------------------------------------------- 1 | package otherproject 2 | 3 | @main def OtherProject(): Unit = 4 | println("hello") 5 | end OtherProject 6 | -------------------------------------------------------------------------------- /test/testproject/project/build.properties: -------------------------------------------------------------------------------- 1 | sbt.version=1.8.0 2 | -------------------------------------------------------------------------------- /test/testproject/project/plugins.sbt: -------------------------------------------------------------------------------- 1 | addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.13.0") 2 | -------------------------------------------------------------------------------- /test/testproject/src/main/scala/testproject/TestProject.scala: -------------------------------------------------------------------------------- 1 | package testproject 2 | 3 | @main def TestProject(): Unit = 4 | println("hello") 5 | end TestProject 6 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "outDir": "./dist", 4 | "target": "es2020", 5 | "module": "ES2020", 6 | "declaration": true, 7 | "esModuleInterop": true, 8 | "forceConsistentCasingInFileNames": true, 9 | "moduleResolution": "node", 10 | "strict": true, 11 | "skipLibCheck": true 12 | }, 13 | "exclude": [ 14 | "./dist" 15 | ], 16 | } 17 | --------------------------------------------------------------------------------