├── .gitignore ├── .scalafmt.conf ├── README.md ├── build.sbt ├── example ├── .gitignore ├── css │ └── styles.module.css ├── favicon.svg ├── index.html ├── package-lock.json ├── package.json ├── pnpm-lock.yaml ├── src │ ├── main │ │ └── scala │ │ │ └── example │ │ │ ├── Css.scala │ │ │ ├── Main.scala │ │ │ └── Utils.scala │ └── test │ │ └── scala │ │ └── example │ │ └── JsTest.scala ├── tsconfig.json └── vite.config.ts └── project ├── build.properties ├── plugins.sbt └── project └── metaplugins.sbt /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .bsp 3 | a.out 4 | ignore 5 | .vagrant 6 | logs 7 | *.log 8 | target 9 | tmp 10 | .history 11 | dist 12 | .idea 13 | .metals 14 | *.iml 15 | /out 16 | .idea_modules 17 | .classpath 18 | .project 19 | /RUNNING_PID 20 | .settings 21 | .DS_Store 22 | test-output/ 23 | .java-version 24 | build 25 | .vscode 26 | 27 | # hidden cross project folders 28 | shared/.js 29 | shared/.jvm 30 | 31 | # temp files 32 | .~* 33 | *~ 34 | *.orig 35 | 36 | # eclipse 37 | .scala_dependencies 38 | .buildpath 39 | .target 40 | bin/ 41 | journal 42 | snapshots 43 | *.rdb 44 | .bloop 45 | -------------------------------------------------------------------------------- /.scalafmt.conf: -------------------------------------------------------------------------------- 1 | version = 3.6.1 2 | 3 | align.preset = most 4 | docstrings.style = Asterisk 5 | docstrings.wrap = no 6 | runner.dialect = scala213source3 7 | maxColumn = 140 8 | indentOperator.preset = spray 9 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | This is an example project showing how to work with Scala.js with vite build. 2 | JS dependencies are managed in package.json 3 | HMR, tests and prod bundling work as expected (and fast!) 4 | 5 | ### Before you start 6 | ``` 7 | $ cd example 8 | $ npm install 9 | ``` 10 | 11 | ### Dev flow 12 | 13 | Start dev server in terminal-1 14 | ``` 15 | $ cd example 16 | $ npm run dev 17 | ``` 18 | 19 | Setup incremental Scala.js linking in terminal-2 20 | ``` 21 | $ sbt 22 | sbt:scala-js-vite> project example 23 | sbt:example> ~fastLinkJS 24 | ``` 25 | 26 | Open http://localhost:5173/ and watch the console. 27 | 28 | Make changes in Main.scala and watch HMR(Hot Module Reloading) working in the console. 29 | 30 | ### Test flow 31 | 32 | Ensure dev server is running in terminal-1 33 | ``` 34 | $ cd example 35 | $ npm run dev 36 | ``` 37 | 38 | Run Scala.js tests in terminal-2 39 | ``` 40 | $ sbt 41 | sbt:scala-js-vite> project example 42 | sbt:example> test 43 | ``` 44 | 45 | ### Prod flow 46 | 47 | In index.html, comment the script tag pointing to `example-fastopt/main.js` 48 | and uncomment the following script tag pointing to `example-opt/main.js` 49 | 50 | Run the full linking in Scala.js 51 | ``` 52 | $ sbt 53 | sbt:scala-js-vite> project example 54 | sbt:example> fullLinkJS 55 | ``` 56 | 57 | Run npm build 58 | ``` 59 | $ cd example 60 | $ npm run build 61 | ``` 62 | 63 | Verify the build with a static web server 64 | ``` 65 | $ cd example/dist 66 | $ python3 -m http.server 4000 67 | ``` 68 | 69 | Open http://localhost:4000/ and see the console. 70 | -------------------------------------------------------------------------------- /build.sbt: -------------------------------------------------------------------------------- 1 | import org.openqa.selenium.chrome.ChromeOptions 2 | import org.scalajs.jsenv.selenium.SeleniumJSEnv 3 | import org.scalajs.linker.interface.ModuleSplitStyle 4 | 5 | inThisBuild( 6 | Seq( 7 | version := "0.1.0-SNAPSHOT", 8 | organization := "com.github.mushtaq.scala-js-vite", 9 | organizationName := "ThoughtWorks", 10 | scalafmtOnCompile := true, 11 | scalaVersion := "3.4.2", 12 | scalacOptions ++= Seq( 13 | "-encoding", 14 | "UTF-8", 15 | "-feature", 16 | "-unchecked", 17 | "-deprecation", 18 | // "-Wconf:any:warning-verbose", 19 | // "-Wdead-code", 20 | // "-Xlint:_,-missing-interpolator", 21 | // "-Xcheckinit" 22 | ) 23 | ) 24 | ) 25 | 26 | lazy val `scala-js-vite` = project 27 | .in(file(".")) 28 | .aggregate(example) 29 | 30 | lazy val example = project 31 | .enablePlugins(ScalaJSPlugin) 32 | .settings( 33 | scalaJSUseMainModuleInitializer := true, 34 | scalaJSLinkerConfig ~= { 35 | _.withModuleKind(ModuleKind.ESModule) 36 | .withSourceMap(false) 37 | .withModuleSplitStyle(ModuleSplitStyle.SmallModulesFor(List("example"))) 38 | }, 39 | Compile / jsEnv := seleniumConfig(Compile, port = 5173).value, 40 | Test / jsEnv := seleniumConfig(Test, port = 5173).value, 41 | libraryDependencies ++= Seq( 42 | "org.scalatest" %%% "scalatest" % "3.2.18" % Test 43 | ) 44 | ) 45 | 46 | def seleniumConfig(sbtConfig: Configuration, port: Int) = Def.setting { 47 | val testJsDir = (sbtConfig / fastLinkJS / scalaJSLinkerOutputDirectory).value 48 | val webRoot = s"http://localhost:$port/${testJsDir.relativeTo(baseDirectory.value).get}/" 49 | 50 | new SeleniumJSEnv( 51 | headlessChrome, 52 | SeleniumJSEnv 53 | .Config() 54 | .withMaterializeInServer(contentDir = testJsDir.getAbsolutePath, webRoot = webRoot) 55 | ) 56 | } 57 | 58 | lazy val headlessChrome = { 59 | import _root_.io.github.bonigarcia.wdm.WebDriverManager 60 | WebDriverManager 61 | .chromedriver() 62 | // .browserVersion("126.0.6478.61") 63 | .setup() 64 | new ChromeOptions().setHeadless(true) 65 | } 66 | -------------------------------------------------------------------------------- /example/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | dist 4 | dist-ssr 5 | *.local -------------------------------------------------------------------------------- /example/css/styles.module.css: -------------------------------------------------------------------------------- 1 | .red { 2 | color: red; 3 | } 4 | -------------------------------------------------------------------------------- /example/favicon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /example/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite App 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /example/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vite-project", 3 | "version": "0.1.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "vite-project", 9 | "version": "0.1.0", 10 | "dependencies": { 11 | "camelcase": "^7.0.0" 12 | }, 13 | "devDependencies": { 14 | "vite": "^3.2.4" 15 | } 16 | }, 17 | "node_modules/@esbuild/android-arm": { 18 | "version": "0.15.10", 19 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.10.tgz", 20 | "integrity": "sha512-FNONeQPy/ox+5NBkcSbYJxoXj9GWu8gVGJTVmUyoOCKQFDTrHVKgNSzChdNt0I8Aj/iKcsDf2r9BFwv+FSNUXg==", 21 | "cpu": [ 22 | "arm" 23 | ], 24 | "dev": true, 25 | "optional": true, 26 | "os": [ 27 | "android" 28 | ], 29 | "engines": { 30 | "node": ">=12" 31 | } 32 | }, 33 | "node_modules/@esbuild/linux-loong64": { 34 | "version": "0.15.10", 35 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.10.tgz", 36 | "integrity": "sha512-w0Ou3Z83LOYEkwaui2M8VwIp+nLi/NA60lBLMvaJ+vXVMcsARYdEzLNE7RSm4+lSg4zq4d7fAVuzk7PNQ5JFgg==", 37 | "cpu": [ 38 | "loong64" 39 | ], 40 | "dev": true, 41 | "optional": true, 42 | "os": [ 43 | "linux" 44 | ], 45 | "engines": { 46 | "node": ">=12" 47 | } 48 | }, 49 | "node_modules/camelcase": { 50 | "version": "7.0.0", 51 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.0.tgz", 52 | "integrity": "sha512-JToIvOmz6nhGsUhAYScbo2d6Py5wojjNfoxoc2mEVLUdJ70gJK2gnd+ABY1Tc3sVMyK7QDPtN0T/XdlCQWITyQ==", 53 | "engines": { 54 | "node": ">=14.16" 55 | }, 56 | "funding": { 57 | "url": "https://github.com/sponsors/sindresorhus" 58 | } 59 | }, 60 | "node_modules/esbuild": { 61 | "version": "0.15.10", 62 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.10.tgz", 63 | "integrity": "sha512-N7wBhfJ/E5fzn/SpNgX+oW2RLRjwaL8Y0ezqNqhjD6w0H2p0rDuEz2FKZqpqLnO8DCaWumKe8dsC/ljvVSSxng==", 64 | "dev": true, 65 | "hasInstallScript": true, 66 | "bin": { 67 | "esbuild": "bin/esbuild" 68 | }, 69 | "engines": { 70 | "node": ">=12" 71 | }, 72 | "optionalDependencies": { 73 | "@esbuild/android-arm": "0.15.10", 74 | "@esbuild/linux-loong64": "0.15.10", 75 | "esbuild-android-64": "0.15.10", 76 | "esbuild-android-arm64": "0.15.10", 77 | "esbuild-darwin-64": "0.15.10", 78 | "esbuild-darwin-arm64": "0.15.10", 79 | "esbuild-freebsd-64": "0.15.10", 80 | "esbuild-freebsd-arm64": "0.15.10", 81 | "esbuild-linux-32": "0.15.10", 82 | "esbuild-linux-64": "0.15.10", 83 | "esbuild-linux-arm": "0.15.10", 84 | "esbuild-linux-arm64": "0.15.10", 85 | "esbuild-linux-mips64le": "0.15.10", 86 | "esbuild-linux-ppc64le": "0.15.10", 87 | "esbuild-linux-riscv64": "0.15.10", 88 | "esbuild-linux-s390x": "0.15.10", 89 | "esbuild-netbsd-64": "0.15.10", 90 | "esbuild-openbsd-64": "0.15.10", 91 | "esbuild-sunos-64": "0.15.10", 92 | "esbuild-windows-32": "0.15.10", 93 | "esbuild-windows-64": "0.15.10", 94 | "esbuild-windows-arm64": "0.15.10" 95 | } 96 | }, 97 | "node_modules/esbuild-android-64": { 98 | "version": "0.15.10", 99 | "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.10.tgz", 100 | "integrity": "sha512-UI7krF8OYO1N7JYTgLT9ML5j4+45ra3amLZKx7LO3lmLt1Ibn8t3aZbX5Pu4BjWiqDuJ3m/hsvhPhK/5Y/YpnA==", 101 | "cpu": [ 102 | "x64" 103 | ], 104 | "dev": true, 105 | "optional": true, 106 | "os": [ 107 | "android" 108 | ], 109 | "engines": { 110 | "node": ">=12" 111 | } 112 | }, 113 | "node_modules/esbuild-android-arm64": { 114 | "version": "0.15.10", 115 | "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.10.tgz", 116 | "integrity": "sha512-EOt55D6xBk5O05AK8brXUbZmoFj4chM8u3riGflLa6ziEoVvNjRdD7Cnp82NHQGfSHgYR06XsPI8/sMuA/cUwg==", 117 | "cpu": [ 118 | "arm64" 119 | ], 120 | "dev": true, 121 | "optional": true, 122 | "os": [ 123 | "android" 124 | ], 125 | "engines": { 126 | "node": ">=12" 127 | } 128 | }, 129 | "node_modules/esbuild-darwin-64": { 130 | "version": "0.15.10", 131 | "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.10.tgz", 132 | "integrity": "sha512-hbDJugTicqIm+WKZgp208d7FcXcaK8j2c0l+fqSJ3d2AzQAfjEYDRM3Z2oMeqSJ9uFxyj/muSACLdix7oTstRA==", 133 | "cpu": [ 134 | "x64" 135 | ], 136 | "dev": true, 137 | "optional": true, 138 | "os": [ 139 | "darwin" 140 | ], 141 | "engines": { 142 | "node": ">=12" 143 | } 144 | }, 145 | "node_modules/esbuild-darwin-arm64": { 146 | "version": "0.15.10", 147 | "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.10.tgz", 148 | "integrity": "sha512-M1t5+Kj4IgSbYmunf2BB6EKLkWUq+XlqaFRiGOk8bmBapu9bCDrxjf4kUnWn59Dka3I27EiuHBKd1rSO4osLFQ==", 149 | "cpu": [ 150 | "arm64" 151 | ], 152 | "dev": true, 153 | "optional": true, 154 | "os": [ 155 | "darwin" 156 | ], 157 | "engines": { 158 | "node": ">=12" 159 | } 160 | }, 161 | "node_modules/esbuild-freebsd-64": { 162 | "version": "0.15.10", 163 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.10.tgz", 164 | "integrity": "sha512-KMBFMa7C8oc97nqDdoZwtDBX7gfpolkk6Bcmj6YFMrtCMVgoU/x2DI1p74DmYl7CSS6Ppa3xgemrLrr5IjIn0w==", 165 | "cpu": [ 166 | "x64" 167 | ], 168 | "dev": true, 169 | "optional": true, 170 | "os": [ 171 | "freebsd" 172 | ], 173 | "engines": { 174 | "node": ">=12" 175 | } 176 | }, 177 | "node_modules/esbuild-freebsd-arm64": { 178 | "version": "0.15.10", 179 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.10.tgz", 180 | "integrity": "sha512-m2KNbuCX13yQqLlbSojFMHpewbn8wW5uDS6DxRpmaZKzyq8Dbsku6hHvh2U+BcLwWY4mpgXzFUoENEf7IcioGg==", 181 | "cpu": [ 182 | "arm64" 183 | ], 184 | "dev": true, 185 | "optional": true, 186 | "os": [ 187 | "freebsd" 188 | ], 189 | "engines": { 190 | "node": ">=12" 191 | } 192 | }, 193 | "node_modules/esbuild-linux-32": { 194 | "version": "0.15.10", 195 | "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.10.tgz", 196 | "integrity": "sha512-guXrwSYFAvNkuQ39FNeV4sNkNms1bLlA5vF1H0cazZBOLdLFIny6BhT+TUbK/hdByMQhtWQ5jI9VAmPKbVPu1w==", 197 | "cpu": [ 198 | "ia32" 199 | ], 200 | "dev": true, 201 | "optional": true, 202 | "os": [ 203 | "linux" 204 | ], 205 | "engines": { 206 | "node": ">=12" 207 | } 208 | }, 209 | "node_modules/esbuild-linux-64": { 210 | "version": "0.15.10", 211 | "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.10.tgz", 212 | "integrity": "sha512-jd8XfaSJeucMpD63YNMO1JCrdJhckHWcMv6O233bL4l6ogQKQOxBYSRP/XLWP+6kVTu0obXovuckJDcA0DKtQA==", 213 | "cpu": [ 214 | "x64" 215 | ], 216 | "dev": true, 217 | "optional": true, 218 | "os": [ 219 | "linux" 220 | ], 221 | "engines": { 222 | "node": ">=12" 223 | } 224 | }, 225 | "node_modules/esbuild-linux-arm": { 226 | "version": "0.15.10", 227 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.10.tgz", 228 | "integrity": "sha512-6N8vThLL/Lysy9y4Ex8XoLQAlbZKUyExCWyayGi2KgTBelKpPgj6RZnUaKri0dHNPGgReJriKVU6+KDGQwn10A==", 229 | "cpu": [ 230 | "arm" 231 | ], 232 | "dev": true, 233 | "optional": true, 234 | "os": [ 235 | "linux" 236 | ], 237 | "engines": { 238 | "node": ">=12" 239 | } 240 | }, 241 | "node_modules/esbuild-linux-arm64": { 242 | "version": "0.15.10", 243 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.10.tgz", 244 | "integrity": "sha512-GByBi4fgkvZFTHFDYNftu1DQ1GzR23jws0oWyCfhnI7eMOe+wgwWrc78dbNk709Ivdr/evefm2PJiUBMiusS1A==", 245 | "cpu": [ 246 | "arm64" 247 | ], 248 | "dev": true, 249 | "optional": true, 250 | "os": [ 251 | "linux" 252 | ], 253 | "engines": { 254 | "node": ">=12" 255 | } 256 | }, 257 | "node_modules/esbuild-linux-mips64le": { 258 | "version": "0.15.10", 259 | "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.10.tgz", 260 | "integrity": "sha512-BxP+LbaGVGIdQNJUNF7qpYjEGWb0YyHVSKqYKrn+pTwH/SiHUxFyJYSP3pqkku61olQiSBnSmWZ+YUpj78Tw7Q==", 261 | "cpu": [ 262 | "mips64el" 263 | ], 264 | "dev": true, 265 | "optional": true, 266 | "os": [ 267 | "linux" 268 | ], 269 | "engines": { 270 | "node": ">=12" 271 | } 272 | }, 273 | "node_modules/esbuild-linux-ppc64le": { 274 | "version": "0.15.10", 275 | "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.10.tgz", 276 | "integrity": "sha512-LoSQCd6498PmninNgqd/BR7z3Bsk/mabImBWuQ4wQgmQEeanzWd5BQU2aNi9mBURCLgyheuZS6Xhrw5luw3OkQ==", 277 | "cpu": [ 278 | "ppc64" 279 | ], 280 | "dev": true, 281 | "optional": true, 282 | "os": [ 283 | "linux" 284 | ], 285 | "engines": { 286 | "node": ">=12" 287 | } 288 | }, 289 | "node_modules/esbuild-linux-riscv64": { 290 | "version": "0.15.10", 291 | "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.10.tgz", 292 | "integrity": "sha512-Lrl9Cr2YROvPV4wmZ1/g48httE8z/5SCiXIyebiB5N8VT7pX3t6meI7TQVHw/wQpqP/AF4SksDuFImPTM7Z32Q==", 293 | "cpu": [ 294 | "riscv64" 295 | ], 296 | "dev": true, 297 | "optional": true, 298 | "os": [ 299 | "linux" 300 | ], 301 | "engines": { 302 | "node": ">=12" 303 | } 304 | }, 305 | "node_modules/esbuild-linux-s390x": { 306 | "version": "0.15.10", 307 | "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.10.tgz", 308 | "integrity": "sha512-ReP+6q3eLVVP2lpRrvl5EodKX7EZ1bS1/z5j6hsluAlZP5aHhk6ghT6Cq3IANvvDdscMMCB4QEbI+AjtvoOFpA==", 309 | "cpu": [ 310 | "s390x" 311 | ], 312 | "dev": true, 313 | "optional": true, 314 | "os": [ 315 | "linux" 316 | ], 317 | "engines": { 318 | "node": ">=12" 319 | } 320 | }, 321 | "node_modules/esbuild-netbsd-64": { 322 | "version": "0.15.10", 323 | "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.10.tgz", 324 | "integrity": "sha512-iGDYtJCMCqldMskQ4eIV+QSS/CuT7xyy9i2/FjpKvxAuCzrESZXiA1L64YNj6/afuzfBe9i8m/uDkFHy257hTw==", 325 | "cpu": [ 326 | "x64" 327 | ], 328 | "dev": true, 329 | "optional": true, 330 | "os": [ 331 | "netbsd" 332 | ], 333 | "engines": { 334 | "node": ">=12" 335 | } 336 | }, 337 | "node_modules/esbuild-openbsd-64": { 338 | "version": "0.15.10", 339 | "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.10.tgz", 340 | "integrity": "sha512-ftMMIwHWrnrYnvuJQRJs/Smlcb28F9ICGde/P3FUTCgDDM0N7WA0o9uOR38f5Xe2/OhNCgkjNeb7QeaE3cyWkQ==", 341 | "cpu": [ 342 | "x64" 343 | ], 344 | "dev": true, 345 | "optional": true, 346 | "os": [ 347 | "openbsd" 348 | ], 349 | "engines": { 350 | "node": ">=12" 351 | } 352 | }, 353 | "node_modules/esbuild-sunos-64": { 354 | "version": "0.15.10", 355 | "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.10.tgz", 356 | "integrity": "sha512-mf7hBL9Uo2gcy2r3rUFMjVpTaGpFJJE5QTDDqUFf1632FxteYANffDZmKbqX0PfeQ2XjUDE604IcE7OJeoHiyg==", 357 | "cpu": [ 358 | "x64" 359 | ], 360 | "dev": true, 361 | "optional": true, 362 | "os": [ 363 | "sunos" 364 | ], 365 | "engines": { 366 | "node": ">=12" 367 | } 368 | }, 369 | "node_modules/esbuild-windows-32": { 370 | "version": "0.15.10", 371 | "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.10.tgz", 372 | "integrity": "sha512-ttFVo+Cg8b5+qHmZHbEc8Vl17kCleHhLzgT8X04y8zudEApo0PxPg9Mz8Z2cKH1bCYlve1XL8LkyXGFjtUYeGg==", 373 | "cpu": [ 374 | "ia32" 375 | ], 376 | "dev": true, 377 | "optional": true, 378 | "os": [ 379 | "win32" 380 | ], 381 | "engines": { 382 | "node": ">=12" 383 | } 384 | }, 385 | "node_modules/esbuild-windows-64": { 386 | "version": "0.15.10", 387 | "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.10.tgz", 388 | "integrity": "sha512-2H0gdsyHi5x+8lbng3hLbxDWR7mKHWh5BXZGKVG830KUmXOOWFE2YKJ4tHRkejRduOGDrBvHBriYsGtmTv3ntA==", 389 | "cpu": [ 390 | "x64" 391 | ], 392 | "dev": true, 393 | "optional": true, 394 | "os": [ 395 | "win32" 396 | ], 397 | "engines": { 398 | "node": ">=12" 399 | } 400 | }, 401 | "node_modules/esbuild-windows-arm64": { 402 | "version": "0.15.10", 403 | "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.10.tgz", 404 | "integrity": "sha512-S+th4F+F8VLsHLR0zrUcG+Et4hx0RKgK1eyHc08kztmLOES8BWwMiaGdoW9hiXuzznXQ0I/Fg904MNbr11Nktw==", 405 | "cpu": [ 406 | "arm64" 407 | ], 408 | "dev": true, 409 | "optional": true, 410 | "os": [ 411 | "win32" 412 | ], 413 | "engines": { 414 | "node": ">=12" 415 | } 416 | }, 417 | "node_modules/fsevents": { 418 | "version": "2.3.2", 419 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 420 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 421 | "dev": true, 422 | "hasInstallScript": true, 423 | "optional": true, 424 | "os": [ 425 | "darwin" 426 | ], 427 | "engines": { 428 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 429 | } 430 | }, 431 | "node_modules/function-bind": { 432 | "version": "1.1.1", 433 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 434 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 435 | "dev": true 436 | }, 437 | "node_modules/has": { 438 | "version": "1.0.3", 439 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 440 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 441 | "dev": true, 442 | "dependencies": { 443 | "function-bind": "^1.1.1" 444 | }, 445 | "engines": { 446 | "node": ">= 0.4.0" 447 | } 448 | }, 449 | "node_modules/is-core-module": { 450 | "version": "2.10.0", 451 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", 452 | "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", 453 | "dev": true, 454 | "dependencies": { 455 | "has": "^1.0.3" 456 | }, 457 | "funding": { 458 | "url": "https://github.com/sponsors/ljharb" 459 | } 460 | }, 461 | "node_modules/nanoid": { 462 | "version": "3.3.4", 463 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", 464 | "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", 465 | "dev": true, 466 | "bin": { 467 | "nanoid": "bin/nanoid.cjs" 468 | }, 469 | "engines": { 470 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 471 | } 472 | }, 473 | "node_modules/path-parse": { 474 | "version": "1.0.7", 475 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 476 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 477 | "dev": true 478 | }, 479 | "node_modules/picocolors": { 480 | "version": "1.0.0", 481 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 482 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", 483 | "dev": true 484 | }, 485 | "node_modules/postcss": { 486 | "version": "8.4.19", 487 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.19.tgz", 488 | "integrity": "sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA==", 489 | "dev": true, 490 | "funding": [ 491 | { 492 | "type": "opencollective", 493 | "url": "https://opencollective.com/postcss/" 494 | }, 495 | { 496 | "type": "tidelift", 497 | "url": "https://tidelift.com/funding/github/npm/postcss" 498 | } 499 | ], 500 | "dependencies": { 501 | "nanoid": "^3.3.4", 502 | "picocolors": "^1.0.0", 503 | "source-map-js": "^1.0.2" 504 | }, 505 | "engines": { 506 | "node": "^10 || ^12 || >=14" 507 | } 508 | }, 509 | "node_modules/resolve": { 510 | "version": "1.22.1", 511 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", 512 | "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", 513 | "dev": true, 514 | "dependencies": { 515 | "is-core-module": "^2.9.0", 516 | "path-parse": "^1.0.7", 517 | "supports-preserve-symlinks-flag": "^1.0.0" 518 | }, 519 | "bin": { 520 | "resolve": "bin/resolve" 521 | }, 522 | "funding": { 523 | "url": "https://github.com/sponsors/ljharb" 524 | } 525 | }, 526 | "node_modules/rollup": { 527 | "version": "2.79.1", 528 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", 529 | "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", 530 | "dev": true, 531 | "bin": { 532 | "rollup": "dist/bin/rollup" 533 | }, 534 | "engines": { 535 | "node": ">=10.0.0" 536 | }, 537 | "optionalDependencies": { 538 | "fsevents": "~2.3.2" 539 | } 540 | }, 541 | "node_modules/source-map-js": { 542 | "version": "1.0.2", 543 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 544 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", 545 | "dev": true, 546 | "engines": { 547 | "node": ">=0.10.0" 548 | } 549 | }, 550 | "node_modules/supports-preserve-symlinks-flag": { 551 | "version": "1.0.0", 552 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 553 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 554 | "dev": true, 555 | "engines": { 556 | "node": ">= 0.4" 557 | }, 558 | "funding": { 559 | "url": "https://github.com/sponsors/ljharb" 560 | } 561 | }, 562 | "node_modules/vite": { 563 | "version": "3.2.4", 564 | "resolved": "https://registry.npmjs.org/vite/-/vite-3.2.4.tgz", 565 | "integrity": "sha512-Z2X6SRAffOUYTa+sLy3NQ7nlHFU100xwanq1WDwqaiFiCe+25zdxP1TfCS5ojPV2oDDcXudHIoPnI1Z/66B7Yw==", 566 | "dev": true, 567 | "dependencies": { 568 | "esbuild": "^0.15.9", 569 | "postcss": "^8.4.18", 570 | "resolve": "^1.22.1", 571 | "rollup": "^2.79.1" 572 | }, 573 | "bin": { 574 | "vite": "bin/vite.js" 575 | }, 576 | "engines": { 577 | "node": "^14.18.0 || >=16.0.0" 578 | }, 579 | "optionalDependencies": { 580 | "fsevents": "~2.3.2" 581 | }, 582 | "peerDependencies": { 583 | "@types/node": ">= 14", 584 | "less": "*", 585 | "sass": "*", 586 | "stylus": "*", 587 | "sugarss": "*", 588 | "terser": "^5.4.0" 589 | }, 590 | "peerDependenciesMeta": { 591 | "@types/node": { 592 | "optional": true 593 | }, 594 | "less": { 595 | "optional": true 596 | }, 597 | "sass": { 598 | "optional": true 599 | }, 600 | "stylus": { 601 | "optional": true 602 | }, 603 | "sugarss": { 604 | "optional": true 605 | }, 606 | "terser": { 607 | "optional": true 608 | } 609 | } 610 | } 611 | }, 612 | "dependencies": { 613 | "@esbuild/android-arm": { 614 | "version": "0.15.10", 615 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.10.tgz", 616 | "integrity": "sha512-FNONeQPy/ox+5NBkcSbYJxoXj9GWu8gVGJTVmUyoOCKQFDTrHVKgNSzChdNt0I8Aj/iKcsDf2r9BFwv+FSNUXg==", 617 | "dev": true, 618 | "optional": true 619 | }, 620 | "@esbuild/linux-loong64": { 621 | "version": "0.15.10", 622 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.10.tgz", 623 | "integrity": "sha512-w0Ou3Z83LOYEkwaui2M8VwIp+nLi/NA60lBLMvaJ+vXVMcsARYdEzLNE7RSm4+lSg4zq4d7fAVuzk7PNQ5JFgg==", 624 | "dev": true, 625 | "optional": true 626 | }, 627 | "camelcase": { 628 | "version": "7.0.0", 629 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.0.tgz", 630 | "integrity": "sha512-JToIvOmz6nhGsUhAYScbo2d6Py5wojjNfoxoc2mEVLUdJ70gJK2gnd+ABY1Tc3sVMyK7QDPtN0T/XdlCQWITyQ==" 631 | }, 632 | "esbuild": { 633 | "version": "0.15.10", 634 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.10.tgz", 635 | "integrity": "sha512-N7wBhfJ/E5fzn/SpNgX+oW2RLRjwaL8Y0ezqNqhjD6w0H2p0rDuEz2FKZqpqLnO8DCaWumKe8dsC/ljvVSSxng==", 636 | "dev": true, 637 | "requires": { 638 | "@esbuild/android-arm": "0.15.10", 639 | "@esbuild/linux-loong64": "0.15.10", 640 | "esbuild-android-64": "0.15.10", 641 | "esbuild-android-arm64": "0.15.10", 642 | "esbuild-darwin-64": "0.15.10", 643 | "esbuild-darwin-arm64": "0.15.10", 644 | "esbuild-freebsd-64": "0.15.10", 645 | "esbuild-freebsd-arm64": "0.15.10", 646 | "esbuild-linux-32": "0.15.10", 647 | "esbuild-linux-64": "0.15.10", 648 | "esbuild-linux-arm": "0.15.10", 649 | "esbuild-linux-arm64": "0.15.10", 650 | "esbuild-linux-mips64le": "0.15.10", 651 | "esbuild-linux-ppc64le": "0.15.10", 652 | "esbuild-linux-riscv64": "0.15.10", 653 | "esbuild-linux-s390x": "0.15.10", 654 | "esbuild-netbsd-64": "0.15.10", 655 | "esbuild-openbsd-64": "0.15.10", 656 | "esbuild-sunos-64": "0.15.10", 657 | "esbuild-windows-32": "0.15.10", 658 | "esbuild-windows-64": "0.15.10", 659 | "esbuild-windows-arm64": "0.15.10" 660 | } 661 | }, 662 | "esbuild-android-64": { 663 | "version": "0.15.10", 664 | "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.10.tgz", 665 | "integrity": "sha512-UI7krF8OYO1N7JYTgLT9ML5j4+45ra3amLZKx7LO3lmLt1Ibn8t3aZbX5Pu4BjWiqDuJ3m/hsvhPhK/5Y/YpnA==", 666 | "dev": true, 667 | "optional": true 668 | }, 669 | "esbuild-android-arm64": { 670 | "version": "0.15.10", 671 | "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.10.tgz", 672 | "integrity": "sha512-EOt55D6xBk5O05AK8brXUbZmoFj4chM8u3riGflLa6ziEoVvNjRdD7Cnp82NHQGfSHgYR06XsPI8/sMuA/cUwg==", 673 | "dev": true, 674 | "optional": true 675 | }, 676 | "esbuild-darwin-64": { 677 | "version": "0.15.10", 678 | "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.10.tgz", 679 | "integrity": "sha512-hbDJugTicqIm+WKZgp208d7FcXcaK8j2c0l+fqSJ3d2AzQAfjEYDRM3Z2oMeqSJ9uFxyj/muSACLdix7oTstRA==", 680 | "dev": true, 681 | "optional": true 682 | }, 683 | "esbuild-darwin-arm64": { 684 | "version": "0.15.10", 685 | "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.10.tgz", 686 | "integrity": "sha512-M1t5+Kj4IgSbYmunf2BB6EKLkWUq+XlqaFRiGOk8bmBapu9bCDrxjf4kUnWn59Dka3I27EiuHBKd1rSO4osLFQ==", 687 | "dev": true, 688 | "optional": true 689 | }, 690 | "esbuild-freebsd-64": { 691 | "version": "0.15.10", 692 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.10.tgz", 693 | "integrity": "sha512-KMBFMa7C8oc97nqDdoZwtDBX7gfpolkk6Bcmj6YFMrtCMVgoU/x2DI1p74DmYl7CSS6Ppa3xgemrLrr5IjIn0w==", 694 | "dev": true, 695 | "optional": true 696 | }, 697 | "esbuild-freebsd-arm64": { 698 | "version": "0.15.10", 699 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.10.tgz", 700 | "integrity": "sha512-m2KNbuCX13yQqLlbSojFMHpewbn8wW5uDS6DxRpmaZKzyq8Dbsku6hHvh2U+BcLwWY4mpgXzFUoENEf7IcioGg==", 701 | "dev": true, 702 | "optional": true 703 | }, 704 | "esbuild-linux-32": { 705 | "version": "0.15.10", 706 | "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.10.tgz", 707 | "integrity": "sha512-guXrwSYFAvNkuQ39FNeV4sNkNms1bLlA5vF1H0cazZBOLdLFIny6BhT+TUbK/hdByMQhtWQ5jI9VAmPKbVPu1w==", 708 | "dev": true, 709 | "optional": true 710 | }, 711 | "esbuild-linux-64": { 712 | "version": "0.15.10", 713 | "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.10.tgz", 714 | "integrity": "sha512-jd8XfaSJeucMpD63YNMO1JCrdJhckHWcMv6O233bL4l6ogQKQOxBYSRP/XLWP+6kVTu0obXovuckJDcA0DKtQA==", 715 | "dev": true, 716 | "optional": true 717 | }, 718 | "esbuild-linux-arm": { 719 | "version": "0.15.10", 720 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.10.tgz", 721 | "integrity": "sha512-6N8vThLL/Lysy9y4Ex8XoLQAlbZKUyExCWyayGi2KgTBelKpPgj6RZnUaKri0dHNPGgReJriKVU6+KDGQwn10A==", 722 | "dev": true, 723 | "optional": true 724 | }, 725 | "esbuild-linux-arm64": { 726 | "version": "0.15.10", 727 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.10.tgz", 728 | "integrity": "sha512-GByBi4fgkvZFTHFDYNftu1DQ1GzR23jws0oWyCfhnI7eMOe+wgwWrc78dbNk709Ivdr/evefm2PJiUBMiusS1A==", 729 | "dev": true, 730 | "optional": true 731 | }, 732 | "esbuild-linux-mips64le": { 733 | "version": "0.15.10", 734 | "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.10.tgz", 735 | "integrity": "sha512-BxP+LbaGVGIdQNJUNF7qpYjEGWb0YyHVSKqYKrn+pTwH/SiHUxFyJYSP3pqkku61olQiSBnSmWZ+YUpj78Tw7Q==", 736 | "dev": true, 737 | "optional": true 738 | }, 739 | "esbuild-linux-ppc64le": { 740 | "version": "0.15.10", 741 | "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.10.tgz", 742 | "integrity": "sha512-LoSQCd6498PmninNgqd/BR7z3Bsk/mabImBWuQ4wQgmQEeanzWd5BQU2aNi9mBURCLgyheuZS6Xhrw5luw3OkQ==", 743 | "dev": true, 744 | "optional": true 745 | }, 746 | "esbuild-linux-riscv64": { 747 | "version": "0.15.10", 748 | "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.10.tgz", 749 | "integrity": "sha512-Lrl9Cr2YROvPV4wmZ1/g48httE8z/5SCiXIyebiB5N8VT7pX3t6meI7TQVHw/wQpqP/AF4SksDuFImPTM7Z32Q==", 750 | "dev": true, 751 | "optional": true 752 | }, 753 | "esbuild-linux-s390x": { 754 | "version": "0.15.10", 755 | "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.10.tgz", 756 | "integrity": "sha512-ReP+6q3eLVVP2lpRrvl5EodKX7EZ1bS1/z5j6hsluAlZP5aHhk6ghT6Cq3IANvvDdscMMCB4QEbI+AjtvoOFpA==", 757 | "dev": true, 758 | "optional": true 759 | }, 760 | "esbuild-netbsd-64": { 761 | "version": "0.15.10", 762 | "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.10.tgz", 763 | "integrity": "sha512-iGDYtJCMCqldMskQ4eIV+QSS/CuT7xyy9i2/FjpKvxAuCzrESZXiA1L64YNj6/afuzfBe9i8m/uDkFHy257hTw==", 764 | "dev": true, 765 | "optional": true 766 | }, 767 | "esbuild-openbsd-64": { 768 | "version": "0.15.10", 769 | "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.10.tgz", 770 | "integrity": "sha512-ftMMIwHWrnrYnvuJQRJs/Smlcb28F9ICGde/P3FUTCgDDM0N7WA0o9uOR38f5Xe2/OhNCgkjNeb7QeaE3cyWkQ==", 771 | "dev": true, 772 | "optional": true 773 | }, 774 | "esbuild-sunos-64": { 775 | "version": "0.15.10", 776 | "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.10.tgz", 777 | "integrity": "sha512-mf7hBL9Uo2gcy2r3rUFMjVpTaGpFJJE5QTDDqUFf1632FxteYANffDZmKbqX0PfeQ2XjUDE604IcE7OJeoHiyg==", 778 | "dev": true, 779 | "optional": true 780 | }, 781 | "esbuild-windows-32": { 782 | "version": "0.15.10", 783 | "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.10.tgz", 784 | "integrity": "sha512-ttFVo+Cg8b5+qHmZHbEc8Vl17kCleHhLzgT8X04y8zudEApo0PxPg9Mz8Z2cKH1bCYlve1XL8LkyXGFjtUYeGg==", 785 | "dev": true, 786 | "optional": true 787 | }, 788 | "esbuild-windows-64": { 789 | "version": "0.15.10", 790 | "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.10.tgz", 791 | "integrity": "sha512-2H0gdsyHi5x+8lbng3hLbxDWR7mKHWh5BXZGKVG830KUmXOOWFE2YKJ4tHRkejRduOGDrBvHBriYsGtmTv3ntA==", 792 | "dev": true, 793 | "optional": true 794 | }, 795 | "esbuild-windows-arm64": { 796 | "version": "0.15.10", 797 | "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.10.tgz", 798 | "integrity": "sha512-S+th4F+F8VLsHLR0zrUcG+Et4hx0RKgK1eyHc08kztmLOES8BWwMiaGdoW9hiXuzznXQ0I/Fg904MNbr11Nktw==", 799 | "dev": true, 800 | "optional": true 801 | }, 802 | "fsevents": { 803 | "version": "2.3.2", 804 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 805 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 806 | "dev": true, 807 | "optional": true 808 | }, 809 | "function-bind": { 810 | "version": "1.1.1", 811 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 812 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 813 | "dev": true 814 | }, 815 | "has": { 816 | "version": "1.0.3", 817 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 818 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 819 | "dev": true, 820 | "requires": { 821 | "function-bind": "^1.1.1" 822 | } 823 | }, 824 | "is-core-module": { 825 | "version": "2.10.0", 826 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", 827 | "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", 828 | "dev": true, 829 | "requires": { 830 | "has": "^1.0.3" 831 | } 832 | }, 833 | "nanoid": { 834 | "version": "3.3.4", 835 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", 836 | "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", 837 | "dev": true 838 | }, 839 | "path-parse": { 840 | "version": "1.0.7", 841 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 842 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 843 | "dev": true 844 | }, 845 | "picocolors": { 846 | "version": "1.0.0", 847 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 848 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", 849 | "dev": true 850 | }, 851 | "postcss": { 852 | "version": "8.4.19", 853 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.19.tgz", 854 | "integrity": "sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA==", 855 | "dev": true, 856 | "requires": { 857 | "nanoid": "^3.3.4", 858 | "picocolors": "^1.0.0", 859 | "source-map-js": "^1.0.2" 860 | } 861 | }, 862 | "resolve": { 863 | "version": "1.22.1", 864 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", 865 | "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", 866 | "dev": true, 867 | "requires": { 868 | "is-core-module": "^2.9.0", 869 | "path-parse": "^1.0.7", 870 | "supports-preserve-symlinks-flag": "^1.0.0" 871 | } 872 | }, 873 | "rollup": { 874 | "version": "2.79.1", 875 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", 876 | "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", 877 | "dev": true, 878 | "requires": { 879 | "fsevents": "~2.3.2" 880 | } 881 | }, 882 | "source-map-js": { 883 | "version": "1.0.2", 884 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 885 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", 886 | "dev": true 887 | }, 888 | "supports-preserve-symlinks-flag": { 889 | "version": "1.0.0", 890 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 891 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 892 | "dev": true 893 | }, 894 | "vite": { 895 | "version": "3.2.4", 896 | "resolved": "https://registry.npmjs.org/vite/-/vite-3.2.4.tgz", 897 | "integrity": "sha512-Z2X6SRAffOUYTa+sLy3NQ7nlHFU100xwanq1WDwqaiFiCe+25zdxP1TfCS5ojPV2oDDcXudHIoPnI1Z/66B7Yw==", 898 | "dev": true, 899 | "requires": { 900 | "esbuild": "^0.15.9", 901 | "fsevents": "~2.3.2", 902 | "postcss": "^8.4.18", 903 | "resolve": "^1.22.1", 904 | "rollup": "^2.79.1" 905 | } 906 | } 907 | } 908 | } 909 | -------------------------------------------------------------------------------- /example/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vite-project", 3 | "version": "0.1.0", 4 | "scripts": { 5 | "dev": "vite", 6 | "build": "vite build", 7 | "serve": "vite preview" 8 | }, 9 | "dependencies": { 10 | "camelcase": "^7.0.0" 11 | }, 12 | "devDependencies": { 13 | "vite": "^3.2.4" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /example/pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | camelcase: 12 | specifier: ^7.0.0 13 | version: 7.0.1 14 | devDependencies: 15 | vite: 16 | specifier: ^3.2.4 17 | version: 3.2.10 18 | 19 | packages: 20 | 21 | '@esbuild/android-arm@0.15.18': 22 | resolution: {integrity: sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==} 23 | engines: {node: '>=12'} 24 | cpu: [arm] 25 | os: [android] 26 | 27 | '@esbuild/linux-loong64@0.15.18': 28 | resolution: {integrity: sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==} 29 | engines: {node: '>=12'} 30 | cpu: [loong64] 31 | os: [linux] 32 | 33 | camelcase@7.0.1: 34 | resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} 35 | engines: {node: '>=14.16'} 36 | 37 | esbuild-android-64@0.15.18: 38 | resolution: {integrity: sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==} 39 | engines: {node: '>=12'} 40 | cpu: [x64] 41 | os: [android] 42 | 43 | esbuild-android-arm64@0.15.18: 44 | resolution: {integrity: sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==} 45 | engines: {node: '>=12'} 46 | cpu: [arm64] 47 | os: [android] 48 | 49 | esbuild-darwin-64@0.15.18: 50 | resolution: {integrity: sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==} 51 | engines: {node: '>=12'} 52 | cpu: [x64] 53 | os: [darwin] 54 | 55 | esbuild-darwin-arm64@0.15.18: 56 | resolution: {integrity: sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==} 57 | engines: {node: '>=12'} 58 | cpu: [arm64] 59 | os: [darwin] 60 | 61 | esbuild-freebsd-64@0.15.18: 62 | resolution: {integrity: sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==} 63 | engines: {node: '>=12'} 64 | cpu: [x64] 65 | os: [freebsd] 66 | 67 | esbuild-freebsd-arm64@0.15.18: 68 | resolution: {integrity: sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==} 69 | engines: {node: '>=12'} 70 | cpu: [arm64] 71 | os: [freebsd] 72 | 73 | esbuild-linux-32@0.15.18: 74 | resolution: {integrity: sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==} 75 | engines: {node: '>=12'} 76 | cpu: [ia32] 77 | os: [linux] 78 | 79 | esbuild-linux-64@0.15.18: 80 | resolution: {integrity: sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==} 81 | engines: {node: '>=12'} 82 | cpu: [x64] 83 | os: [linux] 84 | 85 | esbuild-linux-arm64@0.15.18: 86 | resolution: {integrity: sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==} 87 | engines: {node: '>=12'} 88 | cpu: [arm64] 89 | os: [linux] 90 | 91 | esbuild-linux-arm@0.15.18: 92 | resolution: {integrity: sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==} 93 | engines: {node: '>=12'} 94 | cpu: [arm] 95 | os: [linux] 96 | 97 | esbuild-linux-mips64le@0.15.18: 98 | resolution: {integrity: sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==} 99 | engines: {node: '>=12'} 100 | cpu: [mips64el] 101 | os: [linux] 102 | 103 | esbuild-linux-ppc64le@0.15.18: 104 | resolution: {integrity: sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==} 105 | engines: {node: '>=12'} 106 | cpu: [ppc64] 107 | os: [linux] 108 | 109 | esbuild-linux-riscv64@0.15.18: 110 | resolution: {integrity: sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==} 111 | engines: {node: '>=12'} 112 | cpu: [riscv64] 113 | os: [linux] 114 | 115 | esbuild-linux-s390x@0.15.18: 116 | resolution: {integrity: sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==} 117 | engines: {node: '>=12'} 118 | cpu: [s390x] 119 | os: [linux] 120 | 121 | esbuild-netbsd-64@0.15.18: 122 | resolution: {integrity: sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==} 123 | engines: {node: '>=12'} 124 | cpu: [x64] 125 | os: [netbsd] 126 | 127 | esbuild-openbsd-64@0.15.18: 128 | resolution: {integrity: sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==} 129 | engines: {node: '>=12'} 130 | cpu: [x64] 131 | os: [openbsd] 132 | 133 | esbuild-sunos-64@0.15.18: 134 | resolution: {integrity: sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==} 135 | engines: {node: '>=12'} 136 | cpu: [x64] 137 | os: [sunos] 138 | 139 | esbuild-windows-32@0.15.18: 140 | resolution: {integrity: sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==} 141 | engines: {node: '>=12'} 142 | cpu: [ia32] 143 | os: [win32] 144 | 145 | esbuild-windows-64@0.15.18: 146 | resolution: {integrity: sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==} 147 | engines: {node: '>=12'} 148 | cpu: [x64] 149 | os: [win32] 150 | 151 | esbuild-windows-arm64@0.15.18: 152 | resolution: {integrity: sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==} 153 | engines: {node: '>=12'} 154 | cpu: [arm64] 155 | os: [win32] 156 | 157 | esbuild@0.15.18: 158 | resolution: {integrity: sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==} 159 | engines: {node: '>=12'} 160 | hasBin: true 161 | 162 | fsevents@2.3.3: 163 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 164 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 165 | os: [darwin] 166 | 167 | function-bind@1.1.2: 168 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 169 | 170 | hasown@2.0.2: 171 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 172 | engines: {node: '>= 0.4'} 173 | 174 | is-core-module@2.13.1: 175 | resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} 176 | 177 | nanoid@3.3.7: 178 | resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} 179 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 180 | hasBin: true 181 | 182 | path-parse@1.0.7: 183 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 184 | 185 | picocolors@1.0.1: 186 | resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} 187 | 188 | postcss@8.4.38: 189 | resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} 190 | engines: {node: ^10 || ^12 || >=14} 191 | 192 | resolve@1.22.8: 193 | resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} 194 | hasBin: true 195 | 196 | rollup@2.79.1: 197 | resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==} 198 | engines: {node: '>=10.0.0'} 199 | hasBin: true 200 | 201 | source-map-js@1.2.0: 202 | resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} 203 | engines: {node: '>=0.10.0'} 204 | 205 | supports-preserve-symlinks-flag@1.0.0: 206 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 207 | engines: {node: '>= 0.4'} 208 | 209 | vite@3.2.10: 210 | resolution: {integrity: sha512-Dx3olBo/ODNiMVk/cA5Yft9Ws+snLOXrhLtrI3F4XLt4syz2Yg8fayZMWScPKoz12v5BUv7VEmQHnsfpY80fYw==} 211 | engines: {node: ^14.18.0 || >=16.0.0} 212 | hasBin: true 213 | peerDependencies: 214 | '@types/node': '>= 14' 215 | less: '*' 216 | sass: '*' 217 | stylus: '*' 218 | sugarss: '*' 219 | terser: ^5.4.0 220 | peerDependenciesMeta: 221 | '@types/node': 222 | optional: true 223 | less: 224 | optional: true 225 | sass: 226 | optional: true 227 | stylus: 228 | optional: true 229 | sugarss: 230 | optional: true 231 | terser: 232 | optional: true 233 | 234 | snapshots: 235 | 236 | '@esbuild/android-arm@0.15.18': 237 | optional: true 238 | 239 | '@esbuild/linux-loong64@0.15.18': 240 | optional: true 241 | 242 | camelcase@7.0.1: {} 243 | 244 | esbuild-android-64@0.15.18: 245 | optional: true 246 | 247 | esbuild-android-arm64@0.15.18: 248 | optional: true 249 | 250 | esbuild-darwin-64@0.15.18: 251 | optional: true 252 | 253 | esbuild-darwin-arm64@0.15.18: 254 | optional: true 255 | 256 | esbuild-freebsd-64@0.15.18: 257 | optional: true 258 | 259 | esbuild-freebsd-arm64@0.15.18: 260 | optional: true 261 | 262 | esbuild-linux-32@0.15.18: 263 | optional: true 264 | 265 | esbuild-linux-64@0.15.18: 266 | optional: true 267 | 268 | esbuild-linux-arm64@0.15.18: 269 | optional: true 270 | 271 | esbuild-linux-arm@0.15.18: 272 | optional: true 273 | 274 | esbuild-linux-mips64le@0.15.18: 275 | optional: true 276 | 277 | esbuild-linux-ppc64le@0.15.18: 278 | optional: true 279 | 280 | esbuild-linux-riscv64@0.15.18: 281 | optional: true 282 | 283 | esbuild-linux-s390x@0.15.18: 284 | optional: true 285 | 286 | esbuild-netbsd-64@0.15.18: 287 | optional: true 288 | 289 | esbuild-openbsd-64@0.15.18: 290 | optional: true 291 | 292 | esbuild-sunos-64@0.15.18: 293 | optional: true 294 | 295 | esbuild-windows-32@0.15.18: 296 | optional: true 297 | 298 | esbuild-windows-64@0.15.18: 299 | optional: true 300 | 301 | esbuild-windows-arm64@0.15.18: 302 | optional: true 303 | 304 | esbuild@0.15.18: 305 | optionalDependencies: 306 | '@esbuild/android-arm': 0.15.18 307 | '@esbuild/linux-loong64': 0.15.18 308 | esbuild-android-64: 0.15.18 309 | esbuild-android-arm64: 0.15.18 310 | esbuild-darwin-64: 0.15.18 311 | esbuild-darwin-arm64: 0.15.18 312 | esbuild-freebsd-64: 0.15.18 313 | esbuild-freebsd-arm64: 0.15.18 314 | esbuild-linux-32: 0.15.18 315 | esbuild-linux-64: 0.15.18 316 | esbuild-linux-arm: 0.15.18 317 | esbuild-linux-arm64: 0.15.18 318 | esbuild-linux-mips64le: 0.15.18 319 | esbuild-linux-ppc64le: 0.15.18 320 | esbuild-linux-riscv64: 0.15.18 321 | esbuild-linux-s390x: 0.15.18 322 | esbuild-netbsd-64: 0.15.18 323 | esbuild-openbsd-64: 0.15.18 324 | esbuild-sunos-64: 0.15.18 325 | esbuild-windows-32: 0.15.18 326 | esbuild-windows-64: 0.15.18 327 | esbuild-windows-arm64: 0.15.18 328 | 329 | fsevents@2.3.3: 330 | optional: true 331 | 332 | function-bind@1.1.2: {} 333 | 334 | hasown@2.0.2: 335 | dependencies: 336 | function-bind: 1.1.2 337 | 338 | is-core-module@2.13.1: 339 | dependencies: 340 | hasown: 2.0.2 341 | 342 | nanoid@3.3.7: {} 343 | 344 | path-parse@1.0.7: {} 345 | 346 | picocolors@1.0.1: {} 347 | 348 | postcss@8.4.38: 349 | dependencies: 350 | nanoid: 3.3.7 351 | picocolors: 1.0.1 352 | source-map-js: 1.2.0 353 | 354 | resolve@1.22.8: 355 | dependencies: 356 | is-core-module: 2.13.1 357 | path-parse: 1.0.7 358 | supports-preserve-symlinks-flag: 1.0.0 359 | 360 | rollup@2.79.1: 361 | optionalDependencies: 362 | fsevents: 2.3.3 363 | 364 | source-map-js@1.2.0: {} 365 | 366 | supports-preserve-symlinks-flag@1.0.0: {} 367 | 368 | vite@3.2.10: 369 | dependencies: 370 | esbuild: 0.15.18 371 | postcss: 8.4.38 372 | resolve: 1.22.8 373 | rollup: 2.79.1 374 | optionalDependencies: 375 | fsevents: 2.3.3 376 | -------------------------------------------------------------------------------- /example/src/main/scala/example/Css.scala: -------------------------------------------------------------------------------- 1 | package example 2 | 3 | import scala.scalajs.js 4 | import scala.scalajs.js.annotation.JSImport 5 | 6 | object Css { 7 | @JSImport("/css/styles.module.css", JSImport.Default) 8 | @js.native 9 | object Styles extends js.Object 10 | } 11 | -------------------------------------------------------------------------------- /example/src/main/scala/example/Main.scala: -------------------------------------------------------------------------------- 1 | package example 2 | 3 | import scala.scalajs.js.Object.keys 4 | 5 | object Main { 6 | 7 | def main(args: Array[String]): Unit = { 8 | println(Utils.camelcase("my name is blah")) 9 | println(keys(Css.Styles)) 10 | } 11 | 12 | } 13 | -------------------------------------------------------------------------------- /example/src/main/scala/example/Utils.scala: -------------------------------------------------------------------------------- 1 | package example 2 | 3 | import scala.scalajs.js 4 | import scala.scalajs.js.annotation.JSImport 5 | 6 | object Utils { 7 | @JSImport("camelcase", JSImport.Default) 8 | @js.native 9 | def camelcase(input: String): String = js.native 10 | } 11 | -------------------------------------------------------------------------------- /example/src/test/scala/example/JsTest.scala: -------------------------------------------------------------------------------- 1 | package example 2 | 3 | import org.scalatest.freespec.AnyFreeSpec 4 | import org.scalatest.matchers.should.Matchers 5 | 6 | import scala.scalajs.js.Object.keys 7 | 8 | class JsTest extends AnyFreeSpec with Matchers { 9 | 10 | "camelcase" in { 11 | Utils.camelcase("my name is blah") shouldBe "myNameIsBlah" 12 | } 13 | 14 | "css" in { 15 | keys(Css.Styles).toList.head shouldBe "red" 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /example/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "lib": ["ESNext"] 4 | } 5 | } -------------------------------------------------------------------------------- /example/vite.config.ts: -------------------------------------------------------------------------------- 1 | import {defineConfig, PluginOption, UserConfig} from 'vite' 2 | 3 | export default defineConfig(({command, mode}): UserConfig => { 4 | return { 5 | plugins: command === "build" ? [htmlPlugin()] : [], 6 | build: { 7 | target: "esnext" 8 | }, 9 | }; 10 | }) 11 | 12 | const htmlPlugin = (): PluginOption => { 13 | return { 14 | name: "html-transform", 15 | enforce: 'pre', 16 | transform: (file, fileName) => { 17 | return fileName.endsWith('index.html') ? file.replace("-fastopt", "-opt") : file 18 | } 19 | }; 20 | }; 21 | -------------------------------------------------------------------------------- /project/build.properties: -------------------------------------------------------------------------------- 1 | sbt.version = 1.10.0 2 | -------------------------------------------------------------------------------- /project/plugins.sbt: -------------------------------------------------------------------------------- 1 | addSbtPlugin("com.timushev.sbt" % "sbt-updates" % "0.6.4") 2 | addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.5.2") 3 | addSbtPlugin("com.timushev.sbt" % "sbt-rewarn" % "0.1.3") 4 | 5 | libraryDependencies += "io.github.bonigarcia" % "webdrivermanager" % "5.8.0" 6 | libraryDependencies += "org.scala-js" %% "scalajs-env-selenium" % "1.1.1" 7 | // note, 'sbt-scalajs' must come after 'scalajs-env-selenium' 8 | // reference: https://github.com/scala-js/scala-js-env-selenium#usage 9 | addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.16.0") 10 | 11 | scalacOptions ++= Seq( 12 | "-encoding", 13 | "UTF-8", 14 | "-feature", 15 | "-unchecked", 16 | "-deprecation", 17 | "-Xlint:-unused,_", 18 | "-Ywarn-dead-code", 19 | "-Xfuture" 20 | ) 21 | -------------------------------------------------------------------------------- /project/project/metaplugins.sbt: -------------------------------------------------------------------------------- 1 | addSbtPlugin("com.timushev.sbt" % "sbt-updates" % "0.6.4") 2 | --------------------------------------------------------------------------------