├── .gitignore ├── Index.re ├── LICENSE ├── README.md ├── dune ├── dune-project ├── index.html ├── melange-for-react-devs.opam ├── package-lock.json ├── package.json └── vite.config.mjs /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | _build/ 4 | _opam/ 5 | dist/ 6 | -------------------------------------------------------------------------------- /Index.re: -------------------------------------------------------------------------------- 1 | module App = { 2 | [@react.component] 3 | let make = () =>

{React.string("Welcome to my app!")}

; 4 | }; 5 | 6 | let node = ReactDOM.querySelector("#root"); 7 | switch (node) { 8 | | None => 9 | Js.Console.error("Failed to start React: couldn't find the #root element") 10 | | Some(root) => 11 | let root = ReactDOM.Client.createRoot(root); 12 | ReactDOM.Client.render(root, ); 13 | }; 14 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Melange 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Melange for React Developers 2 | 3 | A simple project template using [Melange](https://github.com/melange-re/melange) 4 | with [opam](https://opam.ocaml.org/). 5 | 6 | ## Quick Start 7 | 8 | ```shell 9 | npm run init 10 | 11 | # In separate terminals: 12 | npm run watch 13 | npm run serve 14 | ``` 15 | 16 | ### React 17 | 18 | React support is provided by 19 | [`reason-react`](https://github.com/reasonml/reason-react/). The entry 20 | point of the sample React app is [`Index.re`](Index.re). 21 | 22 | ## Commands 23 | 24 | All the build commands are defined in the `scripts` field of `package.json`. 25 | This is completely optional, and other tools like `make` could be used. 26 | 27 | You can see all available commands by running `npm run`. There are explanations 28 | of each command in the `scriptsComments` field of the `package.json` file. Here 29 | are a few of the most useful ones: 30 | 31 | - `npm run init`: set up opam local switch and download OCaml, Melange and 32 | JavaScript dependencies 33 | - `npm run install:npm-opam`: install JavaScript, OCaml, and Melange 34 | dependencies 35 | - `npm run watch`: watch the filesystem and have Melange rebuild on every 36 | change 37 | - `npm run serve`: serve the application with a local HTTP server 38 | -------------------------------------------------------------------------------- /dune: -------------------------------------------------------------------------------- 1 | ; `dirs` is a stanza to tell dune which subfolders from the current folder 2 | ; (where the `dune` file is) it should process. Here it is saying to include 3 | ; all directories that don't start with . or _, but exclude node_modules. 4 | 5 | (dirs :standard \ node_modules) 6 | 7 | ; `melange.emit` is a Dune stanza that will produce build rules to generate 8 | ; JavaScript files from sources using the Melange compiler 9 | ; https://dune.readthedocs.io/en/stable/melange.html#melange-emit 10 | 11 | (melange.emit 12 | ; The `target` field is used by Dune to put all JavaScript artifacts in a 13 | ; specific folder inside `_build/default` 14 | (target output) 15 | ; Here's the list of dependencies of the stanza. In this case (being 16 | ; `melange.emit`), Dune will look into those dependencies and generate rules 17 | ; with JavaScript targets for the modules in those libraries as well. 18 | ; Caveat: the libraries need to be specified with `(modes melange)`. 19 | (libraries reason-react) 20 | ; The `preprocess` field lists preprocessors which transform code before it is 21 | ; compiled. melange.ppx allows to use Melange attributes [@mel. ...] 22 | ; (https://melange.re/v2.0.0/communicate-with-javascript/#attributes) 23 | ; reason-react-ppx allows to use JSX for ReasonReact components by using the 24 | ; [@JSX] attributes from Reason: https://reasonml.github.io/docs/en/jsx 25 | (preprocess 26 | (pps melange.ppx reason-react-ppx)) 27 | ; module_systems lets you specify commonjs (the default) or es6 28 | (module_systems es6)) 29 | -------------------------------------------------------------------------------- /dune-project: -------------------------------------------------------------------------------- 1 | (lang dune 3.8) 2 | 3 | ; Use version 0.1 of the melange plugin for dune 4 | 5 | (using melange 0.1) 6 | 7 | ; Set the name which is used by error messages 8 | 9 | (name melange-for-react-devs) 10 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Melange for React Developers 6 | 7 | 8 | 9 |
10 | 11 | 12 | -------------------------------------------------------------------------------- /melange-for-react-devs.opam: -------------------------------------------------------------------------------- 1 | opam-version: "2.0" 2 | synopsis: "Melange for React Developers" 3 | description: "Template for Melange For React Developers Guide" 4 | maintainer: ["Feihong Hsu "] 5 | authors: ["Feihong Hsu "] 6 | license: "MIT" 7 | homepage: "https://github.com/melange-re/melange-for-react-devs-template" 8 | bug-reports: "https://github.com/melange-re/melange-for-react-devs-template" 9 | depends: [ 10 | "ocaml" {>= "5.1.1"} 11 | "reason" {>= "3.10.0"} 12 | "dune" {>= "3.8"} 13 | "melange" {>= "4.0.0-51"} 14 | "reason-react" {>= "0.14.0"} 15 | "reason-react-ppx" {>= "0.14.0"} 16 | "opam-check-npm-deps" {with-test} # todo: use with-dev-setup once opam 2.2 is out 17 | "ocaml-lsp-server" {with-test} # todo: use with-dev-setup once opam 2.2 is out 18 | "dot-merlin-reader" {with-test} # todo: use with-dev-setup once opam 2.2 is out 19 | "odoc" {with-doc} 20 | ] 21 | dev-repo: "git+https://github.com/melange-re/melange-for-react-devs-template.git" 22 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "melange-for-react-devs-template", 3 | "lockfileVersion": 3, 4 | "requires": true, 5 | "packages": { 6 | "": { 7 | "dependencies": { 8 | "react": "^18.2.0", 9 | "react-dom": "^18.2.0" 10 | }, 11 | "devDependencies": { 12 | "@rollup/plugin-node-resolve": "^15.2.3", 13 | "vite": "^5.0.11" 14 | } 15 | }, 16 | "node_modules/@esbuild/aix-ppc64": { 17 | "version": "0.19.11", 18 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz", 19 | "integrity": "sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==", 20 | "cpu": [ 21 | "ppc64" 22 | ], 23 | "dev": true, 24 | "optional": true, 25 | "os": [ 26 | "aix" 27 | ], 28 | "engines": { 29 | "node": ">=12" 30 | } 31 | }, 32 | "node_modules/@esbuild/android-arm": { 33 | "version": "0.19.11", 34 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.11.tgz", 35 | "integrity": "sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==", 36 | "cpu": [ 37 | "arm" 38 | ], 39 | "dev": true, 40 | "optional": true, 41 | "os": [ 42 | "android" 43 | ], 44 | "engines": { 45 | "node": ">=12" 46 | } 47 | }, 48 | "node_modules/@esbuild/android-arm64": { 49 | "version": "0.19.11", 50 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.11.tgz", 51 | "integrity": "sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==", 52 | "cpu": [ 53 | "arm64" 54 | ], 55 | "dev": true, 56 | "optional": true, 57 | "os": [ 58 | "android" 59 | ], 60 | "engines": { 61 | "node": ">=12" 62 | } 63 | }, 64 | "node_modules/@esbuild/android-x64": { 65 | "version": "0.19.11", 66 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.11.tgz", 67 | "integrity": "sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==", 68 | "cpu": [ 69 | "x64" 70 | ], 71 | "dev": true, 72 | "optional": true, 73 | "os": [ 74 | "android" 75 | ], 76 | "engines": { 77 | "node": ">=12" 78 | } 79 | }, 80 | "node_modules/@esbuild/darwin-arm64": { 81 | "version": "0.19.11", 82 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.11.tgz", 83 | "integrity": "sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==", 84 | "cpu": [ 85 | "arm64" 86 | ], 87 | "dev": true, 88 | "optional": true, 89 | "os": [ 90 | "darwin" 91 | ], 92 | "engines": { 93 | "node": ">=12" 94 | } 95 | }, 96 | "node_modules/@esbuild/darwin-x64": { 97 | "version": "0.19.11", 98 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.11.tgz", 99 | "integrity": "sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==", 100 | "cpu": [ 101 | "x64" 102 | ], 103 | "dev": true, 104 | "optional": true, 105 | "os": [ 106 | "darwin" 107 | ], 108 | "engines": { 109 | "node": ">=12" 110 | } 111 | }, 112 | "node_modules/@esbuild/freebsd-arm64": { 113 | "version": "0.19.11", 114 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.11.tgz", 115 | "integrity": "sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==", 116 | "cpu": [ 117 | "arm64" 118 | ], 119 | "dev": true, 120 | "optional": true, 121 | "os": [ 122 | "freebsd" 123 | ], 124 | "engines": { 125 | "node": ">=12" 126 | } 127 | }, 128 | "node_modules/@esbuild/freebsd-x64": { 129 | "version": "0.19.11", 130 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.11.tgz", 131 | "integrity": "sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==", 132 | "cpu": [ 133 | "x64" 134 | ], 135 | "dev": true, 136 | "optional": true, 137 | "os": [ 138 | "freebsd" 139 | ], 140 | "engines": { 141 | "node": ">=12" 142 | } 143 | }, 144 | "node_modules/@esbuild/linux-arm": { 145 | "version": "0.19.11", 146 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.11.tgz", 147 | "integrity": "sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==", 148 | "cpu": [ 149 | "arm" 150 | ], 151 | "dev": true, 152 | "optional": true, 153 | "os": [ 154 | "linux" 155 | ], 156 | "engines": { 157 | "node": ">=12" 158 | } 159 | }, 160 | "node_modules/@esbuild/linux-arm64": { 161 | "version": "0.19.11", 162 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.11.tgz", 163 | "integrity": "sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==", 164 | "cpu": [ 165 | "arm64" 166 | ], 167 | "dev": true, 168 | "optional": true, 169 | "os": [ 170 | "linux" 171 | ], 172 | "engines": { 173 | "node": ">=12" 174 | } 175 | }, 176 | "node_modules/@esbuild/linux-ia32": { 177 | "version": "0.19.11", 178 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.11.tgz", 179 | "integrity": "sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==", 180 | "cpu": [ 181 | "ia32" 182 | ], 183 | "dev": true, 184 | "optional": true, 185 | "os": [ 186 | "linux" 187 | ], 188 | "engines": { 189 | "node": ">=12" 190 | } 191 | }, 192 | "node_modules/@esbuild/linux-loong64": { 193 | "version": "0.19.11", 194 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.11.tgz", 195 | "integrity": "sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==", 196 | "cpu": [ 197 | "loong64" 198 | ], 199 | "dev": true, 200 | "optional": true, 201 | "os": [ 202 | "linux" 203 | ], 204 | "engines": { 205 | "node": ">=12" 206 | } 207 | }, 208 | "node_modules/@esbuild/linux-mips64el": { 209 | "version": "0.19.11", 210 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.11.tgz", 211 | "integrity": "sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==", 212 | "cpu": [ 213 | "mips64el" 214 | ], 215 | "dev": true, 216 | "optional": true, 217 | "os": [ 218 | "linux" 219 | ], 220 | "engines": { 221 | "node": ">=12" 222 | } 223 | }, 224 | "node_modules/@esbuild/linux-ppc64": { 225 | "version": "0.19.11", 226 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.11.tgz", 227 | "integrity": "sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==", 228 | "cpu": [ 229 | "ppc64" 230 | ], 231 | "dev": true, 232 | "optional": true, 233 | "os": [ 234 | "linux" 235 | ], 236 | "engines": { 237 | "node": ">=12" 238 | } 239 | }, 240 | "node_modules/@esbuild/linux-riscv64": { 241 | "version": "0.19.11", 242 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.11.tgz", 243 | "integrity": "sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==", 244 | "cpu": [ 245 | "riscv64" 246 | ], 247 | "dev": true, 248 | "optional": true, 249 | "os": [ 250 | "linux" 251 | ], 252 | "engines": { 253 | "node": ">=12" 254 | } 255 | }, 256 | "node_modules/@esbuild/linux-s390x": { 257 | "version": "0.19.11", 258 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.11.tgz", 259 | "integrity": "sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==", 260 | "cpu": [ 261 | "s390x" 262 | ], 263 | "dev": true, 264 | "optional": true, 265 | "os": [ 266 | "linux" 267 | ], 268 | "engines": { 269 | "node": ">=12" 270 | } 271 | }, 272 | "node_modules/@esbuild/linux-x64": { 273 | "version": "0.19.11", 274 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.11.tgz", 275 | "integrity": "sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==", 276 | "cpu": [ 277 | "x64" 278 | ], 279 | "dev": true, 280 | "optional": true, 281 | "os": [ 282 | "linux" 283 | ], 284 | "engines": { 285 | "node": ">=12" 286 | } 287 | }, 288 | "node_modules/@esbuild/netbsd-x64": { 289 | "version": "0.19.11", 290 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.11.tgz", 291 | "integrity": "sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==", 292 | "cpu": [ 293 | "x64" 294 | ], 295 | "dev": true, 296 | "optional": true, 297 | "os": [ 298 | "netbsd" 299 | ], 300 | "engines": { 301 | "node": ">=12" 302 | } 303 | }, 304 | "node_modules/@esbuild/openbsd-x64": { 305 | "version": "0.19.11", 306 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.11.tgz", 307 | "integrity": "sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==", 308 | "cpu": [ 309 | "x64" 310 | ], 311 | "dev": true, 312 | "optional": true, 313 | "os": [ 314 | "openbsd" 315 | ], 316 | "engines": { 317 | "node": ">=12" 318 | } 319 | }, 320 | "node_modules/@esbuild/sunos-x64": { 321 | "version": "0.19.11", 322 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.11.tgz", 323 | "integrity": "sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==", 324 | "cpu": [ 325 | "x64" 326 | ], 327 | "dev": true, 328 | "optional": true, 329 | "os": [ 330 | "sunos" 331 | ], 332 | "engines": { 333 | "node": ">=12" 334 | } 335 | }, 336 | "node_modules/@esbuild/win32-arm64": { 337 | "version": "0.19.11", 338 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.11.tgz", 339 | "integrity": "sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==", 340 | "cpu": [ 341 | "arm64" 342 | ], 343 | "dev": true, 344 | "optional": true, 345 | "os": [ 346 | "win32" 347 | ], 348 | "engines": { 349 | "node": ">=12" 350 | } 351 | }, 352 | "node_modules/@esbuild/win32-ia32": { 353 | "version": "0.19.11", 354 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.11.tgz", 355 | "integrity": "sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==", 356 | "cpu": [ 357 | "ia32" 358 | ], 359 | "dev": true, 360 | "optional": true, 361 | "os": [ 362 | "win32" 363 | ], 364 | "engines": { 365 | "node": ">=12" 366 | } 367 | }, 368 | "node_modules/@esbuild/win32-x64": { 369 | "version": "0.19.11", 370 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.11.tgz", 371 | "integrity": "sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==", 372 | "cpu": [ 373 | "x64" 374 | ], 375 | "dev": true, 376 | "optional": true, 377 | "os": [ 378 | "win32" 379 | ], 380 | "engines": { 381 | "node": ">=12" 382 | } 383 | }, 384 | "node_modules/@jridgewell/gen-mapping": { 385 | "version": "0.3.3", 386 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", 387 | "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", 388 | "dev": true, 389 | "optional": true, 390 | "peer": true, 391 | "dependencies": { 392 | "@jridgewell/set-array": "^1.0.1", 393 | "@jridgewell/sourcemap-codec": "^1.4.10", 394 | "@jridgewell/trace-mapping": "^0.3.9" 395 | }, 396 | "engines": { 397 | "node": ">=6.0.0" 398 | } 399 | }, 400 | "node_modules/@jridgewell/resolve-uri": { 401 | "version": "3.1.1", 402 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", 403 | "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", 404 | "dev": true, 405 | "optional": true, 406 | "peer": true, 407 | "engines": { 408 | "node": ">=6.0.0" 409 | } 410 | }, 411 | "node_modules/@jridgewell/set-array": { 412 | "version": "1.1.2", 413 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", 414 | "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", 415 | "dev": true, 416 | "optional": true, 417 | "peer": true, 418 | "engines": { 419 | "node": ">=6.0.0" 420 | } 421 | }, 422 | "node_modules/@jridgewell/source-map": { 423 | "version": "0.3.5", 424 | "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", 425 | "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", 426 | "dev": true, 427 | "optional": true, 428 | "peer": true, 429 | "dependencies": { 430 | "@jridgewell/gen-mapping": "^0.3.0", 431 | "@jridgewell/trace-mapping": "^0.3.9" 432 | } 433 | }, 434 | "node_modules/@jridgewell/sourcemap-codec": { 435 | "version": "1.4.15", 436 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", 437 | "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", 438 | "dev": true, 439 | "optional": true, 440 | "peer": true 441 | }, 442 | "node_modules/@jridgewell/trace-mapping": { 443 | "version": "0.3.20", 444 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", 445 | "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", 446 | "dev": true, 447 | "optional": true, 448 | "peer": true, 449 | "dependencies": { 450 | "@jridgewell/resolve-uri": "^3.1.0", 451 | "@jridgewell/sourcemap-codec": "^1.4.14" 452 | } 453 | }, 454 | "node_modules/@rollup/plugin-node-resolve": { 455 | "version": "15.2.3", 456 | "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz", 457 | "integrity": "sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==", 458 | "dev": true, 459 | "dependencies": { 460 | "@rollup/pluginutils": "^5.0.1", 461 | "@types/resolve": "1.20.2", 462 | "deepmerge": "^4.2.2", 463 | "is-builtin-module": "^3.2.1", 464 | "is-module": "^1.0.0", 465 | "resolve": "^1.22.1" 466 | }, 467 | "engines": { 468 | "node": ">=14.0.0" 469 | }, 470 | "peerDependencies": { 471 | "rollup": "^2.78.0||^3.0.0||^4.0.0" 472 | }, 473 | "peerDependenciesMeta": { 474 | "rollup": { 475 | "optional": true 476 | } 477 | } 478 | }, 479 | "node_modules/@rollup/pluginutils": { 480 | "version": "5.1.0", 481 | "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", 482 | "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", 483 | "dev": true, 484 | "dependencies": { 485 | "@types/estree": "^1.0.0", 486 | "estree-walker": "^2.0.2", 487 | "picomatch": "^2.3.1" 488 | }, 489 | "engines": { 490 | "node": ">=14.0.0" 491 | }, 492 | "peerDependencies": { 493 | "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" 494 | }, 495 | "peerDependenciesMeta": { 496 | "rollup": { 497 | "optional": true 498 | } 499 | } 500 | }, 501 | "node_modules/@rollup/rollup-android-arm-eabi": { 502 | "version": "4.9.4", 503 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.4.tgz", 504 | "integrity": "sha512-ub/SN3yWqIv5CWiAZPHVS1DloyZsJbtXmX4HxUTIpS0BHm9pW5iYBo2mIZi+hE3AeiTzHz33blwSnhdUo+9NpA==", 505 | "cpu": [ 506 | "arm" 507 | ], 508 | "dev": true, 509 | "optional": true, 510 | "os": [ 511 | "android" 512 | ] 513 | }, 514 | "node_modules/@rollup/rollup-android-arm64": { 515 | "version": "4.9.4", 516 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.4.tgz", 517 | "integrity": "sha512-ehcBrOR5XTl0W0t2WxfTyHCR/3Cq2jfb+I4W+Ch8Y9b5G+vbAecVv0Fx/J1QKktOrgUYsIKxWAKgIpvw56IFNA==", 518 | "cpu": [ 519 | "arm64" 520 | ], 521 | "dev": true, 522 | "optional": true, 523 | "os": [ 524 | "android" 525 | ] 526 | }, 527 | "node_modules/@rollup/rollup-darwin-arm64": { 528 | "version": "4.9.4", 529 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.4.tgz", 530 | "integrity": "sha512-1fzh1lWExwSTWy8vJPnNbNM02WZDS8AW3McEOb7wW+nPChLKf3WG2aG7fhaUmfX5FKw9zhsF5+MBwArGyNM7NA==", 531 | "cpu": [ 532 | "arm64" 533 | ], 534 | "dev": true, 535 | "optional": true, 536 | "os": [ 537 | "darwin" 538 | ] 539 | }, 540 | "node_modules/@rollup/rollup-darwin-x64": { 541 | "version": "4.9.4", 542 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.4.tgz", 543 | "integrity": "sha512-Gc6cukkF38RcYQ6uPdiXi70JB0f29CwcQ7+r4QpfNpQFVHXRd0DfWFidoGxjSx1DwOETM97JPz1RXL5ISSB0pA==", 544 | "cpu": [ 545 | "x64" 546 | ], 547 | "dev": true, 548 | "optional": true, 549 | "os": [ 550 | "darwin" 551 | ] 552 | }, 553 | "node_modules/@rollup/rollup-linux-arm-gnueabihf": { 554 | "version": "4.9.4", 555 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.4.tgz", 556 | "integrity": "sha512-g21RTeFzoTl8GxosHbnQZ0/JkuFIB13C3T7Y0HtKzOXmoHhewLbVTFBQZu+z5m9STH6FZ7L/oPgU4Nm5ErN2fw==", 557 | "cpu": [ 558 | "arm" 559 | ], 560 | "dev": true, 561 | "optional": true, 562 | "os": [ 563 | "linux" 564 | ] 565 | }, 566 | "node_modules/@rollup/rollup-linux-arm64-gnu": { 567 | "version": "4.9.4", 568 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.4.tgz", 569 | "integrity": "sha512-TVYVWD/SYwWzGGnbfTkrNpdE4HON46orgMNHCivlXmlsSGQOx/OHHYiQcMIOx38/GWgwr/po2LBn7wypkWw/Mg==", 570 | "cpu": [ 571 | "arm64" 572 | ], 573 | "dev": true, 574 | "optional": true, 575 | "os": [ 576 | "linux" 577 | ] 578 | }, 579 | "node_modules/@rollup/rollup-linux-arm64-musl": { 580 | "version": "4.9.4", 581 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.4.tgz", 582 | "integrity": "sha512-XcKvuendwizYYhFxpvQ3xVpzje2HHImzg33wL9zvxtj77HvPStbSGI9czrdbfrf8DGMcNNReH9pVZv8qejAQ5A==", 583 | "cpu": [ 584 | "arm64" 585 | ], 586 | "dev": true, 587 | "optional": true, 588 | "os": [ 589 | "linux" 590 | ] 591 | }, 592 | "node_modules/@rollup/rollup-linux-riscv64-gnu": { 593 | "version": "4.9.4", 594 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.4.tgz", 595 | "integrity": "sha512-LFHS/8Q+I9YA0yVETyjonMJ3UA+DczeBd/MqNEzsGSTdNvSJa1OJZcSH8GiXLvcizgp9AlHs2walqRcqzjOi3A==", 596 | "cpu": [ 597 | "riscv64" 598 | ], 599 | "dev": true, 600 | "optional": true, 601 | "os": [ 602 | "linux" 603 | ] 604 | }, 605 | "node_modules/@rollup/rollup-linux-x64-gnu": { 606 | "version": "4.9.4", 607 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.4.tgz", 608 | "integrity": "sha512-dIYgo+j1+yfy81i0YVU5KnQrIJZE8ERomx17ReU4GREjGtDW4X+nvkBak2xAUpyqLs4eleDSj3RrV72fQos7zw==", 609 | "cpu": [ 610 | "x64" 611 | ], 612 | "dev": true, 613 | "optional": true, 614 | "os": [ 615 | "linux" 616 | ] 617 | }, 618 | "node_modules/@rollup/rollup-linux-x64-musl": { 619 | "version": "4.9.4", 620 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.4.tgz", 621 | "integrity": "sha512-RoaYxjdHQ5TPjaPrLsfKqR3pakMr3JGqZ+jZM0zP2IkDtsGa4CqYaWSfQmZVgFUCgLrTnzX+cnHS3nfl+kB6ZQ==", 622 | "cpu": [ 623 | "x64" 624 | ], 625 | "dev": true, 626 | "optional": true, 627 | "os": [ 628 | "linux" 629 | ] 630 | }, 631 | "node_modules/@rollup/rollup-win32-arm64-msvc": { 632 | "version": "4.9.4", 633 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.4.tgz", 634 | "integrity": "sha512-T8Q3XHV+Jjf5e49B4EAaLKV74BbX7/qYBRQ8Wop/+TyyU0k+vSjiLVSHNWdVd1goMjZcbhDmYZUYW5RFqkBNHQ==", 635 | "cpu": [ 636 | "arm64" 637 | ], 638 | "dev": true, 639 | "optional": true, 640 | "os": [ 641 | "win32" 642 | ] 643 | }, 644 | "node_modules/@rollup/rollup-win32-ia32-msvc": { 645 | "version": "4.9.4", 646 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.4.tgz", 647 | "integrity": "sha512-z+JQ7JirDUHAsMecVydnBPWLwJjbppU+7LZjffGf+Jvrxq+dVjIE7By163Sc9DKc3ADSU50qPVw0KonBS+a+HQ==", 648 | "cpu": [ 649 | "ia32" 650 | ], 651 | "dev": true, 652 | "optional": true, 653 | "os": [ 654 | "win32" 655 | ] 656 | }, 657 | "node_modules/@rollup/rollup-win32-x64-msvc": { 658 | "version": "4.9.4", 659 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.4.tgz", 660 | "integrity": "sha512-LfdGXCV9rdEify1oxlN9eamvDSjv9md9ZVMAbNHA87xqIfFCxImxan9qZ8+Un54iK2nnqPlbnSi4R54ONtbWBw==", 661 | "cpu": [ 662 | "x64" 663 | ], 664 | "dev": true, 665 | "optional": true, 666 | "os": [ 667 | "win32" 668 | ] 669 | }, 670 | "node_modules/@types/estree": { 671 | "version": "1.0.5", 672 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", 673 | "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", 674 | "dev": true 675 | }, 676 | "node_modules/@types/node": { 677 | "version": "20.9.3", 678 | "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.3.tgz", 679 | "integrity": "sha512-nk5wXLAXGBKfrhLB0cyHGbSqopS+nz0BUgZkUQqSHSSgdee0kssp1IAqlQOu333bW+gMNs2QREx7iynm19Abxw==", 680 | "dev": true, 681 | "optional": true, 682 | "peer": true, 683 | "dependencies": { 684 | "undici-types": "~5.26.4" 685 | } 686 | }, 687 | "node_modules/@types/resolve": { 688 | "version": "1.20.2", 689 | "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", 690 | "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", 691 | "dev": true 692 | }, 693 | "node_modules/acorn": { 694 | "version": "8.11.2", 695 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", 696 | "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", 697 | "dev": true, 698 | "optional": true, 699 | "peer": true, 700 | "bin": { 701 | "acorn": "bin/acorn" 702 | }, 703 | "engines": { 704 | "node": ">=0.4.0" 705 | } 706 | }, 707 | "node_modules/buffer-from": { 708 | "version": "1.1.2", 709 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", 710 | "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", 711 | "dev": true, 712 | "optional": true, 713 | "peer": true 714 | }, 715 | "node_modules/builtin-modules": { 716 | "version": "3.3.0", 717 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", 718 | "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", 719 | "dev": true, 720 | "engines": { 721 | "node": ">=6" 722 | }, 723 | "funding": { 724 | "url": "https://github.com/sponsors/sindresorhus" 725 | } 726 | }, 727 | "node_modules/commander": { 728 | "version": "2.20.3", 729 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 730 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", 731 | "dev": true, 732 | "optional": true, 733 | "peer": true 734 | }, 735 | "node_modules/deepmerge": { 736 | "version": "4.3.1", 737 | "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", 738 | "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", 739 | "dev": true, 740 | "engines": { 741 | "node": ">=0.10.0" 742 | } 743 | }, 744 | "node_modules/esbuild": { 745 | "version": "0.19.11", 746 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.11.tgz", 747 | "integrity": "sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==", 748 | "dev": true, 749 | "hasInstallScript": true, 750 | "bin": { 751 | "esbuild": "bin/esbuild" 752 | }, 753 | "engines": { 754 | "node": ">=12" 755 | }, 756 | "optionalDependencies": { 757 | "@esbuild/aix-ppc64": "0.19.11", 758 | "@esbuild/android-arm": "0.19.11", 759 | "@esbuild/android-arm64": "0.19.11", 760 | "@esbuild/android-x64": "0.19.11", 761 | "@esbuild/darwin-arm64": "0.19.11", 762 | "@esbuild/darwin-x64": "0.19.11", 763 | "@esbuild/freebsd-arm64": "0.19.11", 764 | "@esbuild/freebsd-x64": "0.19.11", 765 | "@esbuild/linux-arm": "0.19.11", 766 | "@esbuild/linux-arm64": "0.19.11", 767 | "@esbuild/linux-ia32": "0.19.11", 768 | "@esbuild/linux-loong64": "0.19.11", 769 | "@esbuild/linux-mips64el": "0.19.11", 770 | "@esbuild/linux-ppc64": "0.19.11", 771 | "@esbuild/linux-riscv64": "0.19.11", 772 | "@esbuild/linux-s390x": "0.19.11", 773 | "@esbuild/linux-x64": "0.19.11", 774 | "@esbuild/netbsd-x64": "0.19.11", 775 | "@esbuild/openbsd-x64": "0.19.11", 776 | "@esbuild/sunos-x64": "0.19.11", 777 | "@esbuild/win32-arm64": "0.19.11", 778 | "@esbuild/win32-ia32": "0.19.11", 779 | "@esbuild/win32-x64": "0.19.11" 780 | } 781 | }, 782 | "node_modules/estree-walker": { 783 | "version": "2.0.2", 784 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 785 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", 786 | "dev": true 787 | }, 788 | "node_modules/fsevents": { 789 | "version": "2.3.3", 790 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 791 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 792 | "dev": true, 793 | "hasInstallScript": true, 794 | "optional": true, 795 | "os": [ 796 | "darwin" 797 | ], 798 | "engines": { 799 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 800 | } 801 | }, 802 | "node_modules/function-bind": { 803 | "version": "1.1.2", 804 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 805 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 806 | "dev": true, 807 | "funding": { 808 | "url": "https://github.com/sponsors/ljharb" 809 | } 810 | }, 811 | "node_modules/hasown": { 812 | "version": "2.0.0", 813 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", 814 | "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", 815 | "dev": true, 816 | "dependencies": { 817 | "function-bind": "^1.1.2" 818 | }, 819 | "engines": { 820 | "node": ">= 0.4" 821 | } 822 | }, 823 | "node_modules/is-builtin-module": { 824 | "version": "3.2.1", 825 | "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", 826 | "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", 827 | "dev": true, 828 | "dependencies": { 829 | "builtin-modules": "^3.3.0" 830 | }, 831 | "engines": { 832 | "node": ">=6" 833 | }, 834 | "funding": { 835 | "url": "https://github.com/sponsors/sindresorhus" 836 | } 837 | }, 838 | "node_modules/is-core-module": { 839 | "version": "2.13.1", 840 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", 841 | "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", 842 | "dev": true, 843 | "dependencies": { 844 | "hasown": "^2.0.0" 845 | }, 846 | "funding": { 847 | "url": "https://github.com/sponsors/ljharb" 848 | } 849 | }, 850 | "node_modules/is-module": { 851 | "version": "1.0.0", 852 | "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", 853 | "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", 854 | "dev": true 855 | }, 856 | "node_modules/js-tokens": { 857 | "version": "4.0.0", 858 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 859 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 860 | }, 861 | "node_modules/loose-envify": { 862 | "version": "1.4.0", 863 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 864 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 865 | "dependencies": { 866 | "js-tokens": "^3.0.0 || ^4.0.0" 867 | }, 868 | "bin": { 869 | "loose-envify": "cli.js" 870 | } 871 | }, 872 | "node_modules/nanoid": { 873 | "version": "3.3.7", 874 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", 875 | "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", 876 | "dev": true, 877 | "funding": [ 878 | { 879 | "type": "github", 880 | "url": "https://github.com/sponsors/ai" 881 | } 882 | ], 883 | "bin": { 884 | "nanoid": "bin/nanoid.cjs" 885 | }, 886 | "engines": { 887 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 888 | } 889 | }, 890 | "node_modules/path-parse": { 891 | "version": "1.0.7", 892 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 893 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 894 | "dev": true 895 | }, 896 | "node_modules/picocolors": { 897 | "version": "1.0.0", 898 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 899 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", 900 | "dev": true 901 | }, 902 | "node_modules/picomatch": { 903 | "version": "2.3.1", 904 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 905 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 906 | "dev": true, 907 | "engines": { 908 | "node": ">=8.6" 909 | }, 910 | "funding": { 911 | "url": "https://github.com/sponsors/jonschlinkert" 912 | } 913 | }, 914 | "node_modules/postcss": { 915 | "version": "8.4.33", 916 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", 917 | "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", 918 | "dev": true, 919 | "funding": [ 920 | { 921 | "type": "opencollective", 922 | "url": "https://opencollective.com/postcss/" 923 | }, 924 | { 925 | "type": "tidelift", 926 | "url": "https://tidelift.com/funding/github/npm/postcss" 927 | }, 928 | { 929 | "type": "github", 930 | "url": "https://github.com/sponsors/ai" 931 | } 932 | ], 933 | "dependencies": { 934 | "nanoid": "^3.3.7", 935 | "picocolors": "^1.0.0", 936 | "source-map-js": "^1.0.2" 937 | }, 938 | "engines": { 939 | "node": "^10 || ^12 || >=14" 940 | } 941 | }, 942 | "node_modules/react": { 943 | "version": "18.2.0", 944 | "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", 945 | "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", 946 | "dependencies": { 947 | "loose-envify": "^1.1.0" 948 | }, 949 | "engines": { 950 | "node": ">=0.10.0" 951 | } 952 | }, 953 | "node_modules/react-dom": { 954 | "version": "18.2.0", 955 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", 956 | "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", 957 | "dependencies": { 958 | "loose-envify": "^1.1.0", 959 | "scheduler": "^0.23.0" 960 | }, 961 | "peerDependencies": { 962 | "react": "^18.2.0" 963 | } 964 | }, 965 | "node_modules/resolve": { 966 | "version": "1.22.8", 967 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", 968 | "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", 969 | "dev": true, 970 | "dependencies": { 971 | "is-core-module": "^2.13.0", 972 | "path-parse": "^1.0.7", 973 | "supports-preserve-symlinks-flag": "^1.0.0" 974 | }, 975 | "bin": { 976 | "resolve": "bin/resolve" 977 | }, 978 | "funding": { 979 | "url": "https://github.com/sponsors/ljharb" 980 | } 981 | }, 982 | "node_modules/rollup": { 983 | "version": "4.9.4", 984 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.9.4.tgz", 985 | "integrity": "sha512-2ztU7pY/lrQyXSCnnoU4ICjT/tCG9cdH3/G25ERqE3Lst6vl2BCM5hL2Nw+sslAvAf+ccKsAq1SkKQALyqhR7g==", 986 | "dev": true, 987 | "dependencies": { 988 | "@types/estree": "1.0.5" 989 | }, 990 | "bin": { 991 | "rollup": "dist/bin/rollup" 992 | }, 993 | "engines": { 994 | "node": ">=18.0.0", 995 | "npm": ">=8.0.0" 996 | }, 997 | "optionalDependencies": { 998 | "@rollup/rollup-android-arm-eabi": "4.9.4", 999 | "@rollup/rollup-android-arm64": "4.9.4", 1000 | "@rollup/rollup-darwin-arm64": "4.9.4", 1001 | "@rollup/rollup-darwin-x64": "4.9.4", 1002 | "@rollup/rollup-linux-arm-gnueabihf": "4.9.4", 1003 | "@rollup/rollup-linux-arm64-gnu": "4.9.4", 1004 | "@rollup/rollup-linux-arm64-musl": "4.9.4", 1005 | "@rollup/rollup-linux-riscv64-gnu": "4.9.4", 1006 | "@rollup/rollup-linux-x64-gnu": "4.9.4", 1007 | "@rollup/rollup-linux-x64-musl": "4.9.4", 1008 | "@rollup/rollup-win32-arm64-msvc": "4.9.4", 1009 | "@rollup/rollup-win32-ia32-msvc": "4.9.4", 1010 | "@rollup/rollup-win32-x64-msvc": "4.9.4", 1011 | "fsevents": "~2.3.2" 1012 | } 1013 | }, 1014 | "node_modules/scheduler": { 1015 | "version": "0.23.0", 1016 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", 1017 | "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", 1018 | "dependencies": { 1019 | "loose-envify": "^1.1.0" 1020 | } 1021 | }, 1022 | "node_modules/source-map": { 1023 | "version": "0.6.1", 1024 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1025 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1026 | "dev": true, 1027 | "optional": true, 1028 | "peer": true, 1029 | "engines": { 1030 | "node": ">=0.10.0" 1031 | } 1032 | }, 1033 | "node_modules/source-map-js": { 1034 | "version": "1.0.2", 1035 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 1036 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", 1037 | "dev": true, 1038 | "engines": { 1039 | "node": ">=0.10.0" 1040 | } 1041 | }, 1042 | "node_modules/source-map-support": { 1043 | "version": "0.5.21", 1044 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", 1045 | "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", 1046 | "dev": true, 1047 | "optional": true, 1048 | "peer": true, 1049 | "dependencies": { 1050 | "buffer-from": "^1.0.0", 1051 | "source-map": "^0.6.0" 1052 | } 1053 | }, 1054 | "node_modules/supports-preserve-symlinks-flag": { 1055 | "version": "1.0.0", 1056 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 1057 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 1058 | "dev": true, 1059 | "engines": { 1060 | "node": ">= 0.4" 1061 | }, 1062 | "funding": { 1063 | "url": "https://github.com/sponsors/ljharb" 1064 | } 1065 | }, 1066 | "node_modules/terser": { 1067 | "version": "5.24.0", 1068 | "resolved": "https://registry.npmjs.org/terser/-/terser-5.24.0.tgz", 1069 | "integrity": "sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==", 1070 | "dev": true, 1071 | "optional": true, 1072 | "peer": true, 1073 | "dependencies": { 1074 | "@jridgewell/source-map": "^0.3.3", 1075 | "acorn": "^8.8.2", 1076 | "commander": "^2.20.0", 1077 | "source-map-support": "~0.5.20" 1078 | }, 1079 | "bin": { 1080 | "terser": "bin/terser" 1081 | }, 1082 | "engines": { 1083 | "node": ">=10" 1084 | } 1085 | }, 1086 | "node_modules/undici-types": { 1087 | "version": "5.26.5", 1088 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", 1089 | "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", 1090 | "dev": true, 1091 | "optional": true, 1092 | "peer": true 1093 | }, 1094 | "node_modules/vite": { 1095 | "version": "5.0.11", 1096 | "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.11.tgz", 1097 | "integrity": "sha512-XBMnDjZcNAw/G1gEiskiM1v6yzM4GE5aMGvhWTlHAYYhxb7S3/V1s3m2LDHa8Vh6yIWYYB0iJwsEaS523c4oYA==", 1098 | "dev": true, 1099 | "dependencies": { 1100 | "esbuild": "^0.19.3", 1101 | "postcss": "^8.4.32", 1102 | "rollup": "^4.2.0" 1103 | }, 1104 | "bin": { 1105 | "vite": "bin/vite.js" 1106 | }, 1107 | "engines": { 1108 | "node": "^18.0.0 || >=20.0.0" 1109 | }, 1110 | "funding": { 1111 | "url": "https://github.com/vitejs/vite?sponsor=1" 1112 | }, 1113 | "optionalDependencies": { 1114 | "fsevents": "~2.3.3" 1115 | }, 1116 | "peerDependencies": { 1117 | "@types/node": "^18.0.0 || >=20.0.0", 1118 | "less": "*", 1119 | "lightningcss": "^1.21.0", 1120 | "sass": "*", 1121 | "stylus": "*", 1122 | "sugarss": "*", 1123 | "terser": "^5.4.0" 1124 | }, 1125 | "peerDependenciesMeta": { 1126 | "@types/node": { 1127 | "optional": true 1128 | }, 1129 | "less": { 1130 | "optional": true 1131 | }, 1132 | "lightningcss": { 1133 | "optional": true 1134 | }, 1135 | "sass": { 1136 | "optional": true 1137 | }, 1138 | "stylus": { 1139 | "optional": true 1140 | }, 1141 | "sugarss": { 1142 | "optional": true 1143 | }, 1144 | "terser": { 1145 | "optional": true 1146 | } 1147 | } 1148 | } 1149 | } 1150 | } 1151 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "scripts": { 3 | "preinstall:opam": "opam update", 4 | "install:opam": "opam install -y . --deps-only --with-test", 5 | "check-npm-deps": "opam exec opam-check-npm-deps", 6 | "init": "opam switch create . 5.1.1 -y --deps-only && npm run install:npm-opam", 7 | "install:npm-opam": "npm install && npm run install:opam && npm run check-npm-deps", 8 | "dune": "opam exec -- dune", 9 | "build": "npm run dune -- build", 10 | "build:verbose": "npm run build -- --verbose", 11 | "clean": "npm run dune -- clean", 12 | "format": "npm run format:check -- --auto-promote", 13 | "format:check": "npm run dune -- build @fmt", 14 | "watch": "npm run build -- --watch", 15 | "serve": "vite serve --open", 16 | "bundle": "npm run build && vite build" 17 | }, 18 | "scriptsComments": { 19 | "preinstall:opam": "# Sync opam database with upstream repositories: https://opam.ocaml.org/doc/Usage.html#opam-update", 20 | "install:opam": "# Downloads, builds and installs opam pkgs: https://opam.ocaml.org/doc/Usage.html#opam-install", 21 | "check-npm-deps": "# Checks that Melange bindings have their JS dependencies available: https://github.com/ahrefs/opam-check-npm-deps", 22 | "init": "# Create opam switch: https://opam.ocaml.org/doc/Usage.html#opam-switch and prepare everything to work in development mode (run just once, for initialization)", 23 | "install:npm-opam": "# Install both npm and opam deps", 24 | "dune": "# Run dune, OCaml's build tool", 25 | "build": "# Build the Melange apps", 26 | "build:verbose": "# Build the Melange apps in verbose mode", 27 | "clean": "# Cleans all Melange artifacts", 28 | "format": "# Formats the Melange sources using ocamlformat", 29 | "format:check": "# Checks that the Melange sources have the right formatting (read-only)", 30 | "watch": "# Watch files and rebuild when they change", 31 | "serve": "# Serves the React app in a local server", 32 | "bundle": "# Bundle the JavaScript apps generated by Melange" 33 | }, 34 | "dependencies": { 35 | "react": "^18.2.0", 36 | "react-dom": "^18.2.0" 37 | }, 38 | "devDependencies": { 39 | "@rollup/plugin-node-resolve": "^15.2.3", 40 | "vite": "^5.0.11" 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /vite.config.mjs: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import { nodeResolve } from '@rollup/plugin-node-resolve' 3 | 4 | export default defineConfig({ 5 | plugins: [nodeResolve()], 6 | server: { 7 | watch: { 8 | ignored: ['**/_opam'] 9 | } 10 | }, 11 | }); 12 | --------------------------------------------------------------------------------