├── .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 |
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 |
--------------------------------------------------------------------------------